ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2FjMjcKLS0tIC9kZXYvbnVsbAorKysgYi8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsNyBAQAorTWFrZWZpbGUuaW4KK2FjbG9jYWwubTQKK2F1dG9tNHRlLmNhY2hlCitjb25maWcuaC5pbgorY29uZmlndXJlCitlbGZ1dGlscy5zcGVjCitvc2wyLjAKZGlmZiAtLWdpdCBhL0FCT1VULU5MUyBiL0FCT1VULU5MUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTEyMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvQUJPVVQtTkxTCkBAIC0wLDAgKzEsNTg4IEBACitOb3RlcyBvbiB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEZyZWUgc29mdHdhcmUgaXMgZ29pbmcgaW50ZXJuYXRpb25hbCEgIFRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QKK2lzIGEgd2F5IHRvIGdldCBtYWludGFpbmVycyBvZiBmcmVlIHNvZnR3YXJlLCB0cmFuc2xhdG9ycywgYW5kIHVzZXJzIGFsbAordG9nZXRoZXIsIHNvIHRoYXQgd2lsbCBncmFkdWFsbHkgYmVjb21lIGFibGUgdG8gc3BlYWsgbWFueSBsYW5ndWFnZXMuCitBIGZldyBwYWNrYWdlcyBhbHJlYWR5IHByb3ZpZGUgdHJhbnNsYXRpb25zIGZvciB0aGVpciBtZXNzYWdlcy4KKworICAgSWYgeW91IGZvdW5kIHRoaXMgYEFCT1VULU5MUycgZmlsZSBpbnNpZGUgYSBkaXN0cmlidXRpb24sIHlvdSBtYXkKK2Fzc3VtZSB0aGF0IHRoZSBkaXN0cmlidXRlZCBwYWNrYWdlIGRvZXMgdXNlIEdOVSBgZ2V0dGV4dCcgaW50ZXJuYWxseSwKK2l0c2VsZiBhdmFpbGFibGUgYXQgeW91ciBuZWFyZXN0IEdOVSBhcmNoaXZlIHNpdGUuICBCdXQgeW91IGRvIF9ub3RfCituZWVkIHRvIGluc3RhbGwgR05VIGBnZXR0ZXh0JyBwcmlvciB0byBjb25maWd1cmluZywgaW5zdGFsbGluZyBvciB1c2luZwordGhpcyBwYWNrYWdlIHdpdGggbWVzc2FnZXMgdHJhbnNsYXRlZC4KKworICAgSW5zdGFsbGVycyB3aWxsIGZpbmQgaGVyZSBzb21lIHVzZWZ1bCBoaW50cy4gIFRoZXNlIG5vdGVzIGFsc28KK2V4cGxhaW4gaG93IHVzZXJzIHNob3VsZCBwcm9jZWVkIGZvciBnZXR0aW5nIHRoZSBwcm9ncmFtcyB0byB1c2UgdGhlCithdmFpbGFibGUgdHJhbnNsYXRpb25zLiAgVGhleSB0ZWxsIGhvdyBwZW9wbGUgd2FudGluZyB0byBjb250cmlidXRlIGFuZAord29yayBhdCB0cmFuc2xhdGlvbnMgc2hvdWxkIGNvbnRhY3QgdGhlIGFwcHJvcHJpYXRlIHRlYW0uCisKKyAgIFdoZW4gcmVwb3J0aW5nIGJ1Z3MgaW4gdGhlIGBpbnRsLycgZGlyZWN0b3J5IG9yIGJ1Z3Mgd2hpY2ggbWF5IGJlCityZWxhdGVkIHRvIGludGVybmF0aW9uYWxpemF0aW9uLCB5b3Ugc2hvdWxkIHRlbGwgYWJvdXQgdGhlIHZlcnNpb24gb2YKK2BnZXR0ZXh0JyB3aGljaCBpcyB1c2VkLiAgVGhlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUKK2BpbnRsL1ZFUlNJT04nIGZpbGUsIGluIGludGVybmF0aW9uYWxpemVkIHBhY2thZ2VzLgorCitJTlNUQUxMIE1hdHRlcnMKKz09PT09PT09PT09PT09PQorCisgICBTb21lIHBhY2thZ2VzIGFyZSAibG9jYWxpemFibGUiIHdoZW4gcHJvcGVybHkgaW5zdGFsbGVkOyB0aGUKK3Byb2dyYW1zIHRoZXkgY29udGFpbiBjYW4gYmUgbWFkZSB0byBzcGVhayB5b3VyIG93biBuYXRpdmUgbGFuZ3VhZ2UuCitNb3N0IHN1Y2ggcGFja2FnZXMgdXNlIEdOVSBgZ2V0dGV4dCcuICBPdGhlciBwYWNrYWdlcyBoYXZlIHRoZWlyIG93bgord2F5cyB0byBpbnRlcm5hdGlvbmFsaXphdGlvbiwgcHJlZGF0aW5nIEdOVSBgZ2V0dGV4dCcuCisKKyAgIEJ5IGRlZmF1bHQsIHRoaXMgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZCB0byBhbGxvdyB0cmFuc2xhdGlvbiBvZgorbWVzc2FnZXMuICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHdoZXRoZXIgdGhlIHN5c3RlbSBhbHJlYWR5Citwcm92aWRlcyB0aGUgR05VIGBnZXR0ZXh0JyBmdW5jdGlvbnMuICBJZiBub3QsIHRoZSBHTlUgYGdldHRleHQnIG93bgorbGlicmFyeSB3aWxsIGJlIHVzZWQuICBUaGlzIGxpYnJhcnkgaXMgd2hvbGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhpcworcGFja2FnZSwgdXN1YWxseSBpbiB0aGUgYGludGwvJyBzdWJkaXJlY3RvcnksIHNvIHByaW9yIGluc3RhbGxhdGlvbiBvZgordGhlIEdOVSBgZ2V0dGV4dCcgcGFja2FnZSBpcyBfbm90XyByZXF1aXJlZC4gIEluc3RhbGxlcnMgbWF5IHVzZQorc3BlY2lhbCBvcHRpb25zIGF0IGNvbmZpZ3VyYXRpb24gdGltZSBmb3IgY2hhbmdpbmcgdGhlIGRlZmF1bHQKK2JlaGF2aW91ci4gIFRoZSBjb21tYW5kOgorCisgICAgIC4vY29uZmlndXJlIC0tZGlzYWJsZS1ubHMKKword2lsbCBieXBhc3MgYW55IHByZS1leGlzdGluZyBgZ2V0dGV4dCcgdG8gX3RvdGFsbHlfIGRpc2FibGUgdHJhbnNsYXRpb24KK29mIG1lc3NhZ2VzLgorCisgICBUaGUgY29uZmlndXJhdGlvbiBwcm9jZXNzIHdpbGwgbm90IHRlc3QgZm9yIHRoZSBgY2F0Z2V0cycgZnVuY3Rpb24KK2FuZCB0aGVyZWZvcmUgaXQgd2lsbCBub3QgYmUgdXNlZC4gIFRoZSByZWFzb24gaXMgdGhhdCBldmVuIGFuCitlbXVsYXRpb24gb2YgYGdldHRleHQnIG9uIHRvcCBvZiBgY2F0Z2V0cycgY291bGQgbm90IHByb3ZpZGUgYWxsIHRoZQorZXh0ZW5zaW9ucyBvZiB0aGUgR05VIGBnZXR0ZXh0JyBsaWJyYXJ5LgorCisgICBJbnRlcm5hdGlvbmFsaXplZCBwYWNrYWdlcyBoYXZlIHVzdWFsbHkgbWFueSBgcG8vTEwucG8nIGZpbGVzLCB3aGVyZQorTEwgZ2l2ZXMgYW4gSVNPIDYzOSB0d28tbGV0dGVyIGNvZGUgaWRlbnRpZnlpbmcgdGhlIGxhbmd1YWdlLiAgVW5sZXNzCit0cmFuc2xhdGlvbnMgaGF2ZSBiZWVuIGZvcmJpZGRlbiBhdCBgY29uZmlndXJlJyB0aW1lIGJ5IHVzaW5nIHRoZQorYC0tZGlzYWJsZS1ubHMnIHN3aXRjaCwgYWxsIGF2YWlsYWJsZSB0cmFuc2xhdGlvbnMgYXJlIGluc3RhbGxlZAordG9nZXRoZXIgd2l0aCB0aGUgcGFja2FnZS4gIEhvd2V2ZXIsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgTElOR1VBUycKK21heSBiZSBzZXQsIHByaW9yIHRvIGNvbmZpZ3VyYXRpb24sIHRvIGxpbWl0IHRoZSBpbnN0YWxsZWQgc2V0LgorYExJTkdVQVMnIHNob3VsZCB0aGVuIGNvbnRhaW4gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0d28tbGV0dGVyCitjb2Rlcywgc3RhdGluZyB3aGljaCBsYW5ndWFnZXMgYXJlIGFsbG93ZWQuCisKK1VzaW5nIFRoaXMgUGFja2FnZQorPT09PT09PT09PT09PT09PT09CisKKyAgIEFzIGEgdXNlciwgaWYgeW91ciBsYW5ndWFnZSBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yIHRoaXMgcGFja2FnZSwgeW91Citvbmx5IGhhdmUgdG8gc2V0IHRoZSBgTEFORycgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGFwcHJvcHJpYXRlCitgTExfQ0MnIGNvbWJpbmF0aW9uLiAgSGVyZSBgTEwnIGlzIGFuIElTTyA2MzkgdHdvLWxldHRlciBsYW5ndWFnZSBjb2RlLAorYW5kIGBDQycgaXMgYW4gSVNPIDMxNjYgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUuICBGb3IgZXhhbXBsZSwgbGV0J3MKK3N1cHBvc2UgdGhhdCB5b3Ugc3BlYWsgR2VybWFuIGFuZCBsaXZlIGluIEdlcm1hbnkuICBBdCB0aGUgc2hlbGwKK3Byb21wdCwgbWVyZWx5IGV4ZWN1dGUgYHNldGVudiBMQU5HIGRlX0RFJyAoaW4gYGNzaCcpLAorYGV4cG9ydCBMQU5HOyBMQU5HPWRlX0RFJyAoaW4gYHNoJykgb3IgYGV4cG9ydCBMQU5HPWRlX0RFJyAoaW4gYGJhc2gnKS4KK1RoaXMgY2FuIGJlIGRvbmUgZnJvbSB5b3VyIGAubG9naW4nIG9yIGAucHJvZmlsZScgZmlsZSwgb25jZSBhbmQgZm9yCithbGwuCisKKyAgIFlvdSBtaWdodCB0aGluayB0aGF0IHRoZSBjb3VudHJ5IGNvZGUgc3BlY2lmaWNhdGlvbiBpcyByZWR1bmRhbnQuCitCdXQgaW4gZmFjdCwgc29tZSBsYW5ndWFnZXMgaGF2ZSBkaWFsZWN0cyBpbiBkaWZmZXJlbnQgY291bnRyaWVzLiAgRm9yCitleGFtcGxlLCBgZGVfQVQnIGlzIHVzZWQgZm9yIEF1c3RyaWEsIGFuZCBgcHRfQlInIGZvciBCcmF6aWwuICBUaGUKK2NvdW50cnkgY29kZSBzZXJ2ZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIGRpYWxlY3RzLgorCisgICBUaGUgbG9jYWxlIG5hbWluZyBjb252ZW50aW9uIG9mIGBMTF9DQycsIHdpdGggYExMJyBkZW5vdGluZyB0aGUKK2xhbmd1YWdlIGFuZCBgQ0MnIGRlbm90aW5nIHRoZSBjb3VudHJ5LCBpcyB0aGUgb25lIHVzZSBvbiBzeXN0ZW1zIGJhc2VkCitvbiBHTlUgbGliYy4gIE9uIG90aGVyIHN5c3RlbXMsIHNvbWUgdmFyaWF0aW9ucyBvZiB0aGlzIHNjaGVtZSBhcmUKK3VzZWQsIHN1Y2ggYXMgYExMJyBvciBgTExfQ0MuRU5DT0RJTkcnLiAgWW91IGNhbiBnZXQgdGhlIGxpc3Qgb2YKK2xvY2FsZXMgc3VwcG9ydGVkIGJ5IHlvdXIgc3lzdGVtIGZvciB5b3VyIGNvdW50cnkgYnkgcnVubmluZyB0aGUgY29tbWFuZAorYGxvY2FsZSAtYSB8IGdyZXAgJ15MTCcnLgorCisgICBOb3QgYWxsIHByb2dyYW1zIGhhdmUgdHJhbnNsYXRpb25zIGZvciBhbGwgbGFuZ3VhZ2VzLiAgQnkgZGVmYXVsdCwgYW4KK0VuZ2xpc2ggbWVzc2FnZSBpcyBzaG93biBpbiBwbGFjZSBvZiBhIG5vbmV4aXN0ZW50IHRyYW5zbGF0aW9uLiAgSWYgeW91Cit1bmRlcnN0YW5kIG90aGVyIGxhbmd1YWdlcywgeW91IGNhbiBzZXQgdXAgYSBwcmlvcml0eSBsaXN0IG9mIGxhbmd1YWdlcy4KK1RoaXMgaXMgZG9uZSB0aHJvdWdoIGEgZGlmZmVyZW50IGVudmlyb25tZW50IHZhcmlhYmxlLCBjYWxsZWQKK2BMQU5HVUFHRScuICBHTlUgYGdldHRleHQnIGdpdmVzIHByZWZlcmVuY2UgdG8gYExBTkdVQUdFJyBvdmVyIGBMQU5HJworZm9yIHRoZSBwdXJwb3NlIG9mIG1lc3NhZ2UgaGFuZGxpbmcsIGJ1dCB5b3Ugc3RpbGwgbmVlZCB0byBoYXZlIGBMQU5HJworc2V0IHRvIHRoZSBwcmltYXJ5IGxhbmd1YWdlOyB0aGlzIGlzIHJlcXVpcmVkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZQorc3lzdGVtIGxpYnJhcmllcy4gIEZvciBleGFtcGxlLCBzb21lIFN3ZWRpc2ggdXNlcnMgd2hvIHdvdWxkIHJhdGhlcgorcmVhZCB0cmFuc2xhdGlvbnMgaW4gR2VybWFuIHRoYW4gRW5nbGlzaCBmb3Igd2hlbiBTd2VkaXNoIGlzIG5vdAorYXZhaWxhYmxlLCBzZXQgYExBTkdVQUdFJyB0byBgc3Y6ZGUnIHdoaWxlIGxlYXZpbmcgYExBTkcnIHRvIGBzdl9TRScuCisKKyAgIEluIHRoZSBgTEFOR1VBR0UnIGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgbm90IGluIHRoZSBgTEFORycKK2Vudmlyb25tZW50IHZhcmlhYmxlLCBgTExfQ0MnIGNvbWJpbmF0aW9ucyBjYW4gYmUgYWJicmV2aWF0ZWQgYXMgYExMJwordG8gZGVub3RlIHRoZSBsYW5ndWFnZSdzIG1haW4gZGlhbGVjdC4gIEZvciBleGFtcGxlLCBgZGUnIGlzIGVxdWl2YWxlbnQKK3RvIGBkZV9ERScgKEdlcm1hbiBhcyBzcG9rZW4gaW4gR2VybWFueSksIGFuZCBgcHQnIHRvIGBwdF9QVCcKKyhQb3J0dWd1ZXNlIGFzIHNwb2tlbiBpbiBQb3J0dWdhbCkgaW4gdGhpcyBjb250ZXh0LgorCitUcmFuc2xhdGluZyBUZWFtcworPT09PT09PT09PT09PT09PT0KKworICAgRm9yIHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgdG8gYmUgYSBzdWNjZXNzLCB3ZSBuZWVkIGludGVyZXN0ZWQKK3Blb3BsZSB3aG8gbGlrZSB0aGVpciBvd24gbGFuZ3VhZ2UgYW5kIHdyaXRlIGl0IHdlbGwsIGFuZCB3aG8gYXJlIGFsc28KK2FibGUgdG8gc3luZXJnaXplIHdpdGggb3RoZXIgdHJhbnNsYXRvcnMgc3BlYWtpbmcgdGhlIHNhbWUgbGFuZ3VhZ2UuCitFYWNoIHRyYW5zbGF0aW9uIHRlYW0gaGFzIGl0cyBvd24gbWFpbGluZyBsaXN0LiAgVGhlIHVwLXRvLWRhdGUgbGlzdCBvZgordGVhbXMgY2FuIGJlIGZvdW5kIGF0IHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QncyBob21lcGFnZSwKK2BodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvY29udHJpYi9wby9IVE1MLycsIGluIHRoZSAiTmF0aW9uYWwgdGVhbXMiCithcmVhLgorCisgICBJZiB5b3UnZCBsaWtlIHRvIHZvbHVudGVlciB0byBfd29ya18gYXQgdHJhbnNsYXRpbmcgbWVzc2FnZXMsIHlvdQorc2hvdWxkIGJlY29tZSBhIG1lbWJlciBvZiB0aGUgdHJhbnNsYXRpbmcgdGVhbSBmb3IgeW91ciBvd24gbGFuZ3VhZ2UuCitUaGUgc3Vic2NyaWJpbmcgYWRkcmVzcyBpcyBfbm90XyB0aGUgc2FtZSBhcyB0aGUgbGlzdCBpdHNlbGYsIGl0IGhhcworYC1yZXF1ZXN0JyBhcHBlbmRlZC4gIEZvciBleGFtcGxlLCBzcGVha2VycyBvZiBTd2VkaXNoIGNhbiBzZW5kIGEKK21lc3NhZ2UgdG8gYHN2LXJlcXVlc3RAbGkub3JnJywgaGF2aW5nIHRoaXMgbWVzc2FnZSBib2R5OgorCisgICAgIHN1YnNjcmliZQorCisgICBLZWVwIGluIG1pbmQgdGhhdCB0ZWFtIG1lbWJlcnMgYXJlIGV4cGVjdGVkIHRvIHBhcnRpY2lwYXRlCitfYWN0aXZlbHlfIGluIHRyYW5zbGF0aW9ucywgb3IgYXQgc29sdmluZyB0cmFuc2xhdGlvbmFsIGRpZmZpY3VsdGllcywKK3JhdGhlciB0aGFuIG1lcmVseSBsdXJraW5nIGFyb3VuZC4gIElmIHlvdXIgdGVhbSBkb2VzIG5vdCBleGlzdCB5ZXQgYW5kCit5b3Ugd2FudCB0byBzdGFydCBvbmUsIG9yIGlmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHdoYXQgdG8gZG8gb3IgaG93IHRvCitnZXQgc3RhcnRlZCwgcGxlYXNlIHdyaXRlIHRvIGB0cmFuc2xhdGlvbkBpcm8udW1vbnRyZWFsLmNhJyB0byByZWFjaCB0aGUKK2Nvb3JkaW5hdG9yIGZvciBhbGwgdHJhbnNsYXRvciB0ZWFtcy4KKworICAgVGhlIEVuZ2xpc2ggdGVhbSBpcyBzcGVjaWFsLiAgSXQgd29ya3MgYXQgaW1wcm92aW5nIGFuZCB1bmlmb3JtaXppbmcKK3RoZSB0ZXJtaW5vbG9neSBpbiB1c2UuICBQcm92ZW4gbGluZ3Vpc3RpYyBza2lsbCBhcmUgcHJhaXNlZCBtb3JlIHRoYW4KK3Byb2dyYW1taW5nIHNraWxsLCBoZXJlLgorCitBdmFpbGFibGUgUGFja2FnZXMKKz09PT09PT09PT09PT09PT09PQorCisgICBMYW5ndWFnZXMgYXJlIG5vdCBlcXVhbGx5IHN1cHBvcnRlZCBpbiBhbGwgcGFja2FnZXMuICBUaGUgZm9sbG93aW5nCittYXRyaXggc2hvd3MgdGhlIGN1cnJlbnQgc3RhdGUgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24sIGFzIG9mIE1heSAyMDAzLgorVGhlIG1hdHJpeCBzaG93cywgaW4gcmVnYXJkIG9mIGVhY2ggcGFja2FnZSwgZm9yIHdoaWNoIGxhbmd1YWdlcyBQTworZmlsZXMgaGF2ZSBiZWVuIHN1Ym1pdHRlZCB0byB0cmFuc2xhdGlvbiBjb29yZGluYXRpb24sIHdpdGggYQordHJhbnNsYXRpb24gcGVyY2VudGFnZSBvZiBhdCBsZWFzdCA1MCUuCisKKyAgICAgUmVhZHkgUE8gZmlsZXMgICAgICAgYW0gYXogYmUgYmcgY2EgY3MgZGEgZGUgZWwgZW4gZW5fR0IgZW8gZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICBhMnBzICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICAgICAgICB8CisgICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdIHwKKyAgICAgYmF0Y2hlbG9yICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgYmlzb24gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBibHVlei1waW4gICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gfAorICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGNwaW8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZGFya3N0YXQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgW10gfAorICAgICBkaWZmdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSBbXSBbXSBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIGUyZnNwcm9ncyAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgIFtdICAgICAgICAgfAorICAgICBlcnJvciAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgW10gICAgICBbXSB8CisgICAgIGZldGNobWFpbCAgICAgICAgICB8ICAgICAgICAgICAgIFtdICgpIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgZmlsZXV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBmaW5kdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdjYWwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gfAorICAgICBnZXR0ZXh0ICAgICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdldHRleHQtcnVudGltZSAgICB8ICAgICAgIFtdICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gfAorICAgICBnaW1wLXByaW50ICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgICAgW10gICAgICBbXSB8CisgICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgW10gICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgfAorICAgICBnbnVjYXNoICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgW10gICAgICAgICB8CisgICAgIGdudWNhc2gtZ2xvc3NhcnkgICB8ICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ251cGcgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gKCkgICAgW10gW10gICAgICAgICAgW10gW10gfAorICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtZWRpdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtc2tldGNoYm9vayAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtdG9kbyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gfAorICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAoKSAgICAgICAgICAoKSB8CisgICAgIGdyZXAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorICAgICBoZWxsbyAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIGlkLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaW5kZW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgW10gW10gfAorICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gW10gW10gW10gICAgICAgICAgICAgW10gfAorICAgICBsZCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGxpYmMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBsaWJpY29udiAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICBbXSBbXSB8CisgICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgfAorICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpbmdvdGVhY2hfbGVzc29ucyB8ICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICgpIHwKKyAgICAgbHlueCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gW10gW10gICAgICAgICAgICAgICAgICAgfAorICAgICBtNCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSAgICAgICAgICAgICAgICB8CisgICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBtYW4tZGIgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAoKSBbXSBbXSAgICAgICAgICAgICAgICAoKSB8CisgICAgIG15c2VjcmV0ZGlhcnkgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gKCkgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBuYW5vXzFfMCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAoKSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgcGFydGVkICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBwdHggICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICBbXSBbXSB8CisgICAgIHB5dGhvbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICBbXSBbXSB8CisgICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2VkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgW10gW10gfAorICAgICBzaC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIHNoYXJ1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgc2tldGNoICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gKCkgICAgICAgICAgICAgICAgW10gfAorICAgICBzb3VuZHRyYWNrZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdGFyICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICAgICBbXSAgICB8CisgICAgIHRleHR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICgpICAgICAgICAgfAorICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIHZvcmJpcy10b29scyAgICAgICB8ICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgfAorICAgICB3ZGlmZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIHdnZXQgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdIFtdIFtdIFtdIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgeGNoYXQgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgW10gfAorICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW0gYXogYmUgYmcgY2EgY3MgZGEgZGUgZWwgZW4gZW5fR0IgZW8gZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDEgIDQgIDIgMzEgMTcgNTQgNjAgMTQgIDEgICA0ICAgMTIgNTYKKyAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV0IGZhIGZpIGZyIGdhIGdsIGhlIGhyIGh1IGlkIGl0IGphIGtvCisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgYTJwcyAgICAgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgKCkgICAgKCkgfAorICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBiYXNoICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICB8CisgICAgIGJhdGNoZWxvciAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYmZkICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgfAorICAgICBiaW51dGlscyAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGJpc29uICAgICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIHwKKyAgICAgYmx1ZXotcGluICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgICAgICAgW10gW10gICAgICAgICAgfAorICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgY29yZXV0aWxzICAgICAgICAgIHwgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gW10gICAgfAorICAgICBjcGlvICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICBbXSB8CisgICAgIGRhcmtzdGF0ICAgICAgICAgICB8ICAgICAgICAgICgpIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgIHwKKyAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgW10gICAgfAorICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgZXJyb3IgICAgICAgICAgICAgIHwgICAgICAgW10gW10gW10gICAgICAgICAgW10gICAgICAgICAgICAgfAorICAgICBmZXRjaG1haWwgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGZpbGV1dGlscyAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgIHwKKyAgICAgZmluZHV0aWxzICAgICAgICAgIHwgW10gICAgW10gW10gW10gW10gICAgW10gW10gW10gW10gW10gW10gfAorICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2V0dGV4dCAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gW10gfAorICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSB8CisgICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgZ2ltcC1wcmludCAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgfAorICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgIFtdICAgICAgIFtdICAgIHwKKyAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorICAgICBnbnVjYXNoLWdsb3NzYXJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8CisgICAgIGdudXBnICAgICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgIFtdICAgICAgICAgIFtdIFtdIFtdICAgIHwKKyAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorICAgICBncGUtY29uZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1jb250YWN0cyAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorICAgICBncGUtbG9naW4gICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1vd25lcmluZm8gICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgICAgICAgIHwKKyAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtdGltZXNoZWV0ICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICAgICB8CisgICAgIGdwZS10b2RheSAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorICAgICBncGhvdG8yICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICBbXSAgICB8CisgICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKKyAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgKCkgICAgICAgICAgICAgW10gICAgKCkgKCkgICAgfAorICAgICBncmVwICAgICAgICAgICAgICAgfCBbXSAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSAgICB8CisgICAgIGdyZXRsICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaGVsbG8gICAgICAgICAgICAgIHwgW10gW10gW10gW10gW10gW10gW10gW10gW10gW10gW10gW10gW10gfAorICAgICBpZC11dGlscyAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgICAgICB8CisgICAgIGluZGVudCAgICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgIFtdICAgICAgIFtdIFtdIFtdIFtdICAgIHwKKyAgICAganBpbG90ICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgKCkgICAgfAorICAgICBqd2hvaXMgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSBbXSAgICAgICB8CisgICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBsaWJjICAgICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgICBbXSAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIGxpYmdwZXdpZGdldCAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgICAgIHwKKyAgICAgbGliaWNvbnYgICAgICAgICAgIHwgICAgICAgW10gW10gW10gW10gICAgW10gW10gW10gW10gICAgICAgfAorICAgICBsaWZlbGluZXMgICAgICAgICAgfCAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgfAorICAgICBsaW5nb3RlYWNoX2xlc3NvbnMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGx5bnggICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgIHwKKyAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgW10gICAgfAorICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIG1ha2UgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgKCkgKCkgICAgfAorICAgICBteXNlY3JldGRpYXJ5ICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8CisgICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIFtdIFtdICAgICAgIHwKKyAgICAgbmFub18xXzAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gW10gICAgICAgfAorICAgICBvcGNvZGVzICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8CisgICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgcHR4ICAgICAgICAgICAgICAgIHwgW10gICAgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgfAorICAgICBweXRob24gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgW10gW10gICAgW10gW10gW10gICAgICAgfAorICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHNlZCAgICAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdICAgICAgIFtdIFtdIFtdIFtdICAgIHwKKyAgICAgc2gtdXRpbHMgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgW10gICAgW10gW10gICAgfAorICAgICBzaGFydXRpbHMgICAgICAgICAgfCBbXSAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICBbXSAgICB8CisgICAgIHNrZXRjaCAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgW10gICAgW10gICAgW10gICAgICAgICAgICAgICAgfAorICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAoKSAgICB8CisgICAgIHRhciAgICAgICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgIFtdICAgIFtdIFtdIFtdIFtdIFtdICAgIHwKKyAgICAgdGV4aW5mbyAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgW10gICAgfAorICAgICB0ZXh0dXRpbHMgICAgICAgICAgfCAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICBbXSBbXSB8CisgICAgIHRpbiAgICAgICAgICAgICAgICB8IFtdICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdXRpbC1saW51eCAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgW10gICAgKCkgW10gICAgfAorICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgd2RpZmYgICAgICAgICAgICAgIHwgW10gICAgICAgW10gICAgW10gICAgICAgW10gW10gICAgICAgICAgfAorICAgICB3Z2V0ICAgICAgICAgICAgICAgfCBbXSAgICBbXSBbXSAgICBbXSBbXSBbXSBbXSAgICAgICBbXSAgICB8CisgICAgIHhjaGF0ICAgICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV0IGZhIGZpIGZyIGdhIGdsIGhlIGhyIGh1IGlkIGl0IGphIGtvCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIwICAxIDE1IDczIDE0IDI0ICA4IDEwIDMwIDMxIDE5IDMxICA5CisgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZyBsdCBsdiBtcyBuYiBubCBubiBubyBwbCBwdCBwdF9CUiBybworICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgIGEycHMgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgIFtdICAgICgpICgpICgpICBbXSAgIFtdIHwKKyAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBhbnViaXMgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgIHwKKyAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfAorICAgICBiYXRjaGVsb3IgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBiaXNvbiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgW10gICBbXSB8CisgICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGNvcmV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIHwKKyAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgIFtdICAgICAgfAorICAgICBkYXJrc3RhdCAgICAgICAgICAgfCAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgW10gICBbXSB8CisgICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICBbXSAgICAgIHwKKyAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBlbnNjcmlwdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICB8CisgICAgIGVycm9yICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgIHwKKyAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICgpICAgICAgfAorICAgICBmaWxldXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICB8CisgICAgIGZpbmR1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICBbXSAgIFtdIHwKKyAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfAorICAgICBnYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdhd2sgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwKKyAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBnY2MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdldHRleHQgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIHwKKyAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgfAorICAgICBnZXR0ZXh0LXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdpbXAtcHJpbnQgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfAorICAgICBnbHVuYXJjbG9jayAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdudWNhc2ggICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ251Y2FzaC1nbG9zc2FyeSAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgfAorICAgICBnbnVwZyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1jYWxlbmRhciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKKyAgICAgZ3BlLWNvbmYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAorICAgICBncGUtY29udGFjdHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8CisgICAgIGdwZS1lZGl0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKKyAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAorICAgICBncGUtb3duZXJpbmZvICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8CisgICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKKyAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gfAorICAgICBncGUtdG9kYXkgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8CisgICAgIGdwZS10b2RvICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIHwKKyAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8CisgICAgIGdwc2RyaXZlICAgICAgICAgICB8ICAgICAgICAgICAgICAgICgpICAgICgpICAgICAgICAoKSAgICAgIHwKKyAgICAgZ3JlcCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gIFtdICAgW10gfAorICAgICBncmV0bCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGhlbGxvICAgICAgICAgICAgICB8ICAgICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdICAgICBbXSAgIFtdIHwKKyAgICAgaWQtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgW10gfAorICAgICBpbmRlbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICBbXSB8CisgICAgIGpwaWxvdCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICgpICAgICgpICAgICAgICAgICAgICAgIHwKKyAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgW10gfAorICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGliYyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgIFtdICAgICAgfAorICAgICBsaWJncGV3aWRnZXQgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8CisgICAgIGxpYmljb252ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgIFtdIHwKKyAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGluZ290ZWFjaF9sZXNzb25zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBseW54ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICB8CisgICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICBbXSAgIFtdIHwKKyAgICAgbWFpbHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBtYWtlICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgW10gICAgICB8CisgICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwKKyAgICAgbXlzZWNyZXRkaWFyeSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfAorICAgICBuYW5vICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICBbXSB8CisgICAgIG5hbm9fMV8wICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgIFtdICAgIFtdICAgICAgICAgICAgIHwKKyAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgW10gfAorICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgW10gICAgICB8CisgICAgIHB0eCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdIFtdICBbXSAgIFtdIHwKKyAgICAgcHl0aG9uICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHJlY29kZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdIHwKKyAgICAgc2NyZWVtICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBzZWQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICBbXSB8CisgICAgIHNoLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgfAorICAgICBza2V0Y2ggICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8CisgICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc3AgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICB0YXIgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgICBbXSBbXSAgICAgW10gICBbXSB8CisgICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgdGV4dHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICB0aW4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHV0aWwtbGludXggICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICBbXSAgICAgIHwKKyAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gfAorICAgICB3YXN0ZXNlZGdlICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHdkaWZmICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdIHwKKyAgICAgd2dldCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgW10gfAorICAgICB4Y2hhdCAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHhwYWQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICAgICBsZyBsdCBsdiBtcyBuYiBubCBubiBubyBwbCBwdCBwdF9CUiBybworICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgMCAgMiAxMSAgNyAyNiAgMyAgNCAxOCAxNSAgMzQgICAzNAorICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnUgc2sgc2wgc3Igc3YgdGEgdHIgdWsgdmkgd2EgemhfQ04gemhfVFcKKyAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICBhMnBzICAgICAgICAgICAgICAgfCBbXSAgICBbXSAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICB8IDE2CisgICAgIGFlZ2lzICAgICAgICAgICAgICB8ICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKKyAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICB8ICAxCisgICAgIGJhc2ggICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKKyAgICAgYmF0Y2hlbG9yICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMQorICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgW10gICAgICAgICB8ICA3CisgICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICBbXSAgICAgICAgIHwgIDcKKyAgICAgYmlzb24gICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMworICAgICBibHVlei1waW4gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3CisgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBjb3JldXRpbHMgICAgICAgICAgfCBbXSAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgW10gICB8IDE0CisgICAgIGNwaW8gICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICBbXSAgICAgICAgIHwgMTMKKyAgICAgZGFya3N0YXQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICgpICAgICgpICAgfCAgOQorICAgICBkaWZmdXRpbHMgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgW10gICB8IDIxCisgICAgIGUyZnNwcm9ncyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwgIDMKKyAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgfCAxMQorICAgICBlcnJvciAgICAgICAgICAgICAgfCAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgW10gICB8IDE0CisgICAgIGZldGNobWFpbCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwgIDcKKyAgICAgZmlsZXV0aWxzICAgICAgICAgIHwgW10gICAgW10gICAgW10gICAgW10gICAgICAgICAgIFtdICAgIFtdICAgfCAxNQorICAgICBmaW5kdXRpbHMgICAgICAgICAgfCBbXSBbXSBbXSAgICBbXSAgICBbXSAgICAgICAgICAgW10gICAgICAgICB8IDI3CisgICAgIGZsZXggICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwgMTAKKyAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgfCAgMworICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8ICA5CisgICAgIGdjYWwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwgIDQKKyAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgfCAgNAorICAgICBnZXR0ZXh0ICAgICAgICAgICAgfCBbXSBbXSBbXSAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgW10gICB8IDE1CisgICAgIGdldHRleHQtcnVudGltZSAgICB8IFtdIFtdIFtdICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICBbXSAgIHwgMTYKKyAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBnaW1wLXByaW50ICAgICAgICAgfCAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwCisgICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEKKyAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgfCAxMQorICAgICBnbnVjYXNoICAgICAgICAgICAgfCAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICB8ICA0CisgICAgIGdudWNhc2gtZ2xvc3NhcnkgICB8ICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgIHwgIDgKKyAgICAgZ251cGcgICAgICAgICAgICAgIHwgICAgW10gICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgIFtdICAgfCAxNgorICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICB8ICA1CisgICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKKyAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgfCAgNAorICAgICBncGUtZWRpdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICB8ICA1CisgICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgIHwgIDUKKyAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgfCAgNworICAgICBncGUtc2tldGNoYm9vayAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICB8ICA1CisgICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgIHwgIDYKKyAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgfCAgNgorICAgICBncGUtdG9kbyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICB8ICA2CisgICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICBbXSAgICAgICAgIHwgIDkKKyAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgfCAgNworICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGdyZXAgICAgICAgICAgICAgICB8IFtdICAgIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIHwgMjQKKyAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgorICAgICBoZWxsbyAgICAgICAgICAgICAgfCBbXSBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICB8IDMzCisgICAgIGlkLXV0aWxzICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwgMTEKKyAgICAgaW5kZW50ICAgICAgICAgICAgIHwgW10gW10gICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgfCAxOQorICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgW10gICAgW10gICB8IDEwCisgICAgIGp3aG9pcyAgICAgICAgICAgICB8ICgpICAgICAgICAgICgpICAgIFtdICAgICAgICAgICAgICAgICBbXSAgIHwgMTAKKyAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgfCAgOAorICAgICBsZCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8ICA1CisgICAgIGxpYmMgICAgICAgICAgICAgICB8ICAgIFtdICAgICAgIFtdICAgIFtdICAgICAgICAgICBbXSAgICAgICAgIHwgMjAKKyAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgorICAgICBsaWJpY29udiAgICAgICAgICAgfCBbXSBbXSBbXSAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICAgICB8IDIxCisgICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKKyAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAorICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisgICAgIGxpbmdvdGVhY2hfbGVzc29ucyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgIHwgIDAKKyAgICAgbHlueCAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgfCAxNAorICAgICBtNCAgICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgW10gICAgICAgICB8IDE1CisgICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKKyAgICAgbWFrZSAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgW10gICAgICAgICAgIFtdICAgICAgICAgfCAxNQorICAgICBtYW4tZGIgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2CisgICAgIG15c2VjcmV0ZGlhcnkgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwgIDgKKyAgICAgbmFubyAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgfCAxNQorICAgICBuYW5vXzFfMCAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8IDE1CisgICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwgIDkKKyAgICAgcGFydGVkICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgfCAxMworICAgICBwdHggICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8IDIyCisgICAgIHB5dGhvbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKKyAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAorICAgICByZWNvZGUgICAgICAgICAgICAgfCBbXSAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8IDE5CisgICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEKKyAgICAgc2VkICAgICAgICAgICAgICAgIHwgICAgW10gW10gICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgfCAyMAorICAgICBzaC11dGlscyAgICAgICAgICAgfCBbXSAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8IDEzCisgICAgIHNoYXJ1dGlscyAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICBbXSAgIHwgMTYKKyAgICAgc2tldGNoICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQorICAgICBzb3VuZHRyYWNrZXIgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3CisgICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwgIDMKKyAgICAgdGFyICAgICAgICAgICAgICAgIHwgICAgW10gW10gICAgW10gICAgW10gICAgICAgICAgIFtdICAgICAgICAgfCAyNAorICAgICB0ZXhpbmZvICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgW10gICAgICAgICB8IDEzCisgICAgIHRleHR1dGlscyAgICAgICAgICB8IFtdICAgIFtdICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICBbXSAgIHwgMTUKKyAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMQorICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8IDE0CisgICAgIHZvcmJpcy10b29scyAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKKyAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAorICAgICB3ZGlmZiAgICAgICAgICAgICAgfCBbXSBbXSAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICAgICB8IDE3CisgICAgIHdnZXQgICAgICAgICAgICAgICB8IFtdIFtdIFtdICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICBbXSAgIHwgMjUKKyAgICAgeGNoYXQgICAgICAgICAgICAgIHwgICAgW10gW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQorICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxCisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICA1MCB0ZWFtcyAgICAgICAgICAgcnUgc2sgc2wgc3Igc3YgdGEgdHIgdWsgdmkgd2EgemhfQ04gemhfVFcKKyAgICAgICA5NyBkb21haW5zICAgICAgICAgMzIgMTkgMTYgIDAgNTYgIDAgNDggMTAgIDEgIDEgIDEyICAgIDIzICAgIDkxMworCisgICBTb21lIGNvdW50ZXJzIGluIHRoZSBwcmVjZWRpbmcgbWF0cml4IGFyZSBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mCit2aXNpYmxlIGJsb2NrcyBsZXQgdXMgZXhwZWN0LiAgVGhpcyBpcyBiZWNhdXNlIGEgZmV3IGV4dHJhIFBPIGZpbGVzIGFyZQordXNlZCBmb3IgaW1wbGVtZW50aW5nIHJlZ2lvbmFsIHZhcmlhbnRzIG9mIGxhbmd1YWdlcywgb3IgbGFuZ3VhZ2UKK2RpYWxlY3RzLgorCisgICBGb3IgYSBQTyBmaWxlIGluIHRoZSBtYXRyaXggYWJvdmUgdG8gYmUgZWZmZWN0aXZlLCB0aGUgcGFja2FnZSB0bword2hpY2ggaXQgYXBwbGllcyBzaG91bGQgYWxzbyBoYXZlIGJlZW4gaW50ZXJuYXRpb25hbGl6ZWQgYW5kCitkaXN0cmlidXRlZCBhcyBzdWNoIGJ5IGl0cyBtYWludGFpbmVyLiAgVGhlcmUgbWlnaHQgYmUgYW4gb2JzZXJ2YWJsZQorbGFnIGJldHdlZW4gdGhlIG1lcmUgZXhpc3RlbmNlIGEgUE8gZmlsZSBhbmQgaXRzIHdpZGUgYXZhaWxhYmlsaXR5IGluIGEKK2Rpc3RyaWJ1dGlvbi4KKworICAgSWYgTWF5IDIwMDMgc2VlbXMgdG8gYmUgb2xkLCB5b3UgbWF5IGZldGNoIGEgbW9yZSByZWNlbnQgY29weSBvZgordGhpcyBgQUJPVVQtTkxTJyBmaWxlIG9uIG1vc3QgR05VIGFyY2hpdmUgc2l0ZXMuICBUaGUgbW9zdCB1cC10by1kYXRlCittYXRyaXggd2l0aCBmdWxsIHBlcmNlbnRhZ2UgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQKK2BodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvY29udHJpYi9wby9IVE1ML21hdHJpeC5odG1sJy4KKworVXNpbmcgYGdldHRleHQnIGluIG5ldyBwYWNrYWdlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBJZiB5b3UgYXJlIHdyaXRpbmcgYSBmcmVlbHkgYXZhaWxhYmxlIHByb2dyYW0gYW5kIHdhbnQgdG8KK2ludGVybmF0aW9uYWxpemUgaXQgeW91IGFyZSB3ZWxjb21lIHRvIHVzZSBHTlUgYGdldHRleHQnIGluIHlvdXIKK3BhY2thZ2UuICBPZiBjb3Vyc2UgeW91IGhhdmUgdG8gcmVzcGVjdCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2Ugd2hpY2ggY292ZXJzIHRoZSB1c2Ugb2YgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4gIFRoaXMgbWVhbnMKK2luIHBhcnRpY3VsYXIgdGhhdCBldmVuIG5vbi1mcmVlIHByb2dyYW1zIGNhbiB1c2UgYGxpYmludGwnIGFzIGEgc2hhcmVkCitsaWJyYXJ5LCB3aGVyZWFzIG9ubHkgZnJlZSBzb2Z0d2FyZSBjYW4gdXNlIGBsaWJpbnRsJyBhcyBhIHN0YXRpYworbGlicmFyeSBvciB1c2UgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYGxpYmludGwnLgorCisgICBPbmNlIHRoZSBzb3VyY2VzIGFyZSBjaGFuZ2VkIGFwcHJvcHJpYXRlbHkgYW5kIHRoZSBzZXR1cCBjYW4gaGFuZGxlCit0aGUgdXNlIG9mIGBnZXR0ZXh0JyB0aGUgb25seSB0aGluZyBtaXNzaW5nIGFyZSB0aGUgdHJhbnNsYXRpb25zLiAgVGhlCitGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgaXMgYWxzbyBhdmFpbGFibGUgZm9yIHBhY2thZ2VzIHdoaWNoIGFyZSBub3QKK2RldmVsb3BlZCBpbnNpZGUgdGhlIEdOVSBwcm9qZWN0LiAgVGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBnaXZlbiBhYm92ZQorYXBwbGllcyBhbHNvIGZvciBldmVyeSBvdGhlciBGcmVlIFNvZnR3YXJlIFByb2plY3QuICBDb250YWN0CitgdHJhbnNsYXRpb25AaXJvLnVtb250cmVhbC5jYScgdG8gbWFrZSB0aGUgYC5wb3QnIGZpbGVzIGF2YWlsYWJsZSB0bwordGhlIHRyYW5zbGF0aW9uIHRlYW1zLgorCmRpZmYgLS1naXQgYS9BVVRIT1JTIGIvQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI3NzZmCi0tLSAvZGV2L251bGwKKysrIGIvQVVUSE9SUwpAQCAtMCwwICsxLDIgQEAKK0ZvciBOb3c6CitVbHJpY2ggRHJlcHBlci4KZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODQ2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HCkBAIC0wLDAgKzEsMTYyIEBACisJCQlUaGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlCisJCQkJdi4gMS4wCisKK1RoaXMgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKSBhcHBsaWVzIHRvIGFueSBvcmlnaW5hbAord29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpCitoYXMgcGxhY2VkIHRoZSBmb2xsb3dpbmcgbm90aWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY29weXJpZ2h0Citub3RpY2UgZm9yIHRoZSBPcmlnaW5hbCBXb3JrOiAiTGljZW5zZWQgdW5kZXIgdGhlIE9wZW4gU29mdHdhcmUKK0xpY2Vuc2UgdmVyc2lvbiAxLjAiCisKK0xpY2Vuc2UgVGVybXMKKworMSkgR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEKK3dvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBub24tc3VibGljZW5zZWFibGUKK2xpY2Vuc2UgdG8gZG8gdGhlIGZvbGxvd2luZzoKKworICBhKSB0byByZXByb2R1Y2UgdGhlIE9yaWdpbmFsIFdvcmsgaW4gY29waWVzOworICAKKyAgYikgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzICgiRGVyaXZhdGl2ZSBXb3JrcyIpIGJhc2VkIHVwb24gdGhlCisgIE9yaWdpbmFsIFdvcms7CisgIAorICBjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcworICB0byB0aGUgcHVibGljLCB3aXRoIHRoZSBwcm92aXNvIHRoYXQgY29waWVzIG9mIE9yaWdpbmFsIFdvcmsgb3IKKyAgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIHNoYWxsIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZQorICBPcGVuIFNvZnR3YXJlIExpY2Vuc2U7CisgIAorICBkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKyAgCisgIGUpIHRvIGRpc3BsYXkgdGhlIE9yaWdpbmFsIFdvcmsgcHVibGljbHkuCisgIAorMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBub24tc3VibGljZW5zZWFibGUgbGljZW5zZSwKK3VuZGVyIHBhdGVudCBjbGFpbXMgb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgTGljZW5zb3IgdGhhdCBhcmUKK2VtYm9kaWVkIGluIHRoZSBPcmlnaW5hbCBXb3JrIGFzIGZ1cm5pc2hlZCBieSB0aGUgTGljZW5zb3IgKCJMaWNlbnNlZAorQ2xhaW1zIikgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZCBvZmZlciBmb3Igc2FsZSB0aGUgT3JpZ2luYWwgV29yay4KK0xpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLAorcGVycGV0dWFsLCBub24tc3VibGljZW5zZWFibGUgbGljZW5zZSB1bmRlciB0aGUgTGljZW5zZWQgQ2xhaW1zIHRvCittYWtlLCB1c2UsIHNlbGwgYW5kIG9mZmVyIGZvciBzYWxlIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gYWNjZXNzIGFuZCBtb2RpZnkgdGhlCitPcmlnaW5hbCBXb3JrLiBMaWNlbnNvciBoZXJlYnkgYWdyZWVzIHRvIHByb3ZpZGUgYSBtYWNoaW5lLXJlYWRhYmxlCitjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yayBhbG9uZyB3aXRoIGVhY2ggY29weSBvZgordGhlIE9yaWdpbmFsIFdvcmsgdGhhdCBMaWNlbnNvciBkaXN0cmlidXRlcy4gTGljZW5zb3IgcmVzZXJ2ZXMgdGhlCityaWdodCB0byBzYXRpc2Z5IHRoaXMgb2JsaWdhdGlvbiBieSBwbGFjaW5nIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mCit0aGUgU291cmNlIENvZGUgaW4gYW4gaW5mb3JtYXRpb24gcmVwb3NpdG9yeSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8KK3Blcm1pdCBpbmV4cGVuc2l2ZSBhbmQgY29udmVuaWVudCBhY2Nlc3MgYnkgWW91IGZvciBhcyBsb25nIGFzCitMaWNlbnNvciBjb250aW51ZXMgdG8gZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgV29yaywgYW5kIGJ5IHB1Ymxpc2hpbmcKK3RoZSBhZGRyZXNzIG9mIHRoYXQgaW5mb3JtYXRpb24gcmVwb3NpdG9yeSBpbiBhIG5vdGljZSBpbW1lZGlhdGVseQorZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIHRoYXQgYXBwbGllcyB0byB0aGUgT3JpZ2luYWwgV29yay4KKworNCkgRXhjbHVzaW9ucyBGcm9tIExpY2Vuc2UgR3JhbnQuIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlCitkZWVtZWQgdG8gZ3JhbnQgYW55IHJpZ2h0cyB0byB0cmFkZW1hcmtzLCBjb3B5cmlnaHRzLCBwYXRlbnRzLCB0cmFkZQorc2VjcmV0cyBvciBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIExpY2Vuc29yIGV4Y2VwdCBhcworZXhwcmVzc2x5IHN0YXRlZCBoZXJlaW4uIE5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQgdG8gbWFrZSwgdXNlLAorc2VsbCBvciBvZmZlciB0byBzZWxsIGVtYm9kaW1lbnRzIG9mIGFueSBwYXRlbnQgY2xhaW1zIG90aGVyIHRoYW4gdGhlCitMaWNlbnNlZCBDbGFpbXMgZGVmaW5lZCBpbiBTZWN0aW9uIDIuIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdGhlCit0cmFkZW1hcmtzIG9mIExpY2Vuc29yIGV2ZW4gaWYgc3VjaCBtYXJrcyBhcmUgaW5jbHVkZWQgaW4gdGhlIE9yaWdpbmFsCitXb3JrLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBpbnRlcnByZXRlZCB0byBwcm9oaWJpdAorTGljZW5zb3IgZnJvbSBsaWNlbnNpbmcgdW5kZXIgZGlmZmVyZW50IHRlcm1zIGZyb20gdGhpcyBMaWNlbnNlIGFueQorT3JpZ2luYWwgV29yayB0aGF0IExpY2Vuc29yIG90aGVyd2lzZSB3b3VsZCBoYXZlIGEgcmlnaHQgdG8gbGljZW5zZS4KKworNSkgRXh0ZXJuYWwgRGVwbG95bWVudC4gVGhlIHRlcm0gIkV4dGVybmFsIERlcGxveW1lbnQiIG1lYW5zIHRoZSB1c2UKK29yIGRpc3RyaWJ1dGlvbiBvZiB0aGUgT3JpZ2luYWwgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIGluIGFueSB3YXkKK3N1Y2ggdGhhdCB0aGUgT3JpZ2luYWwgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIG1heSBiZSBhY2Nlc3NlZCBvcgordXNlZCBieSBhbnlvbmUgb3RoZXIgdGhhbiBZb3UsIHdoZXRoZXIgdGhlIE9yaWdpbmFsIFdvcmsgb3IgRGVyaXZhdGl2ZQorV29ya3MgYXJlIGRpc3RyaWJ1dGVkIHRvIHRob3NlIHBlcnNvbnMsIG1hZGUgYXZhaWxhYmxlIGFzIGFuCithcHBsaWNhdGlvbiBpbnRlbmRlZCBmb3IgdXNlIG92ZXIgYSBjb21wdXRlciBuZXR3b3JrLCBvciB1c2VkIHRvCitwcm92aWRlIHNlcnZpY2VzIG9yIG90aGVyd2lzZSBkZWxpdmVyIGNvbnRlbnQgdG8gYW55b25lIG90aGVyIHRoYW4KK1lvdS4gQXMgYW4gZXhwcmVzcyBjb25kaXRpb24gZm9yIHRoZSBncmFudHMgb2YgbGljZW5zZSBoZXJldW5kZXIsIFlvdQorYWdyZWUgdGhhdCBhbnkgRXh0ZXJuYWwgRGVwbG95bWVudCBieSBZb3Ugc2hhbGwgYmUgZGVlbWVkIGEKK2Rpc3RyaWJ1dGlvbiBhbmQgc2hhbGwgYmUgbGljZW5zZWQgdG8gYWxsIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlLCBhcyBwcmVzY3JpYmVkIGluIHNlY3Rpb24gMShjKSBoZXJlaW4uCisKKzYpIFdhcnJhbnR5IGFuZCBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBMSUNFTlNPUiBXQVJSQU5UUyBUSEFUIFRIRQorQ09QWVJJR0hUIElOIEFORCBUTyBUSEUgT1JJR0lOQUwgV09SSyBJUyBPV05FRCBCWSBUSEUgTElDRU5TT1IgT1IgVEhBVAorVEhFIE9SSUdJTkFMIFdPUksgSVMgRElTVFJJQlVURUQgQlkgTElDRU5TT1IgVU5ERVIgQSBWQUxJRCBDVVJSRU5UCitMSUNFTlNFIEZST00gVEhFIENPUFlSSUdIVCBPV05FUi4gRVhDRVBUIEFTIEVYUFJFU1NMWSBTVEFURUQgSU4gVEhFCitJTU1FRElBVEVMWSBQUkVDRUVESU5HIFNFTlRFTkNFLCBUSEUgT1JJR0lOQUwgV09SSyBJUyBQUk9WSURFRCBVTkRFUgorVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFksIEVJVEhFUiBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIFdBUlJBTlRZIE9GCitOT04tSU5GUklOR0VNRU5UIEFORCBXQVJSQU5USUVTIFRIQVQgVEhFIE9SSUdJTkFMIFdPUksgSVMgTUVSQ0hBTlRBQkxFCitPUiBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgT0YKK1RIRSBPUklHSU5BTCBXT1JLIElTIFdJVEggWU9VLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMKK0FOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gTElDRU5TRSBUTyBPUklHSU5BTCBXT1JLIElTCitHUkFOVEVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgorCis3KSBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwKK1RIRU9SWSwgV0hFVEhFUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsCitTSEFMTCBUSEUgTElDRU5TT1IgQkUgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgQVJJU0lORworQVMgQSBSRVNVTFQgT0YgVEhJUyBMSUNFTlNFIE9SIFRIRSBVU0UgT0YgVEhFIE9SSUdJTkFMIFdPUksgSU5DTFVESU5HLAorV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLAorQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIgQ09NTUVSQ0lBTAorREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQRVJTT04gU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YgTElBQklMSVRZIFNIQUxMIE5PVAorQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSAorUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0gKK0xJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFIEVYQ0xVU0lPTiBPUgorTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04KK0FORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgorCis4KSBBY2NlcHRhbmNlIGFuZCBUZXJtaW5hdGlvbi4gTm90aGluZyBlbHNlIGJ1dCB0aGlzIExpY2Vuc2UgKG9yCithbm90aGVyIHdyaXR0ZW4gYWdyZWVtZW50IGJldHdlZW4gTGljZW5zb3IgYW5kIFlvdSkgZ3JhbnRzIFlvdQorcGVybWlzc2lvbiB0byBjcmVhdGUgRGVyaXZhdGl2ZSBXb3JrcyBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrLAorYW5kIGFueSBhdHRlbXB0IHRvIGRvIHNvIGV4Y2VwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIChvcgorYW5vdGhlciB3cml0dGVuIGFncmVlbWVudCBiZXR3ZWVuIExpY2Vuc29yIGFuZCBZb3UpIGlzIGV4cHJlc3NseQorcHJvaGliaXRlZCBieSBVLlMuIGNvcHlyaWdodCBsYXcsIHRoZSBlcXVpdmFsZW50IGxhd3Mgb2Ygb3RoZXIKK2NvdW50cmllcywgYW5kIGJ5IGludGVybmF0aW9uYWwgdHJlYXR5LiBUaGVyZWZvcmUsIGJ5IGV4ZXJjaXNpbmcgYW55CitvZiB0aGUgcmlnaHRzIGdyYW50ZWQgdG8gWW91IGluIFNlY3Rpb25zIDEgYW5kIDIgaGVyZWluLCBZb3UgaW5kaWNhdGUKK1lvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCitUaGlzIGxpY2Vuc2Ugc2hhbGwgdGVybWluYXRlIGltbWVkaWF0ZWx5IGFuZCB5b3UgbWF5IG5vIGxvbmdlcgorZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZCB0byBZb3UgYnkgdGhpcyBMaWNlbnNlIHVwb24gWW91cgorZmFpbHVyZSB0byBob25vciB0aGUgcHJvdmlzbyBpbiBTZWN0aW9uIDEoYykgaGVyZWluLgorCis5KSBNdXR1YWwgVGVybWluYXRpb24gZm9yIFBhdGVudCBBY3Rpb24uIFRoaXMgTGljZW5zZSBzaGFsbCB0ZXJtaW5hdGUKK2F1dG9tYXRpY2FsbHkgYW5kIFlvdSBtYXkgbm8gbG9uZ2VyIGV4ZXJjaXNlIGFueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQKK3RvIFlvdSBieSB0aGlzIExpY2Vuc2UgaWYgWW91IGZpbGUgYSBsYXdzdWl0IGluIGFueSBjb3VydCBhbGxlZ2luZwordGhhdCBhbnkgT1NJIENlcnRpZmllZCBvcGVuIHNvdXJjZSBzb2Z0d2FyZSB0aGF0IGlzIGxpY2Vuc2VkIHVuZGVyIGFueQorbGljZW5zZSBjb250YWluaW5nIHRoaXMgIk11dHVhbCBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbiIgY2xhdXNlCitpbmZyaW5nZXMgYW55IHBhdGVudCBjbGFpbXMgdGhhdCBhcmUgZXNzZW50aWFsIHRvIHVzZSB0aGF0IHNvZnR3YXJlLgorCisxMCkgSnVyaXNkaWN0aW9uLCBWZW51ZSBhbmQgR292ZXJuaW5nIExhdy4gWW91IGFncmVlIHRoYXQgYW55IGxhd3N1aXQKK2FyaXNpbmcgdW5kZXIgb3IgcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIG1haW50YWluZWQgaW4gdGhlCitjb3VydHMgb2YgdGhlIGp1cmlzZGljdGlvbiB3aGVyZWluIHRoZSBMaWNlbnNvciByZXNpZGVzIG9yIGluIHdoaWNoCitMaWNlbnNvciBjb25kdWN0cyBpdHMgcHJpbWFyeSBidXNpbmVzcywgYW5kIHVuZGVyIHRoZSBsYXdzIG9mIHRoYXQKK2p1cmlzZGljdGlvbiBleGNsdWRpbmcgaXRzIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBUaGUgYXBwbGljYXRpb24KK29mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwKK1NhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgdXNlIG9mIHRoZSBPcmlnaW5hbCBXb3JrCitvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2Ugb3IgYWZ0ZXIgaXRzIHRlcm1pbmF0aW9uIHNoYWxsIGJlCitzdWJqZWN0IHRvIHRoZSByZXF1aXJlbWVudHMgYW5kIHBlbmFsdGllcyBvZiB0aGUgVS5TLiBDb3B5cmlnaHQgQWN0LAorMTcgVS5TLkMuIMKnIDEwMSBldCBzZXEuLCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kCitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhpcyBzZWN0aW9uIHNoYWxsIHN1cnZpdmUgdGhlIHRlcm1pbmF0aW9uIG9mCit0aGlzIExpY2Vuc2UuCisKKzExKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzEzKSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIHlvdS4KK0ZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3QKK29yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksCit3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudAorKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcAorb2Ygc3VjaCBlbnRpdHkuCisKK1RoaXMgbGljZW5zZSBpcyBDb3B5cmlnaHQgKEMpIDIwMDIgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCmRpZmYgLS1naXQgYS9DT1BZSU5HLkdQTCBiL0NPUFlJTkcuR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTQ5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLkdQTApAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9DUkVBVEUtTUlOSSBiL0NSRUFURS1NSU5JCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MWQ0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9DUkVBVEUtTUlOSQpAQCAtMCwwICsxLDQ3IEBACittYWtlIGRpc3QKKwordGFyIGp4ZiBlbGZ1dGlscy0qLnRhci5iejIKKworY2QgZWxmdXRpbHMtKgorCitjcCAtYSAkc3JjZGlyL2Zha2Utc3JjIC4KKworQ2hhbmdlIFNVQkRJUlMgaW4gTWFrZWZpbGUuYW0gdG8gb25seSAkKG1pbmlfU1VCRElSUykgcGx1cyBmYWtlLXNyYworICAgICAgIFJlbW92ZSBDT1BZSU5HLkdQTCBmcm9tIEVYVFJBX0RJU1QKKworUmVtb3ZlIGFsbCBBQ19DT05GSUdfRklMRVMgbGluZXMgaW4gY29uZmlndXJlLmFjIGFjY2VwdAorQUNfQ09ORklHX0ZJTEVTKFtjb25maWcvTWFrZWZpbGVdKQorQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCitBQ19DT05GSUdfRklMRVMoW200L01ha2VmaWxlXSkKK0FDX0NPTkZJR19GSUxFUyhbZWxmdXRpbHMuc3BlYzpjb25maWcvZWxmdXRpbHMuc3BlYy5pbl0pCitBQ19DT05GSUdfRklMRVMoW2xpYi9NYWtlZmlsZV0pCitBQ19DT05GSUdfRklMRVMoW2xpYmVsZi9NYWtlZmlsZSBsaWJlbGYtcG8vTWFrZWZpbGUuaW5dKQorCitBZGQKK0FDX0NPTkZJR19GSUxFUyhbZmFrZS1zcmMvTWFrZWZpbGVdKQorCitDaGFuZ2UgbGliL01ha2VmaWxlLmFtOgorICBsaWJldV9hX1NPVVJDRVMgb25seSBuZXh0X3ByaW1lLmMgY3JjMzIuYworICBub2luc3RfSEVBREVSUyBvbmx5IGZpeGVkc2l6ZWhhc2guaCBzeXN0ZW0uaAorICByZW1vdmUgRVhUUkFfRElTVAorICByZW1vdmUgeG1hbGxvY19ub19XZXJyb3IKKworbXYgQ09QWUlORy5HUEwgQ09QWUlORworCitzZXQgZ3BsIGFuZCBmYWtlIGF0IGJlZ2lubmluZyBvZiBlbGZ1dGlscy5zcGVjLmluIHRvIDEKKworYXV0b21ha2UKKworYXV0b2NvbmYKKworbWtkaXIgYnVpbGQKKworY2QgYnVpbGQKKworLi4vY29uZmlndXJlCisKK21ha2UKKworbWFrZSBkaXN0CisKK3JwbWJ1aWxkIC10YSBlbGZ1dGlscy0qLnRhci5negpkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjFjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxMTIgQEAKKzIwMDUtMDctMjEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogVGFrZSAtLWVuYWJsZS1saWJlYmwtc3ViZGlyPURJUiB0byBzZXQgTElCRUJMX1NVQkRJUi4KKworMjAwNS0wNi0wMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGFsbF9TVUJESVJTKTogQWRkIGxpYmR3ZmwuCisJKiBjb25maWd1cmUuYWM6IFdyaXRlIGxpYmR3ZmwvTWFrZWZpbGUuCisKKzIwMDUtMDUtMTkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYyBbQUhfQk9UVE9NXSAoSU5UREVDTCwgX0lOVERFQ0wpOiBOZXcgbWFjcm9zLgorCisyMDA1LTA1LTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOiBEZWZpbmUgTU9EVkVSU0lPTiBpbiBjb25maWcuaC4KKworMjAwNS0wMi0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChhbGxfU1VCRElSUyk6IERvbid0IGFkZCBkb2Mgc3ViZGlyIGZvciBub3cuCisJKiBjb25maWd1cmUuYWM6IERvbid0IHVzZSBkb2Mgc3ViZGlyIGZvciBub3cuCisKKzIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6IFJlbW92ZSBBTV9HTlVfR0VUVEVYVCB1c2UuICBVc2Ugb25seSBBTV9QT19TVUJESVJTLgorCisyMDA1LTAyLTA2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjIChBTV9JTklUX0FVVE9NQUtFKTogUmVtb3ZlZCBkaXN0LWJ6aXAyLgorCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IFJlbW92ZSBzcGxpbnQucmMuCisJKiBzcGxpbnQucmM6IFJlbW92ZWQuCisKKzIwMDQtMDktMjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6IE1ha2UgY29tcGlsZSB3aXRoIGdjYyA0LjAuCisKKzIwMDQtMDMtMDYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6IFVzZSBBU19IRUxQX1NUUklORyB3aGVyZSBhcHBsaWNhYmxlLgorCisyMDA0LTAxLTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOiBDaGVjayBmb3IgQzk5IGNvbXBpbGVyLgorCisJKiBjb25maWd1cmUuYWM6IENoYW5nZSBsb2NraW5nIG1hY3JvcyBpbiBjb25maWcuaCB0byBhdCBsZWFzdAorCWV2YWx1YXRlIHRoZSBwYXJhbWV0ZXIuICBEZWZpbmUgYmFzZV9jcHUgdG8gbm9uZSBmb3IgZ2VuZXJpYyBsaW5rZXIuCisKKzIwMDQtMDEtMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6IFByaW50IGVycm9yIG1lc3NhZ2UgaW4gY2FzZSAtLWRpc2FibGUtZ2VuZXJpYyBpcworCXVzZWQgaWYgbm8gbGlua2VyIHN1cHBvcnQgZm9yIHRoZSBhcmNoaXRlY3R1cmUgaXMgYXZhaWxhYmxlLgorCisyMDA0LTAxLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOiBEb250IGdlbmVyYXRlIGxpYmVibC1wby9NYWtlZmlsZS5pbiwKKwlsaWJkdy1wby9NYWtlZmlsZS5pbiwgbGliYXNtLXBvL01ha2VmaWxlLmluLgorCisJKiBNYWtlZmlsZS5hbSAoYWxsX1NVQkRJUlMpOiBSZW1vdmUgbGliZWJsLXBvLCBsaWJkdy1wbywgbGliYXNtLXBvLgorCisyMDA0LTAxLTE3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOiBQcmV0dHkgcHJpbnRpbmcgb2YgaGVscCBtZXNzYWdlLgorCisJKiBjb25maWd1cmUuYWM6IE1vdmUgQUNfU1lTX0xBUkdFRklMRSB0ZXN0IHRvIHRoZSBmcm9udC4KKworCSogY29uZmlndXJlLmFjOiBBZGQgLS1lbmFibGUtbXVkZmxhcCBvcHRpb24uCisKKzIwMDQtMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6IE1ham9yIGNsZWFudXBzLiAgVXNlIGF1eCBkaXIuCisJKiBjb25maWcuZ3Vlc3M6IE1vdmVkIHRvIG5ldyBjb25maWcgc3ViZGlyLgorCSogY29uZmlnLnJwYXRoOiBMaWtld2lzZS4KKwkqIGNvbmZpZy5zdWI6IExpa2V3aXNlLgorCSogZGVwY29tcDogTGlrZXdpc2UuCisJKiBpbnN0YWxsLXNoOiBMaWtld2lzZS4KKwkqIG1pc3Npbmc6IExpa2V3aXNlLgorCSogbWtpbnN0YWxsZGlyczogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5hbSAobWluaV9TVUJESVJTKTogQWRkIGNvbmZpZy4KKwkoRVhUUkFfRElTVCk6IFJlbW92ZSBjb25maWcucnBhdGguCisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIEFDX1JFVklTSU9OLgorCisJKiBjb25maWd1cmUuYWM6IEFkZCAtLWVuYWJsZS1tdWRmbGFwIG9wdGlvbi4KKworMjAwNC0wMS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogRHJvcCBsaWJkd2FyZiBkaXJlY3RvcnkuICBBZGQgbGliZHctcG8uCisJKiBNYWtlZmlsZS5hbSAoYWxsX1NVQkRJUlMpOiBMaWtld2lzZS4KKwkqIGVsZnV0aWxzLnNwZWM6IERvbid0IGRpc3RyaWJ1dGUgYW55dGhpbmcgZnJvbSBsaWJkd2FyZi4KKworMjAwNC0wMS0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IHNlcGFyYXRlIGxpYmVsZiBidWlsdC4KKworCSogZWxmdXRpbHMuc3BlYy5pbjogQ3JlYXRlIHNlcGFyYXRhIGVsZnV0aWxzLWxpYmVsZi1kZXZlbCBwYWNrYWdlLgorCUluc3RhbGwgbGliZHcgRFNPcy4KKworCSogY29uZmlndXJlLmFjIChBQ19DT05GSUdfU1JDRElSKTogVXNlIGxpYmVsZi9saWJlbGYuaCBhcyB0aGUgZmlsZQorCW5hbWUuCisKKzIwMDMtMDgtMTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBlbGZ1dGlscy5zcGVjLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBsaWJlYmwuc28uCisKKzIwMDMtMDgtMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNb3ZlZCB0byBDVlMgYXJjaGl2ZS4KKworMjAwMC0wOC0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIFRoZSBiZWdpbm5pbmcuICBTZWUgdGhlIE5FV1MgZmlsZSBmb3IgdGhlIHRpbWUgYmVpbmcuCmRpZmYgLS1naXQgYS9HUEctS0VZIGIvR1BHLUtFWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDYwZjgyCi0tLSAvZGV2L251bGwKKysrIGIvR1BHLUtFWQpAQCAtMCwwICsxLDMzIEBACitQdWJsaWMga2V5IGZvciBkcmVwcGVyQHJlZGhhdC5jb20KKy0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorVmVyc2lvbjogR251UEcgdjEuMi4xIChHTlUvTGludXgpCisKK21RR2lCRHVGdGgwUkJBQ1BjSEVreXFKRTI2d1RYdXV1Q3hwcUpqeGxCbk5Ga0pHa1dVb2V1ODlRanpXZ3pYeS8KK0VBOCtwdE5CZ0NUUEtuTEVxaGtSVXl4QVQvVXordCt4YktxVXRMNTRJellmeE80TlFzTi9WVk0wdXBwTmZJSmIKK01XdkFqdnBwMkhDa2QvMzJpNjkzcmxIK0c5ZHZHOEs1N2J5M1BCUkhCZ0gyTDhRN3QvUXZBMkFXcHdDZ3pva1gKK0REVWlpdHlzR240cldPMHJCQm9SNk9FRC8zZWhwY0h0YkdpeE5vdWJSWkF4cHc5OVZUS3MvSTc2T2tyUXpxY20KKyt3K3p3WmVpaEpYQzg4eUFIQTc3L0xCQjNZS2FYM0c0Q21EUVViZVJKOXpQbEVUVExtUk1jRjYxZFFkcS8zcVYKK0JpcTFzbTZjdFo0dUVwbThIbnlzS01UK1ZZNFhtajlMTHpGMkJkSU5HOWZyY1g5cms4VmsyNWlDTEJyb25TME0KK0lVM1dBL3NFdmxVRmxmYnlDQlJCb3ErUmxyOXUwNWZuSGM3Q0xNS0k3RUlTMVQxZExQeEgxaXZ1VWh5WU5HQU0KK1JoQ2l2QmJUMlowdC9SNGtzdTNWZG5QR2tDeUFBZFdOU2FmU0dxQ1lVelFIMHU1WjhISzZjMmlYcklYM0lwazUKK0RoUU9RNmsxdHlZenVRdzNjQ2Y3UllSSjkvaXVwOFJsc2NWdDJrbUduU3VjcXB4SkNiUWpWV3h5YVdOb0lFUnkKK1pYQndaWElnUEdSeVpYQndaWEpBY21Wa2FHRjBMbU52YlQ2SVZ3UVRFUUlBRndVQ080VzJIUVVMQndvREJBTVYKK0F3SURGZ0lCQWhlQUFBb0pFTm9vd2pwNS8wUjBTcVVBb0w1SEJiYVJXUjE5dmpsZFVlSnZZQ0cyQVI5NEFLREwKK25tVkVheWthWld5eU5nME9UdXhMZTFib2E0aEdCQkFSQWdBR0JRSThpUUR2QUFvSkVGV1czUXpwdjJVOTd3Z0EKK24xUlZsNkZiSUhWVm1UMjI0bk9wNWI5OE9aVm5BSjllaFh6TTYwUmJtR2kza0pOUzMwSUkrU0dmdDRoR0JCTVIKK0FnQUdCUUk5VHZ0MEFBb0pFUDNTM3F6VE04dWhVeTBBb05xQVRCajJ1c0V0SmR1R0h1a0taOW1RYXljRkFKOXkKK2xxME1tWkp3TVozNjk5ZTZyZ01pSEFNQVZia0NEUVE3aGJaUEVBZ0F6dUZBUHExc1lVdHBKQ2x3WDcrcGR6MUsKK2RJZ2J4REtvU0hoMnJTUngyNEhMWVkveGc5cHM2ZlpGMjEvU0JpYWxLYUI4QkZuSWVoOFM5TFhVdFd0OWFVZUMKK2tsbm5Rd1BiUjBCR1JjWkFTNytuSFo5YWdpTWQ0Q1JlNFJXRm1TNktoSWVVc0RhNzArOFhoSW0vQytPZ2Q3YWcKK2tCdzd5a1RiL2pXSE15dmNQOWlZMFF0bUlhdGZWVERKVW03Um01VHRNMW1EQ21sL2dXSVFKNWV6cjlndjJOVUcKKzNrcE5Zd1ArRzlvNEJMeVRPSGFtaXgvMFlISS9IaVpTWWl3cTQwYW8welJPZC95WFk2L2EzbWl0Tjk2QWlkSkwKKzVJNXRicW5yRnk2TG1SdldteU94V2tKRC9iRjMxcnJPNVBmVlVnY1ZwVXhidFc0NFB0VmlsaEx1aCtxalR3QUQKK0JRZitOVEh3alV3MWorUFpzL3k1WG5QdzB4MFpkWUdFbDBJN05xdE1nQ3hJNFpIVDlqYUxjTFhBUmIzVVZFdWMKKzFMdUoxdEFBMXNzMWMxTkxLM0xnK3VaemVLTVJmZlJZRVVnMEVtZXI4UUdXcjF1U094REhjQXp1UlpYM1BZTlgKK2NFR0V5RW00NDNERG5Yci80Yjh6WUs2TytzeTFMZCtTVnh4cDZqd3RrMEx5VDdva2dEMEUxZERVelgrcXhwc1YKK3VqYnpkSDRiZHFvY0tvdU1OTVQrQkhlb2JOWnBSNFR5ejUrcHdXK3J3MStYWmVieUJVa0lQWE9vV1BacFVUREcKK2ZaK29tOXhmZzBKT2NLWklaMFg5MWRMUXA1eDk5YUNtendXZVd5OUxGUFRBZjlwWWt5OHdYenRlRW90RS9Ua20KK0RlQTFjYVBDOUlFSzlCQnJyUzlUZXVickVJaEdCQmdSQWdBR0JRSTdoYlpQQUFvSkVOb293anA1LzBSMFozOEEKK21nTTRGQXF1d2x0SDBvb1RkQW1CTW9DZktiNC9BSjl1ZkFoNFJsOXNGYUNpZS9qOGpkbzAyYmNWMUE9PQorPVlldWEKKy0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KZGlmZiAtLWdpdCBhL0lOU1RBTEwgYi9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MmExN2EKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMCkBAIC0wLDAgKzEsMTgyIEBACitCYXNpYyBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PQorCisgICBUaGVzZSBhcmUgZ2VuZXJpYyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorCisgICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgordmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKK3Rob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgorSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50CitkZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKK3lvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYSBmaWxlCitgY29uZmlnLmNhY2hlJyB0aGF0IHNhdmVzIHRoZSByZXN1bHRzIG9mIGl0cyB0ZXN0cyB0byBzcGVlZCB1cAorcmVjb25maWd1cmluZywgYW5kIGEgZmlsZSBgY29uZmlnLmxvZycgY29udGFpbmluZyBjb21waWxlciBvdXRwdXQKKyh1c2VmdWwgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScpLgorCisgICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Cit0byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCitkaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCitiZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgYXQgc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJworY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorCisgICBUaGUgZmlsZSBgY29uZmlndXJlLmluJyBpcyB1c2VkIHRvIGNyZWF0ZSBgY29uZmlndXJlJyBieSBhIHByb2dyYW0KK2NhbGxlZCBgYXV0b2NvbmYnLiAgWW91IG9ubHkgbmVlZCBgY29uZmlndXJlLmluJyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UKK2l0IG9yIHJlZ2VuZXJhdGUgYGNvbmZpZ3VyZScgdXNpbmcgYSBuZXdlciB2ZXJzaW9uIG9mIGBhdXRvY29uZicuCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6CisKKyAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQorICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uICBJZiB5b3UncmUKKyAgICAgdXNpbmcgYGNzaCcgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKKyAgICAgYHNoIC4vY29uZmlndXJlJyBpbnN0ZWFkIHRvIHByZXZlbnQgYGNzaCcgZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZQorICAgICBgY29uZmlndXJlJyBpdHNlbGYuCisKKyAgICAgUnVubmluZyBgY29uZmlndXJlJyB0YWtlcyBhd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMgc29tZQorICAgICBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KKworICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgorCisgIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAorICAgICB0aGUgcGFja2FnZS4KKworICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKKyAgICAgZG9jdW1lbnRhdGlvbi4KKworICA1LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCisgICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCisgICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgorICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKKyAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5CisgICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0CisgICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQorICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK0NvbXBpbGVycyBhbmQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Cit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBZb3UgY2FuIGdpdmUgYGNvbmZpZ3VyZScKK2luaXRpYWwgdmFsdWVzIGZvciB2YXJpYWJsZXMgYnkgc2V0dGluZyB0aGVtIGluIHRoZSBlbnZpcm9ubWVudC4gIFVzaW5nCithIEJvdXJuZS1jb21wYXRpYmxlIHNoZWxsLCB5b3UgY2FuIGRvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSBsaWtlCit0aGlzOgorICAgICBDQz1jODkgQ0ZMQUdTPS1PMiBMSUJTPS1scG9zaXggLi9jb25maWd1cmUKKworT3Igb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlIGBlbnYnIHByb2dyYW0sIHlvdSBjYW4gZG8gaXQgbGlrZSB0aGlzOgorICAgICBlbnYgQ1BQRkxBR1M9LUkvdXNyL2xvY2FsL2luY2x1ZGUgTERGTEFHUz0tcyAuL2NvbmZpZ3VyZQorCitDb21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKK3NhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgorb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBhIHZlcnNpb24gb2YgYG1ha2UnIHRoYXQKK3N1cHBvcnRzIHRoZSBgVlBBVEgnIHZhcmlhYmxlLCBzdWNoIGFzIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQorZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KK3RoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCitzb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuCisKKyAgIElmIHlvdSBoYXZlIHRvIHVzZSBhIGBtYWtlJyB0aGF0IGRvZXMgbm90IHN1cHBvcnRzIHRoZSBgVlBBVEgnCit2YXJpYWJsZSwgeW91IGhhdmUgdG8gY29tcGlsZSB0aGUgcGFja2FnZSBmb3Igb25lIGFyY2hpdGVjdHVyZSBhdCBhIHRpbWUKK2luIHRoZSBzb3VyY2UgY29kZSBkaXJlY3RvcnkuICBBZnRlciB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhlIHBhY2thZ2UgZm9yCitvbmUgYXJjaGl0ZWN0dXJlLCB1c2UgYG1ha2UgZGlzdGNsZWFuJyBiZWZvcmUgcmVjb25maWd1cmluZyBmb3IgYW5vdGhlcgorYXJjaGl0ZWN0dXJlLgorCitJbnN0YWxsYXRpb24gTmFtZXMKKz09PT09PT09PT09PT09PT09PQorCisgICBCeSBkZWZhdWx0LCBgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2UncyBmaWxlcyBpbgorYC91c3IvbG9jYWwvYmluJywgYC91c3IvbG9jYWwvbWFuJywgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuCitpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gYC91c3IvbG9jYWwnIGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUKK29wdGlvbiBgLS1wcmVmaXg9UEFUSCcuCisKKyAgIFlvdSBjYW4gc3BlY2lmeSBzZXBhcmF0ZSBpbnN0YWxsYXRpb24gcHJlZml4ZXMgZm9yCithcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmlsZXMgYW5kIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcy4gIElmIHlvdQorZ2l2ZSBgY29uZmlndXJlJyB0aGUgb3B0aW9uIGAtLWV4ZWMtcHJlZml4PVBBVEgnLCB0aGUgcGFja2FnZSB3aWxsIHVzZQorUEFUSCBhcyB0aGUgcHJlZml4IGZvciBpbnN0YWxsaW5nIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMuCitEb2N1bWVudGF0aW9uIGFuZCBvdGhlciBkYXRhIGZpbGVzIHdpbGwgc3RpbGwgdXNlIHRoZSByZWd1bGFyIHByZWZpeC4KKworICAgSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYW4gdW51c3VhbCBkaXJlY3RvcnkgbGF5b3V0IHlvdSBjYW4gZ2l2ZQorb3B0aW9ucyBsaWtlIGAtLWJpbmRpcj1QQVRIJyB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMgZm9yIHBhcnRpY3VsYXIKK2tpbmRzIG9mIGZpbGVzLiAgUnVuIGBjb25maWd1cmUgLS1oZWxwJyBmb3IgYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcworeW91IGNhbiBzZXQgYW5kIHdoYXQga2luZHMgb2YgZmlsZXMgZ28gaW4gdGhlbS4KKworICAgSWYgdGhlIHBhY2thZ2Ugc3VwcG9ydHMgaXQsIHlvdSBjYW4gY2F1c2UgcHJvZ3JhbXMgdG8gYmUgaW5zdGFsbGVkCit3aXRoIGFuIGV4dHJhIHByZWZpeCBvciBzdWZmaXggb24gdGhlaXIgbmFtZXMgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQorb3B0aW9uIGAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCcgb3IgYC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYJy4KKworT3B0aW9uYWwgRmVhdHVyZXMKKz09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgcGFja2FnZXMgcGF5IGF0dGVudGlvbiB0byBgLS1lbmFibGUtRkVBVFVSRScgb3B0aW9ucyB0bworYGNvbmZpZ3VyZScsIHdoZXJlIEZFQVRVUkUgaW5kaWNhdGVzIGFuIG9wdGlvbmFsIHBhcnQgb2YgdGhlIHBhY2thZ2UuCitUaGV5IG1heSBhbHNvIHBheSBhdHRlbnRpb24gdG8gYC0td2l0aC1QQUNLQUdFJyBvcHRpb25zLCB3aGVyZSBQQUNLQUdFCitpcyBzb21ldGhpbmcgbGlrZSBgZ251LWFzJyBvciBgeCcgKGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtKS4gIFRoZQorYFJFQURNRScgc2hvdWxkIG1lbnRpb24gYW55IGAtLWVuYWJsZS0nIGFuZCBgLS13aXRoLScgb3B0aW9ucyB0aGF0IHRoZQorcGFja2FnZSByZWNvZ25pemVzLgorCisgICBGb3IgcGFja2FnZXMgdGhhdCB1c2UgdGhlIFggV2luZG93IFN5c3RlbSwgYGNvbmZpZ3VyZScgY2FuIHVzdWFsbHkKK2ZpbmQgdGhlIFggaW5jbHVkZSBhbmQgbGlicmFyeSBmaWxlcyBhdXRvbWF0aWNhbGx5LCBidXQgaWYgaXQgZG9lc24ndCwKK3lvdSBjYW4gdXNlIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGAtLXgtaW5jbHVkZXM9RElSJyBhbmQKK2AtLXgtbGlicmFyaWVzPURJUicgdG8gc3BlY2lmeSB0aGVpciBsb2NhdGlvbnMuCisKK1NwZWNpZnlpbmcgdGhlIFN5c3RlbSBUeXBlCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUaGVyZSBtYXkgYmUgc29tZSBmZWF0dXJlcyBgY29uZmlndXJlJyBjYW4gbm90IGZpZ3VyZSBvdXQKK2F1dG9tYXRpY2FsbHksIGJ1dCBuZWVkcyB0byBkZXRlcm1pbmUgYnkgdGhlIHR5cGUgb2YgaG9zdCB0aGUgcGFja2FnZQord2lsbCBydW4gb24uICBVc3VhbGx5IGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKK2EgbWVzc2FnZSBzYXlpbmcgaXQgY2FuIG5vdCBndWVzcyB0aGUgaG9zdCB0eXBlLCBnaXZlIGl0IHRoZQorYC0taG9zdD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCit0eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aXRoIHRocmVlIGZpZWxkczoKKyAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCisKK1NlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCitgY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0CituZWVkIHRvIGtub3cgdGhlIGhvc3QgdHlwZS4KKworICAgSWYgeW91IGFyZSBidWlsZGluZyBjb21waWxlciB0b29scyBmb3IgY3Jvc3MtY29tcGlsaW5nLCB5b3UgY2FuIGFsc28KK3VzZSB0aGUgYC0tdGFyZ2V0PVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAorcHJvZHVjZSBjb2RlIGZvciBhbmQgdGhlIGAtLWJ1aWxkPVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2YKK3N5c3RlbSBvbiB3aGljaCB5b3UgYXJlIGNvbXBpbGluZyB0aGUgcGFja2FnZS4KKworU2hhcmluZyBEZWZhdWx0cworPT09PT09PT09PT09PT09PQorCisgICBJZiB5b3Ugd2FudCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGBjb25maWd1cmUnIHNjcmlwdHMgdG8gc2hhcmUsCit5b3UgY2FuIGNyZWF0ZSBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbGxlZCBgY29uZmlnLnNpdGUnIHRoYXQgZ2l2ZXMKK2RlZmF1bHQgdmFsdWVzIGZvciB2YXJpYWJsZXMgbGlrZSBgQ0MnLCBgY2FjaGVfZmlsZScsIGFuZCBgcHJlZml4Jy4KK2Bjb25maWd1cmUnIGxvb2tzIGZvciBgUFJFRklYL3NoYXJlL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMsIHRoZW4KK2BQUkVGSVgvZXRjL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMuICBPciwgeW91IGNhbiBzZXQgdGhlCitgQ09ORklHX1NJVEUnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2l0ZSBzY3JpcHQuCitBIHdhcm5pbmc6IG5vdCBhbGwgYGNvbmZpZ3VyZScgc2NyaXB0cyBsb29rIGZvciBhIHNpdGUgc2NyaXB0LgorCitPcGVyYXRpb24gQ29udHJvbHMKKz09PT09PT09PT09PT09PT09PQorCisgICBgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdAorb3BlcmF0ZXMuCisKK2AtLWNhY2hlLWZpbGU9RklMRScKKyAgICAgVXNlIGFuZCBzYXZlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBpbiBGSUxFIGluc3RlYWQgb2YKKyAgICAgYC4vY29uZmlnLmNhY2hlJy4gIFNldCBGSUxFIHRvIGAvZGV2L251bGwnIHRvIGRpc2FibGUgY2FjaGluZywgZm9yCisgICAgIGRlYnVnZ2luZyBgY29uZmlndXJlJy4KKworYC0taGVscCcKKyAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0tcXVpZXQnCitgLS1zaWxlbnQnCitgLXEnCisgICAgIERvIG5vdCBwcmludCBtZXNzYWdlcyBzYXlpbmcgd2hpY2ggY2hlY2tzIGFyZSBiZWluZyBtYWRlLiAgVG8KKyAgICAgc3VwcHJlc3MgYWxsIG5vcm1hbCBvdXRwdXQsIHJlZGlyZWN0IGl0IHRvIGAvZGV2L251bGwnIChhbnkgZXJyb3IKKyAgICAgbWVzc2FnZXMgd2lsbCBzdGlsbCBiZSBzaG93bikuCisKK2AtLXNyY2Rpcj1ESVInCisgICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKKyAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgorCitgLS12ZXJzaW9uJworICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJworICAgICBzY3JpcHQsIGFuZCBleGl0LgorCitgY29uZmlndXJlJyBhbHNvIGFjY2VwdHMgc29tZSBvdGhlciwgbm90IHdpZGVseSB1c2VmdWwsIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjdhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM2IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGNyZWF0ZSBNYWtlZmlsZS5pbgorIyMgQ29uZmlndXJlIGlucHV0IGZpbGUgZm9yIGVsZnV0aWxzLgorIyMKKyMjIENvcHlyaWdodCAoQykgMTk5Ni0yMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyMjCisjIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyMjCisjIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyMKKyMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyMgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMjCitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNAorCittaW5pX1NVQkRJUlMgPSBjb25maWcgbTQgbGliIGxpYmVsZiBsaWJlbGYtcG8KKyMgQWRkIGRvYyBiYWNrIHdoZW4gd2UgaGF2ZSBzb21lIHJlYWwgY29udGVudC4KK2FsbF9TVUJESVJTID0gbGliZWJsIGxpYmR3IGxpYmR3ZmwgbGliY3B1IGxpYmFzbSBzcmMgcG8gdGVzdHMKK1NVQkRJUlMgPSAkKG1pbmlfU1VCRElSUykgJChhbGxfU1VCRElSUykKKworRVhUUkFfRElTVCA9IGVsZnV0aWxzLnNwZWMgR1BHLUtFWSBOT1RFUyBDT1BZSU5HLkdQTAorCitkaXN0Y2hlY2staG9vazoKKwljaG1vZCAtUiB1K3cgJChkaXN0ZGlyKQorCitycG06IGRpc3QKKwlycG1idWlsZCAtdHMgLS1zaWduIGVsZnV0aWxzLUBQQUNLQUdFX1ZFUlNJT05ALnRhci5negorCisjIFRlbGwgdmVyc2lvbiAzLjc5IGFuZCB1cCBvZiBHTlUgbWFrZSB0byBub3QgYnVpbGQgZ29hbHMgaW4gdGhpcworIyBkaXJlY3RvcnkgaW4gcGFyYWxsZWwuCisuTk9UUEFSQUxMRUw6CmRpZmYgLS1naXQgYS9ORVdTIGIvTkVXUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2RkZmJiCi0tLSAvZGV2L251bGwKKysrIGIvTkVXUwpAQCAtMCwwICsxLDc4NiBAQAorVmVyc2lvbiAwLjExMDoKKworbGliZWxmOiBmaXggYSBudW1iZSByb2YgcHJvYmxlbXMgd2l0aCBlbGZfdXBkYXRlCisKK2VsZmNtcDogZml4IGEgZmV3IGJ1Z3MuICBDb21wYXJlIGdhcHMuCisKK0ZpeCBhIGZldyBQTFQgcHJvYmxlbXMgYW5kIG11ZGZsYXAgYnVpbGQgaXNzdWVzLgorCitsaWJlYmw6IERvbid0IGV4cG9zZSBFYmwgc3RydWN0dXJlIGRlZmluaXRpb24gaW4gbGliZWJsLmguICBJdCdzIG5vdyBwcml2YXRlLgorCitWZXJzaW9uIDAuMTA5OgorCitsaWJlYmw6IENoZWNrIGZvciBtYXRjaGluZyBtb2R1bGVzLgorCitlbGZsaW50OiBDaGVjayB0aGF0IGNvcHkgcmVsb2NhdGlvbnMgb25seSBoYXBwZW4gZm9yIE9CSkVDVCBvciBOT1RZUEUgc3ltYm9scy4KKworZWxmY21wOiBOZXcgcHJvZ3JhbS4KKworbGliZHdmbDogTmV3IGxpYnJhcnkuCisKK1ZlcnNpb24gMC4xMDg6CisKK3N0cmlwOiBmaXggYnVnIGludHJvZHVjZWQgaW4gbGFzdCBjaGFuZ2UKKworbGliZHc6IHJlY29yZHMgcmV0dXJuZWQgYnkgZHdhcmZfZ2V0c3JjbGluZXMgYXJlIG5vdyBzb3J0ZWQgYnkgYWRkcmVzcworCitWZXJzaW9uIDAuMTA3OgorCityZWFkZWxmOiBpbXByb3ZlIERXQVJGIG91dHB1dCBmb3JtYXQKKworc3RyaXA6IHN1cHBvcnQgTGludXgga2VybmVsIG1vZHVsZXMKKworVmVyc2lvbiAwLjEwNjoKKworbGliZHc6IFVwZGF0ZWQgZHdhcmYuaCBmcm9tIERXQVJGMyBzcGVjCitsaWJkdzogYWRkIG5ldyBmdW50aW9ucyBkd2FyZl9mdW5jX2VudHJ5cGMsIGR3YXJmX2Z1bmNfZmlsZSwgZHdhcmZfZnVuY19saW5lLAorZHdhcmZfZnVuY19jb2wsIGR3YXJmX2dldHNyY19maWxlCisKK1ZlcnNpb24gMC4xMDU6CisKK2FkZHIybGluZTogTmV3IHByb2dyYW0KKworbGliZHc6IGFkZCBuZXcgZnVuY3Rpb25zOiBkd2FyZl9hZGRyZGllLCBkd2FyZl9tYWNyb18qLCBkd2FyZl9nZXRmdW5jcywKK2R3YXJmX2Z1bmNfKi4KKworZmluZHRleHRyZWw6IHVzZSBkd2FyZl9hZGRyZGllCisKK1ZlcnNpb24gMC4xMDQ6CisKK2ZpbmR0ZXh0cmVsOiBOZXcgcHJvZ3JhbS4KKworVmVyc2lvbiAwLjEwMzoKKworbGliZHc6IEZpeCB1c2luZyBsaWJkdy5oIHdpdGggZ2NjIDwgNCBhbmQgQysrIGNvZGUuICBDb21waWxlciBidWcuCisKK1ZlcnNpb24gMC4xMDI6CisKK01vcmUgTWFrZWZpbGUgYW5kIHNwZWMgZmlsZSBjbGVhbnVwcy4KKworVmVyc2lvbiAwLjEwMToKKworUmVtb3ZlIG1vc3QgZ2V0dGV4dCBhdXRvY29uZiBoYW5kbGluZy4KKworQWRkIG1vcmUgd2FybmluZ3MKKworRml4IHJlc3VsdGluZyBwcm9ibGVtcy4gIE9uZSBhY3R1YWwgYnVnIGZvdW5kIGFuZCBmaXhlZCB0aGlzIHdheQorCitWZXJzaW9uIDAuMTAwOgorCitsaWJlYmw6IEZpeCB4ODYtNjQgcmVsb2NhdGlvbnMuCisKK0FkZCAtV3VudXNlZCAtV2V4dHJhIHdhcm5pbmdzLgorCitTb21lIGNsZWFudXBzIHJlc3VsdGluZyBmcm9tIHRob3NlIGFkZGl0aW9uYWwgd2FybmluZ3MuCisKK0xvdHMgb2YgTWFrZWZpbGUgY2xlYW51cC4KKworVmVyc2lvbiAwLjk5OgorCitsaWJlbGY6IGFkZCBnZWxmX2NoZWNrc3VtIHByb3RvdHlwZSB0byA8bGliZWxmLmg+CisKK2xpYmVsZjogZml4IGVsZipfY2hlY2tzdW0gaGFuZGxpbmcgb2YgTk9CSVRTIHNlY3Rpb25zCisKK0ZpbmlzaCBtdWRmbGFwIHN1cHBvcnQuCisKK0ZpeCB0aHJlZSBidWdzIGZvdW5kIGJ5IG11ZGZsYXAuCisKK2xkOiBhZGQgYXNfbmVlZGVkIHN1cHBvcnQKKworVmVyc2lvbiAwLjk4OgorCityZWFkZWxmOiBpbiBzZWN0aW9uIHRvIHNlZ21lbnQgbWFwcGluZywgaW5kaWNhdGUgcmVhZC1vbmx5IHNlY3Rpb25zLgorCitlbGZsaW50OiBtb3JlIHJlbGF4YXRpb24gZm9yIEdOVSBsZAorCitWZXJzaW9uIDAuOTc6CisKK0ZpeCBjb21waWxpbmcgd2l0aCBnY2MgNC4wLgorU29tZSB0ZXN0cyBjYWxsZWQgZWxmbGludCB3aXRob3V0IGFwcHJvcHJpYXRlIExEX0xJQlJBUllfUEFUSC4KKworVmVyc2lvbiAwLjk2OgorCitGaXggc3VwcG9ydCBmb3IgcGxhdGZvcm1zIHdpdGggbGliNjQuCisKK1ZlcnNpb24gMC45NToKKworbGliZWJsOiBhZGQgcHBjIGFuZCBwcGM2NCBzdXBwb3J0CisKK3JlYWRlbGY6IGZpeCBtaW5pbWFsIG1lbW9yeSBsZWFrLgorCitBZGQgc3VwcG9ydCB0byBjb21waWxlIHdpdGggbXVkZmxhcC4KKworTW9kZXJuaXplIGNvbmZpZ3VyZS5hYy4gIE1vdmUgc2NyaXB0cyBpbiBjb25maWcgc3ViZGlyLgorCitNb2Rlcm5pemUgKi1wbyBkaXJlY3RvcnkgaW5mcmFzdHJ1Y3R1cmUuCisKK2xpYmVsZjogQWRkIGdlbGZfZ2V0bGliIGFuZCBnZWxmX3VwZGF0ZV9saWIKKworcmVhZGVsZjogcHJpbnQgbGlibGlzdCBzZWN0aW9ucworCitWZXJzaW9uIDAuOTQ6CisKK0ZpeCBzb21lIG1pbmltYWwgYnVpbGQgcHJvYmxlbXMuCisKK1ZlcnNpb24gMC45MzoKKworaWJkdzogdG9ucyBvZiBuZXcgZnVuY3Rpb25hbGl0eSBhbmQgYnVnIGZpeGVzLiAgU2V2ZXJhbCBpbnRlcmZhY2UgY2hhbmdlcy4KKworcmVhZGVsZjogdXNlIGxpYmR3IG5vdy4KKworbGliZHdhcmY6IHJlbW92ZWQgY29tcGxldGVseS4KKworVmVyc2lvbiAwLjkyOgorCitjb25maWd1cmF0aW9uIGNoYW5nZXMuCisKK1ZlcnNpb24gMC45MToKKworbGliZHc6IGZpeCBtZW1vcnkgaGFuZGxpbmcuICBJbXBsZW1lbnQgc291cmNlIGxpbmUgaGFuZGxpbmcuCitubTogdXNlIGxpYmR3IGluc3RlYWQgb2YgbGliZHdhcmYuCitsaWJlbGY6IGNoYW5nZSB0byBHUEwgZnJvbSBPU0wxIGZvciBub3cuCisKK1ZlcnNpb24gMC45MDoKKworbGliZWJsOiBSZWNvZ25pemUgYSBmZXcgbW9yZSBzZWN0aW9uIHR5cGVzIGFuZCBkeW5hbWljIHRhZ3MgYW5kIHJldHVybgorYXBwcm9yaWF0ZSBzdHJpbmdzLgorCitWZXJzaW9uIDAuODk6CisKK3N0cmlwOiBmaXggb3ZlcndyaXRpbmcgb2Ygc3ltYm9sIHRhYmxlIGluIGlucHV0IGZpbGUuCisKK1ZlcnNpb24gMC44ODoKKworbGliZWJsOiBBZGQgc29tZSBpYTY0IGJpdHMuCisKK1ZlcnNpb24gMC44NzoKKworQnVnIGZpeGVzIGZvciBiaWcgZW5kaWFuIGFuZCBzb21lIDY0LWJpdCBtYWNoaW5lcy4KKworVmVyc2lvbiAwLjg2OgorCitzdHJpcDogZml4IGhhbmRsaW5nIG9mIEFscGhhIGFuZCBzMzkweCB3aGljaCB1c2UgaW5jb3JyZWN0IGhhc2ggYnVja2V0IHNpemVzLgorCitsZDogdG9ucyBvZiBjaGFuZ2VzLCBtb3ZpbmcgdG93YXJkcyB1c2FiaWxpdHkuCisKK1ZlcnNpb24gMC44NToKKworc3RyaXA6IHVwZGF0ZSBzZWN0aW9uIGdyb3VwIHN5bWJvbCBpbmRleCBpZiB0aGUgYXNzb2NpYXRlZCBzeW1ib2wgdGFibGUgY2hhbmdlZAorCitsaWJlbGY6IGZpeCB0d28gcHJvYmxlbXMgd2l0aCBnZW5lcmF0aW5nIG91dHB1dCBub3QgdmlhIG1tYXAKKworZWxmbGludDogYWRkIHByb2JhYmx5IDEwLTE1IG1vcmUgdGVzdHMKK2xpYmVibDogYWRkIHN1cHBvcnQgZm9yIHNvbWUgb2YgdGhlIG5ldyB0ZXN0cworCitsZDogZ2F6aWxsaW9uIGNoYW5nZXMKKworVmVyc2lvbiAwLjg0OgorCitlbGZsaW50OiBkZWFsIHdpdGggLnJlbC5keW4gc2VjdGlvbi4gIEZpeCBhIHByb2JsZW0gd2l0aCByZWxhIHBsYXRmb3Jtcy4KK0hhbmRsZSBQVF9HTlVfU1RBQ0suICBDaGFuZ2UgdG8gd3JpdGUgbWVzc2FnZXMgdG8gc3Rkb3V0LgorCityZWFkZWxmOiBmaXggYSBwcm9ibGVtIHdpdGggdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlIG91dHB1dC4KKworc3RyaXA6IHVwZGF0ZSBhbGwgdmVyc2lvbiBzeW1ib2wgdGFibGUgZW50cmllcworCitWZXJzaW9uIDAuODM6CisKK3NpemU6IGZpeCBhIHdhcm5pbmcKKworc3RyaXA6IGxhc3QgY2hhbmdlZCBjYXVzZWQgcHJvYmxlbXMgd2hlbiB0aGUgc3ltYm9sIHRhYmxlIGlzIGJlZm9yZSB0aGUKK3JlbG9jYXRpb24gc2VjdGlvbi4gIEZpeGVkLiAgVGhpcyBmaXggYWxzbyBpbXByb3ZlZCB0aGUgYXN5bXB0b3RpYworYmVoYXZpb3IgaWYgbWFueSBzeW1ib2wgdGFibGUgc2VjdGlvbnMgYXJlIHByZXNlbnQuCisKK1ZlcnNpb24gMC44MjoKKworUnVuIHN0cmlwIHRlc3RzIHdpdGggdGhlIGNvcnJlY3QgbGliZWxmIGFuZCBsaWJlYmwuCisKK2xpYmVsZjogZml4IGJ1ZyBpbiB2ZXJuZWVkIGJ5dGUgb3JkZXIgY2hhbmdpbmcgY29kZS4KKworVmVyc2lvbiAwLjgxOgorCitzdHJpcDogUmVtb3ZlIHVudXNlZCBzeW1ib2wgdGFibGUgZW50cmllcy4gIFRoaXMgbWlnaHQgcmVxdWlyZSB1cGRhdGluZwordmFyaW91cyBvdGhlciBzZWN0aW9ucy4KKworVmVyc2lvbiAwLjgwOgorCitGaXggc29tZSBsaWJlbGYgcHJvYmxlbXMgd2l0aCBFVF9SRUwgZmlsZXMuCisKK1ZlcnNpb24gMC43OToKKworTW9yZSB3YXJuaW5nIGNoYW5nZXMsIG1haW5seSBieSBqYmouCisKK2xpYmR3OiB5ZXQgbW9yZSBuZXcgY29kZS4gIGR3YXJmX2NoaWxkIGFuZCBkd2FyZl9zaWJsaW5nIHNob3VsZCBub3cgYWN0dWFsbHkKK3dvcmsuCisKK1ZlcnNpb24gMC43ODoKKworbGliZHc6IDEwKyBuZXcgZnVuY3Rpb25zLiAgZ2V0LXB1Ym5hbWVzMiB3b3JrcyBub3cgZnVsbHkuICBBbG1vc3QgYWxsIHRoZQorY29kZSBuZWVkZWQgZm9yIG5tIGlzIGluIHBsYWNlLgorCitWZXJzaW9uIDAuNzc6CisKK2NsZWFudXBzIHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoIGdjYyAzLjMgYW5kIC1XZXJyb3IuCisKK2xpYmR3OiBzb21lIG5ldyBjb2RlLgorCitWZXJzaW9uIDAuNzY6CisKK2xpYmVibDogRml4IGxhc3QgcGF0Y2ggdG8gcmVjb2duaXplIHJlbG9jYXRpb24gc2VjdGlvbnMuICAgV2UgbXVzdCBub3QKK3VzZSB0aGUgbmFtZS4KKworVmVyc2lvbiAwLjc1OgorCitsaWJlYmw6IC5kZWJ1Z19yYW5nZXMgaXMgYSBEV0FSRiAzIGRlYnVnIHNlY3Rpb24KK2xpYmVibDogcmVjb2duaXplIHJlbG9jYXRpb24gc2VjdGlvbnMgZm9yIGRlYnVnIHNlY3Rpb24KK1BhdGNoZXMgYnkgSmFrdWIgSmVsaW5lay4KKworVmVyc2lvbiAwLjc0OgorCitDbGVhbnVwcyBhbmQgbW9yZSBTUEFSQyBzdXBwb3J0IGJ5IFRvbSBDYWxsYXdheSA8dGNhbGxhd2F5QHJlZGhhdC5jb20+LgorCitWZXJzaW9uIDAuNzM6CisKKzY0LWJpdCBjbGVhbnVwcyBmb3IgdGhlIHByb2dyYW1zLgorCitWZXJzaW9uIDAuNzI6CisKK2xpYmVsZjogYW5kIHlldCBtb3JlIGZ1biB3aXRoIGVuZGlhbiB0cmFuZm9ybWF0aW9uIGF0IG91dHB1dCB0aW1lLgorCitWZXJzaW9uIDAuNzE6CisKK2xpYmVsZjogbW9yZSBmdW4gd2l0aCBlbmRpYW4gdHJhbmZvcm1hdGlvbiBhdCBvdXRwdXQgdGltZS4gIEFkZCB0ZXN0IGZvciBpdC4KKworVmVyc2lvbiAwLjcwOgorCitsaWJlbGY6IFR3byBsaXR0bGUgYnVncyBsZWZ0IGZyb20gcHJldmlvdXMgcGF0Y2ggdG8gaGFuZGxlIHNlY3Rpb24gb3V0cHV0CitvcmRlci4KKworbGliZWxmOiBhZGQgdW5saWtlbHkgaW4gc29tZSBtb3JlIHBsYWNlcy4KKworVmVyc2lvbiAwLjY5OgorCitsaWJlbGY6IGZpeCBvdXRwdXQgcm91dGluZXMgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgc2VjdGlvbiBpbmRlY2VzIGFuZAorb3JkcmUgaW4gdGhlIG91dHB1dCBmaWxlIGRvbid0IG1hdGNoIGNvcnJlY3RseS4gIFBhdGNoIGJ5IEpha3ViLgorCitlbGZsaW50OiBmaXggdGVzdCBvZiBub3RlIHNlY3Rpb24gY29udGVudCBmb3IgNjQtYml0IHBsYXRmb3JtcyBhbmQgZmlsZXMKK3dpdGggZGlmZmVyZW50IGJ5dGUgb3JkZXIuCisKK1ZlcnNpb24gMC42ODoKKworbGliZWJsOiBGaXggU0hfRU5UU0laRV9IQVNIIGRlZmluaXRpb24gKHBhdGNoIGJ5IEpha3ViKQorCitWZXJzaW9uIDAuNjc6CisKK2xpYmVsZjogY29ycmVjdCBtaXN0YWtlIGluIGVycm9yIHN0cmluZyBoYW5kbGluZy4KKworbGliZWxmOiBJbXBsZW1lbnQgRUxGX0ZfUEVSTUlTU0lWRS4KK3N0cmlwOiBJbXBsZW1lbnQgLS1wZXJtaXNzaXZlIG9wdGlvbi4KKworVmVyc2lvbiAwLjY2OgorCitzdHJpcDogSW1wbGVtZW50IC1nIG9wdGlvbi4KKworbGliZWxmOiBIYW5kbGUgYnJva2VuIGhhc2ggdGFibGUgZW50cnkgc2l6ZXMuCisKK2xpYmVibDogTmV3IGZ1bmN0aW9uIGVibF9kZWJ1Z3Njbl9wLiAgVXNlIGl0IHdoZXJlIGFwcHJvcHJpYXRlLgorCitWZXJzaW9uIDAuNjU6CisKK2xpYmVsZjogVXNlIGNvcnJlY3QgZmlsZSBzaXplIGZvciBOT0JJVFMgc2VjdGlvbiB3aXRoIEVMRl9GX0xBWU9VVCBzZXQKKworVmVyc2lvbiAwLjY0OgorCitsaWJlbGY6IE1ha2UgZXJyb3IgaGFuZGxpbmcgbW9yZSByb2J1c3QuCitsaWJlbGY6IFVzZSBUTFMgaW4gZXJyb3IgaGFuZGxlciBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGxzCisKK3Rlc3RzOiBpbnB1dCBmaWxlcyBhcmUgbm93IGRpc3RyaWJ1dGVkLCBub3QgdXVlbmNvZGVkIGluIHRoZSBzaGVsbCBzY3JpcHRzCisKK2xpYmR3OiBpbXBsZW1lbnQgZXJyb3IgaGFuZGxpbmcsIGR3YXJmX2dldF9wdWJuYW1lcworCitWZXJzaW9uIDAuNjM6CisKK0J1aWxkIChpbmNvbXBsZXRlKSBsaWJkdy4KKworVmVyc2lvbiAwLjYyOgorCitHZXQgcmlkIG9mIGxpYnRvb2wuCisKK1ZlcnNpb24gMC42MToKKworRml4IFVSTCBvZiBPU0wuCisKK1ZlcnNpb24gMC42MDoKKworbGliZWJsOiBIYW5kbGUgLmdudS53YXJuaW5nLiogc2VjdGlvbnMgY29ycmVjdGx5LgorCitzaXplOiBJbXBsZW1lbnQgLXQgb3B0aW9uLgorCitsaWJlYmw6IEFkZCBJQS02NCBzdXBwb3J0LgorbGliZWJsOiBVcGRhdGUgU0ggcmVsb2NhdGlvbnMuCitsaWJlYmw6IEFkZCBBbHBoYSBzdXBwb3J0LgorbGliZWJsOiBBZGQgQXJtIHN1cHBvcnQuCitsaWJlYmw6IEFkZCBzdXBwb3J0IGZvciBhbGwgY3VycmVudGx5IGtub3duIGFyY2hpdGVjdHVyZSB0byB0aGUgbG9hZGVyLgorCitWZXJzaW9uIDAuNTk6CisKK25tOiBJbXBsZW1lbnQgLVMgb3B0aW9uLiAgQ29ycmVjdCBwb3J0YWJsZSBvdXRwdXQgZm9ybWF0LiAgSW1wbGVtZW50IC1zIG9wdGlvbi4KKworbGliZWxmOiBUYWtlIG9mZnNldCBvZiBhcmNoaXZlIGludG8gYWNjb3VudCBpbiBlbGZfcmFuZC4KKworVmVyc2lvbiAwLjU4OgorCitzdHJpcDogZml4IGhhbmRsaW5nIG9mIEVUX1JFTCBmaWxlcy4KK0FkZCB0ZXN0cyBmb3Igc3RyaXAuCisKK1ZlcnNpb24gMC41NzoKKworc3RyaXA6IHJlc3BlY3QgbGF5b3V0IG9mIGlucHV0IGZpbGUKKworVmVyc2lvbiAwLjU2OgorCitzdHJpcDogaGFuZGxlIGZpbGVzIHdpdGggbGFyZ2UgbnVtYmVyIG9mIHNlY3Rpb25zLgorCitWZXJzaW9uIDAuNTU6CisKK2xpYmVsZjogcXVpdGUgYSBmZXcgYnVnIGZpeGVzIGJ5IEFsZXggTGFyc3Nvbi4KKworc3RyaXA6IGltcGxlbWVudCAtZiBvcHRpb24gdG8gcGxhY2Ugc3RyaXBwZWQgc2VjdGlvbnMgaW50byBhIHNlcGFyYXRlCitmaWxlLiAgQnkgQWxleCBMYXJzc29uLgorCitWZXJzaW9uIDAuNTQ6CisKK3N0cmlwOiBkb24ndCBsZXQgU1RUX1NFQ1RJT04gc3ltYm9scyBrZWVwcyBzZWN0aW9ucyBmcm9tIGJlaW5nIHJlbW92ZWQKKworZWxmbGludDogbG9jYWwgc3ltYm9scyBhcmUgYWxsb3dlZCBpbiAuZHluc3ltCitlbGZsaW50OiBzcGVjaWFsIGNhc2UgLnJlbC5keW4gYSBiaXQKKworVmVyc2lvbiAwLjUzOgorCitlbGZsaW50OiBjaGVjayB0eXBlcyBhbmQgZmxhZ3Mgb2Ygc3BlY2lhbCBzZWN0aW9ucyBkZWZpbmVkIGluIGdBQkkKKworbGliZWJsOiBhZGQgeDg2LTY0IHN1cHBvcnQKKworVmVyc2lvbiAwLjUyOgorCitTdGFydCBpbXByb3ZlbWVudCBvZiBkZWJ1ZyBpbmZvIGhhbmRsaW5nIGluIG5tLgorCitsaWJhc206IGltcGxlbWVudCBhc21fYWRkdWxlYjEyOCBhbmQgYXNtX2FkZHNsZWIxMjggYW5kIGEgdGVzdCBmb3IgdGhlbQorCitWZXJzaW9uIDAuNTE6CisKK0ZpeCBidWlsZCBvbiA2NC1iaXQgcGxhdGZvcm1zLgorCitWZXJzaW9uIDAuNTA6CisKK25tOiBwcmludCBmaWxlL2xpbmUgbnVtYmVyIGFsc28gZm9yIGxvY2FsIHN5bWJvbHMKKwordXNlIHZlcnNpb25zIHNjcmlwdHMgbm90IGxpYnRvb2wncyB1c2VsZXNzIC1leHBvcnQtc3ltYm9scyBvcHRpb24KKworVmVyc2lvbiAwLjQ5OgorCitVcGRhdGUgdG8gYXV0b2NvbmYgMi41NCBhbmQgYXV0b21ha2UgMS43LgorCitlbGZsaW50OiBjaGVjayBub3RlIHNlY3Rpb25zCisKK2xpYmR3YXJmOiBhIG51bWJlciBvZiBidWcgZml4ZXMKKworcmVhZGVsZjogcHJpbnQgLmRlYnVnX2luZm8gc2VjdGlvbiBjb250ZW50CisKK2R3YXJmLmg6IFVwZGF0ZSBmcm9tIGRyYWZ0IDcKKworVmVyc2lvbiAwLjQ4OgorCitsaWJjcHU6IGJlZ2lubmluZworCitsaWJlbGY6IG5ldyBmdW5jdGlvbiB0byByZWFkIHBhcnRzIG9mIHRoZSBFTEYgZmlsZQorCitsaWJlYmw6IHN1cHBvcnQgZm9yIG5vdGUgc2VjdGlvbiBoYW5kbGluZworCityZWFkZWxmOiBkdW1wIG5vdGUgc2VjdGlvbnMKKworVmVyc2lvbiAwLjQ3OgorCitsaWJlbGY6IGZpeCBsaXR0bGUgbmV3IHNlY3Rpb24taGFuZGxpbmcgcmVsYXRlZCBidWdzIGluIGVsZl9nZXRzaHN0cm5keAorYW5kIGVsZl9uZXh0c2NuCisKK2VsZmxpbnQ6IHRlc3RzIGZvciBtYW5kYXRvcnkgY29udGVudCBvZiBkeW5hbWljIHNlY3Rpb24KKworbGliYXNtOiBiZXR0ZXIgaGFuZGxpbmcgb2YgYWJzb2x1dGUgc3ltYm9scworCitWZXJzaW9uIDAuNDY6CisKK2xpYmFzbTogcmV3cml0ZSB0byBzdG9yZSBFbGZfU2NuKiBpbnN0ZWFkIG9mIGluZGljZXMKKworbm06IGZpbmlzaCBtYW55LXNlY3Rpb24gc3VwcG9ydAorCitubTogdXNlIGRlYnVnIGluIHRvIHByaW50IGZpbGUvbGluZSBpbmZvIGluIHN5c3YgZm9ybWF0CisKK2xpYmR3YXJmOiBmaXggYSBmZXcgYnVncyBpbiBESUUgaGFuZGxpbmcKKworVmVyc2lvbiAwLjQ1OgorCitsaWJlbGY6IG1ham9yIHJld3JpdGUgdG8ga2VlcCBFbGZfU2NuIHJlZmVyZW5jZXMgdmFsaWQgdW50aWwgZWxmX2VuZAorCitWZXJzaW9uIDAuNDQ6CisKK2xpYmFzbTogQWRkIHN1cHBvcnQgZm9yIGJzcywgQUJTLCBhbmQgQ09NIHNlY3Rpb25zLgorCitsaWJlYmw6IGVibF9zZWN0aW9uX25hbWUgdGFrZXMgbm93IHR3byBpbmRleCBhcmd1bWVudHMgdG8gZGlzdGluZ3Vpc2gKK2JldHdlZW4gc3BlY2lhbCBzZWN0aW9ucyBhbmQgZXh0ZW5kZWQgc2VjdGlvbnMKKworVmVyc2lvbiAwLjQzOgorCitHZW5lcmFsOiBmaXggYSBmZXcgcHJvYmxlbSBnY2MgMy4xIGhhZCB3aXRoIHRoZSBjb2RlLgorCitsaWJlbGY6IGltcGxlbWVudCB7Z2VsZixlbGYzMixlbGY2NH1fY2hlY2tzdW0KKworbGliZWxmOiBvcHRpbXplIERTTzogZmV3ZXIgcmVsb2NhdGlvbnMsIGZld2VyIFBMVHMKKworYWRkIG1zZ190c3QgdGVzdAorCitsZDogdXNlIGNvcnJlY3Qgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OyB3cml0ZSBjb3JyZWN0IGluZGV4CisKK2FkZCBkZXBlbmRlbmNpZXMgZm9yICouc3ltIGZpbGVzCisKK1ZlcnNpb24gMC40MjoKKworbGliZWxmOiBhZGQgZWxmX2dldHNobnVtIGFuZCBlbGZfZ2V0c2hzdHJuZHgKKworbGliZWJsOiB1cGRhdGUgc2VjdGlvbiB0eXBlIG5hbWUgZnVuY3Rpb24KKworZWxmbGludDogdG9ucyBvZiBmaXhlcyB3cnQgbGFyZ2UgbnVtYmVyIG9mIHNlY3Rpb25zLiAgTmV3IHRlc3RzIGluIHRoaXMgYXJlYS4KK1NhbWUgYW1vdW50IG9mIG90aGVyIGJ1ZyBmaXhlcy4KKworc2l6ZSwgc3RyaXAsIG5tOiBiZXR0ZXIgc3VwcG9ydCBmb3IgbGFyZ2UgbnVtYmVyIG9mIHNlY3Rpb25zLiAgSW5jbHVkaW5nCit1c2luZyBjb3JyZWN0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZQorCitsaWJhc206IGNvcnJlY3RseSBjcmVhdGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBsYXJnZSBudW1iZXIgb2Ygc2VjdGlvbnMKKworbmV3IHRlc3RzIGFzbS10c3Q0IGFuZCBhc20tdHN0NSB0byBjaGVjayBsYXJnZSBudW1iZXIgb2Ygc2VjdGlvbnMKKworbGliYXNtOiBpbXBsZW1lbnQgc2VjdGlvbiBncm91cCBnZW5lcmF0aW9uCisKK2VsZmxpbnQ6IG1vcmUgdGVzdHMgb24gc2VjdGlvbiBncm91cHMuICBJbXByb3ZlIHBlcmZvcm1hbmNlIG9uIGV4aXN0aW5nCitzZWN0aW9uIGdyb3VwIHRlc3RzCisKK1ZlcnNpb24gMC40MToKKworbGQ6IGFkZCB1bmRlZmluZWQgc3ltYm9scyB0byBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZiAtLWV4cG9ydC1keW5hbWljIGlzCitub3QgZ2l2ZW4KKworbGQ6IGZpeCB2YWx1ZSBvZiBlX2VudHJ5CisKK1ZlcnNpb24gMC40MDoKKworZWxmbGludDogcHJpbnQgc2VjdGlvbiBuYW1lcyBpbiBlcnJvciBtZXNzYWdlcworCitlbGZsaW50OiBtdXN0bid0IHdhcm4gYWJvdXQgbXVsdGlwbGUgRFRfTlVMTAorCitsZDogZG9uJ3QgZW1pdCBhbGwgc3ltYm9scyBpZiAtLWV4cG9ydC1keW5hbWljIGlzIG5vdCBnaXZlbgorCitsZDogY29ycmVjdCBjb21wdXRlIHN5bWJvbCBhZGRyZXNzIGluIG91dHB1dCBmaWxlIChzZWN0aW9uIGluZGV4IHdhcyBvZmYgYnkgMSkKKworbGQ6IGdlbmVyYXRlIGNvcnJlY3QgdmVyc2lvbiBpbmZvIGluIGR5bnN5bSB3aXRob3V0IC0tZXhwb3J0LWR5bmFtaWMgYW5kCitpbiBzeW10YWIKKworVmVyc2lvbiAwLjM5OgorCitGaXggY2hlY2sgb2YgdmFyaW91cyBlXypzaXplIGVudHJpZXMgaW4gZWxmbGludC4KKworSGFuZGxlIHRleHQgb3V0cHV0IGluIGFzbV9uZXdzeW0uCisKK0ZpbmlzaCBjaGVja3MgaW4gYXNtLXRzdDMuCisKK1ZlcnNpb24gMC4zODoKKworVXBkYXRlIHRvIGF1dG9jb25mIDIuNTMsIGF1dG9tYWtlIDEuNiwgZ2V0dGV4dCAwLjExKy4KKworSW50cm9kdWNlICouc3ltIGZpbGVzIHRvIHJlc3RyaWN0IGV4cG9ydCBmcm9tIERTT3MuCisKK1VzZSBhdHRyaWJ1dGVfaGlkZGVuIGFuZCBpbnRlcm5hbF9mdW5jdGlvbiB0byBvcHRpbWl6ZSBEU08gY29kZS4KKworQWRkIFRMUyBkZWZpbml0aW9ucyBpbiBlbGYuaCBhbmQgaGFuZGxlIHRoZW0gaW4gcmVhZGVsZi4KKworRml4IGJ1ZyBpbiB2ZXJkZWYgc2VjdGlvbiBnZW5lcmF0aW9uIGluIGxkLgorCitBZGQgaW5pdGlhbCBsaWJhc20gY29kZS4KKworVmVyc2lvbiAwLjM3OgorCitJbXBsZW1lbnQgYmV0dGVyIGhhc2ggc2l6ZSBvcHRpbWl6YXRpb24gaGV1cmlzdGljIGluIGxkLiAgSXQgdXNlcyBhIGZvcm11bGEKK3Rha2luZyBudW1iZXIgb2YgdGVzdHMgaW50byBhY2NvdW50LgorCitMb3RzIG9mIHNtYWxsIGJ1ZyBmaXhlcy4KKworSW1wcm92ZSByZWFkZWxmIG91dHB1dCBmb3JtYXQuICBSZXNwZWN0IHZhcmlvdXMgc2hfbGluay9zaF9pbmZvIHZhbHVlcy4KK0NvcnJlY3RseSBwcmludCB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uIGZvciBzeW1ib2wgdGFibGVzLgorCitWZXJzaW9uIDAuMzY6CisKK0ltcGxlbWVudCBwcmVwcm9jZXNzaW5nIG9mIGxpbmtlciBzY3JpcHQuICBSZWNvZ25pemUgLXogY29tYnJlbG9jLgorCitWZXJzaW9uIDAuMzU6CisKK0ltcGxlbWVudCAteiBpZ25vcmV8cmVjb3JkIGZvciBsZC4KKworSW1wbGVtZW50IGNyZWF0aW5nIG9mIC5nbnUudmVyc2lvbl9yIGFuZCAuZ251LnZlcnNpb24gc2VjdGlvbnMuICBUaGUKKy5nbnUudmVyc2lvbiBkb2VzIG5vdCB5ZXQgY29udGFpbiBjb3JyZWN0IGluZm8gZm9yIGRlZmluZWQgYW5kIHZlcnNpb25lZAorc3ltYm9scyAobWVhbnMgLmdudS52ZXJzaW9uX2QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCkuCisKK0ltcGxlbWVudCBnZWxmX3VwZGF0ZV8qIGZ1bmN0aW9ucyB0byBjcmVhdGUgdmVyc2lvbmluZyBkYXRhLgorCitWZXJzaW9uIDAuMzQ6CisKK0FkZCBEVF9SVU5QQVRIL0RUX1JQQVRIIGVudHJpZXMgdG8gZHluYW1pYyBzZWN0aW9uLiAgQ3JlYXRlIC5wbHQgYW5kCisucmVsLnBsdCBzZWN0aW9ucyAoY29tcGxldGVseSkuICBBZGQgc3VwcG9ydCBmb3IgYWxsIGZvdXIgUExUIHJlbGF0ZWQKK2R5bmFtaWMgc2VjdGlvbiBlbnRyaWVzLiAgQWRkIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBQTFQgY3JlYXRpb24uCisKK01vcmUgdGVzdHMgaW4gZWxmbGludC4gIEFkZCBzdXBwb3J0IGZvciB2ZXJ5IHN0cmljdCBjaGVja2luZyB3aGljaCBmb3IKK25vdyBmbGFncyBsZXZlbCAyIChkZXByZWNhdGVkIGZlYXR1cmVzKSB1c2FnZS4KKworVmVyc2lvbiAwLjMzOgorCitDcmVhdGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGR5bmFtaWMgc3RyaW5nIHRhYmxlLCBhbmQgaGFzaCB0YWJsZSB0byBsZC4KKworQWRkIGhhc2ggdGFibGUgaGlzdG9ncmFtIHN1cHBvcnQgdG8gcmVhZGVsZi4KKworVmVyc2lvbiAwLjMyOgorCittb3JlIHdvcmsgb24gZWxmbGludAorCitsZCBub3cgY3JlYXRlcyB0aGUgZHluYW1pYyBzZWN0aW9uIGFuZCByZWZlcmVuY2VzIGl0LiAgU3RhcnQgYWRkaW5nIGVudHJpZXMKK3RvIGR5bmFtaWMgc2VjdGlvbi4KKworVmVyc2lvbiAwLjMxOgorCitTdGFydCBpbXBsZW1lbnRpbmcgZWxmbGludC4KKworVmVyc2lvbiAwLjMwOgorCitGaXggaGFuZGxpbmcgb2YgTk9CSVRTIHNlY3Rpb25zIGluIGVsZl9nZXRkYXRhLgorCitTdGFydCBpbXBsZW1lbnRpbmcgZ2VuZXJhdGlvbiBvZiBleGVjdXRhYmxlcyBhbmQgRFNPcyBpbiBsZC4KK0dlbmVyYXRpb24gb2YgcHJvZ3JhbSBoZWFkZXIgbW9zdGx5IGRvbmUuICBBZGRyZXNzIGNvbXB1dGF0aW9uIGRvbmUuCitFeHRlbnNpb24gb2YgbGlua2VyIHNjcmlwdCBzeW50YXguCisKK1ZhcmlvdXMgY2xlYW51cHMuCisKK0ltcGxlbWVudCBzZWN0aW9uIGdyb3VwIGhhbmRsaW5nIGluIHJlYWRlbGYuCisKK1ZlcnNpb24gMC4yOToKKworSW1wbGVtZW50IHNlY3Rpb24gZ3JvdXBzLiAgVGhpcyBpbnZvbHZlZCBhIGxvdCBvZiBjb2RlIG1vdmluZy4gIFRoZQorbmV3IGNvZGUgaXMgZW50aXJlbHkgdW50ZXN0ZWQgc2luY2UgZ2FzL2djYyBhcmUgY3VycmVudGx5IG5vdCBhYmxlIHRvCitjcmVhdGUgc2VjdGlvbiBncm91cHMuICBsZCB3b3JrcyBmaW5lIG9uIGZpbGVzIHdpdGhvdXQgc2VjdGlvbiBncm91cHMuCisKK1ZlcnNpb24gMC4yODoKKworRml4IHByb2JsZW0gd2l0aCBhZGRpbmcgbW9yZSBzZWN0aW9uIGluIGVsZl9uZXdzY24uICBUaGUgc2VjdGlvbiBwb2ludGVycworZm9yIHRoZSBkYXRhIGJ1ZmZlcnMgd2Fzbid0IGFkanVzdGVkLgorCitGaXggZWxmX2dldGRhdGEgd2l0aCBub256ZXJvIHNlY29uZCBwYXJhbWV0ZXIuICBDb3JyZWN0bHkgaGFuZGxlIGNyZWF0aW9uCitvZiBpbnRlcm5hbCBkYXRhIGJ1ZmZlciBmb3IgbWFjaGluZXMgd2l0aG91dCB1bmFsaWduZWQgYWNjZXNzLgorCitWZXJzaW9uIDAuMjc6CisKK1N0YXJ0IGFkZGluZyBzdXBwb3J0IHRvIHNlbGVjdGl2ZWx5IGFkZCBzZWN0aW9ucy4gIEluY2x1ZGVzIHN1cHBvcnQgZm9yCitzZWN0aW9uIGdyb3Vwcy4KK0FkZCAtLWdjLXNlY3Rpb25zLy0tbm8tZ2Mtc2VjdGlvbnMgb3B0aW9ucy4KK0FkZCBnZW5lcmFsIHNlY3Rpb24gbWVyZ2luZyBzdXBwb3J0LgorCitGaXggYSBidWcgaW4gc2VjdGlvbiBncm91cCBzdXBwb3J0IGluIHN0cmlwLgorCitGaXggc29tZSBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCBoYXNoIHZhbHVlIGluIGR5bmFtaWMgaGFzaCBpbXBsZW1lbnRhdGlvbi4KKworVmVyc2lvbiAwLjI2OgorCitzZWN0aW9uIG1lcmdpbmcgd29ya3MgaW4gbGQuCisKK1ZlcnNpb24gMC4yNToKKworQWN0dWFsbHkgY3JlYXRlIGRhdGEgc3RydWN0dXJlcyBmcm9tIHZlcnNpb24gbWFwIGZpbGUgYW5kIHVzZSBpdCB0byBoaWRlCitzeW1ib2xzIGluIGxkLgorCitJbXBsZW1lbnQgLXMgLXMgZm9yIGxkLgorCitWZXJzaW9uIDAuMjQ6CisKK0ltcHJvdmUgcmVsb2NhdGlvbiB0YWJsZSBvdXRwdXQgaW4gcmVhZGVsZi4gIEF2b2lkIHNvbWUgY3Jhc2hlcy4KK0ZpbmlzaCBtYW55IHNlY3Rpb24gaGFuZGxpbmcgaW4gcmVhZGVsZi4KKworRmluaXNoOiBmaW5pc2ggaW1wbGVtZW50YXRpb24gb2YgbGQgLXIuICBBdCBsZWFzdCBzb21lIHNpbXBsZSB0ZXN0cyBwYXNzLgorCitWZXJzaW9uIDAuMjM6CisKK0ZpeCBhIG51bWJlciBvZiBlcnJvcnMgaW4gRUxGX0NfV1JJVEUgaGFuZGxpbmcuCisKK0FsbW9zdCBmaW5pc2hlZCBpbXBsZW1lbnRhdGlvbiBvZiBsZCAtci4gIFRoZSBkYXRhIHNlY3Rpb25zIGFyZSBhbGwgY29waWVkLgorSGFuZGxpbmcgb2Ygc3ltYm9sIHRhYmxlcyBpcyBtaXNzaW5nLgorCitWZXJzaW9uIDAuMjI6CisKK0hhbmRsZSBEU08gYW5kIGFyY2hpdmUgaW5wdXQgZmlsZXMgY29ycmVjdGx5IGlmIC1yIG9wdGlvbiBpcyBnaXZlbi4KKworR3JhY2VmdWxseSBkZWFsIHdpdGggbm8gcGhkciBpbiBuZXcgZmlsZSBpbiBsaWJlbGYuCitGaXggdmFyaW91cyBzbWFsbCBlcnJvciBoYW5kbGluZyBwcm9ibGVtcy4KK0Rvbid0IG1tYXAgZmlsZSBmb3Igb3V0cHV0IHVubGVzcyB0aGUgY29tbWFuZCBzYXlzIHNvLgorCitBZGQgY29kZSB0byBjcmVhdGUgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIHRvIGxkIGZpbmFsaXplIHJvdXRpbmVzLgorCitWZXJzaW9uIDAuMjE6CisKK0ZpeCBzb21lIHByb2JsZW1zIHdpdGggcmVjdXJzaXZlIGhhbmRsaW5nIG9mIGFyY2hpdmVzIGluIGxpYmVsZi4KKworSW1wcm92ZSBtZXNzYWdlcyBwcmludGVkIGJ5IG5tLgorCitBZGQgc3ltYm9sIGJpbmRpbmcgbmFtZSBoYW5kbGluZyB0byBsaWJlYmwuICBGaXggc2VjdGlvbiBuYW1lIGhhbmRsaW5nIGluCitsaWJlYmwuCisKK3JlYWRlbGYgYW5kIG5tIHVzZSBtb3JlIGxpYmVibCBmdW5jdGlvbnMuCisKK0hhbmRsZSBYSU5ERVggY29ycmVjdGx5IGluIG5tIGFuZCBzdHJpbmcuCisKK0FkZCBmaXJzdCBtYWNoaW5lIGxkIGJhY2tlbmQgbGlicmFyeSAoaTM4NikuCitVc2UgaXQuICBSZWNvZ25pemUgLXIgYW5kIC0tc2hhcmVkLiAgQXZvaWQgdXNpbmcgLWx4eHggcGFyYW1ldGVycyBmb3IgLXIuCitDcmVhdGUgRUxGIGhlYWRlciBpbiBvdXRwdXQgZmlsZS4gIENoYW5nZSBtb2RlIG9mIG91dHB1dCBmaWxlIGFjY29yZGluZyB0bworb3V0cHV0IGZpbGUgdHlwZS4gIFJlb3JnYW5pemUgY2FsbGJhY2sgaW5pdGlhbGl6YXRpb24gaW4gbGQuCisKK1ZlcnNpb24gMC4yMDoKKworRml4IHNvbWUgbWVtb3J5IGxlYWtzIGluIGxpYmVsZi4KKworVmVyc2lvbiAwLjE5OgorCitJbXBsZW1lbnQgcmVhZGluZyB2ZXJzaW9uIHNjcmlwdC4gIEJvdGggaW5zaWRlIGxpbmtlciBzY3JpcHRzIGFuZCB2aWEgdGhlCistLXZlcnNpb24tc2NyaXB0IGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuICBVc2VzIHRoZSBzYW1lIGNvZGUuCitXaGF0IHJlbWFpbnMgdG8gYmUgZG9uZSBpcyB0byBpbXBsZW1lbnQgYSBkYXRhIHN0cnVjdHVyZSB3aGljaCBhbGxvd3MKK2VmZmljaWVudCBtYXRjaGluZyBhZ2FpbnN0IHRoZSB2ZXJzaW9uIG5hbWVzIHRvIGRlY2lkZSB3aGljaCBwYXR0ZXJuCittYXRjaGVzLgorCitCZWdpbm5pbmcgb2Ygb3V0cHV0IGdlbmVyYXRpb24gYW5kIG91dHB1dCB3cml0aW5nIGZ1bmN0aW9ucy4KKworVmVyc2lvbiAwLjE4OgorCitGaW5pc2ggaW1wbGVtZW50YXRpb24gZm9yIERTTyBpbnB1dCBmaWxlIGhhbmRsaW5nLiAgSW1wbGVtZW50IHJwYXRoLCBydW5wYXRoLAorYW5kIExEX0xJQlJBUllfUEFUSCBoYW5kbGluZy4KKworVmVyc2lvbiAwLjE3OgorCittYWtlIGhhbmRsaW5nIG9mIGVfc2hudW0gb3ZlcmZsb3cgaW4gbGliZWxmIHN0YW5kYXJkIGNvbmZvcm1pbmcKKworbGQgbm93IGFjdHVhbGx5IGNhbiBoYW5kbGUgRFNPcyBpbiBsaW5rZXIgc2NyaXB0cy4gIEhhbmRsaW5nIG9mIERUX1JVTlBBVEgsCitEVF9SUEFUSCwgLXJwYXRoLCAtcnBhdGgtbGluayBzdGlsbCByZW1haW5zIHRvIGJlIGltcGxlbWVudGVkLgorCitmaXggaGFuZGxpbmcgb2YgLUwgcGFyYW1ldGVycy4gIE1ha2UgYWN0dWFsIHVzZSBvZiB0aGUgZGVmYXVsdF9wYXRocyBlbGVtZW50LgorCittYWtlIHJlLWRlZmluaXRpb24gb2Ygc3ltYm9scyBpbiBhbmQgZnJvbSBEU08gY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGxpbmtlcgorCitWZXJzaW9uIDAuMTY6CisKK21vcmUgd29yayBvbiBhc3NpZ25pbmcgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLgorCitBZGQgZ2VsZl94bGF0ZXRvZiBhbmQgZ2VsZl94bGF0ZXRvbSB3aGljaCB3ZXJlIGFjY2lkZW50bHkgbGVmdCBvdXQuCisKK0ZpeCBtZW1vcnkgaGFuZGxpbmcgb2Ygc2VjdGlvbiBoZWFkZXJzLgorCitWZXJzaW9uIDAuMTU6CisKK0FkZCBtYW55LXNlY3Rpb24gc3VwcG9ydCB0byBsZC4gIEFkZCB2YXJpb3VzIG5ldyBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4KK0FsbG93IHBhZ2VzaXplIHRvIGJlIHNwZWNpZmllZCBpbiBsaW5rZXIgc2NyaXB0IG9yIG9uIHRoZSBjb21tYW5kIGxpbmUuCitDb2xsZWN0IGlucHV0IHNlY3Rpb25zIGluIGxpc3QgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCitzcGVjaWZpZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQuCisKK1ZlcnNpb24gMC4xNDoKKworRml4IHNvbWUgcHJvYmxlbXMgaW4gdGhlIGludGVybmFsIGxpc3QgaGFuZGxpbmcgd2hpY2ggaGFkIHRoZSByZXN1bHQKK3RoYXQgd2UgZGlkbid0IGxvb2sgZm9yIHNvbWUgb2YgdGhlIHVucmVzb2x2ZWQgc3ltYm9scy4KKworRnJlZSBzb21lIG1lbW9yeSBpZiB3ZSBrbm93IHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZS4KKworT3B0aW1pemUgdGhlIGxpc3Qgb2YgdW5yZXNvbHZlZCBzeW1ib2xzLiAgVGhyb3cgb3V0IHN5bWJvbHMgd2hpY2ggYXJlCittZWFud2hpbGUgcmVzb2x2ZWQuCisKK1ZlcnNpb24gMC4xMzoKKworR290IGZpbGUgcmVhZGluZyBjb3JyZWN0IG5vdy4gIFRoZSBmaWxlcyBhcmUgYWxsIHJlYWQgd2hpbGUgcGFyc2luZwordGhlIHBhcmFtZXRlcnMuICBObyBjcmVhdGluZyBvZiBkYXRhIHN0cnVjdHVyZXMgdG8gZGVzY3JpYmUgdGhlIGxpbmtlcgorY29tbWFuZCBsaW5lLiAgVGhlIHN5bWJvbCB0YWJsZSBpcyBidWlsdCB1cCB3aGlsZSByZWFkaW5nIHRoZSBmaWxlcy4KK0RTT3MgYXJlIGhhbmRsZWQgbm93LiAgLSggLSkgaGFuZGxpbmcgaXMgb3B0aW1pemVkLgorCitWZXJzaW9uIDAuMTI6CisKK0xpbmtlciByZWFkIGxpbmtlciBzY3JpcHRzIGV2ZXJ5d2hlcmUuICBIYW5kbGVzIC0td2hvbGUtYXJjaGl2ZS4gIFJlY29nbml6ZXMKKy0tZHluYW1pYyBhbmQgLS1zdGF0aWMuICBDb2xsZWN0cyBkZWZpbmVkIGFuZCB1bmRlZmluZWQgc3ltYm9scy4gIFJlY29nbml6ZXMKK2NvbmZsaWN0cy4KKworbGliZWJsIG5vdyBkZWZpbmVzIGZ1bmN0aW9ucyB0byBjYWxsIHRoZSBjYWxsYmFja3MuICBBZGQgZ2VuZXJpYyBuYW1lIGhhbmRsaW5nCitpbiB0aGVzZSBuZXcgZnVuY3Rpb25zLiAgUmVtb3ZlIHRoZSBjb2RlIGZyb20gcmVhZGVsZiBhbmQgY2FsbCB0aGUgbmV3CitmdW5jdGlvbnMuCisKK1ZlcnNpb24gMC4xMToKKworU3RhcnQgb2YgbGlua2VyLiAgQmFzaWMgYXJndW1lbnQgcGFyc2luZywgZmluZGluZyBvZiBpbnB1dCBmaWxlcywKK2xpbmtlciBzY3JpcHQgcmVhZGluZy4KKworVmVyc2lvbiAwLjEwOgorCitJbXBsZW1lbnQgZHdhcmZfZ2V0X2ZkZV9uKCksIGR3YXJmX2dldF9hYmJyZXYoKSwgZHdhcmZfZ2V0X2FiYnJldl90YWcoKSwKK2R3YXJmX2dldF9hYmJyZXZfY29kZSgpLCBkd2FyZl9nZXRfYWJicmV2X2NoaWxkcmVuX2ZsYWcoKSwKK2R3YXJmX2dldF9hYmJyZXZfZW50cnkoKSwgZHdhcmZfZ2V0X2ZkZV9hdF9wYygpLCBhbmQgdGVzdHMgZm9yIGl0LgorCitWZXJzaW9uIDAuOToKKworSW1wbGVtZW50IGR3YXJmX2dldF9mZGVfbGlzdF9laCgpLCBkd2FyZl9nZXRfY2llX29mX2ZkZSgpLAorZHdhcmZfZ2V0X2ZkZV9yYW5nZSgpLCBkd2FyZl9nZXRfY2llX2luZm8oKSwgZHdhcmZfZ2V0X2ZkZV9pbnN0cl9ieXRlcygpLAorYW5kIHRlc3RzIGZvciB0aGVtLgorCitWZXJzaW9uIDAuODoKKworTWFrZSBoYW5kbGluZyBvZiBiaW5hcmllcyBpbiBvdGhlciBieXRlIG9yZGVyIHdvcmsgYW5kIGFkZCB0ZXN0cyBmb3IgaXQuCisKK1ZlcnNpb24gMC43OgorCitJbXBsZW1lbnQgZHdhcmZfZ2V0X2FyYW5nZXMoKSwgZHdhcmZfZ2V0X2FyYW5nZSgpLCBkd2FyZl9nZXRfY3VfZGllX29mZnNldCgpLAorZHdhcmZfZ2V0X2FyYW5nZV9pbmZvKCksIGFuZCB0ZXN0cyBmb3IgdGhlbS4KKworVmVyc2lvbiAwLjY6CisKK0ltcGxlbWVudCBkd2FyZl9nZXRfZ2xvYmFsKCksIGR3YXJmX2dsb2JuYW1lKCksIGR3YXJmX2dsb2JhbF9kaWVfb2Zmc2V0KCksCitkd2FyZl9nbG9iYWxfY3Vfb2Zmc2V0KCksIGR3YXJmX2dsb2JhbF9uYW1lX29mZnNldHMoKSwgYW5kIHRlc3RzIGZvciB0aGVtCisKK1ZlcnNpb24gMC41OgorCitJbXBsZW1lbnRlZCBkd2FyZl9zcmNsaW5lcygpLCBkd2FyZl9zcmNmaWxlcygpLCBkd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQoKSwKK2R3YXJmX2xpbmVlbmRzZXF1ZW5jZSgpLCBkd2FyZl9saW5lbm8oKSwgZHdhcmZfbGluZWFkZHIoKSwgZHdhcmZfbGluZW9mZigpLAorZHdhcmZfbGluZXNyYygpLCBkd2FyZl9saW5lYmxvY2soKSwgZHdhcmZfbGluZXByb2xvZ3VlZW5kKCksCitkd2FyZl9saW5lZXBpbG9ndWViZWdpbigpLCBhbmQgdGVzdHMgZm9yIHRoZW0uCisKK1ZlcnNpb24gMC40OgorCitJbXBsZW1lbnRlZCBkd2FyZl9sb2NsaXN0KCkuCisKK1ZlcnNpb24gMC4zOgorCitJbXBsZW1lbnRlZCBkd2FyZl9kaWVvZmZzZXQoKSwgZHdhcmZfZGllX0NVX29mZnNldCgpLCBkd2FyZl9kaWVuYW1lKCkgYW5kCit0ZXN0cy4KKworSW1wbGVtZW50ZWQgZHdhcmZfYXR0cmxpc3QoKSwgZHdhcmZfaGFzYXR0cigpLCBkd2FyZl9hdHRyKCksIGR3YXJmX2xvd3BjKCksCitkd2FyZl9oaWdocGMoKSwgZHdhcmZfYnl0ZXNpemUoKSwgZHdhcmZfYml0c2l6ZSgpLCBkd2FyZl9iaXRvZmZzZXQoKSwKK2R3YXJmX3NyY2xhbmcoKSwgZHdhcmZfYXJyYXlvcmRlcigpLCBkd2FyZl9oYXNmb3JtKCksIGR3YXJmX3doYXRmb3JtKCksCitkd2FyZl93aGF0YXR0cigpLCBkd2FyZl9mb3JtcmVmKCksIGR3YXJmX2dsb2JhbF9mb3JtcmVmKCksIGR3YXJmX2Zvcm1hZGRyKCksCitkd2FyZl9mb3JtZmxhZygpLCBkd2FyZl9mb3JtdWRhdGEoKSwgZHdhcmZfZm9ybXNkYXRhKCksIGR3YXJmX2Zvcm1ibG9jaywKK2R3YXJmX2Zvcm1zdHJpbmcoKSBhbmQgdGVzdHMgZm9yIHRoZW0uCisKK1ZlcnNpb24gMC4yOgorCitJbXBsZW1lbnRlZCBkd2FyZl9vZmZkaWUoKSksIGR3YXJmX3RhZygpLCBkd2FyZl9kaWVvZmZzZXQoKSwKK2R3YXJmX2RpZV9DVV9vZmZzZXQoKSwgZHdhcmZfZGllbmFtZSgpIGFuZCB0ZXN0cyBmb3IgdGhlbS4KKworVmVyc2lvbiAwLjE6CisKK0ZpcnN0IGxpYmR3YXJmIGZ1bmN0aW9ucyB3b3JrLgorCitWZXJzaW9uIDAuMDoKKworbGliZWxmIGFuZCBwYXJ0cyBvZiBsaWJlYmwgYXJlIGRvbmUuCmRpZmYgLS1naXQgYS9OT1RFUyBiL05PVEVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDZiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9OT1RFUwpAQCAtMCwwICsxLDczIEBACistIG9sZCBHTlUgbGQncyBiZWhhdmlvciB3cnQgRFNPcyBzZWVtcyB0byBiZSBzZXZlcmVseSBicm9rZW4uCisKKyAgICAgeS5vIHJlZmVyZW5jZSBmb28oKQorICAgICB5MS5vIGRlZmluZXMgZm9vKCksIHJlZmVyZW5jZXMgYmFyKCkKKyAgICAgeTIubyBkZWZpbmVzIGJhcigpCisgICAgIGxpYmJhci5zbyBkZWZpbmVzIGJhcigpCisKKyAgUnVubmluZworCisgICAgIGdjYyAtbyB5IHkubyAtbGJhciB5MS5vIHkyLm8KKworICB1c2VzIHRoZSBiYXIoKSBkZWZpbml0aW9uIGZyb20gbGliYmFyLnNvIGFuZCBkb2VzIG5vdCBtZW50aW9uIHRoZSBkZWZpbml0aW9uCisgIGluIHkyLm8gYXQgYWxsIChubyBkdXBsaWNhdGUgc3ltYm9sIG1lc3NhZ2UpLiAgQ29ycmVjdCBpcyB0byB1c2UgdGhlCisgIGRlZmluaXRpb24gaW4geTIuby4KKworCisgICAgIHkubyByZWZlcmVuY2UgZm9vKCkKKyAgICAgeTEubyBkZWZpbmVzIGZvbygpLCByZWZlcmVuY2VzIGJhcigpCisgICAgIHkyLm8gaW4gbGlieTIuYSBkZWZpbmVzIGJhcigpCisgICAgIGxpYmJhci5zbyBkZWZpbmVzIGJhcigpCisKKyAgUnVubmluZworCisgICAgIGdjYyAtbyB5IHkubyAtbGJhciB5MS5vIC1seTMKKworICBoYXMgdG8gdXNlIHRoZSBkZWZpbml0aW9uIGluIC1sYmFyIGFuZCBub3QgcHVsbCB0aGUgZGVmaW5pdGlvbiBmcm9tIGxpYnkzLmEuCisKKworLSB0aGUgb2xkIGxpbmtlciBmb2xsb3dzIERUX05FRURFRCBlbnRyaWVzIGFuZCBhZGRzIHRoZSBvYmplY3RzIHJlZmVyZW5jZWQKKyAgdGhpcyB3YXkgd2hpY2ggZGVmaW5lIGEgc3ltYm9sIHdoaWNoIGlzIG5lZWRlZCBhcyBhIERUX05FRURFRCB0byB0aGUKKyAgZ2VuZXJhdGVkIGJpbmFyeS4gIFRoaXMgaXMgd3Jvbmcgc2luY2UgdGhlIERUX05FRURFRCBjaGFuZ2VzIHRoZSBzZWFyY2gKKyAgcGF0aCBpbiB0aGUgb2JqZWN0ICh3aGljaCBpcyBicmVhZHRoIGZpcnN0KS4KKworCistIHRoZSBvbGQgbGlua2VyIHN1cHBvcnRlZCBleHRlcm4gIkMrKyIsIGV4dGVybiAiamF2YSIgaW4gdmVyc2lvbiBzY3JpcHRzLgorICBJIGJlbGlldmUgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzZXZlcmx5IGJyb2tlbiBhbmQgbmVlZHMgYSByZWRlc2lnbgorICAoaG93IGRvIHdpbGRjYXJkcyB3b3JrIHdpdGggdGhlc2UgbGFuZ3VhZ2VzKj8pLiAgVGhlcmVmb3JlIGl0IGlzIGxlZnQKKyAgb3V0IGZvciBub3cuCisKKworLSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgdHdvIHNlY3Rpb25zIGluIGRpZmZlcmVudCBmaWxlcyB3aXRoIHRoZSBzYW1lCisgIG5hbWUgaGF2ZSBkaWZmZXJlbnQgdHlwZXMgYW5kL29yIHRoZSBmbGFncyBhcmUgZGlmZmVyZW50CisKKworLSBzZWN0aW9uIG5hbWVzIGluIGlucHV0IGZpbGVzIGFyZSBtb3N0bHkgaXJyZWxldmFudC4gIEV4Y2VwdGlvbnM6CisKKyAgLmNvbW1lbnQvU0hUX1BST0dCSVRTCQlpbiBzdHJpcCwgbGQKKworICAuZGVidWcJCVwKKyAgLmxpbmUJCQl8CisgIC5kZWJ1Z19zcmNpbmZvCXwKKyAgLmRlYnVnX3NmbmFtZXMJfAorICAuZGVidWdfYXJhbmdlcwl8CisgIC5kZWJ1Z19wdWJuYW1lcwl8CisgIC5kZWJ1Z19pbmZvCQl8CisgIC5kZWJ1Z19hYmJyZXYJCXwKKyAgLmRlYnVnX2xpbmUJCXwKKyAgLmRlYnVnX2FiYnJldgkJID4JRFdBUkYgc2VjdGlvbnMgaW4gbGQKKyAgLmRlYnVnX2xpbmUJCXwKKyAgLmRlYnVnX2ZyYW1lCQl8CisgIC5kZWJ1Z19zdHIJCXwKKyAgLmRlYnVnX2xvYwkJfAorICAuZGVidWdfbWFjaW5mbwl8CisgIC5kZWJ1Z193ZWFrbmFtZXMJfAorICAuZGVidWdfZnVuY25hbWVzCXwKKyAgLmRlYnVnX3R5cGVuYW1lcwl8CisgIC5kZWJ1Z192YXJuYW1lcwkvCisKKyAgU2VjdGlvbnMgY3JlYXRlZCBpbiBvdXRwdXQgZmlsZXMgZm9sbG93IHRoZSBuYW1pbmcgb2Ygc3BlY2lhbCBzZWN0aW9uCisgIGZyb20gdGhlIGdBQkkuCisKKyAgSW4gbm8gcGxhY2UgaXMgYSBzZWN0aW9uIHNvbGVseSBpbmRlbnRpZmllZCBieSBpdHMgbmFtZS4gIEludGVybmFsCisgIHJlZmVyZW5jZXMgYWx3YXlzIHVzZSB0aGUgc2VjdGlvbiBpbmRleC4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM5NDA3Ci0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsNiBAQAorRnVuZGFtZW50YWwgZGVzaWduIGRlY2lzaW9uOgorCistIHRoZSBzaXplcyBvZiBleHRlcm5hbCBhbmQgaW50ZXJuYWwgdHlwZXMgYXJlIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUuCisgIFRoaXMgbGVhdmVzIGJ5dGUgb3JkZXJpbmcgYXNpZGUuICBXaGlsZSBhc3N1bWluZyB0aGlzIHRoZSBjb2RlIGNhbiBiZQorICBncmVhdGx5IHNpbXBsaWZpZWQgYW5kIHNwZWVkIGluY3JlYXNlcy4gIFNpbmNlIG5vIGNoYW5nZSB2aW9sYXRpbmcgdGhpcworICBhc3N1bXB0aW9uIGlzIGluIHNpZ2h0IHRoaXMgaXMgYmVsaWV2ZWQgdG8gYmUgYSB3b3J0aHdoaWxlIG9wdGltaXphdGlvbi4KZGlmZiAtLWdpdCBhL1RIQU5LUyBiL1RIQU5LUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM0MzZjCi0tLSAvZGV2L251bGwKKysrIGIvVEhBTktTCkBAIC0wLDAgKzEsNSBAQAorQXQgbGVhc3QgdGhlIGZvbGxvd2luZyBoYXZlIHN1Ym1pdHRlZCB2YWx1YWJsZSBwYXRjaGVzOgorCitKZWZmIEpvaG5zb24JCWJ1aWxkaW5nLiBycG0gd3Jlc3RsaW5nCitBbGV4YW5kZXIgTGFyc3NvbglzZXBhcmF0ZSBkZWJ1ZyBpbmZvCitKYWt1YiBKZWxpbmVrCQlidWcgZml4ZXMsIHRlc3RpbmcKZGlmZiAtLWdpdCBhL1RPRE8gYi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNGEwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9UT0RPCkBAIC0wLDAgKzEsMTY4IEBACisJCSAgICAgIFRvRG8gbGlzdCBmb3IgZWxmdXRpbHMgICAgICAgICAgICAgICAgICAgICAgLSotb3V0bGluZS0qLQorICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGltZS1zdGFtcDogPDIwMDMtMDgtMDcgMTI6NTI6NDkgZHJlcHBlcj4KKworKiBta2luc3RhbGxkaXJzCisKKyAgUmVtb3ZlIGV2ZXJ5d2hlcmUuICBVc2UgbWtkaXIgLXAuCisKKyogbGliZWxmOgorCisqKiB2ZXJpZnkgc2VjdGlvbgorCisgICBDdXJyZW50bHkgdGhlIGVsZl91cGRhdGUgZnVuY3Rpb24gdHJ1c3RzIHRoZSB1c2VyIGJsaW5kbHkgaWYgdGhlCisgICBFTEZfRl9MQVlPVVQgZmxhZyBpcyBzZXQuICBUaGlzIGlzIE9LIGlmIHRoZSBkYXRhIGlzIHByZXBhcmVkIGJ5IGEKKyAgIEVMRl9DX05VTEwgY2FsbCBidXQgbm90IGlmIHRoZSB1c2VyIHByZXBhcmVkIHRoZSBkYXRhIGhlcnNlbGYKKworKiogYnJlYWsgb3V0IGFyY2hpdmUgaGFuZGxpbmcgZnJvbSBlbGZfYmVnaW4KKworICAgVGhlIGhhbmRsaW5nIG9mIGFyY2hpdmVzIChlc3BlY2lhbGx5IG9mIHRoZSBzeW1ib2wgdGFibGVzKSBtdXN0IGJlCisgICBicm9rZW4gb3V0IG9mIGVsZl9iZWdpbi4gIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudCBmb3JtcyBvZgorICAgYXJjaGl2ZXMgYW5kIG9ubHkgd2hlbiBoYXZpbmcgdGhlIGFyY2hpdmUgaGFuZGxpbmcgc2VwYXJhdGVseSB0aGlzCisgICByZW1haW5zIG1haW50YWluYWJsZS4KKworCisqIGxpYmR3YXJmCisKKyoqIFNob3VsZCB3ZSBkbyBtb3JlIGVycm9yIGNoZWNraW5nPworCisgICBNb3N0IGZ1bmN0aW9ucyBkb24ndCBjaGVjayB3aGV0aGVyIHRoZXkgZ2V0IGEgTlVMTCB2YWx1ZSBwYXNzZWQgZm9yCisgICBhIHBvaW50ZXIgYXJndW1lbnQuICBJdCBjb3VsZCBiZSBhcmd1ZWQgdGhhdCB0aGlzIGlzIE9LIHNpbmNlIGl0J3MKKyAgIGEgYnVnIGludGhlIHByb2dyYW0uICBCdXQgcGVyaGFwcyBvbmUgY291bGQgY2F0Y2ggdGhlIGNhc2UgYW5kIHJldHVybgorICAgYW4gZXJyb3Igd2hpY2ggd291bGQgYWxsb3cgdGhlIHByb2dyYW0gdXNpbmcgbGliZHdhcmYgdG8gaGF2ZSBmZXdlcgorICAgcGxhY2VzIHdpdGggZXJyb3IgY2hlY2tpbmcuCisKKyoqIE1vcmUgbWVtb3J5IGFjY2VzcyBjaGVja3MgbmVlZGVkCisKKyAgIEFsbCBhY2Nlc3NlcyB0byB0aGUgZGVidWcgc2VjdGlvbnMgc2hvdWxkIG1ha2Ugc3VyZSB0aGUgb2Zmc2V0cyBhcmUKKyAgIHZhbGlkLiAgVGhpcyBpcyBjdXJyZW50bHkgZXNwZWNpYWxseSBhIHByb2JsZW0gd2l0aCBsZWIxMjggYWNjZXNzZXMuCisKKyoqIExvdyBsZXZlbCBtYWNybyBpbmZvcm1hdGlvbiBvcGVyYXRpb25zCisKKyAgIGluIDUuMTEuMyBhcmUgbm90IGltcGxlbWVudGVkLiAgZ2NjIGN1cnJlbnRseSBkb2VzIG5vdCBlbWl0IHRoaXMKKyAgIGluZm9ybWF0aW9uIHNvIEkgY2Fubm90IHRlc3QgaXQuCisKKyoqIFJlbmFtZSBkd2FyZl9nZXRhYmJyZXYKKworKiogZHdhcmZfbG9jbGlzdCgpCisKKyAgIFRoaXMgZnVuY3Rpb24gYW5kIGl0cyBpbnRlcmZhY2Ugc2VlbSB0byBiZSBtaXNkZXNpZ25lZC4gIFRoZSBzcGVjaWZpY2F0aW9uCisgICBpcyB1bmNsZWFyIGFuZCBpdHMgY2hhbmdlZCBiZXR3ZWVuIHYyIGFuZCB2Mi4xLiAgT3RoZXIgaW1wbGVtZW50YXRpb24KKyAgIGltcGxlbWVudCBldmVuIGRpZmZlcmVudCBiZWhhdmlvci4KKworCisqIG5tOgorCisqKiBhZGQgZGVtYW5nbGVyIHN1cHBvcnQKKworICAgVXNlIGRlbWFuZ2xlciBmcm9tIGxpYmliZXJ0eS4KKworKiogYWRkIHN1cHBvcnQgdG8gcmVhZCBkZWJ1Z2dpbmcgc3ltYm9scworCisgICBJbXBsZW1lbnQgLWwgb3B0aW9uIGZvciBCU0QgYW5kIFBPU0lYIGZvcm1hdAorCisKKyogc3RyaXA6CisKKyoqIHN1cHBvcnQgU0hUX1NZTVRBQl9TSE5EWAorCisgICBzaG91bGQgYmUgcmVtb3ZlZCBpZiBub3QgbmVlZGVkIGFueW1vcmUKKworKiBsZDoKKworKiogc2FuaXR5IGNoZWNrIC5yZWwgc2hfaW5mbyBjb250ZW50CisKKyAgIHRoZSBzaF9pbmZvIG9mIGFsbCAucmVsIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBtdXN0IHBvaW50IHRvCisgICBzZWN0aW9ucyB3aGljaCBhbHNvIGhhdmUgdGhlIHNhbWUgbmFtZQorCisqKiB1c2UgbGQuc28uY29uZgorCisgICB0byBsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhbHNvIHVzZSAvZXRjL2xkLnNvLmNvbmYKKworKiogaGFuZGxlIG9iamVjdCBmaWxlcyBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMKKworICAgbGQuc28gaXMgZXhwZWN0ZWQgdG8gaWdub3JlIG9iamVjdCBmaWxlcyBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMgYW5kCisgICBjb250aW51ZSBsb29raW5nIGZvciBhIG1hdGNoaW5nIGZpbGUgKGUuZy4sIGlnbm9yZSAzMi1iaXQgYmluYXJpZXMgb24KKyAgIDY0LWJpdCBwbGF0Zm9ybXMgYW5kIHZpY2UgdmVyc2EpLiAgV2UgcHJvYmFibHkgbmVlZCB0aGUgc2FtZSBpbiBsZC4KKworKiogcmV1c2UgYWZ0ZXIgZWxmX2VuZAorCisgICBTb21lIGZpbGVzIGFyZSBjbG9zZWQgdXNpbmcgZWxmX2VuZC4gIFRoZXkgYXJlIHJlbW92ZWQgZnJvbSBtZW1vcnkgb25seQorICAgaWYgbm8gcmVmZXJlbmNlIGlzIGxlZnQgKGVzcGVjaWFsbHkgZm9yIGFyY2hpdmVzIHRoaXMgaXMgYSBwcm9ibGVtKS4KKyAgIFRoZSBvbGQgbWFwcGluZyBzaG91bGQgYmUgcmV1c2VkIGluIHRoYXQgY2FzZS4gIFRoZSBwcm9ibGVtIGlzIHdvcnNlCisgICBmb3IgZmlsZXMgd2hpY2ggYXJlIG5vdCBtYXBwZWQgcmVhZC1vbmx5IChhcmNoaXZlcyBhZ2FpbikuCisKKworKiogc2l6ZSBmb3IgU1RUX1NFQ1RJT04gZW50cmllcworCisgICBUaGUgU1RUX1NFQ1RJT04gZW50cmllcyBoYXZlIHplcm8gZm9yIHRoZSBzaXplIGJ1dCBjYW4gZWFzaWx5IGdldAorICAgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uCisKKyogZWxmbGludAorCisqKiBhZGRpdGlvbmFsIGNoZWNrcworCisgICAxc3QgR09UIGVudHJ5ID09IF9EWU5BTUlDCisKKyAgIGlmIFRFWFRSRUwgY2hlY2sgd2hldGhlciBhbnkgcmVsb2NhdGlvbiB0b3VjaGVzIFJPIHNlZ21lbnQKKworICAgaWYgVEVYVFJFTCBub3Qgc2V0IGNoZWNrIHRoYXQgbm8gcmVsb2NhdGlvbiB0b3VjaGVzIFJPIHNlZ21lbnQKKworICAgY2hlY2sgdmVyc2lvbmluZyBpbmZvOgorCisgICAgIGFsd2F5cyBCQVNFIGluIHZlcmRlZgorICAgICBzaF9zaXplL3NoX2VudHNpemUgbWF0Y2hlcyBsYXN0IG9mZnNldCAhPSAwCisKKyAgIGNoZWNrIHdoZXRoZXIgYW55IHJlbG9jYXRpb24gaXMgZm9yIGEgbWVyZ2UtYWJsZSBzZWN0aW9uCisKKyoqIHBvc3NpYmx5IG1pc3NpbmcgdGVzdHMKKworICAgYXQgbW9zdCBvbmUgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZSBmb3IgYSBzeW10YWIKKworICAgbm8gZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZSAhPSBFVF9SRUwKKworICAgbm8gZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZSBmb3IgU0hUX0RZTlNZTQorCisqKiByZWxheAorCisgICBwcmVsaW5rIGdlbmVyYXRlZCBmaWxlcworCisKKyogbWNzCisKKyAgU3VuIGhhcyBpdC4gIENhbiBtb2RpZnkgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBpbiBzZWdtZW50cy4KKworICAgICAtYSBzdHJpbmcKKyAgICAgICAgICAgQXBwZW5kIHN0cmluZyB0byB0aGUgY29tbWVudCBzZWN0aW9uIG9mIHRoZSBFTEYgb2JqZWN0CisgICAgICAgICAgIGZpbGVzLiBJZiAgc3RyaW5nIGNvbnRhaW5zIGVtYmVkZGVkIGJsYW5rcywgaXQgbXVzdCBiZQorICAgICAgICAgICBlbmNsb3NlZCBpbiBxdW90YXRpb24gbWFya3MuCisKKyAgICAgLWMgICAgQ29tcHJlc3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21tZW50ICBzZWN0aW9uICBvZiAgdGhlCisgICAgICAgICAgIEVMRiAgb2JqZWN0ICBmaWxlcy4gQWxsIGR1cGxpY2F0ZSBlbnRyaWVzIGFyZSByZW1vdmVkLgorICAgICAgICAgICBUaGUgb3JkZXJpbmcgb2YgdGhlICByZW1haW5pbmcgIGVudHJpZXMgIGlzICBub3QgIGRpcy0KKyAgICAgICAgICAgdHVyYmVkLgorCisgICAgIC1kICAgIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIGNvbW1lbnQgIHNlY3Rpb24gIGZyb20gIHRoZQorICAgICAgICAgICBFTEYgIG9iamVjdCAgZmlsZXMuIFRoZSBzZWN0aW9uIGhlYWRlciBmb3IgdGhlIGNvbW1lbnQKKyAgICAgICAgICAgc2VjdGlvbiBpcyBhbHNvIHJlbW92ZWQuCisKKyAgICAgLW4gbmFtZQorICAgICAgICAgICBTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBjb21tZW50IHNlY3Rpb24gdG8gIGFjY2VzcyAgaWYKKyAgICAgICAgICAgb3RoZXIgIHRoYW4gIC5jb21tZW50LiAgQnkgZGVmYXVsdCwgbWNzIGRlYWxzIHdpdGggdGhlCisgICAgICAgICAgIHNlY3Rpb24gbmFtZWQgLmNvbW1lbnQuIFRoaXMgb3B0aW9uICBjYW4gIGJlICB1c2VkICB0bworICAgICAgICAgICBzcGVjaWZ5ICBhbm90aGVyICBzZWN0aW9uLiAgbWNzICBjYW4gIHRha2UgbXVsdGlwbGUgLW4KKyAgICAgICAgICAgb3B0aW9ucyB0byBhbGxvdyBmb3Igc3BlY2lmaWNhdGlvbiBvZiAgIG11bHRpcGxlICBzZWMtCisgICAgICAgICAgIHRpb24gY29tbWVudHMuCisKKyAgICAgLXAgICAgUHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21tZW50IHNlY3Rpb24gb24gdGhlIHN0YW4tCisgICAgICAgICAgIGRhcmQgIG91dHB1dC4gIEVhY2ggIHNlY3Rpb24gIHByaW50ZWQgaXMgdGFnZ2VkIGJ5IHRoZQorICAgICAgICAgICBuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggaXQgIHdhcyAgZXh0cmFjdGVkLCAgdXNpbmcKKyAgICAgICAgICAgdGhlICBmb3JtYXQgIGZpbGVbbWVtYmVyX25hbWVdOiAgZm9yIGFyY2hpdmUgZmlsZXMgYW5kCisgICAgICAgICAgIGZpbGU6ICBmb3Igb3RoZXIgZmlsZXMuCisKKyAgICAgLVYgICAgUHJpbnQgb24gc3RhbmRhcmQgZXJyb3IgdGhlIHZlcnNpb24gbnVtYmVyIG9mIG1jcy4KKworTG9jYWwgVmFyaWFibGVzOgorZXZhbDooaGlkZS1ib2R5KQorRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlnLy5jdnNpZ25vcmUgYi9jb25maWcvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg0NWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2NvbmZpZy9DaGFuZ2VMb2cgYi9jb25maWcvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWRmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNTMgQEAKKzIwMDUtMDctMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBlbGZ1dGlscy5zcGVjLmluOiBEaXN0cmlidXRlIGV1LWVsZmNtcC4KKworMjAwNS0wNC0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVsZnV0aWxzLnNwZWMuaW46IERpc3RyaWJ1dGUgZXUtYWRkcjJsaW5lLgorCisyMDA1LTAzLTE3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmdXRpbHMuc3BlYy5pbjogRGlzdHJpYnV0ZSBsaWJkdy57YSxzbyxofS4KKworMjAwNS0wMi0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBJZ25vcmUgcmVzdWx0IG9mIGN2cyBydW4uCisKKwkqIGVsZnV0aWxzLnNwZWMuaW46IFNpbXBsaWZ5IGJ1aWxkIHByb2Nlc3MgYnkgbm90IHVzaW5nIGEgc3ViZGlyLgorCVRoaXMgbWVhbnMgd2UgY2FuIHVzZSAlY29uZmlndXJlLgorCisyMDA1LTAyLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IEF1dG9tYXRpY2FsbHkgYWRkZWQgY2hhbmdlbG9nIGZyb20gTkVXUyBmaWxlIG9uIGRpc3QuCisKKzIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBlbGZ1dGlscy5zcGVjLmluOiBNYWtlIHN1cmUgUlBNX09QVF9GTEFHUyBpcyB1c2VkLiAgRHVyaW5nCisJJWJ1aWxkLCByZWFsbHkgZG8gYnVpbGQgdGhlIGJpbmFyaWVzLgorCVJlbW92ZSAtLWVuYWJsZS1zaGFyZWQgY29uZmlndXJlIHBhcmFtZXRlcnMuCisKKzIwMDUtMDItMDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBlbGZ1dGlscy5zcGVjLmluIChCdWlsZFJlcXVpcmVzKTogVXAgZ2NjIHJlcXVpcmVtZW50IHRvIDMuNC4KKworMjAwNC0xMS0yMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVsZnV0aWxzLnNwZWMuaW46IFNvbWUgbW9yZSBjaGFuZ2VzIGZvciB0aGUgUlBNIHdpdGggdGhlIGZha2UKKwliaW5hcmllcy4KKworMjAwNC0wMS0yOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVsZnV0aWxzLnNwZWMuaW46IFVwZGF0ZSBCdWlsZFJlcXVpcmVzLgorCisyMDA0LTAxLTE3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLgorCSogY29uZmlnLmd1ZXNzOiBNb3ZlZCB0byBoZXJlIGZyb20gdG9wbGV2ZWwuCisJKiBjb25maWcucnBhdGg6IExpa2V3aXNlLgorCSogY29uZmlnLnN1YjogTGlrZXdpc2UuCisJKiBkZXBjb21wOiBMaWtld2lzZS4KKwkqIGluc3RhbGwtc2g6IExpa2V3aXNlLgorCSogbWlzc2luZzogTGlrZXdpc2UuCisJKiBta2luc3RhbGxkaXJzOiBMaWtld2lzZS4KKwkqIGVsZnV0aWxzLnNwZWMuaW46IE5ldyBmaWxlLgpkaWZmIC0tZ2l0IGEvY29uZmlnL01ha2VmaWxlLmFtIGIvY29uZmlnL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTc4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzOCBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluIC0qLU1ha2VmaWxlLSotCisjIyBDb25maWd1cmUgaW5wdXQgZmlsZSBmb3IgZWxmdXRpbHMuCisjIworIyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyMjCisjIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyMjCisjIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyMKKyMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyMgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMjCitFWFRSQV9ESVNUID0gZWxmdXRpbHMuc3BlYy5pbgorCiskKHNyY2RpcikvZWxmdXRpbHMuc3BlYy5pbjogJCh0b3Bfc3JjZGlyKS9ORVdTCisJQHRtcG5hbWU9JCQobWt0ZW1wICQke1RNUERJUjotL3RtcH0vZWxmdXRpbHMuWFhYWFhYKTsgXAorCWRhdGUgKycqICVhICViICVlICVZJyB8IHRyICdbXG5dJyAnWyBdJyA+ICQkdG1wbmFtZTsgXAorCWdldGVudCBwYXNzd2QgIiQkKHdob2FtaSkiIHwgXAorCSAgYXdrICdCRUdJTiB7RlM9IjoifSB7IHByaW50ZiAkJDU7IGV4aXQgMH0nID4+ICQkdG1wbmFtZTsgXAorCWVjaG8gLW4gIiA8JCh3aG9hbWkpQHJlZGhhdC5jb20+ICIgPj4gJCR0bXBuYW1lOyBcCisJc2VkICdzL1ZlcnNpb24gXCguKlwpOiQkL1wxLTEvO3EnICQodG9wX3NyY2RpcikvTkVXUyA+PiAkJHRtcG5hbWU7IFwKKwlzZWQgJzIsL15WZXJzaW9uIC9wO2QnICQodG9wX3NyY2RpcikvTkVXUyB8IFwKKwkgIGhlYWQgLW4gLTEgfCBcCisJICBhd2sgJ3sgaWYgKCQkMCA9PSAiIikgeyBpZiAobGluZSAhPSAiIikgeyBwcmludGYgIi0gIjsgZmZsdXNoKCk7IHN5c3RlbSgiZWNobyBcIiIgbGluZSAiXCIgfCBmb2xkIC13IDcwIik7IGxpbmU9IiI7IH0gfSBlbHNlIHsgbGluZT1saW5lICQkMDsgfX0gRU5EIHsgaWYgKGxpbmUgIT0gIiIpIHsgcHJpbnRmICItICI7IHN5c3RlbSgiZWNobyBcIiIgbGluZSAiXCIgfCBmb2xkIC13IDcwIil9fScgPj4gJCR0bXBuYW1lOyBcCisJZWNobyA+PiAkJHRtcG5hbWU7IFwKKwlzZWQgIi9eJWNoYW5nZWxvZy9yICQkdG1wbmFtZSIgJEAgPiAkQC5uZXc7IFwKKwlybSAtZiAkJHRtcG5hbWU7IFwKKwltdiAtZiAkQC5uZXcgJEAKKwktQGlmIFsgLWQgJChzcmNkaXIpL0NWUyBdOyB0aGVuIFwKKwkgIGNkICQoc3JjZGlyKTsgXAorCSAgY3ZzIGNpIC1tICJBZGRlZCBjaGFuZ2Vsb2cuIiAkKEBGKTsgXAorCWZpCmRpZmYgLS1naXQgYS9jb25maWcvY29uZmlnLmd1ZXNzIGIvY29uZmlnL2NvbmZpZy5ndWVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE2ODhiCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDE0NTkgQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA0LTA2LTExJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPHBlckBib3RobmVyLmNvbT4uCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCisjCisjIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KKyMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCisjIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgorIworIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKKyMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBidWlsZCBzeXN0ZW0gdHlwZS4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0KKworT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCAwIDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgMCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCAwIDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAtcSAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJICAgICAgICBvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCAwIDs7CisgICAgYW1kNjQ6T3BlbkJTRDoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXJjOk9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBjYXRzOk9wZW5CU0Q6KjoqKQorCWVjaG8gYXJtLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBocDMwMDpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGx1bmE4OGs6T3BlbkJTRDoqOiopCisgICAgCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjcHBjOk9wZW5CU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZTY4azpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCisJZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lcHBjOk9wZW5CU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcG1heDpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc2dpOk9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwc2ViLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4zOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgd2dyaXNjOk9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOk9wZW5CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1hY3BwYzpNaXJCU0Q6KjoqKQorCWVjaG8gcG93ZXJwcGMtdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpNaXJCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwljYXNlICRVTkFNRV9SRUxFQVNFIGluCisJKjQuMCkKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwkJOzsKKwkqNS4qKQorCSAgICAgICAgVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKKwkJOzsKKwllc2FjCisJIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KKwkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAorCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKKwkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KKwlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCisJY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgorCSAgICAiRVY0ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNC41ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY1ICgyMTE2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKKwkgICAgIkVWNS42ICgyMTE2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OworCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKKwkgICAgIkVWNS43ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7CisJICAgICJFVjYgKDIxMjY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OworCSAgICAiRVY2LjcgKDIxMjY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7CisJICAgICJFVjYuOENCICgyMTI2NEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKKwkgICAgIkVWNyAoMjEzNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7CisJICAgICJFVjcuOSAoMjEzNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKKwllc2FjCisJIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KKwkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KKwkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgorCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgorCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCWV4aXQgMCA7OworICAgIEFscGhhKjpPcGVuVk1TOio6KikKKwllY2hvIGFscGhhLWhwLXZtcworCWV4aXQgMCA7OworICAgIEFscGhhXCAqOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgU2hvdWxkIHdlIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZAorCSMgb2YgdGhlIHNwZWNpZmljIEFscGhhIG1vZGVsPworCWVjaG8gYWxwaGEtcGMtaW50ZXJpeAorCWV4aXQgMCA7OworICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKKwllY2hvIGFscGhhLWRlYy13aW5udDMuNQorCWV4aXQgMCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCAwOzsKKyAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKKwlleGl0IDAgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDAgOzsKKyAgICAqOk9TLzM5MDoqOiopCisJZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgorCWV4aXQgMCA7OworICAgICo6T1M0MDA6KjoqKQorICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCisJZXhpdCAwIDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDA7OworICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgMDs7CisgICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCisJIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KKwlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCisJZWxzZQorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKKwlmaQorCWV4aXQgMCA7OworICAgIE5JTEUqOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCAwIDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCAwIDs7CisgICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqKQorCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgorCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3ICYmIGV4aXQgMCA7OworCWVzYWMgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KikKKwllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6KjoqKQorCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KKwkgICAgU2VyaWVzKnxTNCopCisJCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAorCQk7OworCWVzYWMKKwkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCisJZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDAgOzsKKyAgICBhdXNocDpTdW5PUzoqOiopCisJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCAwIDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICBtNjhrOm1hY2h0ZW46KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUklTQyo6TWFjaDoqOiopCisJZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMworCWV4aXQgMCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQorCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLworCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisjZWxzZQorCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7CisjZW5kaWYKKwkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2VuZGlmCisJICBleGl0ICgtMSk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgXAorCSAgJiYgJGR1bW15IGBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgIFwKKwkgICYmIGV4aXQgMAorCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4CisJZXhpdCAwIDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgMCA7OworICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgMCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDAgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgMCA7OworICAgIG04OGs6Kjo0KjpSNCopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDAgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQorCXRoZW4KKwkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCisJICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCisJICAgIHRoZW4KKwkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJICAgIGVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJICAgIGZpCisJZWxzZQorCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwlmaQorIAlleGl0IDAgOzsKKyAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQorCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCisJZXhpdCAwIDs7CisgICAgTTg4KjoqOlIzKjoqKQorCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDAgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCAwIDs7CisgICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKKwllY2hvIG02OGstdGVrdHJvbml4LWJzZAorCWV4aXQgMCA7OworICAgICo6SVJJWCo6KjoqKQorCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKKwlleGl0IDAgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCisJZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKKyAgICBpKjg2OkFJWDoqOiopCisJZWNobyBpMzg2LWlibS1haXgKKwlleGl0IDAgOzsKKyAgICBpYTY0OkFJWDoqOiopCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCAwIDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmICRkdW1teSAmJiBleGl0IDAKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDAgOzsKKyAgICAqOkFJWDoqOls0NV0pCisJSUJNX0NQVV9JRD1gL3Vzci9zYmluL2xzZGV2IC1DIC1jIHByb2Nlc3NvciAtUyBhdmFpbGFibGUgfCBzZWQgMXEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCisJaWYgL3Vzci9zYmluL2xzYXR0ciAtRWwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgJyBQT1dFUicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCUlCTV9BUkNIPXJzNjAwMAorCWVsc2UKKwkJSUJNX0FSQ0g9cG93ZXJwYworCWZpCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgMCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDAgOzsKKyAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAorCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KKwlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMworICAgICo6Qk9TWDoqOiopCisJZWNobyByczYwMDAtYnVsbC1ib3N4CisJZXhpdCAwIDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgMCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCAwIDs7CisgICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKKwllY2hvIG02OGstaHAtYnNkNC40CisJZXhpdCAwIDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgorCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKyAgICAgICAgICAgICAgICAgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKyAgICAgICAgICAgICAgICAgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisJCWZpCisJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgorCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisKKyAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCisgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgICAgICAgIH0KK0VPRgorCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKKwkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKKwkJZmkgOzsKKwllc2FjCisJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCisJdGhlbgorCSAgICAjIGF2b2lkIGRvdWJsZSBldmFsdWF0aW9uIG9mICRzZXRfY2NfZm9yX2J1aWxkCisJICAgIHRlc3QgLW4gIiRDQ19GT1JfQlVJTEQiIHx8IGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkgICAgaWYgZWNobyBfX0xQNjRfXyB8IChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSkgfCBncmVwIF9fTFA2NF9fID4vZGV2L251bGwKKwkgICAgdGhlbgorCQlIUF9BUkNIPSJocHBhMi4wdyIKKwkgICAgZWxzZQorCQlIUF9BUkNIPSJocHBhNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCAwIDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgMCA7OworICAgIDMwNTAqOkhJLVVYOio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmICRkdW1teSAmJiBleGl0IDAKKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCAwIDs7CisgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1ic2QKKwlleGl0IDAgOzsKKyAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1ic2QKKwlleGl0IDAgOzsKKyAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCisJZWNobyBocHBhMS4wLWhwLW1wZWl4CisJZXhpdCAwIDs7CisgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCisJZWNobyBocHBhMS4xLWhwLW9zZgorCWV4aXQgMCA7OworICAgIGhwOD8/Ok9TRjE6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1vc2YKKwlleGl0IDAgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDAgOzsKKyAgICBwYXJpc2MqOkxpdGVzKjoqOiopCisJZWNobyBocHBhMS4xLWhwLWxpdGVzCisJZXhpdCAwIDs7CisgICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKKwllY2hvIGMxLWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisgICAgICAgIGV4aXQgMCA7OworICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCisJZWNobyBjNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIENSQVkqWS1NUDoqOio6KikKKwllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIENSQVkqVFM6KjoqOiopCisJZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKlQzRToqOio6KikKKwllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgICo6VU5JQ09TL21wOio6KikKKwllY2hvIG52MS1jcmF5LXVuaWNvc21wJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCisJRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorICAgICAgICBleGl0IDAgOzsKKyAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorCWV4aXQgMCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHNwYXJjKjpCU0QvT1M6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6QlNEL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6RnJlZUJTRDoqOiopCisJIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciB1c2VzIGdsaWJjLgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCSNpZiBfX0dMSUJDX18gPj0gMgorCUxJQkM9Z251CisJI2Vsc2UKKwlMSUJDPQorCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkxJQkM9YAorCSMgR05VL0tGcmVlQlNEIHN5c3RlbXMgaGF2ZSBhICJrIiBwcmVmaXggdG8gaW5kaWNhdGUgd2UgYXJlIHVzaW5nCisJIyBGcmVlQlNEJ3Mga2VybmVsLCBidXQgbm90IHRoZSBjb21wbGV0ZSBPUy4KKwljYXNlICR7TElCQ30gaW4gZ251KSBrZXJuZWxfb25seT0naycgOzsgZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLSR7a2VybmVsX29ubHl9ZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2Ake0xJQkM6Ky0kTElCQ30KKwlleGl0IDAgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgorCWV4aXQgMCA7OworICAgIGkqOk1JTkdXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCisJZXhpdCAwIDs7CisgICAgaSo6UFcqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKKwlleGl0IDAgOzsKKyAgICB4ODY6SW50ZXJpeCo6WzM0XSopCisJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9cLi4qLy8nCisJZXhpdCAwIDs7CisgICAgWzM0NV04NjpXaW5kb3dzXzk1OiogfCBbMzQ1XTg2OldpbmRvd3NfOTg6KiB8IFszNDVdODY6V2luZG93c19OVDoqKQorCWVjaG8gaSR7VU5BTUVfTUFDSElORX0tcGMtbWtzCisJZXhpdCAwIDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCAwIDs7CisgICAgaSo6VVdJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgorCWV4aXQgMCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgMCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICAqOkdOVToqOiopCisJIyB0aGUgR05VIHN5c3RlbQorCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAorCWV4aXQgMCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtZ251CisJZXhpdCAwIDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCAwIDs7CisgICAgYXJtKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyBjcmlzLWF4aXMtbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgaWE2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIG02OCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIG1pcHM6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwcworCSN1bmRlZiBtaXBzZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHMKKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5DUFU9YAorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IiAmJiBleGl0IDAKKwk7OworICAgIG1pcHM2NDpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiBtaXBzNjQKKwkjdW5kZWYgbWlwczY0ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzNjRlbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9bWlwczY0CisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeQ1BVPWAKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSIgJiYgZXhpdCAwCisJOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQorCWV4aXQgMCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7CisJZXNhYworCWV4aXQgMCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCAwIDs7CisgICAgc2g2NCo6TGludXg6KjoqKQorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIHg4Nl82NDpMaW51eDoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbworCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKKwkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCisJIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KKwlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAorCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAorCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKKwkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KKwkJCQkgICAgcy8gLiovLworCQkJCSAgICBwJ2AKKyAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgorCSAgZWxmMzItaTM4NikKKwkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKKwkJOzsKKwkgIGEub3V0LWkzODYtbGludXgpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKKwkJZXhpdCAwIDs7CisJICBjb2ZmLWkzODYpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKKwkJZXhpdCAwIDs7CisJICAiIikKKwkJIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpIG9yCisJCSMgb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIgorCQlleGl0IDAgOzsKKwllc2FjCisJIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKwkjaWZkZWYgX19FTEZfXworCSMgaWZkZWYgX19HTElCQ19fCisJIyAgaWYgX19HTElCQ19fID49IDIKKwlMSUJDPWdudQorCSMgIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyAgZW5kaWYKKwkjIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyBlbmRpZgorCSNlbHNlCisJI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKwlMSUJDPWdudQorCSNlbHNlCisJTElCQz1nbnVhb3V0CisJI2VuZGlmCisJI2VuZGlmCisJI2lmZGVmIF9fZGlldGxpYmNfXworCUxJQkM9ZGlldGxpYmMKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5MSUJDPWAKKwl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iICYmIGV4aXQgMAorCXRlc3QgeCIke1RFTlRBVElWRX0iICE9IHggJiYgZWNobyAiJHtURU5UQVRJVkV9IiAmJiBleGl0IDAKKwk7OworICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCisJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KKwkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCisJIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KKwllY2hvIGkzODYtc2VxdWVudC1zeXN2NAorCWV4aXQgMCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgMCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgMCA7OworICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAorCWV4aXQgMCA7OworICAgIGkqODY6YXRoZW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKKwlleGl0IDAgOzsKKwlpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDAgOzsKKyAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKKwllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaSo4NjoqRE9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAorCWV4aXQgMCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgMCA7OworICAgIGkqODY6Kjo1Ols3OF0qKQorCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCisJICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OworCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKKwkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059CisJZXhpdCAwIDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDAgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KKwllY2hvIGkzODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDAgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCAwIDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgMCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDAgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgMCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCAwIDs7CisgICAgTTY4MD8wOkQtTklYOjUuMzoqKQorCWVjaG8gbTY4ay1kaWFiLWRuaXgKKwlleGl0IDAgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgMCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuMCo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgMCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCAwIDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCAwIDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgICo6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKKwlleGl0IDAgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCAwIDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorICAgICAgICBleGl0IDAgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDAgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDAgOzsKKyAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1iZW9zCisJZXhpdCAwIDs7CisgICAgU1gtNDpTVVBFUi1VWDoqOiopCisJZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU1gtNTpTVVBFUi1VWDoqOiopCisJZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpSaGFwc29keToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6RGFyd2luOio6KikKKwljYXNlIGB1bmFtZSAtcGAgaW4KKwkgICAgKjg2KSBVTkFNRV9QUk9DRVNTT1I9aTY4NiA7OworCSAgICBwb3dlcnBjKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCisJCVVOQU1FX1BST0NFU1NPUj1pMzg2CisJCVVOQU1FX01BQ0hJTkU9cGMKKwlmaQorCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDAgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCAwIDs7CisgICAgQlMyMDAwOlBPU0lYKjoqOiopCisJZWNobyBiczIwMDAtc2llbWVucy1zeXN2CisJZXhpdCAwIDs7CisgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCAwIDs7CisgICAgKjpUT1BTLTEwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCisJZXhpdCAwIDs7CisgICAgKjpURU5FWDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRlbmV4CisJZXhpdCAwIDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDAgOzsKKyAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAteGtsLXRvcHMyMAorCWV4aXQgMCA7OworICAgICo6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAorCWV4aXQgMCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCAwIDs7CisgICAgU0VJOio6KjpTRUlVWCkKKyAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkRyYWdvbkZseToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZHJhZ29uZmx5YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAorCWV4aXQgMCA7OworZXNhYworCisjZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKKyNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKKworZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorY2F0ID4kZHVtbXkuYyA8PEVPRgorI2lmZGVmIF9TRVFVRU5UXworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorbWFpbiAoKQoreworI2lmIGRlZmluZWQgKHNvbnkpCisjaWYgZGVmaW5lZCAoTUlQU0VCKQorICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAorICAgICBJIGRvbid0IGtub3cuLi4uICAqLworICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCisjaWZkZWYgTkVXU09TNAorICAgICAgICAgICI0IgorI2Vsc2UKKwkgICIiCisjZW5kaWYKKyAgICAgICAgICk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXgiKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKKyAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTmVYVCkKKyNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKKyNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKKyNlbmRpZgorICBpbnQgdmVyc2lvbjsKKyAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOworICBpZiAodmVyc2lvbiA8IDQpCisgICAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIiVzLW5leHQtb3BlbnN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQorI2lmIGRlZmluZWQgKFVNQVhWKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpZiBkZWZpbmVkIChDTVUpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQorICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChzZXF1ZW50KQorI2lmIGRlZmluZWQgKGkzODYpCisgIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjaWYgZGVmaW5lZCAobnMzMjAwMCkKKyAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKKyAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKKworICAgIHVuYW1lKCZ1bik7CisKKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7CisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAodmF4KQorIyBpZiAhZGVmaW5lZCAodWx0cml4KQorIyAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICBpZiBkZWZpbmVkIChCU0QpCisjICAgaWYgQlNEID09IDQzCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM1xuIik7IGV4aXQgKDApOworIyAgIGVsc2UKKyMgICAgaWYgQlNEID09IDE5OTAwNgorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNyZW5vXG4iKTsgZXhpdCAoMCk7CisjICAgIGVsc2UKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgZW5kaWYKKyMgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCisgIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisgIGV4aXQgKDEpOworfQorRU9GCisKKyRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsICYmICRkdW1teSAmJiBleGl0IDAKKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQorCisjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCisKK2lmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCit0aGVuCisgICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KKyAgICBjMSopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgYzIqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDAgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjMzgqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjNCopCisJZWNobyBjNC1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgICBmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L2NvbmZpZy8KKworSWYgdGhlIHZlcnNpb24geW91IHJ1biAoJDApIGlzIGFscmVhZHkgdXAgdG8gZGF0ZSwgcGxlYXNlCitzZW5kIHRoZSBmb2xsb3dpbmcgZGF0YSBhbmQgYW55IGluZm9ybWF0aW9uIHlvdSB0aGluayBtaWdodCBiZQorcGVydGluZW50IHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBuZWVkZWQKK2luZm9ybWF0aW9uIHRvIGhhbmRsZSB5b3VyIHN5c3RlbS4KKworY29uZmlnLmd1ZXNzIHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAKKwordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCisKK2hvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCisvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCisvdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKKworVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KK1VOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9CitVTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19CitVTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQorRU9GCisKK2V4aXQgMQorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9jb25maWcvY29uZmlnLnN1YiBiL2NvbmZpZy9jb25maWcuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzMxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvY29uZmlnLnN1YgpAQCAtMCwwICsxLDE1NDkgQEAKKyMhIC9iaW4vc2gKKyMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMDQtMDMtMTInCisKKyMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgorIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCisjIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgMCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgMCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDA7OworCisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitjYXNlICQjIGluCisgMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgorICAgIGV4aXQgMTs7CisgMSkgOzsKKyAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworZXNhYworCisjIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCisjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgorbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCitjYXNlICRtYXliZV9vcyBpbgorICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LXVjbGliYyogfCB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBcCisgIGtmcmVlYnNkKi1nbnUqIHwga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICAqKQorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKKyAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KKyAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCisgICAgZWxzZSBvcz07IGZpCisgICAgOzsKK2VzYWMKKworIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCisjIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbworIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQorIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCitjYXNlICRvcyBpbgorCS1zdW4qb3MqKQorCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KKwkJOzsKKwktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAorCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAorCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCisJLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKKwktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAorCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAorCS1hcHBsZSB8IC1heGlzKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zY291dCkKKwkJOzsKKwktd3JzKQorCQlvcz0tdnh3b3JrcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWNob3J1c29zKikKKwkJb3M9LWNob3J1c29zCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKyAJLWNob3J1c3JkYikKKyAJCW9zPS1jaG9ydXNyZGIKKwkJYmFzaWNfbWFjaGluZT0kMQorIAkJOzsKKwktaGl1eCopCisJCW9zPS1oaXV4d2UyCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbyopCisJCW9zPS1zY28zLjJ2MgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXVkayopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktaXNjKQorCQlvcz0taXNjMi4yCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktY2xpeCopCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCisJCTs7CisJLWlzYyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktbHlueCopCisJCW9zPS1seW54b3MKKwkJOzsKKwktcHR4KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCisJCTs7CisJLXdpbmRvd3NudCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKKwkJOzsKKwktcHNvcyopCisJCW9zPS1wc29zCisJCTs7CisJLW1pbnQgfCAtbWludFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7Citlc2FjCisKKyMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCisJIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KKwkxNzUwYSB8IDU4MCBcCisJfCBhMjlrIFwKKwl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCisJfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKKwl8IGFtMzNfMi4wIFwKKwl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIHwgbWNvcmUgXAorCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCisJfCBtaXBzMTYgXAorCXwgbWlwczY0IHwgbWlwczY0ZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCisJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCisJfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCisJfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCisJfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAorCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAorCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbXNwNDMwIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3BlbnJpc2MgfCBvcjMyIFwKKwl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCisJfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgfCBwcGNiZSBcCisJfCBweXJhbWlkIFwKKwl8IHNoIHwgc2hbMTIzNF0gfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzg2eCB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiBcCisJfCBzdHJvbmdhcm0gXAorCXwgdGFob2UgfCB0aHVtYiB8IHRpYzR4IHwgdGljODAgfCB0cm9uIFwKKwl8IHY4NTAgfCB2ODUwZSBcCisJfCB3ZTMyayBcCisJfCB4ODYgfCB4c2NhbGUgfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCisJCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogXAorCXwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCisJfCBjbGlwcGVyLSogfCBjeWRyYS0qIFwKKwl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKKwl8IGVseHNpLSogXAorCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAorCXwgaDgzMDAtKiB8IGg4NTAwLSogXAorCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKKwl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCisJfCBpcDJrLSogfCBpcTIwMDAtKiBcCisJfCBtMzJyLSogfCBtMzJybGUtKiBcCisJfCBtNjgwMDAtKiB8IG02ODBbMDEyMzQ2XTAtKiB8IG02ODM2MC0qIHwgbTY4Mz8yLSogfCBtNjhrLSogXAorCXwgbTg4MTEwLSogfCBtODhrLSogfCBtY29yZS0qIFwKKwl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKKwl8IG1pcHMxNi0qIFwKKwl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCisJfCBtaXBzNjR2ci0qIHwgbWlwczY0dnJlbC0qIFwKKwl8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAorCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKKwl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCisJfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAorCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKKwl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBub25lLSogfCBucDEtKiB8IG52MS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcm9tcC0qIHwgcnM2MDAwLSogXAorCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIHwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCisJfCB0YWhvZS0qIHwgdGh1bWItKiBcCisJfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCisJfCB0cm9uLSogXAorCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhwczEwMC0qIHwgeHNjYWxlLSogfCB4c3Rvcm15MTYtKiBcCisJfCB4dGVuc2EtKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworICAgIAlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwljOTApCisJCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyMTZjKQorCQliYXNpY19tYWNoaW5lPWNyMTZjLXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXMgfCBjcmlzLSogfCBldHJheCopCisJCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCisJCTs7CisJY3J4KQorCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwlkYTMwIHwgZGEzMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAorCQk7OworCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKKwkJYmFzaWNfbWFjaGluZT1taXBzLWRlYworCQk7OworCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMxMAorCQk7OworCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMyMAorCQk7OworCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCisJICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQorCQk7OworCWRlbHRhODgpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQorCQlvcz0tc3lzdjMKKwkJOzsKKwlkcHgyMCB8IGRweDIwLSopCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKKwkJb3M9LWJvc3gKKwkJOzsKKwlkcHgyKiB8IGRweDIqLWJ1bGwpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MworCQk7OworCWVibW9uMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS1lYm1vbgorCQk7OworCWVseHNpKQorCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCisJCW9zPS1ic2QKKwkJOzsKKwllbmNvcmUgfCB1bWF4IHwgbW1heCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKKwkJOzsKKwllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJZ28zMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1nbzMyCisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWg4MzAweHJheSkKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS14cmF5CisJCTs7CisJaDg1MDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaGFycmlzKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1zeXN2MworCQk7OworCWhwMzAwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwMzAwYnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWJzZAorCQk7OworCWhwMzAwaHB1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ocHV4CisJCTs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlocHBhb3NmKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LW9zZgorCQk7OworCWhwcHJvKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LXByb2VsZgorCQk7OworCWkzNzAtaWJtKiB8IGlibSopCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJOzsKKyMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKKwltaXBzMyotKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKKwkJOzsKKwltaXBzMyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KKwkJOzsKKwltbWl4KikKKwkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCisJCW9zPS1tbWl4d2FyZQorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluY3IzMDAwKQorCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCisJCW9zPS1zeXN2NAorCQk7OworCW5ldGJzZDM4NikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LW5ldGJzZAorCQk7OworCW5ldHdpbmRlcikKKwkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKKwkJb3M9LWxpbnV4CisJCTs7CisJbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MxMDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzLTM2MDAgfCByaXNjLW5ld3MpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZWN2NzApCisJCWJhc2ljX21hY2hpbmU9djcwLW5lYworCQlvcz0tc3lzdgorCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbW9uOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW1vbjk2MAorCQk7OworCW5vbnN0b3B1eCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQorCQlvcz0tbm9uc3RvcHV4CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCW52MSkKKwkJYmFzaWNfbWFjaGluZT1udjEtY3JheQorCQlvcz0tdW5pY29zbXAKKwkJOzsKKwluc3ItdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KKwkJOzsKKwlvcDUwbi0qIHwgb3A2MGMtKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQlvcz0tcHJvZWxmCisJCTs7CisJb3IzMiB8IG9yMzItKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYmQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCisJCTs7CisJcGJiKQorCQliYXNpY19tYWNoaW5lPW02OGstdHRpCisJCTs7CisJcGM1MzIgfCBwYzUzMi0qKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyb202OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJczM5MCB8IHMzOTAtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQorCQk7OworCXMzOTB4IHwgczM5MHgtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJOzsKKwlzYTI5MjAwKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlzYjEpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KKwkJOzsKKwlzYjFlbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCisJCTs7CisJc2VpKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCisJCW9zPS1zZWl1eAorCQk7OworCXNlcXVlbnQpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCTs7CisJc2gpCisJCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCisJCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCisJCW9zPS1zeXN2NAorCQk7OworCXN1bjIpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQk7OworCXN1bjJvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuMm9zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW4zb3MzKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4zb3M0KQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40b3MzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuNG9zNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRzb2wyKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlzdW4zIHwgc3VuMy0qKQorCQliYXNpY19tYWNoaW5lPW02OGstc3VuCisJCTs7CisJc3VuNCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgorCQk7OworCXN2MSkKKwkJYmFzaWNfbWFjaGluZT1zdjEtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJc3ltbWV0cnkpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCXQzZSkKKwkJYmFzaWNfbWFjaGluZT1hbHBoYWV2NS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0OTApCisJCWJhc2ljX21hY2hpbmU9dDkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXRpYzU0eCB8IGM1NHgqKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNTV4IHwgYzU1eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTV4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM2eCB8IGM2eCopCisJCWJhc2ljX21hY2hpbmU9dGljNngtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b2FkMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKKwkJb3M9LXRvcHMyMAorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl0cGYpCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCW9zPS10cGYKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXY4MTAgfCBuZWN2ODEwKQorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKwkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKKwkJOzsKKwl2eHdvcmtzOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczY4KQorCQliYXNpY19tYWNoaW5lPW02OGstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXc2NSopCisJCWJhc2ljX21hY2hpbmU9dzY1LXdkYworCQlvcz0tbm9uZQorCQk7OworCXc4OWstKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJb3M9LXByb2VsZgorCQk7OworCXhwcyB8IHhwczEwMCkKKwkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCisJCTs7CisJeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl6OGstKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwlub25lKQorCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQorCQlvcz0tbm9uZQorCQk7OworCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCisjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCisJdzg5aykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJOzsKKwlvcDUwbikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCW9wNjBjKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMCkKKwkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAorCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzaDMgfCBzaDQgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCisJCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgorCQk7OworCXNoNjQpCisJCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCisJCTs7CisJc3BhcmMgfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCWN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQk7OworCXBtYWMgfCBwbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCisJCTs7CisJKi11bmtub3duKQorCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKyAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKyAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KKwkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIHwgLW9wZW5ic2QqIFwKKwkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKKwkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIFwKKwkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC11Y2xpYmMqIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKKwkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1ta3MqIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAorCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAorCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAorCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKKwkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqIHwgLXdpbmRpc3MqIFwKKwkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogXAorCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCisJCTs7CisJLW1hYyopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKKwkJOzsKKwktbGludXgtZGlldGxpYmMpCisJCW9zPS1saW51eC1kaWV0bGliYworCQk7OworCS1saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwktc3Vub3M1KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAorCQk7OworCS1zdW5vczYqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCisJCTs7CisJLW9wZW5lZCopCisJCW9zPS1vcGVuZWRpdGlvbgorCQk7OworICAgICAgICAtb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWF0aGVvcyopCisJCW9zPS1hdGhlb3MKKwkJOzsKKwktc3lsbGFibGUqKQorCQlvcz0tc3lsbGFibGUKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5vdmEqKQorCQlvcz0tcnRtay1ub3ZhCisJCTs7CisJLW5zMiApCisJCW9zPS1uZXh0c3RlcDIKKwkJOzsKKwktbnNrKikKKwkJb3M9LW5zaworCQk7OworCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KKwktc2luaXg1LiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCisJCTs7CisJLXNpbml4KikKKwkJb3M9LXN5c3Y0CisJCTs7CisgICAgICAgIC10cGYqKQorCQlvcz0tdHBmCisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLWthb3MqKQorCQlvcz0ta2FvcworCQk7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1hY29ybikKKwkJb3M9LXJpc2NpeDEuMgorCQk7OworCWFybSotcmViZWwpCisJCW9zPS1saW51eAorCQk7OworCWFybSotc2VtaSkKKwkJb3M9LWFvdXQKKwkJOzsKKyAgICBjNHgtKiB8IHRpYzR4LSopCisgICAgICAgIG9zPS1jb2ZmCisgICAgICAgIDs7CisJIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgorCXBkcDEwLSopCisJCW9zPS10b3BzMjAKKwkJOzsKKwlwZHAxMS0qKQorCQlvcz0tbm9uZQorCQk7OworCSotZGVjIHwgdmF4LSopCisJCW9zPS11bHRyaXg0LjIKKwkJOzsKKwltNjgqLWFwb2xsbykKKwkJb3M9LWRvbWFpbgorCQk7OworCWkzODYtc3VuKQorCQlvcz0tc3Vub3M0LjAuMgorCQk7OworCW02ODAwMC1zdW4pCisJCW9zPS1zdW5vczMKKwkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCisJCSMgZGVmYXVsdC4KKwkJIyBvcz0tc3Vub3M0CisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKwkqLXdlYykKKwkJb3M9LXByb2VsZgorCQk7OworCSotd2luYm9uZCkKKwkJb3M9LXByb2VsZgorCQk7OworCSotb2tpKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1ocCkKKwkJb3M9LWhwdXgKKwkJOzsKKwkqLWhpdGFjaGkpCisJCW9zPS1oaXV4CisJCTs7CisJaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQorCQlvcz0tc3lzdgorCQk7OworCSotY2JtKQorCQlvcz0tYW1pZ2FvcworCQk7OworCSotZGcpCisJCW9zPS1kZ3V4CisJCTs7CisJKi1kb2xwaGluKQorCQlvcz0tc3lzdjMKKwkJOzsKKwltNjhrLWNjdXIpCisJCW9zPS1ydHUKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJb3M9LWx1bmEKKwkJOzsKKwkqLW5leHQgKQorCQlvcz0tbmV4dHN0ZXAKKwkJOzsKKwkqLXNlcXVlbnQpCisJCW9zPS1wdHgKKwkJOzsKKwkqLWNyZHMpCisJCW9zPS11bm9zCisJCTs7CisJKi1ucykKKwkJb3M9LWdlbml4CisJCTs7CisJaTM3MC0qKQorCQlvcz0tbXZzCisJCTs7CisJKi1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisJKi1zZ2kpCisJCW9zPS1pcml4CisJCTs7CisJKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQorCQlvcz0tY29mZgorCQk7OworCSotKmJ1ZykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLWFwcGxlKQorCQlvcz0tbWFjb3MKKwkJOzsKKwkqLWF0YXJpKikKKwkJb3M9LW1pbnQKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyogfCAtb3BlbmVkKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1vczQwMCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktcHR4KikKKwkJCQl2ZW5kb3I9c2VxdWVudAorCQkJCTs7CisJCQktdHBmKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdCAwCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2NvbmZpZy9kZXBjb21wIGIvY29uZmlnL2RlcGNvbXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4ZTNiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9kZXBjb21wCkBAIC0wLDAgKzEsNDM2IEBACisjISAvYmluL3NoCisKKyMgZGVwY29tcCAtIGNvbXBpbGUgYSBwcm9ncmFtIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzIGFzIHNpZGUtZWZmZWN0cworIyBDb3B5cmlnaHQgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+LgorCitpZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KKyAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCisgIGV4aXQgMQorZmkKKyMgYGxpYnRvb2wnIGNhbiBhbHNvIGJlIHNldCB0byBgeWVzJyBvciBgbm8nLgorCitpZiB0ZXN0IC16ICIkZGVwZmlsZSI7IHRoZW4KKyAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzLF4uKi8sLCcgLWUgJ3MsXC5cKFteLl0qXCkkLC5QXDEsJ2AKKyAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MsLy4qJCwvLCdgCisgICBpZiB0ZXN0ICIkZGlyIiA9ICIkb2JqZWN0IjsgdGhlbgorICAgICAgZGlyPQorICAgZmkKKyAgICMgRklYTUU6IHNob3VsZCBiZSBfZGVwcyBvbiBET1MuCisgICBkZXBmaWxlPSIkZGlyLmRlcHMvJGJhc2UiCitmaQorCit0bXBkZXBmaWxlPSR7dG1wZGVwZmlsZS1gZWNobyAiJGRlcGZpbGUiIHwgc2VkICdzL1wuXChbXi5dKlwpJC8uVFwxLydgfQorCitybSAtZiAiJHRtcGRlcGZpbGUiCisKKyMgU29tZSBtb2RlcyB3b3JrIGp1c3QgbGlrZSBvdGhlciBtb2RlcywgYnV0IHVzZSBkaWZmZXJlbnQgZmxhZ3MuICBXZQorIyBwYXJhbWV0ZXJpemUgaGVyZSwgYnV0IHN0aWxsIGxpc3QgdGhlIG1vZGVzIGluIHRoZSBiaWcgY2FzZSBiZWxvdywKKyMgdG8gbWFrZSBkZXBlbmQubTQgZWFzaWVyIHRvIHdyaXRlLiAgTm90ZSB0aGF0IHdlICpjYW5ub3QqIHVzZSBhIGNhc2UKKyMgaGVyZSwgYmVjYXVzZSB0aGlzIGZpbGUgY2FuIG9ubHkgY29udGFpbiBvbmUgY2FzZSBzdGF0ZW1lbnQuCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBocDsgdGhlbgorICAjIEhQIGNvbXBpbGVyIHVzZXMgLU0gYW5kIG5vIGV4dHJhIGFyZy4KKyAgZ2NjZmxhZz0tTQorICBkZXBtb2RlPWdjYworZmkKKworaWYgdGVzdCAiJGRlcG1vZGUiID0gZGFzaFhtc3Rkb3V0OyB0aGVuCisgICAjIFRoaXMgaXMganVzdCBsaWtlIGRhc2htc3Rkb3V0IHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQuCisgICBkYXNobWZsYWc9LXhNCisgICBkZXBtb2RlPWRhc2htc3Rkb3V0CitmaQorCitjYXNlICIkZGVwbW9kZSIgaW4KK2djYzMpCisjIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAorIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKKyMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KKyAgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIG12ICIkdG1wZGVwZmlsZSIgIiRkZXBmaWxlIgorICA7OworCitnY2MpCisjIyBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGdldCBkZXBlbmRlbmN5IG91dHB1dCBmcm9tIGdjYy4gIEhlcmUncworIyMgd2h5IHdlIHBpY2sgdGhpcyByYXRoZXIgb2JzY3VyZSBtZXRob2Q6CisjIyAtIERvbid0IHdhbnQgdG8gdXNlIC1NRCBiZWNhdXNlIHdlJ2QgbGlrZSB0aGUgZGVwZW5kZW5jaWVzIHRvIGVuZAorIyMgICB1cCBpbiBhIHN1YmRpci4gIEhhdmluZyB0byByZW5hbWUgYnkgaGFuZCBpcyB1Z2x5LgorIyMgICAoV2UgbWlnaHQgZW5kIHVwIGRvaW5nIHRoaXMgYW55d2F5IHRvIHN1cHBvcnQgb3RoZXIgY29tcGlsZXJzLikKKyMjIC0gVGhlIERFUEVOREVOQ0lFU19PVVRQVVQgZW52aXJvbm1lbnQgdmFyaWFibGUgbWFrZXMgZ2NjIGFjdCBsaWtlCisjIyAgIC1NTSwgbm90IC1NIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4KKyMjIC0gVXNpbmcgLU0gZGlyZWN0bHkgbWVhbnMgcnVubmluZyB0aGUgY29tcGlsZXIgdHdpY2UgKGV2ZW4gd29yc2UKKyMjICAgdGhhbiByZW5hbWluZykuCisgIGlmIHRlc3QgLXogIiRnY2NmbGFnIjsgdGhlbgorICAgIGdjY2ZsYWc9LU1ELAorICBmaQorICAiJEAiIC1XcCwiJGdjY2ZsYWckdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgYWxwaGE9QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorIyMgVGhlIHNlY29uZCAtZSBleHByZXNzaW9uIGhhbmRsZXMgRE9TLXN0eWxlIGZpbGUgbmFtZXMgd2l0aCBkcml2ZSBsZXR0ZXJzLgorICBzZWQgLWUgJ3MvXlteOl0qOiAvIC8nIFwKKyAgICAgIC1lICdzL15bJyRhbHBoYSddOlwvW146XSo6IC8gLycgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyMjIFRoaXMgbmV4dCBwaWVjZSBvZiBtYWdpYyBhdm9pZHMgdGhlIGBkZWxldGVkIGhlYWRlciBmaWxlJyBwcm9ibGVtLgorIyMgVGhlIHByb2JsZW0gaXMgdGhhdCB3aGVuIGEgaGVhZGVyIGZpbGUgd2hpY2ggYXBwZWFycyBpbiBhIC5QIGZpbGUKKyMjIGlzIGRlbGV0ZWQsIHRoZSBkZXBlbmRlbmN5IGNhdXNlcyBtYWtlIHRvIGRpZSAoYmVjYXVzZSB0aGVyZSBpcworIyMgdHlwaWNhbGx5IG5vIHdheSB0byByZWJ1aWxkIHRoZSBoZWFkZXIpLiAgV2UgYXZvaWQgdGhpcyBieSBhZGRpbmcKKyMjIGR1bW15IGRlcGVuZGVuY2llcyBmb3IgZWFjaCBoZWFkZXIgZmlsZS4gIFRvbyBiYWQgZ2NjIGRvZXNuJ3QgZG8KKyMjIHRoaXMgZm9yIHVzIGRpcmVjdGx5LgorICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgfAorIyMgU29tZSB2ZXJzaW9ucyBvZiBnY2MgcHV0IGEgc3BhY2UgYmVmb3JlIHRoZSBgOicuICBPbiB0aGUgdGhlb3J5CisjIyB0aGF0IHRoZSBzcGFjZSBtZWFucyBzb21ldGhpbmcsIHdlIGFkZCBhIHNwYWNlIHRvIHRoZSBvdXRwdXQgYXMKKyMjIHdlbGwuCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitocCkKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKK3NnaSkKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgIiRAIiAiLVdwLC1NRHVwZGF0ZSwkdG1wZGVwZmlsZSIKKyAgZWxzZQorICAgICIkQCIgLU1EdXBkYXRlICIkdG1wZGVwZmlsZSIKKyAgZmkKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gICMgeWVzLCB0aGUgc291cmNlZmlsZSBkZXBlbmQgb24gb3RoZXIgZmlsZXMKKyAgICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorCisgICAgIyBDbGlwIG9mZiB0aGUgaW5pdGlhbCBlbGVtZW50ICh0aGUgZGVwZW5kZW50KS4gIERvbid0IHRyeSB0byBiZQorICAgICMgY2xldmVyIGFuZCByZXBsYWNlIHRoaXMgd2l0aCBzZWQgY29kZSwgYXMgSVJJWCBzZWQgd29uJ3QgaGFuZGxlCisgICAgIyBsaW5lcyB3aXRoIG1vcmUgdGhhbiBhIGZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzICg0MDk2IGluCisgICAgIyBJUklYIDYuMiBzZWQsIDgxOTIgaW4gSVJJWCA2LjUpLiAgV2UgYWxzbyByZW1vdmUgY29tbWVudCBsaW5lczsKKyAgICAjIHRoZSBJUklYIGNjIGFkZHMgY29tbWVudHMgbGlrZSBgIzpmZWMnIHRvIHRoZSBlbmQgb2YgdGhlCisgICAgIyBkZXBlbmRlbmN5IGxpbmUuCisgICAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIFwKKyAgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgfCBcCisgICAgdHIgJworJyAnICcgPj4gJGRlcGZpbGUKKyAgICBlY2hvID4+ICRkZXBmaWxlCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKKyAgID4+ICRkZXBmaWxlCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCithaXgpCisgICMgVGhlIEMgZm9yIEFJWCBDb21waWxlciB1c2VzIC1NIGFuZCBvdXRwdXRzIHRoZSBkZXBlbmRlbmNpZXMKKyAgIyBpbiBhIC51IGZpbGUuICBUaGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgIyBBbHNvLCB0aGUgQUlYIGNvbXBpbGVyIHB1dHMgYCRvYmplY3Q6JyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBsaW5lOworICAjICRvYmplY3QgZG9lc24ndCBoYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgc3RyaXBwZWQ9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzLF4uKi8sLCcgLWUgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKKyAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCisgIG91dG5hbWU9IiRzdHJpcHBlZC5vIgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiIC1XYywtTQorICBlbHNlCisgICAgIiRAIiAtTQorICBmaQorCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLgorICAgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgorICAgIHNlZCAtZSAicyxeJG91dG5hbWU6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICBzZWQgLWUgInMsXiRvdXRuYW1lOiBcKC4qXCkkLFwxOiwiIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCit0cnU2NCkKKyAgICMgVGhlIFRydTY0IEFJWCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCisgICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCisgICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0IAorICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCisgICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisKKyAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzL1wubyQvLmQvJyAtZSAncy9cLmxvJC8uZC8nYAorICAgdG1wZGVwZmlsZTE9IiRiYXNlLm8uZCIKKyAgIHRtcGRlcGZpbGUyPSIkYmFzZS5kIgorICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgICAiJEAiIC1XYywtTUQKKyAgIGVsc2UKKyAgICAgICIkQCIgLU1ECisgICBmaQorCisgICBzdGF0PSQ/CisgICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgIGVsc2UKKyAgICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiCisgICAgICBleGl0ICRzdGF0CisgICBmaQorCisgICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZTEiOyB0aGVuCisgICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTEiCisgICBlbHNlCisgICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTIiCisgICBmaQorICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgICAgIyBUaGF0J3MgYSBzcGFjZSBhbmQgYSB0YWIgaW4gdGhlIFtdLgorICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsgCV0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgICBlbHNlCisgICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICAgZmkKKyAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgIDs7CisKKyNub3NpZGVlZmZlY3QpCisgICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAorICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgorCitkYXNobXN0ZG91dCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcm9wcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCisgICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KKyAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCisgICggSUZTPSIgIgorICAgIGNhc2UgIiAkKiAiIGluCisgICAgKiIgLS1tb2RlPWNvbXBpbGUgIiopICMgdGhpcyBpcyBsaWJ0b29sLCBsZXQgdXMgbWFrZSBpdCBxdWlldAorICAgICAgZm9yIGFyZworICAgICAgZG8gIyBjeWNsZSBvdmVyIHRoZSBhcmd1bWVudHMKKyAgICAgICAgY2FzZSAiJGFyZyIgaW4KKwkiLS1tb2RlPWNvbXBpbGUiKQorCSAgIyBpbnNlcnQgLS1xdWlldCBiZWZvcmUgIi0tbW9kZT1jb21waWxlIgorCSAgc2V0IGZub3JkICIkQCIgLS1xdWlldAorCSAgc2hpZnQgIyBmbm9yZAorCSAgOzsKKwllc2FjCisJc2V0IGZub3JkICIkQCIgIiRhcmciCisJc2hpZnQgIyBmbm9yZAorCXNoaWZ0ICMgIiRhcmciCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgICAiJEAiICRkYXNobWZsYWcgfCBzZWQgJ3M6XlteOl0qXDpbIAldKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgorICApICYKKyAgcHJvYz0kIQorICAiJEAiCisgIHN0YXQ9JD8KKyAgd2FpdCAiJHByb2MiCisgIGlmIHRlc3QgIiRzdGF0IiAhPSAwOyB0aGVuIGV4aXQgJHN0YXQ7IGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworZGFzaFhtc3Rkb3V0KQorICAjIFRoaXMgY2FzZSBvbmx5IGV4aXN0cyB0byBzYXRpc2Z5IGRlcGVuZC5tNC4gIEl0IGlzIG5ldmVyIGFjdHVhbGx5CisgICMgcnVuLCBhcyB0aGlzIG1vZGUgaXMgc3BlY2lhbGx5IHJlY29nbml6ZWQgaW4gdGhlIHByZWFtYmxlLgorICBleGl0IDEKKyAgOzsKKworbWFrZWRlcGVuZCkKKyAgIyBYIG1ha2VkZXBlbmQKKyAgKAorICAgIHNoaWZ0CisgICAgY2xlYXJlZD1ubworICAgIGZvciBhcmcgaW4gIiRAIjsgZG8KKyAgICAgIGNhc2UgJGNsZWFyZWQgaW4gbm8pCisgICAgICAgIHNldCAiIjsgc2hpZnQKKwljbGVhcmVkPXllcworICAgICAgZXNhYworICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICAgLUQqfC1JKikKKwkgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQ7OworCS0qKQorCSAgOzsKKwkqKQorCSAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdDs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIG9ial9zdWZmaXg9ImBlY2hvICRvYmplY3QgfCBzZWQgJ3MvXi4qXC4vLi8nYCIKKyAgICB0b3VjaCAiJHRtcGRlcGZpbGUiCisgICAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IDI+L2Rldi9udWxsIC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgorICApICYKKyAgcHJvYz0kIQorICAiJEAiCisgIHN0YXQ9JD8KKyAgd2FpdCAiJHByb2MiCisgIGlmIHRlc3QgIiRzdGF0IiAhPSAwOyB0aGVuIGV4aXQgJHN0YXQ7IGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgc2VkICcxLDJkJyAiJHRtcGRlcGZpbGUiIHwgdHIgJyAnICcKKycgfCBcCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIiAiJHRtcGRlcGZpbGUiLmJhaworICA7OworCitjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJvcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAorICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCisgICggSUZTPSIgIgorICAgIGNhc2UgIiAkKiAiIGluCisgICAgKiIgLS1tb2RlPWNvbXBpbGUgIiopCisgICAgICBmb3IgYXJnCisgICAgICBkbyAjIGN5Y2xlIG92ZXIgdGhlIGFyZ3VtZW50cworICAgICAgICBjYXNlICRhcmcgaW4KKwkiLS1tb2RlPWNvbXBpbGUiKQorCSAgIyBpbnNlcnQgLS1xdWlldCBiZWZvcmUgIi0tbW9kZT1jb21waWxlIgorCSAgc2V0IGZub3JkICIkQCIgLS1xdWlldAorCSAgc2hpZnQgIyBmbm9yZAorCSAgOzsKKwllc2FjCisJc2V0IGZub3JkICIkQCIgIiRhcmciCisJc2hpZnQgIyBmbm9yZAorCXNoaWZ0ICMgIiRhcmciCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgICAiJEAiIC1FIHwKKyAgICBzZWQgLW4gJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAorICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgICkgJgorICBwcm9jPSQhCisgICIkQCIKKyAgc3RhdD0kPworICB3YWl0ICIkcHJvYyIKKyAgaWYgdGVzdCAiJHN0YXQiICE9IDA7IHRoZW4gZXhpdCAkc3RhdDsgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAnL14kL2Q7cy9eIC8vO3MvIFxcJC8vO3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3Zpc3VhbGNwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcm9wcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCisgICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KKyAgKCBJRlM9IiAiCisgICAgY2FzZSAiICQqICIgaW4KKyAgICAqIiAtLW1vZGU9Y29tcGlsZSAiKikKKyAgICAgIGZvciBhcmcKKyAgICAgIGRvICMgY3ljbGUgb3ZlciB0aGUgYXJndW1lbnRzCisgICAgICAgIGNhc2UgJGFyZyBpbgorCSItLW1vZGU9Y29tcGlsZSIpCisJICAjIGluc2VydCAtLXF1aWV0IGJlZm9yZSAiLS1tb2RlPWNvbXBpbGUiCisJICBzZXQgZm5vcmQgIiRAIiAtLXF1aWV0CisJICBzaGlmdCAjIGZub3JkCisJICA7OworCWVzYWMKKwlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKwlzaGlmdCAjIGZub3JkCisJc2hpZnQgIyAiJGFyZyIKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQorCXNldCBmbm9yZCAiJEAiCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgICAqKQorCXNldCBmbm9yZCAiJEAiICIkYXJnIgorCXNoaWZ0CisJc2hpZnQKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKyAgICAiJEAiIC1FIHwKKyAgICBzZWQgLW4gJy9eI2xpbmUgWzAtOV1bMC05XSogIlwoW14iXSpcKSIvIHM6OmVjaG8gImBjeWdwYXRoIC11IFxcIlwxXFwiYCI6cCcgfCBzb3J0IHwgdW5pcSA+ICIkdG1wZGVwZmlsZSIKKyAgKSAmCisgIHByb2M9JCEKKyAgIiRAIgorICBzdGF0PSQ/CisgIHdhaXQgIiRwcm9jIgorICBpZiB0ZXN0ICIkc3RhdCIgIT0gMDsgdGhlbiBleGl0ICRzdGF0OyBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgorICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitub25lKQorICBleGVjICIkQCIKKyAgOzsKKworKikKKyAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitleGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy9lbGZ1dGlscy5zcGVjLmluIGIvY29uZmlnL2VsZnV0aWxzLnNwZWMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2ODFmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9lbGZ1dGlscy5zcGVjLmluCkBAIC0wLDAgKzEsMzg1IEBACisjIC0qLSBycG0tc3BlYy0qLQorJWRlZmluZSBmYWtlIDAKK1N1bW1hcnk6IEEgY29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgYW5kIERTT3MgdG8gaGFuZGxlIGNvbXBpbGVkIG9iamVjdHMuCitOYW1lOiBlbGZ1dGlscworVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK1JlbGVhc2U6IDEKKyVpZiAle2Zha2V9CitMaWNlbnNlOiBHUEwKKyVlbHNlCitMaWNlbnNlOiBPU0wKKyVlbmRpZgorR3JvdXA6IERldmVsb3BtZW50L1Rvb2xzCisjVVJMOiBmaWxlOi8vaG9tZS9kZXZlbC9kcmVwcGVyLworU291cmNlOiBlbGZ1dGlscy0le3ZlcnNpb259LnRhci5negorT2Jzb2xldGVzOiBsaWJlbGYgbGliZWxmLWRldmVsCitSZXF1aXJlczogZWxmdXRpbHMtbGliZWxmID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9CislaWYgJXtmYWtlfQorUmVxdWlyZXM6IGJpbnV0aWxzID49IDIuMTQuOTAuMC40LTI2LjIKKyVlbmRpZgorUmVxdWlyZXM6IGdsaWJjID49IDIuMy4xLTIKKworIyBFeGNsdWRlQXJjaDogeHh4CisKK0J1aWxkUm9vdDogJXtfdG1wcGF0aH0vJXtuYW1lfS1yb290CitCdWlsZFJlcXVpcmVzOiBnY2MgPj0gMy40CitCdWlsZFJlcXVpcmVzOiBiaXNvbiA+PSAxLjg3NQorQnVpbGRSZXF1aXJlczogZmxleCA+PSAyLjUuNGEKK0J1aWxkUmVxdWlyZXM6IGJ6aXAyCisKKyVkZWZpbmUgX2dudSAle25pbH0KKyVkZWZpbmUgX3Byb2dyYW1wcmVmaXggZXUtCisKKyVkZXNjcmlwdGlvbgorRWxmdXRpbHMgaXMgYSBjb2xsZWN0aW9uIG9mIHV0aWxpdGllcywgaW5jbHVkaW5nIGxkIChhIGxpbmtlciksCitubSAoZm9yIGxpc3Rpbmcgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcyksIHNpemUgKGZvciBsaXN0aW5nIHRoZQorc2VjdGlvbiBzaXplcyBvZiBhbiBvYmplY3Qgb3IgYXJjaGl2ZSBmaWxlKSwgc3RyaXAgKGZvciBkaXNjYXJkaW5nCitzeW1ib2xzKSwgcmVhZGVsZiAodG8gc2VlIHRoZSByYXcgRUxGIGZpbGUgc3RydWN0dXJlcyksIGFuZCBlbGZsaW50CisodG8gY2hlY2sgZm9yIHdlbGwtZm9ybWVkIEVMRiBmaWxlcykuICBBbHNvIGluY2x1ZGVkIGFyZSBudW1lcm91cworaGVscGVyIGxpYnJhcmllcyB3aGljaCBpbXBsZW1lbnQgRFdBUkYsIEVMRiwgYW5kIG1hY2hpbmUtc3BlY2lmaWMgRUxGCitoYW5kbGluZy4KKworJXBhY2thZ2UgZGV2ZWwKK1N1bW1hcnk6IERldmVsb3BtZW50IGxpYnJhcmllcyB0byBoYW5kbGUgY29tcGlsZWQgb2JqZWN0cy4KK0dyb3VwOiBEZXZlbG9wbWVudC9Ub29scworJWlmICV7ZmFrZX0KK0xpY2Vuc2U6IEdQTAorJWVsc2UKK0xpY2Vuc2U6IE9TTAorJWVuZGlmCitSZXF1aXJlczogZWxmdXRpbHMgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzOiBlbGZ1dGlscy1saWJlbGYtZGV2ZWwgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KKworJWRlc2NyaXB0aW9uIGRldmVsCitUaGUgZWxmdXRpbHMtZGV2ZWwgcGFja2FnZSBjb250YWlucyB0aGUgbGlicmFyaWVzIHRvIGNyZWF0ZQorYXBwbGljYXRpb25zIGZvciBoYW5kbGluZyBjb21waWxlZCBvYmplY3RzLiAgbGliZWJsIHByb3ZpZGVzIHNvbWUKK2hpZ2hlci1sZXZlbCBFTEYgYWNjZXNzIGZ1bmN0aW9uYWxpdHkuICBsaWJkdyBwcm92aWRlcyBhY2Nlc3MgdG8KK3RoZSBEV0FSRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBsaWJhc20gcHJvdmlkZXMgYSBwcm9ncmFtbWFibGUKK2Fzc2VtYmxlciBpbnRlcmZhY2UuCisKKyVwYWNrYWdlIGxpYmVsZgorU3VtbWFyeTogTGlicmFyeSB0byByZWFkIGFuZCB3cml0ZSBFTEYgZmlsZXMuCitHcm91cDogRGV2ZWxvcG1lbnQvVG9vbHMKKyVpZiAle2Zha2V9CitMaWNlbnNlOiBHUEwKKyVlbmRpZgorCislZGVzY3JpcHRpb24gbGliZWxmCitUaGUgZWxmdXRpbHMtbGliZWxmIHBhY2thZ2UgcHJvdmlkZXMgYSBEU08gd2hpY2ggYWxsb3dzIHJlYWRpbmcgYW5kCit3cml0aW5nIEVMRiBmaWxlcyBvbiBhIGhpZ2ggbGV2ZWwuICBUaGlyZCBwYXJ0eSBwcm9ncmFtcyBkZXBlbmQgb24KK3RoaXMgcGFja2FnZSB0byByZWFkIGludGVybmFscyBvZiBFTEYgZmlsZXMuICBUaGUgcHJvZ3JhbXMgb2YgdGhlCitlbGZ1dGlscyBwYWNrYWdlIHVzZSBpdCBhbHNvIHRvIGdlbmVyYXRlIG5ldyBFTEYgZmlsZXMuCisKKyVwYWNrYWdlIGxpYmVsZi1kZXZlbAorU3VtbWFyeTogRGV2ZWxvcG1lbnQgc3VwcG9ydCBmb3IgbGliZWxmCitHcm91cDogRGV2ZWxvcG1lbnQvVG9vbHMKK1JlcXVpcmVzOiBlbGZ1dGlscy1saWJlbGYgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK0NvbmZsaWN0czogbGliZWxmLWRldmVsCislaWYgJXtmYWtlfQorTGljZW5zZTogR1BMCislZW5kaWYKKworJWRlc2NyaXB0aW9uIGxpYmVsZi1kZXZlbAorVGhlIGVsZnV0aWxzLWxpYmVsZi1kZXZlbCBwYWNrYWdlIGNvbnRhaW5zIHRoZSBsaWJyYXJpZXMgdG8gY3JlYXRlCithcHBsaWNhdGlvbnMgZm9yIGhhbmRsaW5nIGNvbXBpbGVkIG9iamVjdHMuICBsaWJlbGYgYWxsb3dzIHlvdSB0bworYWNjZXNzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQsIHNvIHlvdSBjYW4gc2VlIHRoZQorZGlmZmVyZW50IHNlY3Rpb25zIG9mIGFuIEVMRiBmaWxlLgorCislcHJlcAorJXNldHVwIC1xCisKKyVidWlsZAorJWNvbmZpZ3VyZSAtLXByb2dyYW0tcHJlZml4PSV7X3Byb2dyYW1wcmVmaXh9CittYWtlCisKKyVpbnN0YWxsCitybSAtcmYgJHtSUE1fQlVJTERfUk9PVH0KK21rZGlyIC1wICR7UlBNX0JVSUxEX1JPT1R9JXtfcHJlZml4fQorCislbWFrZWluc3RhbGwKKworY2htb2QgK3ggJHtSUE1fQlVJTERfUk9PVH0le19wcmVmaXh9LyV7X2xpYn0vbGliKi5zbyoKKyVpZiAhJXtmYWtlfQorY2htb2QgK3ggJHtSUE1fQlVJTERfUk9PVH0le19wcmVmaXh9LyV7X2xpYn0vZWxmdXRpbHMvbGliKi5zbyoKKyVlbmRpZgorCislaWYgISV7ZmFrZX0KKyMgWFhYIE51a2UgdW5wYWNrYWdlZCBmaWxlcworeyBjZCAke1JQTV9CVUlMRF9ST09UfQorICBybSAtZiAuJXtfYmluZGlyfS9ldS1sZAorICBybSAtZiAuJXtfaW5jbHVkZWRpcn0vZWxmdXRpbHMvbGliYXNtLmgKKyAgcm0gLWYgLiV7X2xpYmRpcn0vbGliYXNtLSV7dmVyc2lvbn0uc28KKyAgcm0gLWYgLiV7X2xpYmRpcn0vbGliYXNtLnNvLioKKyAgcm0gLWYgLiV7X2xpYmRpcn0vbGliYXNtLnNvCisgIHJtIC1mIC4le19saWJkaXJ9L2xpYmFzbS5hCit9CislZW5kaWYKKworJWNoZWNrCittYWtlIGNoZWNrCisKKyVjbGVhbgorcm0gLXJmICR7UlBNX0JVSUxEX1JPT1R9CisKKyVwb3N0IC1wIC9zYmluL2xkY29uZmlnCisKKyVwb3N0dW4gLXAgL3NiaW4vbGRjb25maWcKKworJXBvc3QgbGliZWxmIC1wIC9zYmluL2xkY29uZmlnCisKKyVwb3N0dW4gbGliZWxmIC1wIC9zYmluL2xkY29uZmlnCisKKyVmaWxlcworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIFJFQURNRSBUT0RPCislaWYgJXtmYWtlfQorJWRvYyBmYWtlLXNyYy9GVUxMCislZW5kaWYKKyV7X2JpbmRpcn0vZXUtZWxmbGludAorJXtfYmluZGlyfS9ldS1ubQorJXtfYmluZGlyfS9ldS1yZWFkZWxmCisle19iaW5kaXJ9L2V1LXNpemUKKyV7X2JpbmRpcn0vZXUtc3RyaXAKKyV7X2JpbmRpcn0vZXUtZmluZHRleHRyZWwKKyV7X2JpbmRpcn0vZXUtYWRkcjJsaW5lCisle19iaW5kaXJ9L2V1LWVsZmNtcAorJWlmICEle2Zha2V9CisjJXtfYmluZGlyfS9ldS1sZAorIyV7X2xpYmRpcn0vbGliYXNtLSV7dmVyc2lvbn0uc28KKyV7X2xpYmRpcn0vbGliZHctJXt2ZXJzaW9ufS5zbworJXtfbGliZGlyfS9saWJkd2ZsLSV7dmVyc2lvbn0uc28KKyMle19saWJkaXJ9L2xpYmFzbS5zby4qCisle19saWJkaXJ9L2xpYmR3LnNvLioKKyV7X2xpYmRpcn0vbGliZHdmbC5zby4qCislZGlyICV7X2xpYmRpcn0vZWxmdXRpbHMKKyV7X2xpYmRpcn0vZWxmdXRpbHMvbGliKi5zbworJWVuZGlmCisKKyVmaWxlcyBkZXZlbAorJWRlZmF0dHIoLSxyb290LHJvb3QpCisle19pbmNsdWRlZGlyfS9kd2FyZi5oCislZGlyICV7X2luY2x1ZGVkaXJ9L2VsZnV0aWxzCisle19pbmNsdWRlZGlyfS9lbGZ1dGlscy9lbGYta25vd2xlZGdlLmgKKyVpZiAhJXtmYWtlfQorJXtfaW5jbHVkZWRpcn0vZWxmdXRpbHMvbGliZWJsLmgKKyV7X2luY2x1ZGVkaXJ9L2VsZnV0aWxzL2xpYmR3LmgKKyV7X2luY2x1ZGVkaXJ9L2VsZnV0aWxzL2xpYmR3ZmwuaAorIyV7X2xpYmRpcn0vbGliYXNtLmEKKyV7X2xpYmRpcn0vbGliZWJsLmEKKyV7X2xpYmRpcn0vbGliZHcuYQorJXtfbGliZGlyfS9saWJkd2ZsLmEKKyMle19saWJkaXJ9L2xpYmFzbS5zbworJXtfbGliZGlyfS9saWJkdy5zbworJXtfbGliZGlyfS9saWJkd2ZsLnNvCislZW5kaWYKKworJWZpbGVzIGxpYmVsZgorJWRlZmF0dHIoLSxyb290LHJvb3QpCisle19saWJkaXJ9L2xpYmVsZi0le3ZlcnNpb259LnNvCisle19saWJkaXJ9L2xpYmVsZi5zby4qCisKKyVmaWxlcyBsaWJlbGYtZGV2ZWwKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJXtfaW5jbHVkZWRpcn0vbGliZWxmLmgKKyV7X2luY2x1ZGVkaXJ9L2dlbGYuaAorJXtfaW5jbHVkZWRpcn0vbmxpc3QuaAorJXtfbGliZGlyfS9saWJlbGYuYQorJXtfbGliZGlyfS9saWJlbGYuc28KKworJWNoYW5nZWxvZworKiBTdW4gSnVsIDI0IDIwMDUgVWxyaWNoIERyZXBwZXIgPEByZWRoYXQuY29tPiAwLjExMC0xCistIGxpYmVsZjogZml4IGEgbnVtYmUgcm9mIHByb2JsZW1zIHdpdGggZWxmX3VwZGF0ZQorLSBlbGZjbXA6IGZpeCBhIGZldyBidWdzLiAgQ29tcGFyZSBnYXBzLgorLSBGaXggYSBmZXcgUExUIHByb2JsZW1zIGFuZCBtdWRmbGFwIGJ1aWxkIGlzc3Vlcy4KKy0gbGliZWJsOiBEb24ndCBleHBvc2UgRWJsIHN0cnVjdHVyZSBkZWZpbml0aW9uIGluIGxpYmVibC5oLiAgSXQncyBub3cgcAorcml2YXRlLgorCisqIFRodSBKdWwgMjEgMjAwNSBVbHJpY2ggRHJlcHBlciA8QHJlZGhhdC5jb20+IDAuMTA5LTEKKy0gbGliZWJsOiBDaGVjayBmb3IgbWF0Y2hpbmcgbW9kdWxlcy4KKy0gZWxmbGludDogQ2hlY2sgdGhhdCBjb3B5IHJlbG9jYXRpb25zIG9ubHkgaGFwcGVuIGZvciBPQkpFQ1Qgb3IgTk9UWVBFCitzeW1ib2xzLgorLSBlbGZjbXA6IE5ldyBwcm9ncmFtLgorLSBsaWJkd2ZsOiBOZXcgbGlicmFyeS4KKworKiBNb24gTWF5ICA5IDIwMDUgVWxyaWNoIERyZXBwZXIgPEByZWRoYXQuY29tPiAwLjEwOC0xCistIHN0cmlwOiBmaXggYnVnIGludHJvZHVjZWQgaW4gbGFzdCBjaGFuZ2UKKy0gbGliZHc6IHJlY29yZHMgcmV0dXJuZWQgYnkgZHdhcmZfZ2V0c3JjbGluZXMgYXJlIG5vdyBzb3J0ZWQgYnkgYWRkcmVzcworCisqIFN1biBNYXkgIDggMjAwNSBVbHJpY2ggRHJlcHBlciA8QHJlZGhhdC5jb20+IDAuMTA4LTEKKy0gc3RyaXA6IGZpeCBidWcgaW50cm9kdWNlZCBpbiBsYXN0IGNoYW5nZQorCisqIFN1biBNYXkgIDggMjAwNSBVbHJpY2ggRHJlcHBlciA8QHJlZGhhdC5jb20+IDAuMTA3LTEKKy0gcmVhZGVsZjogaW1wcm92ZSBEV0FSRiBvdXRwdXQgZm9ybWF0CistIHN0cmlwOiBzdXBwb3J0IExpbnV4IGtlcm5lbCBtb2R1bGVzCisKKyogRnJpIEFwciAyOSAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTA3LTEKKy0gcmVhZGVsZjogaW1wcm92ZSBEV0FSRiBvdXRwdXQgZm9ybWF0CisKKyogTW9uIEFwciAgNCAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTA2LTEKKy0gbGliZHc6IFVwZGF0ZWQgZHdhcmYuaCBmcm9tIERXQVJGMyBzcGVjbGliZHc6IGFkZCBuZXcgZnVudGlvbnMgZHdhcmZfZgordW5jX2VudHJ5cGMsIGR3YXJmX2Z1bmNfZmlsZSwgZHdhcmZfZnVuY19saW5lLGR3YXJmX2Z1bmNfY29sLCBkd2FyZl9nZQordHNyY19maWxlCisKKyogRnJpIEFwciAgMSAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTA1LTEKKy0gYWRkcjJsaW5lOiBOZXcgcHJvZ3JhbQorLSBsaWJkdzogYWRkIG5ldyBmdW5jdGlvbnM6IGR3YXJmX2FkZHJkaWUsIGR3YXJmX21hY3JvXyosIGR3YXJmX2dldGZ1bmNzCissZHdhcmZfZnVuY18qLgorLSBmaW5kdGV4dHJlbDogdXNlIGR3YXJmX2FkZHJkaWUKKworKiBNb24gTWFyIDI4IDIwMDUgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xMDQtMQorLSBmaW5kdGV4dHJlbDogTmV3IHByb2dyYW0uCisKKyogTW9uIE1hciAyMSAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTAzLTEKKy0gbGliZHc6IEZpeCB1c2luZyBsaWJkdy5oIHdpdGggZ2NjIDwgNCBhbmQgQysrIGNvZGUuICBDb21waWxlciBidWcuCisKKyogVHVlIEZlYiAyMiAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTAyLTEKKy0gTW9yZSBNYWtlZmlsZSBhbmQgc3BlYyBmaWxlIGNsZWFudXBzLgorCisqIEZyaSBKYW4gMTYgMjAwNCBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjk0LTEKKy0gdXBncmFkZSB0byAwLjk0CisKKyogRnJpIEphbiAxNiAyMDA0IEpha3ViIEplbGluZWsgPGpha3ViQHJlZGhhdC5jb20+IDAuOTMtMQorLSB1cGdyYWRlIHRvIDAuOTMKKworKiBUaHUgSmFuICA4IDIwMDQgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4gMC45Mi0xCistIGZ1bGwgdmVyc2lvbgorLSBtYWNyb2l6ZWQgc3BlYyBmaWxlIGZvciBHUEwgb3IgT1NMIGJ1aWxkcworLSBpbmNsdWRlIG9ubHkgbGliZWxmIHVuZGVyIEdQTCBwbHVzIHdyYXBwZXIgc2NyaXB0cworCisqIFdlZCBKYW4gIDcgMjAwNCBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjkxLTIKKy0gbWFjcm9pemVkIHNwZWMgZmlsZSBmb3IgR1BMIG9yIE9TTCBidWlsZHMKKworKiBXZWQgSmFuICA3IDIwMDQgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKy0gc3BsaXQgZWxmdXRpbHMtZGV2ZWwgaW50byB0d28gcGFja2FnZXMuCisKKyogV2VkIEphbiAgNyAyMDA0IEpha3ViIEplbGluZWsgPGpha3ViQHJlZGhhdC5jb20+IDAuOTEtMQorLSBpbmNsdWRlIG9ubHkgbGliZWxmIHVuZGVyIEdQTCBwbHVzIHdyYXBwZXIgc2NyaXB0cworCisqIFR1ZSBEZWMgMjMgMjAwMyBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjg5LTMKKy0gcmVhZGVsZiwgbm90IHJlYWRsaW5lLCBpbiAlJWRlc2NyaXB0aW9uICgjMTExMjE0KS4KKworKiBGcmkgU2VwIDI2IDIwMDMgQmlsbCBOb3R0aW5naGFtIDxub3R0aW5nQHJlZGhhdC5jb20+IDAuODktMQorLSB1cGRhdGUgdG8gMC44OSAoZml4IGV1LXN0cmlwKQorCisqIFR1ZSBTZXAgMjMgMjAwMyBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjg2LTMKKy0gdXBkYXRlIHRvIDAuODYgKGZpeCBldS1zdHJpcCBvbiBzMzkweC9hbHBoYSkKKy0gbGliZWJsIGlzIGFuIGFyY2hpdmUgbm93OyByZW1vdmUgcmVmZXJlbmNlcyB0byBEU08KKworKiBNb24gSnVsIDE0IDIwMDMgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC44NC0zCistIHVwZ3JhZGUgdG8gMC44NCAocmVhZGVsZi9lbGZsaW50IGltcHJvdmVtZW50cywgcmF3aGlkZSBidWdzIGZpeGVkKS4KKworKiBGcmkgSnVsIDExIDIwMDMgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC44My0zCistIHVwZ3JhZGUgdG8gMC44MyAoZml4IGludmFsaWQgRUxmIGhhbmRsZSBvbiAqLnNvIHN0cmlwLCBtb3JlKS4KKworKiBXZWQgSnVsICA5IDIwMDMgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC44Mi0zCistIHVwZ3JhZGUgdG8gMC44MiAoc3RyaXAgdGVzdHMgZml4ZWQgb24gYmlnLWVuZGlhbikuCisKKyogVHVlIEp1bCAgOCAyMDAzIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuODEtMworLSB1cGdyYWRlIHRvIDAuODEgKHN0cmlwIGV4Y2x1ZGVzIHVudXNlZCBzeW10YWJsZSBlbnRyaWVzLCB0ZXN0IGJvcmtlZCkuCisKKyogVGh1IEp1biAyNiAyMDAzIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuODAtMworLSB1cGdyYWRlIHRvIDAuODAgKGRlYnVnZWRpdCBjaGFuZ2VzIGZvciBrZXJuZWwgaW4gcHJvZ3Jlc3MpLgorCisqIFdlZCBKdW4gMDQgMjAwMyBFbGxpb3QgTGVlIDxzb3B3aXRoQHJlZGhhdC5jb20+CistIHJlYnVpbHQKKworKiBXZWQgTWF5IDIxIDIwMDMgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC43OS0yCistIHVwZ3JhZGUgdG8gMC43OSAoY29ycmVjdCBmb3JtYXRzIGZvciBzaXplX3QsIG1vcmUgb2YgbGliZHcgIndvcmtzIikuCisKKyogTW9uIE1heSAxOSAyMDAzIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNzgtMgorLSB1cGdyYWRlIHRvIDAuNzggKGxpYmR3YXJmIGJ1Z2ZpeCwgbGliZHcgYWRkaXRpb25zKS4KKworKiBNb24gRmViIDI0IDIwMDMgRWxsaW90IExlZSA8c29wd2l0aEByZWRoYXQuY29tPgorLSBkZWJ1Z2luZm8gcmVidWlsZAorCisqIFRodSBGZWIgMjAgMjAwMyBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjc2LTIKKy0gdXNlIHRoZSBjb3JyZWN0IHdheSBvZiBpZGVudGlmeWluZyB0aGUgc2VjdGlvbiB2aWEgdGhlIHNoX2luZm8gbGluay4KKworKiBTYXQgRmViIDE1IDIwMDMgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4gMC43NS0yCistIHVwZGF0ZSB0byAwLjc1IChldS1zdHJpcCAtZyBmaXgpCisKKyogVHVlIEZlYiAxMSAyMDAzIEpha3ViIEplbGluZWsgPGpha3ViQHJlZGhhdC5jb20+IDAuNzQtMgorLSB1cGRhdGUgdG8gMC43NCAoZml4IGZvciB3cml0aW5nIHdpdGggc29tZSBub24tZGlydHkgc2VjdGlvbnMpCisKKyogVGh1IEZlYiAgNiAyMDAzIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNzMtMworLSBhbm90aGVyIC0wLjczIHVwZGF0ZSAod2l0aCBzcGFyYyBmaXhlcykuCistIGRvICJtYWtlIGNoZWNrIiBpbiAlJWNoZWNrLCBub3QgJSVpbnN0YWxsLCBzZWN0aW9uLgorCisqIE1vbiBKYW4gMjcgMjAwMyBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjczLTIKKy0gdXBkYXRlIHRvIDAuNzMgKHdpdGggczM5MCBmaXhlcykuCisKKyogV2VkIEphbiAyMiAyMDAzIFRpbSBQb3dlcnMgPHRpbXBAcmVkaGF0LmNvbT4KKy0gcmVidWlsdAorCisqIFdlZCBKYW4gMjIgMjAwMyBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjcyLTQKKy0gZml4IGFyZ3VtZW50cyB0byBnZWxmX2dldHN5bXNobmR4IGFuZCBlbGZfZ2V0c2hzdHJuZHgKKy0gZml4IG90aGVyIHdhcm5pbmdzCistIHJlZW5hYmxlIGNoZWNrcyBvbiBzMzkweAorCisqIFNhdCBKYW4gMTEgMjAwMyBLYXJzdGVuIEhvcHAgPGthcnN0ZW5AcmVkaGF0LmRlPiAwLjcyLTMKKy0gdGVtcG9yYXJpbHkgZGlzYWJsZSBjaGVja3Mgb24gczM5MHgsIHVudGlsIHNvbWVvbmUgaGFzCisgIHRpbWUgdG8gbG9vayBhdCBpdAorCisqIFRodSBEZWMgMTIgMjAwMiBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjcyLTIKKy0gdXBkYXRlIHRvIDAuNzIKKworKiBXZWQgRGVjIDExIDIwMDIgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4gMC43MS0yCistIHVwZGF0ZSB0byAwLjcxCisKKyogV2VkIERlYyAxMSAyMDAyIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNjktNAorLSB1cGRhdGUgdG8gMC42OS4KKy0gYWRkICJtYWtlIGNoZWNrIiBhbmQgc2VnZmF1bHQgYXZvaWRhbmNlIHBhdGNoLgorLSBlbGZ1dGlscy1saWJlbGYgbmVlZHMgdG8gcnVuIGxkY29uZmlnLgorCisqIFR1ZSBEZWMgMTAgMjAwMiBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjY4LTIKKy0gdXBkYXRlIHRvIDAuNjguCisKKyogRnJpIERlYyAgNiAyMDAyIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNjctMgorLSB1cGRhdGUgdG8gMC42Ny4KKworKiBUdWUgRGVjICAzIDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC42NS0yCistIHVwZGF0ZSB0byAwLjY1LgorCisqIE1vbiBEZWMgIDIgMjAwMiBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjY0LTIKKy0gdXBkYXRlIHRvIDAuNjQuCisKKyogU3VuIERlYyAxIDIwMDIgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC42NAorLSBzcGxpdCBwYWNrYWdlcyBmdXJ0aGVyIGludG8gZWxmdXRpbHMtbGliZWxmCisKKyogU2F0IE5vdiAzMCAyMDAyIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNjMtMgorLSB1cGRhdGUgdG8gMC42My4KKworKiBGcmkgTm92IDI5IDIwMDIgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC42MgorLSBBZGp1c3QgZm9yIGRyb3BwaW5nIGxpYnRvb2wKKworKiBTdW4gTm92IDI0IDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC41OS0yCistIHVwZGF0ZSB0byAwLjU5CisKKyogVGh1IE5vdiAxNCAyMDAyIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNTYtMgorLSB1cGRhdGUgdG8gMC41NgorCisqIFRodSBOb3YgIDcgMjAwMiBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjU0LTIKKy0gdXBkYXRlIHRvIDAuNTQKKworKiBTdW4gT2N0IDI3IDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC41My0yCistIHVwZGF0ZSB0byAwLjUzCistIGRyb3AgeDg2XzY0IGhhY2ssIElDRSBmaXhlZCBpbiBnY2MtMy4yLTExLgorCisqIFNhdCBPY3QgMjYgMjAwMiBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjUyLTMKKy0gZ2V0IGJlZWhpdmUgdG8gcHVuY2ggYSByaHBrZyBnZW5lcmF0ZWQgcGFja2FnZS4KKworKiBXZWQgT2N0IDIzIDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC41Mi0yCistIGJ1aWxkIGluIDguMC4xLgorLSB4ODZfNjQ6IGF2b2lkIGdjYy0zLjIgSUNFIG9uIHg4Nl82NCBmb3Igbm93LgorCisqIFR1ZSBPY3QgMjIgMjAwMiBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjUyCistIEFkZCBsaWJlbGYtZGV2ZWwgdG8gY29uZmxpY3RzIGZvciBlbGZ1dGlscy1kZXZlbAorCisqIE1vbiBPY3QgMjEgMjAwMiBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjUwCistIFNwbGl0IGludG8gcnVudGltZSBhbmQgZGV2ZWwgcGFja2FnZQorCisqIEZyaSBPY3QgMTggMjAwMiBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjQ5CistIGludGVncmF0ZSBpbnRvIG9mZmljaWFsIHNvdXJjZXMKKworKiBXZWQgT2N0IDE2IDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC40Ni0xCistIFN3YWRkbGUuCmRpZmYgLS1naXQgYS9jb25maWcvaW5zdGFsbC1zaCBiL2NvbmZpZy9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OGE4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvaW5zdGFsbC1zaApAQCAtMCwwICsxLDI1MSBAQAorIyEvYmluL3NoCisjCisjIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQorIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCisjCisjIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisjCisjIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50CisjIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0CisjIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCisjCisjIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KKyMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KKyMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCisKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9IiR7RE9JVFBST0ctfSIKKworCisjIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KKworbXZwcm9nPSIke01WUFJPRy1tdn0iCitjcHByb2c9IiR7Q1BQUk9HLWNwfSIKK2NobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgorY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCitjaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKK3N0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igorcm1wcm9nPSIke1JNUFJPRy1ybX0iCitta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKKwordHJhbnNmb3JtYmFzZW5hbWU9IiIKK3RyYW5zZm9ybV9hcmc9IiIKK2luc3RjbWQ9IiRtdnByb2ciCitjaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgorY2hvd25jbWQ9IiIKK2NoZ3JwY21kPSIiCitzdHJpcGNtZD0iIgorcm1jbWQ9IiRybXByb2cgLWYiCittdmNtZD0iJG12cHJvZyIKK3NyYz0iIgorZHN0PSIiCitkaXJfYXJnPSIiCisKK3doaWxlIFsgeCIkMSIgIT0geCBdOyBkbworICAgIGNhc2UgJDEgaW4KKwktYykgaW5zdGNtZD0iJGNwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWQpIGRpcl9hcmc9dHJ1ZQorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJKikgIGlmIFsgeCIkc3JjIiA9IHggXQorCSAgICB0aGVuCisJCXNyYz0kMQorCSAgICBlbHNlCisJCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZworCQk6CisJCWRzdD0kMQorCSAgICBmaQorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisgICAgZXNhYworZG9uZQorCitpZiBbIHgiJHNyYyIgPSB4IF0KK3RoZW4KKwllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKKwlleGl0IDEKK2Vsc2UKKwk6CitmaQorCitpZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgorCWRzdD0kc3JjCisJc3JjPSIiCisJCisJaWYgWyAtZCAkZHN0IF07IHRoZW4KKwkJaW5zdGNtZD06CisJCWNobW9kY21kPSIiCisJZWxzZQorCQlpbnN0Y21kPSRta2RpcnByb2cKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCToKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCToKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCToKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCisJJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgorCWVsc2UKKwkJOgorCWZpCisKKwlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgorZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgOiA7IGZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIDogOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSA6IDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgOiA7IGZpCitlbHNlCisKKyMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgorCisJaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJOgorCWZpCisKKyMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisKKyMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQorCisJJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCisKKwl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSA6O2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIDo7ZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgOjtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSA6O2ZpICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCisJJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKKworZmkgJiYKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy9taXNzaW5nIGIvY29uZmlnL21pc3NpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1ODM3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9taXNzaW5nCkBAIC0wLDAgKzEsMzM2IEBACisjISAvYmluL3NoCisjIENvbW1vbiBzdHViIGZvciBhIGZldyBtaXNzaW5nIEdOVSBwcm9ncmFtcyB3aGlsZSBpbnN0YWxsaW5nLgorIyBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgT3JpZ2luYWxseSBieSBGcmFuLGNvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorIyAwMjExMS0xMzA3LCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgZXhpdCAxCitmaQorCitydW49OgorCisjIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCisjIHNyY2RpciBhbHJlYWR5LgoraWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KKyAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYworZWxzZQorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCitmaQorCitjYXNlICIkMSIgaW4KKy0tcnVuKQorICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCisgIHJ1bj0KKyAgc2hpZnQKKyAgIiRAIiAmJiBleGl0IDAKKyAgOzsKK2VzYWMKKworIyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgb3IgZmFpbHMgdG8gcnVuIChwb3NzaWJseSBhbiBvdXRkYXRlZCB2ZXJzaW9uKSwKKyMgdHJ5IHRvIGVtdWxhdGUgaXQuCitjYXNlICIkMSIgaW4KKworICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisgICAgZWNobyAiXAorJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCisKK0hhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KK2Vycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtLXJ1biAgICAgICAgICAgdHJ5IHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIGVtdWxhdGUgaXQgaWYgaXQgZmFpbHMKKworU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgorICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCisgIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJworICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJworICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCisgIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KKyAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKKyAgaGVscDJtYW4gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQorICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYworICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCisgIHRhciAgICAgICAgICB0cnkgdGFyLCBnbnV0YXIsIGd0YXIsIHRoZW4gdGFyIHdpdGhvdXQgbm9uLXBvcnRhYmxlIGZsYWdzCisgIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0iCisgICAgOzsKKworICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcnN8LS12ZXJzaXwtLXZlcnNpb3wtLXZlcnNpb24pCisgICAgZWNobyAibWlzc2luZyAwLjQgLSBHTlUgYXV0b21ha2UiCisgICAgOzsKKworICAtKikKKyAgICBlY2hvIDE+JjIgIiQwOiBVbmtub3duIFxgJDEnIG9wdGlvbiIKKyAgICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgICAgZXhpdCAxCisgICAgOzsKKworICBhY2xvY2FsKikKKyAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgorICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAorICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvbWFrZScgYW5kIFxgUGVybCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbQorICAgICAgICAgYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHRvdWNoIGFjbG9jYWwubTQKKyAgICA7OworCisgIGF1dG9jb25mKQorICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCisgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUKKyAgICAgICAgIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0gZnJvbSBhbnkgR05VCisgICAgICAgICBhcmNoaXZlIHNpdGUuIgorICAgIHRvdWNoIGNvbmZpZ3VyZQorICAgIDs7CisKKyAgYXV0b2hlYWRlcikKKyAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgorICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNjb25maWcuaCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0KKyAgICAgICAgIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbGVzPWBzZWQgLW4gJ3MvXlsgXSpBW0NNXV9DT05GSUdfSEVBREVSKFwoW14pXSpcKSkuKi9cMS9wJyAke2NvbmZpZ3VyZV9hY31gCisgICAgdGVzdCAteiAiJGZpbGVzIiAmJiBmaWxlcz0iY29uZmlnLmgiCisgICAgdG91Y2hfZmlsZXM9CisgICAgZm9yIGYgaW4gJGZpbGVzOyBkbworICAgICAgY2FzZSAiJGYiIGluCisgICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAorCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKKyAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisgICAgdG91Y2ggJHRvdWNoX2ZpbGVzCisgICAgOzsKKworICBhdXRvbWFrZSopCisgICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KKyAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KKyAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgorICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8CisJICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKKwkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKKyAgICA7OworCisgIGF1dG9tNHRlKQorICAgIGlmIHRlc3QgLXogIiRydW4iICYmICgkMSAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAjIFdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuCisgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBhbmQgeW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgaXQgaGFuZHkgb24geW91cgorICAgICAgICAgc3lzdGVtLiAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLgorICAgICAgICAgWW91IGNhbiBnZXQgXGAkMUhlbHAybWFuJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0WyA9XSpcKFteIF0qXCkuKi9cMS9wJ2AKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW9bIF0qXChbXiBdKlwpLiovXDEvcCdgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiIyEgL2Jpbi9zaCIKKwllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKKwllY2hvICIjICAkICRAIgorCWVjaG8gImV4aXQgMCIKKwljaG1vZCAreCAkZmlsZQorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBiaXNvbnx5YWNjKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCisgICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0CisgICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKKyAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAiJExBU1RBUkciIGluCisJKi55KQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYworCSAgICBmaQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCisJZWNobyA+eS50YWIuaAorICAgIGZpCisgICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgorCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYworICAgIGZpCisgICAgOzsKKworICBsZXh8ZmxleCkKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCisgICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0CisgICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIGxleC55eS5jCisgICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCisgICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgorCWNhc2UgIiRMQVNUQVJHIiBpbgorCSoubCkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKKwkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KKwkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCisJICAgIGZpCisJICA7OworCWVzYWMKKyAgICBmaQorICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYworICAgIGZpCisgICAgOzsKKworICBoZWxwMm1hbikKKyAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgorICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCisJIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQorCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorCWZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0PVwoW14gXSpcKS4qL1wxL3AnYAorICAgIGZpCisgICAgaWYgWyAtZiAiJGZpbGUiIF07IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBtYWtlaW5mbykKKyAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAobWFrZWluZm8gLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIyBXZSBoYXZlIG1ha2VpbmZvLCBidXQgaXQgZmFpbGVkLgorICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKKyAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cworICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKKyAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgorICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKKyAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KKyAgICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKKyAgICAgIGZpbGU9YHNlZCAtbiAnL15Ac2V0ZmlsZW5hbWUvIHsgcy8uKiBcKFteIF0qXCkgKiQvXDEvOyBwOyBxOyB9JyAkZmlsZWAKKyAgICBmaQorICAgIHRvdWNoICRmaWxlCisgICAgOzsKKworICB0YXIpCisgICAgc2hpZnQKKyAgICBpZiB0ZXN0IC1uICIkcnVuIjsgdGhlbgorICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIHRhciBpbiB0aGUgZ2VuZXJpYyBwYXJ0LgorICAgICMgTG9vayBmb3IgZ251dGFyL2d0YXIgYmVmb3JlIGludm9jYXRpb24gdG8gYXZvaWQgdWdseSBlcnJvcgorICAgICMgbWVzc2FnZXMuCisgICAgaWYgKGdudXRhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgICBnbnV0YXIgJHsxKyIkQCJ9ICYmIGV4aXQgMAorICAgIGZpCisgICAgaWYgKGd0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgICAgZ3RhciAkezErIiRAIn0gJiYgZXhpdCAwCisgICAgZmkKKyAgICBmaXJzdGFyZz0iJDEiCisgICAgaWYgc2hpZnQ7IHRoZW4KKwljYXNlICIkZmlyc3RhcmciIGluCisJKm8qKQorCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL28vL2AKKwkgICAgdGFyICIkZmlyc3RhcmciICR7MSsiJEAifSAmJiBleGl0IDAKKwkgICAgOzsKKwllc2FjCisJY2FzZSAiJGZpcnN0YXJnIiBpbgorCSpoKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAkezErIiRAIn0gJiYgZXhpdCAwCisJICAgIDs7CisJZXNhYworICAgIGZpCisKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IEkgY2FuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHJ1biBcYHRhcicgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAgICAgWW91IG1heSB3YW50IHRvIGluc3RhbGwgR05VIHRhciBvciBGcmVlIHBheHV0aWxzLCBvciBjaGVjayB0aGUKKyAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIgorICAgIGV4aXQgMQorICAgIDs7CisKKyAgKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIHlvdSBkbyBub3Qgc2VlbSB0byBoYXZlIGl0IGhhbmR5IG9uIHlvdXIKKyAgICAgICAgIHN5c3RlbS4gIFlvdSBtaWdodCBoYXZlIG1vZGlmaWVkIHNvbWUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdGhlCisgICAgICAgICBwcm9wZXIgdG9vbHMgZm9yIGZ1cnRoZXIgaGFuZGxpbmcgdGhlbS4gIENoZWNrIHRoZSBcYFJFQURNRScgZmlsZSwKKyAgICAgICAgIGl0IG9mdGVuIHRlbGxzIHlvdSBhYm91dCB0aGUgbmVlZGVkIHByZXJlcXVpcmVtZW50cyBmb3IgaW5zdGFsbGluZworICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKKyAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKKyAgICBleGl0IDEKKyAgICA7OworZXNhYworCitleGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy9ta2luc3RhbGxkaXJzIGIvY29uZmlnL21raW5zdGFsbGRpcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiYmMzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9ta2luc3RhbGxkaXJzCkBAIC0wLDAgKzEsMTAxIEBACisjISAvYmluL3NoCisjIG1raW5zdGFsbGRpcnMgLS0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQorIyBBdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KKyMgQ3JlYXRlZDogMTk5My0wNS0xNgorIyBQdWJsaWMgZG9tYWluCisKKyMgJElkOiBta2luc3RhbGxkaXJzLHYgMS4xLjEuMSAyMDAzLzA4LzEyIDA2OjQ0OjQ2IGRyZXBwZXIgRXhwICQKKworZXJyc3RhdHVzPTAKK2Rpcm1vZGU9IiIKKwordXNhZ2U9IlwKK1VzYWdlOiBta2luc3RhbGxkaXJzIFstaF0gWy0taGVscF0gWy1tIG1vZGVdIGRpciAuLi4iCisKKyMgcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgIGNhc2UgIiR7MX0iIGluCisgICAgIC1oIHwgLS1oZWxwIHwgLS1oKiApCQkJIyAtaCBmb3IgaGVscAorCWVjaG8gIiR7dXNhZ2V9IiAxPiYyOyBleGl0IDAgOzsKKyAgICAgLW0gKQkJCQkJIyAtbSBQRVJNIGFyZworCXNoaWZ0CisJdGVzdCAkIyAtZXEgMCAmJiB7IGVjaG8gIiR7dXNhZ2V9IiAxPiYyOyBleGl0IDE7IH0KKwlkaXJtb2RlPSIkezF9IgorCXNoaWZ0IDs7CisgICAgIC0tICkgc2hpZnQ7IGJyZWFrIDs7CQkJIyBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgIC0qICkgZWNobyAiJHt1c2FnZX0iIDE+JjI7IGV4aXQgMSA7OwkjIHVua25vd24gb3B0aW9uCisgICAgICogKSAgYnJlYWsgOzsJCQkJIyBmaXJzdCBub24tb3B0IGFyZworICAgZXNhYworZG9uZQorCitmb3IgZmlsZQorZG8KKyAgaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisgICAgc2hpZnQKKyAgZWxzZQorICAgIGJyZWFrCisgIGZpCitkb25lCisKK2Nhc2UgJCMgaW4KKzApIGV4aXQgMCA7OworZXNhYworCitjYXNlICRkaXJtb2RlIGluCisnJykKKyAgaWYgbWtkaXIgLXAgLS0gLiAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIm1rZGlyIC1wIC0tICQqIgorICAgIGV4ZWMgbWtkaXIgLXAgLS0gIiRAIgorICBmaSA7OworKikKKyAgaWYgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLSAuIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAibWtkaXIgLW0gJGRpcm1vZGUgLXAgLS0gJCoiCisgICAgZXhlYyBta2RpciAtbSAiJGRpcm1vZGUiIC1wIC0tICIkQCIKKyAgZmkgOzsKK2VzYWMKKworZm9yIGZpbGUKK2RvCisgICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAorICAgc2hpZnQKKworICAgcGF0aGNvbXA9CisgICBmb3IgZAorICAgZG8KKyAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgorICAgICBjYXNlICIkcGF0aGNvbXAiIGluCisgICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OworICAgICBlc2FjCisKKyAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisJZWNobyAibWtkaXIgJHBhdGhjb21wIgorCisJbWtkaXIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworCisJaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisJICBlcnJzdGF0dXM9JGxhc3RlcnIKKwllbHNlCisJICBpZiB0ZXN0ICEgLXogIiRkaXJtb2RlIjsgdGhlbgorCSAgICAgZWNobyAiY2htb2QgJGRpcm1vZGUgJHBhdGhjb21wIgorCisJICAgICBsYXN0ZXJyPSIiCisJICAgICBjaG1vZCAiJGRpcm1vZGUiICIkcGF0aGNvbXAiIHx8IGxhc3RlcnI9JD8KKworCSAgICAgaWYgdGVzdCAhIC16ICIkbGFzdGVyciI7IHRoZW4KKwkgICAgICAgZXJyc3RhdHVzPSRsYXN0ZXJyCisJICAgICBmaQorCSAgZmkKKwlmaQorICAgICBmaQorCisgICAgIHBhdGhjb21wPSIkcGF0aGNvbXAvIgorICAgZG9uZQorZG9uZQorCitleGl0ICRlcnJzdGF0dXMKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMworIyBFbmQ6CisjIG1raW5zdGFsbGRpcnMgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjZDU1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDI3NiBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitkbmwgQ29uZmlndXJlIGlucHV0IGZpbGUgZm9yIGVsZnV0aWxzLiAgICAgICAgICAgICAgICAgICAgIC0qLWF1dG9jb25mLSotCitkbmwKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCitkbmwKK2RubCBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CitkbmwgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorZG5sCitkbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitkbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK2RubCBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitkbmwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK2RubCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorZG5sCitBQ19JTklUKFtSZWQgSGF0IGVsZnV0aWxzXSxbMC4xMTBdLFtodHRwOi8vYnVnemlsbGEucmVkaGF0LmNvbS9idWd6aWxsYS9dLAorCVtlbGZ1dGlsc10pCisKK0FDX0NPTkZJR19BVVhfRElSKFtjb25maWddKQorQUNfQ09ORklHX0ZJTEVTKFtjb25maWcvTWFrZWZpbGVdKQorCitBQ19DT1BZUklHSFQoW0NvcHlyaWdodCAoQykgMTk5Ni0yMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy5dKQorQUNfUFJFUkVRKDIuNTkpCQkJZG5sIE1pbmltdW0gQXV0b2NvbmYgdmVyc2lvbiByZXF1aXJlZC4KKworQU1fSU5JVF9BVVRPTUFLRShbZ25pdHMgMS43XSkKKworZG5sIFVuaXF1ZSBJRCBmb3IgdGhpcyBidWlsZC4KK01PRFZFUlNJT049IkJ1aWxkIG9uICQoaG9zdG5hbWUpICQoZGF0ZSArJUZUJVI6JVMleikiCitBQ19TVUJTVChbTU9EVkVSU0lPTl0pCitBQ19ERUZJTkVfVU5RVU9URUQoTU9EVkVSU0lPTiwgIiRNT0RWRVJTSU9OIikKK0FIX1RFTVBMQVRFKFtNT0RWRVJTSU9OXSwgW0lkZW50aWZpZXIgZm9yIG1vZHVsZXMgaW4gdGhlIGJ1aWxkLl0pCisKK0FDX0NPTkZJR19TUkNESVIoW2xpYmVsZi9saWJlbGYuaF0pCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlXSkKK0FDX0NPTkZJR19IRUFERVJTKFtjb25maWcuaF0pCisKK0FDX0NPTkZJR19NQUNST19ESVIoW200XSkKK0FDX0NPTkZJR19GSUxFUyhbbTQvTWFrZWZpbGVdKQorCitkbmwgVGhlIFJQTSBzcGVjIGZpbGUuICBXZSBzdWJzdGl0dXRlIGEgZmV3IHZhbHVlcyBpbiB0aGUgZmlsZS4KK0FDX0NPTkZJR19GSUxFUyhbZWxmdXRpbHMuc3BlYzpjb25maWcvZWxmdXRpbHMuc3BlYy5pbl0pCisKKworQUNfQ0FOT05JQ0FMX0hPU1QKKworQUNfQVJHX0VOQUJMRShbdGxzXSwKK0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS10bHNdLCBbZW5hYmxlIHVzZSBvZiB0aHJlYWQgbG9jYWwgc3RvcmFnZV0pLAorQUNfREVGSU5FKFVTRV9UTFMpKQorQUhfVEVNUExBVEUoW1VTRV9UTFNdLCBbRGVmaW5lZCBpZiB0aHJlYWQgbG9jYWwgc3RvcmFnZSBzaG91bGQgYmUgdXNlZC5dKQorCitkbmwgQWRkIGFsbCB0aGUgbGFuZ3VhZ2VzIGZvciB3aGljaCB0cmFuc2xhdGlvbnMgYXJlIGF2YWlsYWJsZS4KK0FMTF9MSU5HVUFTPQorCitBQ19QUk9HX0NDCitBQ19QUk9HX1JBTkxJQgorQUNfUFJPR19ZQUNDCitBTV9QUk9HX0xFWAorCitBQ19DQUNIRV9DSEVDSyhbZm9yIGdjYyB3aXRoIEM5OSBzdXBwb3J0XSwgYWNfY3ZfYzk5LCBbZG5sCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTIC1zdGQ9Z251OTkiCitBQ19DT01QSUxFX0lGRUxTRShbZG5sCitpbnQgZm9vIChpbnQgYSkgeyBmb3IgKGludCBpID0gMDsgaSA8IGE7ICsraSkgaWYgKGkgJSA0KSBicmVhazsgaW50IHMgPSBhOyB9XSwKKwkJICBhY19jdl9jOTk9eWVzLCBhY19jdl9jOTk9bm8pCitDRkxBR1M9IiRvbGRfQ0ZMQUdTIl0pCitBU19JRihbdGVzdCAieCRhY19jdl9jOTkiICE9IHh5ZXNdLAorICAgICAgQUNfTVNHX0VSUk9SKFtnY2Mgd2l0aCBDOTkgc3VwcG9ydCByZXF1aXJlZF0pKQorCitMT0NBTEVESVI9JGRhdGFkaXIKK0FDX1NVQlNUKExPQ0FMRURJUikKK0FDX0RFRklORV9VTlFVT1RFRChMT0NBTEVESVIsICIkTE9DQUxFRElSIikKK0FIX1RFTVBMQVRFKFtMT0NBTEVESVJdLCBbRGlyZWN0b3J5IHRvIHBsYWNlIHRyYW5zbGF0aW9uIGZpbGVzIGluLl0pCisKK0RBVEFESVJOQU1FPSRkYXRhZGlyCitBQ19TVUJTVChEQVRBRElSTkFNRSkKKworZG5sIFRoaXMgdGVzdCBtdXN0IGNvbWUgYXMgZWFybHkgYXMgcG9zc2libGUgYWZ0ZXIgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24KK2RubCB0ZXN0cywgYmVjYXVzZSB0aGUgY2hvaWNlIG9mIHRoZSBmaWxlIG1vZGVsIGNhbiAoaW4gcHJpbmNpcGxlKSBhZmZlY3QKK2RubCB3aGV0aGVyIGZ1bmN0aW9ucyBhbmQgaGVhZGVycyBhcmUgYXZhaWxhYmxlLCB3aGV0aGVyIHRoZXkgd29yaywgZXRjLgorQUNfU1lTX0xBUkdFRklMRQorCitkbmwgRW5hYmxlIHRoZSBsaW5rZXIgdG8gYmUgYnVpbGQgYXMgYSBuYXRpdmUtb25seSBsaW5rZXIuICBCeSBkZWZhdWx0IGl0CitkbmwgY2FuIGhhbmRsZSBhbGwgYXJjaGl0ZWN0dXJlcyBidXQgdGhpcyBjb21lcyBhdCBhIGNvc3QuICBBIG5hdGl2ZQorZG5sIHdpbGwgYmUgc2xpZ2h0bHkgZmFzdGVyLCBzbWFsbCwgYW5kIGhhcyBmZXdlciBkZXBlbmRlbmNpZXMuCituYXRpdmVfbGQ9bm8KK0FDX0FSR19FTkFCTEUoW2dlbmVyaWNdLAorQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1nZW5lcmljXSwgW2RvIG5vdCBidWlsZCBnZW5lcmljIGxpbmtlcl0pLCBbZG5sCitpZiB0ZXN0ICIkZW5hYmxlX2dlbmVyaWMiID0gbm87IHRoZW4KKyAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgaT84NikKKyAgICBBQ19ERUZJTkUoTkFUSVZFX0VMRiwgMzIpCisgICAgbmF0aXZlX2xkPXllcworICAgIGJhc2VfY3B1PWkzODYKKyAgICA7OworICAgKikKKyAgICBBQ19NU0dfRVJST1IoW25vIG1hY2hpbmUtc3BlY2lmaWMgbGlua2VyIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlXSkKKyAgICA7OworICBlc2FjCitmaV0pCitBSF9URU1QTEFURShbTkFUSVZFX0VMRl0sCitbRGVmaW5lIHRvIDMyIG9yIDY0IGlmIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gaXMgd2FudGVkLl0pCitBTV9DT05ESVRJT05BTChOQVRJVkVfTEQsIHRlc3QgIiRuYXRpdmVfbGQiID0geWVzKQorZG5sIFRoZSBhdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgY2Fubm90IGRlYWwgd2l0aCBtYWNyb3MgaW4gdGhlIG5hbWUKK2RubCBvZiBmaWxlcyBpZiBhdCBhbnkgdGltZSB0aGVyZSBpcyBubyBzdWNoIGZpbGUsIGV2ZW4gaWYgdGhlIGZpbGVuYW1lCitkbmwgd291bGQgbm90IGJlIHVzZWQuCitBU19JRihbdGVzdCAteiAiJGJhc2VfY3B1Il0sIFtiYXNlX2NwdT1ub25lXSkKK0FDX1NVQlNUKGJhc2VfY3B1KQorCitkbmwgRW5hYmxlIGRlYnVnZ2luZyB2aWEgbXVkZmxhcC4gIFRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgbW9zdCBsaWJyYXJpZXMKK2RubCB0byBiZSBidWlsdCBhcyBhcmNoaXZlcyB3aGljaCBhcmUgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgYXBwbGljYXRpb25zLgorZG5sIEFsbCBjb2RlLCBhcyBmYXIgYXMgcG9zc2libGUsIGlzIGNvbXBpbGVkIGluc3RydW1lbnRlZCB0byBjYXRjaCBhbGwKK2RubCB0aGUgYnVncyB2YWxncmluZCBpcyBhYmxlIHRvIGNhdGNoLgordXNlX211ZGZsYXA9bm8KK0FDX0FSR19FTkFCTEUoW211ZGZsYXBdLAorQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW11ZGZsYXBdLAorW2J1aWxkIGJpbmFyaWVzIHdpdGggbXVkZmxhcCBpbnN0cnVtZW50YXRpb25dKSwgW2RubAoraWYgdGVzdCAieCRlbmFibGVfbXVkZmxhcCIgPSB4eWVzOyB0aGVuCisgICMgQ2hlY2sgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydCAtZm11ZGZsYXAuCisgIG9sZF9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtZm11ZGZsYXAiCisgIEFDX1RSWV9DT01QSUxFKFtdLCBbXSwgdXNlX211ZGZsYXA9eWVzLCB1c2VfbXVkZmxhcD1mYWlsKQorICBDRkxBR1M9IiRvbGRfQ0ZMQUdTIgorZmldKQoraWYgdGVzdCAiJHVzZV9tdWRmbGFwIiA9IGZhaWw7IHRoZW4KKyAgQUNfTVNHX0ZBSUxVUkUoWy0tZW5hYmxlLW11ZGZsYXAgcmVxdWlyZXMgYSBjb21waWxlciB3aGljaCB1bmRlcnN0YW5kcyB0aGlzIG9wdGlvbl0pCitmaQorQU1fQ09ORElUSU9OQUwoTVVERkxBUCwgdGVzdCAiJHVzZV9tdWRmbGFwIiA9IHllcykKKworTElCRUJMX1NVQkRJUj0iJFBBQ0tBR0UiCitBQ19BUkdfRU5BQkxFKFtsaWJlYmwtc3ViZGlyXSwKK0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJlYmwtc3ViZGlyPURJUl0sCitbaW5zdGFsbCBsaWJlYmxfQ1BVIG1vZHVsZXMgaW4gJChsaWJkaXIpL0RJUl0pLCBbZG5sCitMSUJFQkxfU1VCRElSPSIkZW5hYmxlX2xpYmVibF9zdWJkaXIiXSkKK0FDX1NVQlNUKFtMSUJFQkxfU1VCRElSXSkKK0FDX0RFRklORV9VTlFVT1RFRChMSUJFQkxfU1VCRElSLCAiJExJQkVCTF9TVUJESVIiKQorQUhfVEVNUExBVEUoW0xJQkVCTF9TVUJESVJdLCBbJGxpYmRpciBzdWJkaXJlY3RvcnkgY29udGFpbmluZyBsaWJlYmwgbW9kdWxlcy5dKQorCitkbmwgVGhlIGRpcmVjdG9yaWVzIHdpdGggY29udGVudC4KKworZG5sIERvY3VtZW50YXRpb24uCitkbmwgQ29tbWVudGVkIG91dCBmb3Igbm93LgorZG5sIEFDX0NPTkZJR19GSUxFUyhbZG9jL01ha2VmaWxlXSkKKworZG5sIFN1cHBvcnQgbGlicmFyeS4KK0FDX0NPTkZJR19GSUxFUyhbbGliL01ha2VmaWxlXSkKKworZG5sIEVMRiBsaWJyYXJ5LgorQUNfQ09ORklHX0ZJTEVTKFtsaWJlbGYvTWFrZWZpbGUgbGliZWxmLXBvL01ha2VmaWxlLmluXSkKKworZG5sIEhpZ2hlci1sZXZlbCBFTEYgc3VwcG9ydCBsaWJyYXJ5LgorQUNfQ09ORklHX0ZJTEVTKFtsaWJlYmwvTWFrZWZpbGVdKQorCitkbmwgRFdBUkYgbGlicmFyeS4KK0FDX0NPTkZJR19GSUxFUyhbbGliZHcvTWFrZWZpbGVdKQorCitkbmwgSGlnaGVyLWxldmVsIERXQVJGIHN1cHBvcnQgbGlicmFyeS4KK0FDX0NPTkZJR19GSUxFUyhbbGliZHdmbC9NYWtlZmlsZV0pCisKK2RubCBDUFUgaGFuZGxpbmcgbGlicmFyeS4KK0FDX0NPTkZJR19GSUxFUyhbbGliY3B1L01ha2VmaWxlXSkKKworZG5sIEFzc2VtYmxlciBsaWJyYXJ5LgorQUNfQ09ORklHX0ZJTEVTKFtsaWJhc20vTWFrZWZpbGVdKQorCitkbmwgVG9vbHMuCitBQ19DT05GSUdfRklMRVMoW3NyYy9NYWtlZmlsZSBwby9NYWtlZmlsZS5pbl0pCisKK2RubCBUZXN0IHN1aXRlLgorQUNfQ09ORklHX0ZJTEVTKFt0ZXN0cy9NYWtlZmlsZV0pCisKKyMgR2V0IHRoZSBkZWZpbml0aW9ucyBuZWNlc3NhcnkgdG8gY3JlYXRlIHRoZSBNYWtlZmlsZXMgaW4gdGhlIHBvCisjIHN1YmRpcmVjdG9yaWVzLiAgVGhpcyBpcyBhIHNtYWxsIHN1YnNldCBvZiB0aGUgZ2V0dGV4dCBydWxlcy4KK0FDX1NVQlNUKFVTRV9OTFMsIHllcykKK0FNX1BPX1NVQkRJUlMKKworCitkbmwgVGVzdCBvZiB0aGUgY29uZmlnLmggZmlsZS4gIFdlIGhpZGUgYWxsIGtpbmRzIG9mIGNvbmZpZ3VyYXRpb24gbWFnaWMKK2RubCBpbiB0aGVyZS4KK0FIX0JPVFRPTShbCisvKiBFdmVudHVhbGx5IHdlIHdpbGwgYWxsb3cgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIHRvIHVzZSB0aGUKKyAgIGxpYnJhcmllcy4gIFRoZXJlZm9yZSB3ZSB3aWxsIGFkZCB0aGUgbmVjZXNzYXJ5IGxvY2tpbmcgYWx0aG91Z2gKKyAgIHRoZSBtYWNyb3MgdXNlZCBleHBhbmQgdG8gbm90aGluZyBmb3Igbm93LiAgKi8KKyNkZWZpbmUgbG9ja19sb2NrKGxvY2spICgodm9pZCkgKGxvY2spKQorI2RlZmluZSByd2xvY2tfZGVmaW5lKGNsYXNzLG5hbWUpIGNsYXNzIGludCBuYW1lCisjZGVmaW5lIHJ3bG9ja19pbml0KGxvY2spICgodm9pZCkgKGxvY2spKQorI2RlZmluZSByd2xvY2tfZmluaShsb2NrKSAoKHZvaWQpIChsb2NrKSkKKyNkZWZpbmUgcndsb2NrX3JkbG9jayhsb2NrKSAoKHZvaWQpIChsb2NrKSkKKyNkZWZpbmUgcndsb2NrX3dybG9jayhsb2NrKSAoKHZvaWQpIChsb2NrKSkKKyNkZWZpbmUgcndsb2NrX3VubG9jayhsb2NrKSAoKHZvaWQpIChsb2NrKSkKKyNkZWZpbmUgdGxzX2tleV90IHZvaWQgKgorI2RlZmluZSBrZXlfY3JlYXRlKGtleXAsIGZyZWVmY3QpICgxKQorI2RlZmluZSBnZXRzcGVjaWZpYyhrZXkpIGtleQorI2RlZmluZSBzZXRzcGVjaWZpYyhrZXksdmFsKSBrZXkgPSB2YWwKKyNkZWZpbmUgb25jZV9kZWZpbmUoY2xhc3MsbmFtZSkgY2xhc3MgaW50IG5hbWUKKyNkZWZpbmUgb25jZV9leGVjdXRlKG5hbWUsZmN0KSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKG5hbWUgPT0gMCkJCQkJCQkJICAgICAgXAorICAgICAgZmN0ICgpOwkJCQkJCQkJICAgICAgXAorICAgIG5hbWUgPSAxOwkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKiBnZXR0ZXh0IGhlbHBlciBtYWNyby4gICovCisjZGVmaW5lIE5fKFN0cikgU3RyCisKKy8qIENvbXBpbGVyLXNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKyNkZWZpbmUgc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgXAorICBleHRlcm4gX190eXBlb2YgKG5hbWUpIGFsaWFzbmFtZSBfX2F0dHJpYnV0ZV9fICgoYWxpYXMgKCNuYW1lKSkpOworCisjaWZkZWYgX19pMzg2X18KKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uX2RlZiBfX2F0dHJpYnV0ZV9fICgocmVncGFybSAoMyksIHN0ZGNhbGwpKQorI2Vsc2UKKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uX2RlZiAvKiBub3RoaW5nICovCisjZW5kaWYKKworIyBkZWZpbmUgaW50ZXJuYWxfZnVuY3Rpb24gXAorICBpbnRlcm5hbF9mdW5jdGlvbl9kZWYgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJpbnRlcm5hbCIpKSkKKyMgZGVmaW5lIGludGVybmFsX3N0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpIFwKKyAgZXh0ZXJuIF9fdHlwZW9mIChuYW1lKSBhbGlhc25hbWUgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgjbmFtZSksIHZpc2liaWxpdHkgKCJpbnRlcm5hbCIpKSkgaW50ZXJuYWxfZnVuY3Rpb25fZGVmOworCisjZGVmaW5lIGF0dHJpYnV0ZV9oaWRkZW4gXAorICBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKKworLyogRGVmaW5lIEFMTE9XX1VOQUxJR05FRCBpZiB0aGUgYXJjaGl0ZWN0dXJlIGFsbG93cyBvcGVyYXRpb25zIG9uCisgICB1bmFsaWduZWQgbWVtb3J5IGxvY2F0aW9ucy4gICovCisjaWYgZGVmaW5lZCBfX2kzODZfXyB8fCBkZWZpbmVkIF9fYWxwaGFfXyB8fCBkZWZpbmVkIF9feDg2XzY0X18gfHwgZGVmaW5lZCBfX2lhNjRfXworIyBkZWZpbmUgQUxMT1dfVU5BTElHTkVECTEKKyNlbHNlCisjIGRlZmluZSBBTExPV19VTkFMSUdORUQJMAorI2VuZGlmCisKKyNkZWZpbmUgdW5saWtlbHkoZXhwcikgX19idWlsdGluX2V4cGVjdCAoZXhwciwgMCkKKyNkZWZpbmUgbGlrZWx5KGV4cHIpIF9fYnVpbHRpbl9leHBlY3QgKGV4cHIsIDEpCisKKyNkZWZpbmUgb2JzdGFja19jYWxsb2Mob2IsIHNpemUpIFwKKyAgKHsgc2l6ZV90IF9zID0gKHNpemUpOyBtZW1zZXQgKG9ic3RhY2tfYWxsb2MgKG9iLCBfcyksICdcMCcsIF9zKTsgfSkKKyNkZWZpbmUgb2JzdGFja19zdHJkdXAob2IsIHN0cikgXAorICAoeyBjb25zdCBjaGFyICpfcyA9IChzdHIpOyBvYnN0YWNrX2NvcHkwIChvYiwgX3MsIHN0cmxlbiAoX3MpKTsgfSkKKyNkZWZpbmUgb2JzdGFja19zdHJuZHVwKG9iLCBzdHIsIG4pIFwKKyAgKHsgY29uc3QgY2hhciAqX3MgPSAoc3RyKTsgb2JzdGFja19jb3B5MCAob2IsIF9zLCBzdHJubGVuIChfcywgbikpOyB9KQorCisjaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjIGRlZmluZSBmbGV4YXJyX3NpemUgLyogZW1wdHkgKi8KKyNlbHNlCisjIGRlZmluZSBmbGV4YXJyX3NpemUgMAorI2VuZGlmCisKKy8qIENhbGxpbmcgY29udmVudGlvbnMuICAqLworI2lmZGVmIF9faTM4Nl9fCisjIGRlZmluZSBDQUxMSU5HX0NPTlZFTlRJT04gcmVncGFybSAoMyksIHN0ZGNhbGwKKyMgZGVmaW5lIEFORF9DQUxMSU5HX0NPTlZFTlRJT04gLCByZWdwYXJtICgzKSwgc3RkY2FsbAorI2Vsc2UKKyMgZGVmaW5lIENBTExJTkdfQ09OVkVOVElPTgorIyBkZWZpbmUgQU5EX0NBTExJTkdfQ09OVkVOVElPTgorI2VuZGlmCisKKy8qIEF2b2lkIFBMVCBlbnRyaWVzLiAgKi8KKyNpZmRlZiBQSUMKKyMgZGVmaW5lIElOVFVTRShuYW1lKSBfSU5UVVNFKG5hbWUpCisjIGRlZmluZSBfSU5UVVNFKG5hbWUpIF9fIyNuYW1lIyNfaW50ZXJuYWwKKyMgZGVmaW5lIElOVERFRihuYW1lKSBfSU5UREVGKG5hbWUpCisjIGRlZmluZSBfSU5UREVGKG5hbWUpIFwKKyAgZXh0ZXJuIF9fdHlwZW9mX18gKG5hbWUpIF9fIyNuYW1lIyNfaW50ZXJuYWwgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgjbmFtZSkpKTsKKyMgZGVmaW5lIElOVERFQ0wobmFtZSkgX0lOVERFQ0wobmFtZSkKKyMgZGVmaW5lIF9JTlRERUNMKG5hbWUpIFwKKyAgZXh0ZXJuIF9fdHlwZW9mX18gKG5hbWUpIF9fIyNuYW1lIyNfaW50ZXJuYWwgYXR0cmlidXRlX2hpZGRlbjsKKyNlbHNlCisjIGRlZmluZSBJTlRVU0UobmFtZSkgbmFtZQorIyBkZWZpbmUgSU5UREVGKG5hbWUpIC8qIGVtcHR5ICovCisjIGRlZmluZSBJTlRERUNMKG5hbWUpIC8qIGVtcHR5ICovCisjZW5kaWYKK10pCisKK0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvZG9jLy5jdnNpZ25vcmUgYi9kb2MvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg0NWUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2RvYy9DaGFuZ2VMb2cgYi9kb2MvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MGEwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTIgQEAKKzIwMDUtMDQtMjkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBlbGZ1dGlscy5zZ21sOiBTb21lIHR5cG8gZml4ZXMgYW5kIGEgZmV3IGV4dGVuc2lvbnMuCisJUGF0Y2ggYnkgRXJpYyBDaHJpc3RvcGhlciA8ZWNocmlzdG9AcmVkaGF0LmNvbT4uCisKKzIwMDUtMDItMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbTogUHJlZmVyIHBkZi4KKworMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvZG9jL01ha2VmaWxlLmFtIGIvZG9jL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTczMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBjcmVhdGUgTWFrZWZpbGUuaW4KKyMjIENvbmZpZ3VyZSBpbnB1dCBmaWxlIGZvciBlbGZ1dGlscy4KKyMjCisjIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMSwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisjIworIyMgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworIyMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorIyMKKyMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworIyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisjIyBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisjIyBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyMjIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKyMjCitFWFRSQV9ESVNUID0gZWxmdXRpbHMuc2dtbAorCitDTEVBTkZJTEVTID0gZWxmdXRpbHMuZHZpCisKKyMgV2UgbmVlZCBvbmx5IGEgZmV3IHNwZWNpYWwgcnVsZXMgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgb3V0cHV0IGZvcm1hdHMKKyMgZnJvbSB0aGUgU0dNTCBzb3VyY2VzLgorLlBIT05ZOiBkdmkgcGRmIGh0bWwKK3BkZjogJChzcmNkaXIpZWxmdXRpbHMucGRmCitkdmk6ICQoc3JjZGlyKWVsZnV0aWxzLmR2aQorCiskKHNyY2RpciklLmR2aTogJS5zZ21sCisJZGIyZHZpICReCiskKHNyY2RpciklLnBkZjogJS5zZ21sCisJZGIycGRmICReCmRpZmYgLS1naXQgYS9kb2MvZWxmdXRpbHMuc2dtbCBiL2RvYy9lbGZ1dGlscy5zZ21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZmVhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWxmdXRpbHMuc2dtbApAQCAtMCwwICsxLDQ0NCBAQAorPCFkb2N0eXBlIGJvb2sgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgVjQuMS8vRU4iWworPCFFTlRJVFkgcGFja2FnZSAiPGZpbGVuYW1lPm5ldy1idTwvZmlsZW5hbWU+Ij4KK10+CisKKzxib29rPgorICA8dGl0bGU+TmV3IEJpbnV0aWxzIFVzZXIncyBhbmQgUmVmZXJlbmNlIE1hbnVhbDwvdGl0bGU+CisKKyAgPGNoYXB0ZXI+CisgICAgPHRpdGxlPjxmaWxlbmFtZT5saWJlbGY8L2ZpbGVuYW1lPiA8YWNyb255bT5BQkk8L2Fjcm9ueW0+PC90aXRsZT4KKworICAgIDxzaW1wYXJhPlRoZSA8YWNyb255bT5BQkk8L2Fjcm9ueW0+IG9mIHRoZQorICAgIDxmaWxlbmFtZT5saWJlbGY8L2ZpbGVuYW1lPiBpbXBsZW1lbnRlZCBpbiB0aGUgJnBhY2thZ2U7IHBhY2thZ2UKKyAgICBpcyBmb2xsb3dpbmcgdGhhdCBvZiBTdW4ncyBpbXBsZW1lbnRhdGlvbiB3aGljaCBpbiB0dXJuIGluIGRlcml2ZWQKKyAgICBmcm9tIHRoZSBvcmlnaW5hbCBTeXNWcjQgaW1wbGVtZW50YXRpb24uICBUaGVyZSBhcmUgc29tZQorICAgIGV4dGVuc2lvbnMgb3ZlciBTdW4ncyB2ZXJzaW9ucywgdGhvdWdoLCB3aGljaCBtYWtlcyBpdCBpbXBvc3NpYmxlCisgICAgdG8gcmVwbGFjZSB0aGlzIGltcGxlbWVudGF0aW9uIHdpdGggU3VuJ3MuPC9zaW1wYXJhPgorCisgICAgPGJlZ2lucGFnZT4KKworICAgIDxyZWZlbnRyeSB4cmVmbGFiZWw9IkVsZl9EYXRhIiBpZD0iRWxmVURhdGEiPgorICAgICAgPHJlZm5hbWVkaXY+CisJPHJlZm5hbWU+RWxmX0RhdGE8L3JlZm5hbWU+CisJPHJlZnB1cnBvc2U+RGVzY3JpcHRvciBmb3IgRGF0YSBCdWZmZXI8L3JlZnB1cnBvc2U+CisgICAgICA8L3JlZm5hbWVkaXY+CisKKyAgICAgIDxyZWZzeW5vcHNpc2Rpdj4KKwk8c3lub3BzaXM+CisjaW5jbHVkZSAmbHQ7bGliZWxmLmgmZ3Q7Cis8L3N5bm9wc2lzPgorICAgICAgPC9yZWZzeW5vcHNpc2Rpdj4KKworICAgICAgPHJlZnNlY3QxPgorCTx0aXRsZT5EZXNjcmlwdGlvbjwvdGl0bGU+CisKKwk8c2ltcGFyYT5UaGUgPHN0cnVjdG5hbWU+RWxmX0RhdGE8L3N0cnVjdG5hbWU+IHN0cnVjdHVyZSBpcyBhcworCWEgZGVzY3JpcHRvciBmb3IgYSBkYXRhIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLgorCUV2ZXJ5IGRhdGEgYnVmZmVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHNlY3Rpb24gKHNlZQorCTwhLS0geHJlZiAtLT48c3RydWN0bmFtZT5FbGZfU2NuPC9zdHJ1Y3RuYW1lPikuPC9zaW1wYXJhPgorCisJPHNpbXBhcmE+QSBkYXRhIGJ1ZmZlciBpcyBjcmVhdGVkIHdoZW4gcmVhZGluZyBhIGZpbGUuICBJbgorCXRoaXMgY2FzZSBvbmx5IGEgc2luZ2xlIGJ1ZmZlciBpcyBwcmVzZW50IGluIHRoZSBzZWN0aW9uLiAgVGhlCisJdXNlciBjYW4gYWRkIGFzIG1hbnkgc2VjdGlvbnMgYXMgd2FudGVkIHRvIGEgc2VjdGlvbiBhbmQgdGhleQorCWNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlIDxmdW5jdGlvbj5lbGZfZ2V0ZGF0YTwvZnVuY3Rpb24+CisJYW5kIDxmdW5jdGlvbj5lbGZfcmF3ZGF0YTwvZnVuY3Rpb24+IGZ1bmN0aW9ucy48IS0tIHhyZWYKKwktLT48L3NpbXBhcmE+CisKKwk8c2ltcGFyYT5UaGUgPHN0cnVjdG5hbWU+RWxmX0RhdGE8L3N0cnVjdG5hbWU+IHN0cnVjdHVyZQorCWNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWVtYmVyczo8L3NpbXBhcmE+CisKKwk8cHJvZ3JhbWxpc3Rpbmc+CisgICB2b2lkICAgICAgICAgKmRfYnVmCisgICBFbGZfVHlwZSAgICAgIGRfdHlwZQorICAgc2l6ZV90ICAgICAgICBkX3NpemUKKyAgIG9mZl90ICAgICAgICAgZF9vZmYKKyAgIHNpemVfdCAgICAgICAgZF9hbGlnbgorICAgdW5zaWduZWQgaW50ICBkX3ZlcnNpb24KKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKwk8c2ltcGFyYT5BbGwgb2YgdGhlc2UgbWVtYmVycyBjYW4gYmUgbW9kaWZpZWQgZGlyZWN0bHkgYnkgdGhlCisJdXNlci4gIFRoZXkgY2FuIGJlIHVzZWQgdG8gcmVzaXplIGEgc2VjdGlvbiwgdG8gY2hhbmdlIGl0cworCWNvbnRlbnQgb3IgdHlwZSwgYW5kIG1hbnkgbW9yZSB0YXNrcy4gIFRoaXMgaXMgYWxzbyB0cnVlIGZvcgorCXRoZSBkYXRhIHJlYWQgZnJvbSBhIGZpbGUuICBUaGUgbWVhbmluZyBvZiBlYWNoIG1lbWJlciBpcyBhcworCWZvbGxvd3M6PC9zaW1wYXJhPgorCisJPHZhcmlhYmxlbGlzdD4KKwkgIDx2YXJsaXN0ZW50cnk+CisJICAgIDx0ZXJtPjxzdHJ1Y3RmaWVsZD5kX2J1Zjwvc3RydWN0ZmllbGQ+PC90ZXJtPgorCSAgICA8bGlzdGl0ZW0+CisJICAgICAgPHNpbXBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5kX2J1Zjwvc3RydWN0ZmllbGQ+IG1lbWJlciBpcworCSAgICAgIHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2l0aCB0aGUgYWN0dWFsIGRhdGEuICBXaGVuCisJICAgICAgdGhlIEVMRiBmaWxlIHdhcyByZWFkIGZyb20gYSBmaWxlIHRoZSBmaXJzdCBhbmQgb25seQorCSAgICAgIGRhdGEgYnVmZmVyIG9mIGEgc2VjdGlvbiBpcyBhbGxvY2F0ZWQgYnkgdGhlCisJICAgICAgPGZpbGVuYW1lPmxpYmVsZjwvZmlsZW5hbWU+IGxpYnJhcnkuICBUaGUgdXNlciBzaG91bGQKKwkgICAgICBub3QgdHJ5IHRvIHJlc2l6ZSBvciBmcmVlIHRoaXMgYnVmZmVyLiAgV2hlbiB0aGUgdXNlcgorCSAgICAgIGFkZHMgYSBuZXcgZGF0YSBidWZmZXIgdG8gYSBzZWN0aW9uIHRoZSBhc3NvY2lhdGVkCisJICAgICAgbWVtb3J5IGJsb2NrIGlzIG5vcm1hbGx5IGFsbG9jYXRlZCBieSB0aGUgdXNlci4gIEl0IGlzCisJICAgICAgaW1wb3J0YW50IHRoYXQgdGhlIGJ1ZmZlciBtdXN0IGhhdmUgYSBsaWZldGltZSBhdCBsZWFzdAorCSAgICAgIHVudGlsIHRoZSBFTEYgZmlsZSBpcyBjbG9zZWQgZW50aXJlbHkgKGltcG9ydGFudCB3aGVuCisJICAgICAgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrKS4gIElmIHRoZSBidWZmZXIgaXMKKwkgICAgICBub3QgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBpdCBpcyB0aGUgdXNlcidzCisJICAgICAgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgYnVmZmVyIGFmdGVyIGl0IGlzIG5vdCB1c2VkCisJICAgICAgYW55bW9yZS4gIFRoZSA8c3RydWN0ZmllbGQ+ZF9idWY8L3N0cnVjdGZpZWxkPiBtZW1iZXIKKwkgICAgICBjYW4gY29udGFpbiBhIG51bGwgcG9pbnRlciBpZiB0aGUgZGF0YSBidWZmZXIgaXMKKwkgICAgICBlbXB0eS48L3NpbXBhcmE+CisJICAgIDwvbGlzdGl0ZW0+CisJICA8L3Zhcmxpc3RlbnRyeT4KKworCSAgPHZhcmxpc3RlbnRyeT4KKwkgICAgPHRlcm0+PHN0cnVjdGZpZWxkPmRfdHlwZTwvc3RydWN0ZmllbGQ+PC90ZXJtPgorCSAgICA8bGlzdGl0ZW0+CisJICAgICAgPHNpbXBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5kX3R5cGU8L3N0cnVjdGZpZWxkPgorCSAgICAgIGRldGVybWluZXMgaG93IHRoZSBkYXRhIG9mIHRoZSBidWZmZXIgaXMgaW50ZXJwcmV0ZWQuCisJICAgICAgVGhpcyB0eXBlIGlzIGRldGVybWluZWQgZnJvbSB0aGUgc2VjdGlvbiB0eXBlIGFuZCBtdXN0CisJICAgICAgYmUgdGhlIHNhbWUgZm9yIGFsbCBkYXRhIGJ1ZmZlcnMgZm9yIGEgc2VjdGlvbi4gIFNlZQorCSAgICAgIDwhLS0geHJlZiAtLT48dHlwZT5FbGZfVHlwZTwvdHlwZT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisJICAgICAgVGhlIDxmdW5jdGlvbj48bGluayBsaW5rZW5kPSJlbGZVZ2V0ZGF0YSIKKwkgICAgICBlbmR0ZXJtPSJlbGZVZ2V0ZGF0YS5yZWZuYW1lIj48L2xpbms+PC9mdW5jdGlvbj4KKwkgICAgICBmdW5jdGlvbiB1c2VzIHRoaXMgaW5mb3JtYXRpb24gdG8gY29udmVydCB0aGUgZGF0YSBvZgorCSAgICAgIHRoZSBidWZmZXIgYmV0d2VlbiB0aGUgZXh0ZXJuYWwgZm9ybSBhbmQgdGhlIGZvcm0KKwkgICAgICByZXByZXNlbnRlZCB0byB0aGUgdXNlciBhbmQgYmFjayBpZiBuZWNlc3NhcnkuPC9zaW1wYXJhPgorCSAgICA8L2xpc3RpdGVtPgorCSAgPC92YXJsaXN0ZW50cnk+CisKKwkgIDx2YXJsaXN0ZW50cnk+CisJICAgIDx0ZXJtPjxzdHJ1Y3RmaWVsZD5kX3ZlcnNpb248L3N0cnVjdGZpZWxkPjwvdGVybT4KKwkgICAgPGxpc3RpdGVtPgorCSAgICAgIDxzaW1wYXJhPlRoZSA8c3RydWN0ZmllbGQ+ZF92ZXJzaW9uPC9zdHJ1Y3RmaWVsZD4KKyAgICAgICAgICAgICAgY29udGFpbnMgdGhlIEVMRiB2ZXJzaW9uIG9mIHRoZSBmaWxlLjwvc2ltcGFyYT4KKwkgICAgPC9saXN0aXRlbT4KKwkgIDwvdmFybGlzdGVudHJ5PgorCisJICA8dmFybGlzdGVudHJ5PgorCSAgICA8dGVybT48c3RydWN0ZmllbGQ+ZF9zaXplPC9zdHJ1Y3RmaWVsZD48L3Rlcm0+CisJICAgIDxsaXN0aXRlbT4KKwkgICAgICA8c2ltcGFyYT5UaGUgPHN0cnVjdGZpZWxkPmRfc2l6ZTwvc3RydWN0ZmllbGQ+IGNvbnRhaW5zCisgICAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuPC9zaW1wYXJhPgorCSAgICA8L2xpc3RpdGVtPgorCSAgPC92YXJsaXN0ZW50cnk+CisKKwkgIDx2YXJsaXN0ZW50cnk+CisJICAgIDx0ZXJtPjxzdHJ1Y3RmaWVsZD5kX29mZjwvc3RydWN0ZmllbGQ+PC90ZXJtPgorCSAgICA8bGlzdGl0ZW0+CisJICAgICAgPHNpbXBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5kX29mZjwvc3RydWN0ZmllbGQ+IGlzIHRoZQorICAgICAgICAgICAgICBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBpbiBieXRlcy48L3NpbXBhcmE+CisJICAgIDwvbGlzdGl0ZW0+CisJICA8L3Zhcmxpc3RlbnRyeT4KKworCSAgPHZhcmxpc3RlbnRyeT4KKwkgICAgPHRlcm0+PHN0cnVjdGZpZWxkPmRfYWxpZ248L3N0cnVjdGZpZWxkPjwvdGVybT4KKwkgICAgPGxpc3RpdGVtPgorCSAgICAgIDxzaW1wYXJhPlRoZSA8c3RydWN0ZmllbGQ+ZF9hbGlnbjwvc3RydWN0ZmllbGQ+IGlzIHRoZQorICAgICAgICAgICAgICBhZGRyZXNzIGFsaWdubWVudCBvZiB0aGUgc2VjdGlvbiBpbiBieXRlcy48L3NpbXBhcmE+CisJICAgIDwvbGlzdGl0ZW0+CisJICA8L3Zhcmxpc3RlbnRyeT4KKwk8L3ZhcmlhYmxlbGlzdD4KKyAgICAgIDwvcmVmc2VjdDE+CisgICAgPC9yZWZlbnRyeT4KKworICAgIDxiZWdpbnBhZ2U+CisKKyAgICA8cmVmZW50cnkgaWQ9ImVsZlVnZXRkYXRhIj4KKyAgICAgIDxyZWZuYW1lZGl2PgorCTxyZWZuYW1lIGlkPSJlbGZVZ2V0ZGF0YS5yZWZuYW1lIj5lbGZfZ2V0ZGF0YTwvcmVmbmFtZT4KKwk8cmVmcHVycG9zZT5HZXQgd2FzaGVkIGRhdGEgb2Ygc2VjdGlvbjwvcmVmcHVycG9zZT4KKyAgICAgIDwvcmVmbmFtZWRpdj4KKworICAgICAgPHJlZnN5bm9wc2lzZGl2PgorCTxmdW5jc3lub3BzaXM+CisJICA8ZnVuY3N5bm9wc2lzaW5mbz4KKyNpbmNsdWRlICZsdDtsaWJlbGYuaCZndDsKKzwvZnVuY3N5bm9wc2lzaW5mbz4KKwkgIDxmdW5jcHJvdG90eXBlPgorCSAgICA8ZnVuY2RlZj5FbGZfRGF0YSAqPGZ1bmN0aW9uPmVsZl9nZXRkYXRhPC9mdW5jdGlvbj48L2Z1bmNkZWY+CisJICAgIDxwYXJhbWRlZj5FbGZfU2NuICo8cGFyYW1ldGVyPnNjbjwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJICAgIDxwYXJhbWRlZj5FbGZfRGF0YSAqPHBhcmFtZXRlcj5kYXRhPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKwkgIDwvZnVuY3Byb3RvdHlwZT4KKwk8L2Z1bmNzeW5vcHNpcz4KKyAgICAgIDwvcmVmc3lub3BzaXNkaXY+CisKKyAgICAgIDxyZWZzZWN0MT4KKwk8dGl0bGU+RGVzY3JpcHRpb248L3RpdGxlPgorCisJPHNpbXBhcmE+VGhlIDxmdW5jdGlvbj5lbGZfZ2V0ZGF0YTwvZnVuY3Rpb24+IGZ1bmN0aW9uIGFsbG93cworCXRoZSB1c2VyIHRvIHJldHJpZXZlIHRoZSBkYXRhIGJ1ZmZlcnMgb2YgdGhlIHNlY3Rpb24KKwk8cGFyYW1ldGVyPnNjbjwvcGFyYW1ldGVyPi4gIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGJ1ZmZlcgorCWlmIHRoZSB1c2VyIGV4cGxpY2l0bHkgYWRkZWQgdGhlbS4gIFdoZW4gYSBmaWxlIGlzIHJlYWQgdGhlCisJPGZpbGVuYW1lPmxpYmVsZjwvZmlsZW5hbWU+IGxpYnJhcnkgY3JlYXRlcyBleGFjdGx5IG9uZSBkYXRhCisJYnVmZmVyLjwvc2ltcGFyYT4KKworCTxzaW1wYXJhPlRoZSBmaXJzdCBidWZmZXIgaW4gdGhlIGxpc3QgY2FuIGJlIG9idGFpbmVkIGJ5CisJcGFzc2luZyBhIG51bGwgcG9pbnRlciBpbiB0aGUgcGFyYW1ldGVyCisJPHBhcmFtZXRlcj5kYXRhPC9wYXJhbWV0ZXI+LiAgVG8gZ2V0IHRoZSBuZXh0IGRhdGEgYnVmZmVyIHRoZQorCXByZXZpb3VzbHkgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBwYXNzZWQgaW4gdGhlCisJPHBhcmFtZXRlcj5kYXRhPC9wYXJhbWV0ZXI+IHBhcmFtZXRlci4gIElmIHRoZXJlIGFyZSBubyBtb3JlCisJYnVmZmVyIGxlZnQgaW4gdGhlIGxpc3QgYSBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQuPC9zaW1wYXJhPgorCisJPHNpbXBhcmE+SWYgdGhlIDxwYXJhbWV0ZXI+ZGF0YTwvcGFyYW1ldGVyPiBwYXJhbWV0ZXIgaXMgbm90IGEKKwludWxsIHBvaW50ZXIgaXQgbXVzdCBiZSBhIGRlc2NyaXB0b3IgZm9yIGEgYnVmZmVyCisJYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWN0aW9uIDxwYXJhbWV0ZXI+c2NuPC9wYXJhbWV0ZXI+LiAgSWYKKwl0aGlzIGlzIG5vdCB0aGUgY2FzZSBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZC4gIFRvCisJZmFjaWxpdGF0ZSBlcnJvciBoYW5kbGluZyA8ZnVuY3Rpb24+ZWxmX2dldGRhdGE8L2Z1bmN0aW9uPgorCWFsc28gcmV0dXJucyBhIG51bGwgcG9pbnRlciBpZiB0aGUgPHBhcmFtZXRlcj5zY248L3BhcmFtZXRlcj4KKwlwYXJhbWV0ZXIgaXMgYSBudWxsIHBvaW50ZXIuPC9zaW1wYXJhPgorICAgICAgPC9yZWZzZWN0MT4KKyAgICA8L3JlZmVudHJ5PgorCisgICAgPHJlZmVudHJ5PgorICAgICAgPHJlZm5hbWVkaXY+CisJPHJlZm5hbWUgaWQ9ImVsZlV1cGRhdGUucmVmbmFtZSI+ZWxmX3VwZGF0ZTwvcmVmbmFtZT4KKwk8cmVmcHVycG9zZT51cGRhdGUgYW4gRUxGIGRlc2NyaXB0b3I8L3JlZnB1cnBvc2U+CisgICAgICA8L3JlZm5hbWVkaXY+CisKKyAgICAgIDxyZWZzeW5vcHNpc2Rpdj4KKwk8ZnVuY3N5bm9wc2lzPgorCSAgPGZ1bmNzeW5vcHNpc2luZm8+CisjaW5jbHVkZSAmbHQ7bGliZWxmLmgmZ3Q7Cis8L2Z1bmNzeW5vcHNpc2luZm8+CisJICA8ZnVuY3Byb3RvdHlwZT4KKwkgICAgPGZ1bmNkZWY+b2ZmX3QgPGZ1bmN0aW9uPmVsZl91cGRhdGU8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KKwkgICAgPHBhcmFtZGVmPkVsZiAqPHBhcmFtZXRlcj5lbGY8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCSAgICA8cGFyYW1kZWY+RWxmX0NtZCA8cGFyYW1ldGVyPmNtZDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJICA8L2Z1bmNwcm90b3R5cGU+CisJPC9mdW5jc3lub3BzaXM+CisgICAgICA8L3JlZnN5bm9wc2lzZGl2PgorCisgICAgICA8cmVmc2VjdDE+CisJPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKworCTxzaW1wYXJhPlRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSBmb2xsb3dpbmcKKwlmaWVsZHMgaW4gdGhlIG5hbWVkIGRhdGEgc3RydWN0dXJlczo8L3NpbXBhcmE+CisKKwk8dGFibGU+CisJICA8dGl0bGU+RmllbGRzIG5vdCBzZXQgYnkgPGZ1bmN0aW9uPmVsZl91cGRhdGU8L2Z1bmN0aW9uPjwvdGl0bGU+CisJICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPGNvbHNwZWMgY29sd2lkdGg9IjkwcHQiPgorICAgICAgICAgICAgPGNvbHNwZWMgY29sd2lkdGg9IjExMHB0Ij4KKwkgICAgPHRoZWFkPgorCSAgICAgIDxyb3c+CisJCTxlbnRyeT5EYXRhIFN0cnVjdHVyZTwvZW50cnk+CisJCTxlbnRyeT5NZW1iZXI8L2VudHJ5PgorCQk8ZW50cnk+RXhjZXB0aW9uPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgPC90aGVhZD4KKwkgICAgPHRib2R5PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBtb3Jlcm93cz0iOCI+PHR5cGU+RWxmeHhfRWhkcjwvdHlwZT48L2VudHJ5PgorCQk8ZW50cnk+ZV9pZGVudFtFSV9EQVRBXTwvZW50cnk+CisJCTxlbnRyeT5zZWUgYmVsb3c8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeT48L2VudHJ5PgorCQk8ZW50cnk+ZV90eXBlPC9lbnRyeT4KKwkJPCEtLSA8ZW50cnkgbW9yZXJvd3M9IjEiPjwvZW50cnk+IC0tPgorCQk8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkJPGVudHJ5PmVfbWFjaGluZTwvZW50cnk+CisJCTxlbnRyeT48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeT48L2VudHJ5PgorCQk8ZW50cnk+ZV92ZXJzaW9uPC9lbnRyeT4KKwkJPGVudHJ5PnNlZSBiZWxvdzwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5lX2VudHJ5PC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5lX3Bob2ZmPC9lbnRyeT4KKwkJPGVudHJ5PmlmIDxzeW1ib2w+RUxGX0ZfTEFZT1VUPC9zeW1ib2w+IGlzIHVzZWQ8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeT48L2VudHJ5PgorCQk8ZW50cnk+ZV9zaG9mZjwvZW50cnk+CisJCTxlbnRyeT5pZiA8c3ltYm9sPkVMRl9GX0xBWU9VVDwvc3ltYm9sPiBpcyB1c2VkPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkJPGVudHJ5PmVfZmxhZ3M8L2VudHJ5PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkJPGVudHJ5PmVfc2hzdHJuZHg8L2VudHJ5PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgbW9yZXJvd3M9IjciPkVsZnh4X1BoZHI8L2VudHJ5PgorCQk8ZW50cnk+cF90eXBlPC9lbnRyeT4KKwkJPGVudHJ5IG1vcmVyb3dzPSI3Ij48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeT48L2VudHJ5PgorCQk8ZW50cnk+cF9vZmZzZXQ8L2VudHJ5PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkJPGVudHJ5PnBfdmFkZHI8L2VudHJ5PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkJPGVudHJ5PnBfcGFkZHI8L2VudHJ5PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkJPGVudHJ5PnBfZmlsZXN6PC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5wX21lbXN6PC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5wX2ZsYWdzPC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5wX2FsaWduPC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PgorCQk8ZW50cnkgbW9yZXJvd3M9IjkiPkVsZnh4X1NoZHI8L2VudHJ5PgorCQk8ZW50cnk+c2hfbmFtZTwvZW50cnk+CisJCTxlbnRyeSBtb3Jlcm93cz0iMyI+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkJPGVudHJ5PnNoX3R5cGU8L2VudHJ5PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkJPGVudHJ5PnNoX2ZsYWdzPC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5zaF9hZGRyPC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5zaF9vZmZzZXQ8L2VudHJ5PgorCQk8ZW50cnk+aWYgPHN5bWJvbD5FTEZfRl9MQVlPVVQ8L3N5bWJvbD4gaXMgdXNlZDwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5zaF9zaXplPC9lbnRyeT4KKwkJPGVudHJ5PmlmIDxzeW1ib2w+RUxGX0ZfTEFZT1VUPC9zeW1ib2w+IGlzIHVzZWQ8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeT48L2VudHJ5PgorCQk8ZW50cnk+c2hfbGluazwvZW50cnk+CisJCTwhLS0gPGVudHJ5IG1vcmVyb3dzPSIxIj48L2VudHJ5PiAtLT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5zaF9pbmZvPC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5zaF9hZGRyYWxpZ248L2VudHJ5PgorCQk8ZW50cnk+aWYgPHN5bWJvbD5FTEZfRl9MQVlPVVQ8L3N5bWJvbD4gaXMgdXNlZDwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5zaF9lbnRzaXplPC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PgorCQk8ZW50cnkgbW9yZXJvd3M9IjUiPkVsZl9EYXRhPC9lbnRyeT4KKwkJPGVudHJ5PmRfYnVmPC9lbnRyeT4KKwkJPGVudHJ5IG1vcmVyb3dzPSIyIj48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeT48L2VudHJ5PgorCQk8ZW50cnk+ZF90eXBlPC9lbnRyeT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5kX3NpemU8L2VudHJ5PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkJPGVudHJ5PmRfb2ZmPC9lbnRyeT4KKwkJPGVudHJ5PmlmIDxzeW1ib2w+RUxGX0ZfTEFZT1VUPC9zeW1ib2w+IGlzIHVzZWQ8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeT48L2VudHJ5PgorCQk8ZW50cnk+ZF9hbGlnbjwvZW50cnk+CisJCTwhLS0gPGVudHJ5IG1vcmVyb3dzPSIxIj48L2VudHJ5PiAtLT4KKwkJPGVudHJ5PjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5PjwvZW50cnk+CisJCTxlbnRyeT5kX3ZlcnNpb248L2VudHJ5PgorCQk8ZW50cnk+PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgPC90Ym9keT4KKwkgIDwvdGdyb3VwPgorCTwvdGFibGU+CisKKwk8c2ltcGFyYT5Ud28gZmllbGRzIG9mIHRoZSBFTEYgaGVhZGVyIGFyZSBoYW5kbGVkIGluIGEgc3BlY2lhbAorCXdheTo8L3NpbXBhcmE+CisKKwk8dmFyaWFibGVsaXN0PgorCSAgPHZhcmxpc3RlbnRyeT4KKwkgICAgPHRlcm0+ZV92ZXJzaW9uPC90ZXJtPgorCSAgICA8bGlzdGl0ZW0+CisJICAgICAgPHNpbXBhcmE+VGhlIHVzZXIgY2FuIHNldCB0aGlzIGZpZWxkIHRvIHRoZSB2dmFsdWUgZm9yCisJICAgICAgdGhlIHZlcnNpb24gdG8gYmUgdXNlZC4gIEl0IGlzIGFuIGVycm9yIGlmIHRoZSBsaWJyYXJ5CisJICAgICAgY2Fubm90IGhhbmRsZSB0aGlzIHZlcnNpb24uICBJZiB0aGUgZmllbGQgY29udGFpbnMgdGhlCisJICAgICAgdmFsdWUgPHN5bWJvbD5FVl9OT05FPC9zeW1ib2w+IHRoZSBsaWJyYXJ5IHdpbGwgZmlsbCBpbgorCSAgICAgIGl0cyBvd24gaW50ZXJuYWwgdmVyc2lvbi48L3NpbXBhcmE+CisJICAgIDwvbGlzdGl0ZW0+CisJICA8L3Zhcmxpc3RlbnRyeT4KKworCSAgPHZhcmxpc3RlbnRyeT4KKwkgICAgPHRlcm0+ZV9pZGVudFtFSV9EQVRBXTwvdGVybT4KKwkgICAgPGxpc3RpdGVtPgorCSAgICAgIDxzaW1wYXJhPlRoZSB1c2VyIHNob3VsZCBmaWxsIGluIHRoZSBieXRlIG9yZGVyaW5nIGZvcgorCSAgICAgIHRoZSBmaWxlLiAgSWYgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpcworCSAgICAgIDxzeW1ib2w+RUxGREFUQU5PTkU8L3N5bWJvbD4gdGhlIGxpYnJhcnkgcmVwbGFjZXMgaXQKKwkgICAgICB3aXRoIHRoZSBuYXRpdmUgYnl0ZSBvcmRlcmluZyBmb3IgdGhlIG1hY2hpbmUuPC9zaW1wYXJhPgorCSAgICA8L2xpc3RpdGVtPgorCSAgPC92YXJsaXN0ZW50cnk+CisJPC92YXJpYWJsZWxpc3Q+CisgICAgICA8L3JlZnNlY3QxPgorICAgIDwvcmVmZW50cnk+CisgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlcj4KKyAgICA8dGl0bGU+PGZpbGVuYW1lPmxpYmVsZjwvZmlsZW5hbWU+IEludGVybmFsczwvdGl0bGU+CisKKyAgICA8c2ltcGFyYT5TaW5jZSB0aGUgYmluYXJ5IGZvcm1hdCBoYW5kbGluZyB0b29scyBuZWVkIGNvbnN0YW50CisgICAgYXR0ZW50aW9uIHNpbmNlIHRoZXJlIGFyZSBhbHdheXMgbmV3IG1hY2hpbmVzIGFuZCB2YXJpZW50cworICAgIHRoZXJlZm9yZSBjb21pbmcgb3V0IGl0IGlzIGltcG9ydGFudCB0byBoYXZlIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgIHdlbGwgZG9jdW1lbnRlZC4gIE9ubHkgdGhpcyB3YXkgZXh0ZW5zaW9ucyBjYW4gYmUgbWFkZSBpbiB0aGUKKyAgICByaWdodCBwbGFjZXMgYW5kIHRoZSBtaXN0YWtlcyBvZiB0aGUgcGFzdCBhdm9pZGVkLjwvc2ltcGFyYT4KKyAgPC9jaGFwdGVyPgorPC9ib29rPgorPCEtLSBLZWVwIHRoaXMgY29tbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCitMb2NhbCB2YXJpYWJsZXM6Cittb2RlOiBzZ21sCitzZ21sLW9taXRhZzpuaWwKK3NnbWwtc2hvcnR0YWc6dAorRW5kOgorLS0+CmRpZmYgLS1naXQgYS9mYWtlLXNyYy9GVUxMIGIvZmFrZS1zcmMvRlVMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWU2NTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmFrZS1zcmMvRlVMTApAQCAtMCwwICsxLDMgQEAKK1RoZSBmdWxsIGVsZnV0aWxzIHBhY2thZ2UgaXMgYXZhaWxhYmxlIGZyb20gUmVkIEhhdCdzIHdlYiBzaXRlIGF0OgorCisgICoqKkZJTEUgTUUgSU4qKioKZGlmZiAtLWdpdCBhL2Zha2Utc3JjL01ha2VmaWxlLmFtIGIvZmFrZS1zcmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiMGZmZgotLS0gL2Rldi9udWxsCisrKyBiL2Zha2Utc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjQgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCisjIyBDb25maWd1cmUgaW5wdXQgZmlsZSBmb3IgZWxmdXRpbHMuCisjIworIyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIworIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIyBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIyMKK2Jpbl9TQ1JJUFRTID0gcmVhZGVsZiBubSBzaXplIHN0cmlwIGVsZmxpbnQgYWRkcjJsaW5lCitFWFRSQV9ESVNUID0gcmVhZGVsZiBubSBzaXplIHN0cmlwIGVsZmxpbnQuaW4gYWRkcjJsaW5lIEZVTEwKK2luY2x1ZGVfSEVBREVSUyA9IGR3YXJmLmgKKworZWxmbGludDogJChzcmNkaXIpL2VsZmxpbnQuaW4KKwlzZWQgInMvQEVVVkVSU0lPTkAvJChWRVJTSU9OKS8iICQ8ID4gJEAKZGlmZiAtLWdpdCBhL2Zha2Utc3JjL01ha2VmaWxlLmluIGIvZmFrZS1zcmMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyZDQxZAotLS0gL2Rldi9udWxsCisrKyBiL2Zha2Utc3JjL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzkwIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjcuOSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3RvcF9idWlsZGRpciA9IC4uCisKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK0lOU1RBTEwgPSBASU5TVEFMTEAKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1ERVBfRkFMU0UgPSBAQU1ERVBfRkFMU0VACitBTURFUF9UUlVFID0gQEFNREVQX1RSVUVACitBTVRBUiA9IEBBTVRBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitEQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitHTVNHRk1UID0gQEdNU0dGTVRACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0lOVExMSUJTID0gQElOVExMSUJTQAorTERGTEFHUyA9IEBMREZMQUdTQAorTEVYID0gQExFWEAKK0xFWExJQiA9IEBMRVhMSUJACitMRVhfT1VUUFVUX1JPT1QgPSBATEVYX09VVFBVVF9ST09UQAorTElCSUNPTlYgPSBATElCSUNPTlZACitMSUJJTlRMID0gQExJQklOVExACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMT0NBTEVESVIgPSBATE9DQUxFRElSQAorTFRMSUJJQ09OViA9IEBMVExJQklDT05WQAorTFRMSUJJTlRMID0gQExUTElCSU5UTEAKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKK01TR0ZNVCA9IEBNU0dGTVRACitNU0dNRVJHRSA9IEBNU0dNRVJHRUAKK05BVElWRV9MRF9GQUxTRSA9IEBOQVRJVkVfTERfRkFMU0VACitOQVRJVkVfTERfVFJVRSA9IEBOQVRJVkVfTERfVFJVRUAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQT1NVQiA9IEBQT1NVQkAKK1JBTkxJQiA9IEBSQU5MSUJACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitVU0VfTkxTID0gQFVTRV9OTFNACitWRVJTSU9OID0gQFZFUlNJT05ACitYR0VUVEVYVCA9IEBYR0VUVEVYVEAKK1lBQ0MgPSBAWUFDQ0AKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfUkFOTElCID0gQGFjX2N0X1JBTkxJQkAKK2FjX2N0X1NUUklQID0gQGFjX2N0X1NUUklQQAorYW1fX2Zhc3RkZXBDQ19GQUxTRSA9IEBhbV9fZmFzdGRlcENDX0ZBTFNFQAorYW1fX2Zhc3RkZXBDQ19UUlVFID0gQGFtX19mYXN0ZGVwQ0NfVFJVRUAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACitiYXNlX2NwdSA9IEBiYXNlX2NwdUAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK2Jpbl9TQ1JJUFRTID0gcmVhZGVsZiBubSBzaXplIHN0cmlwIGVsZmxpbnQKK0VYVFJBX0RJU1QgPSByZWFkZWxmIG5tIHNpemUgc3RyaXAgZWxmbGludC5pbiBGVUxMCitpbmNsdWRlX0hFQURFUlMgPSBkd2FyZi5oCitzdWJkaXIgPSBmYWtlLXNyYworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NDUklQVFMgPSAkKGJpbl9TQ1JJUFRTKQorCitESVNUX1NPVVJDRVMgPQorSEVBREVSUyA9ICQoaW5jbHVkZV9IRUFERVJTKQorCitESVNUX0NPTU1PTiA9ICQoaW5jbHVkZV9IRUFERVJTKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gTWFrZWZpbGUuYW0KK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogIE1ha2VmaWxlLmFtICAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYyAkKEFDTE9DQUxfTTQpCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWduaXRzICBmYWtlLXNyYy9NYWtlZmlsZQorTWFrZWZpbGU6ICAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpCitiaW5TQ1JJUFRfSU5TVEFMTCA9ICQoSU5TVEFMTF9TQ1JJUFQpCitpbnN0YWxsLWJpblNDUklQVFM6ICQoYmluX1NDUklQVFMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCisJQGxpc3Q9JyQoYmluX1NDUklQVFMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgaWYgdGVzdCAtZiAkJGQkJHA7IHRoZW4gXAorCSAgICBmPWBlY2hvICIkJHAiIHwgc2VkICdzfF4uKi98fDskKHRyYW5zZm9ybSknYDsgXAorCSAgICBlY2hvICIgJChiaW5TQ1JJUFRfSU5TVEFMTCkgJCRkJCRwICQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAorCSAgICAkKGJpblNDUklQVF9JTlNUQUxMKSAkJGQkJHAgJChERVNURElSKSQoYmluZGlyKS8kJGY7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1iaW5TQ1JJUFRTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoYmluX1NDUklQVFMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBmPWBlY2hvICIkJHAiIHwgc2VkICdzfF4uKi98fDskKHRyYW5zZm9ybSknYDsgXAorCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAorCSAgcm0gLWYgJChERVNURElSKSQoYmluZGlyKS8kJGY7IFwKKwlkb25lCisKK2luc3RhbGxjaGVjay1iaW5TQ1JJUFRTOiAkKGJpbl9TQ1JJUFRTKQorCWJhZD0wOyBwaWQ9JCQkJDsgbGlzdD0iJChiaW5fU0NSSVBUUykiOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGNhc2UgJyAkKEFNX0lOU1RBTExDSEVDS19TVERfT1BUSU9OU19FWEVNUFQpICcgaW4gXAorCSAgICoiICQkcCAiKiB8ICoiICQoc3JjZGlyKS8kJHAgIiopIGNvbnRpbnVlOzsgXAorCSAgZXNhYzsgXAorCSAgZj1gZWNobyAiJCRwIiB8IHNlZCAncyxeLiovLCw7JCh0cmFuc2Zvcm0pJ2A7IFwKKwkgIGZvciBvcHQgaW4gLS1oZWxwIC0tdmVyc2lvbjsgZG8gXAorCSAgICBpZiAkKERFU1RESVIpJChiaW5kaXIpLyQkZiAkJG9wdCA+IGMkJHtwaWR9Xy5vdXQgMj4gYyQke3BpZH1fLmVyciBcCisJICAgICAgICAgJiYgdGVzdCAtbiAiYGNhdCBjJCR7cGlkfV8ub3V0YCIgXAorCSAgICAgICAgICYmIHRlc3QgLXogImBjYXQgYyQke3BpZH1fLmVycmAiOyB0aGVuIDo7IFwKKwkgICAgZWxzZSBlY2hvICIkJGYgZG9lcyBub3Qgc3VwcG9ydCAkJG9wdCIgMT4mMjsgYmFkPTE7IGZpOyBcCisJICBkb25lOyBcCisJZG9uZTsgcm0gLWYgYyQke3BpZH1fLj8/PzsgZXhpdCAkJGJhZAordW5pbnN0YWxsLWluZm8tYW06CitpbmNsdWRlSEVBREVSU19JTlNUQUxMID0gJChJTlNUQUxMX0hFQURFUikKK2luc3RhbGwtaW5jbHVkZUhFQURFUlM6ICQoaW5jbHVkZV9IRUFERVJTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5jbHVkZWRpcikKKwlAbGlzdD0nJChpbmNsdWRlX0hFQURFUlMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZj0iYGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgIjsgXAorCSAgZWNobyAiICQoaW5jbHVkZUhFQURFUlNfSU5TVEFMTCkgJCRkJCRwICQoREVTVERJUikkKGluY2x1ZGVkaXIpLyQkZiI7IFwKKwkgICQoaW5jbHVkZUhFQURFUlNfSU5TVEFMTCkgJCRkJCRwICQoREVTVERJUikkKGluY2x1ZGVkaXIpLyQkZjsgXAorCWRvbmUKKwordW5pbnN0YWxsLWluY2x1ZGVIRUFERVJTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoaW5jbHVkZV9IRUFERVJTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj0iYGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgIjsgXAorCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKGluY2x1ZGVkaXIpLyQkZiI7IFwKKwkgIHJtIC1mICQoREVTVERJUikkKGluY2x1ZGVkaXIpLyQkZjsgXAorCWRvbmUKKworRVRBR1MgPSBldGFncworRVRBR1NGTEFHUyA9CisKK0NUQUdTID0gY3RhZ3MKK0NUQUdTRkxBR1MgPQorCit0YWdzOiBUQUdTCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR0YWdzICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorCit0b3BfZGlzdGRpciA9IC4uCitkaXN0ZGlyID0gJCh0b3BfZGlzdGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGNhc2UgJCRmaWxlIGluIFwKKwkgICAgJChzcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKwkgICAgJCh0b3Bfc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfCJgOzsgXAorCSAgZXNhYzsgXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZGlyPWBlY2hvICIkJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgaWYgdGVzdCAiJCRkaXIiICE9ICIkJGZpbGUiICYmIHRlc3QgIiQkZGlyIiAhPSAiLiI7IHRoZW4gXAorCSAgICBkaXI9Ii8kJGRpciI7IFwKKwkgICAgJChta2luc3RhbGxkaXJzKSAiJChkaXN0ZGlyKSQkZGlyIjsgXAorCSAgZWxzZSBcCisJICAgIGRpcj0nJzsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKFNDUklQVFMpICQoSEVBREVSUykKKworaW5zdGFsbGRpcnM6CisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLWluY2x1ZGVIRUFERVJTCisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5TQ1JJUFRTCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsY2hlY2stYW06IGluc3RhbGxjaGVjay1iaW5TQ1JJUFRTCisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5TQ1JJUFRTIHVuaW5zdGFsbC1pbmNsdWRlSEVBREVSUyBcCisJdW5pbnN0YWxsLWluZm8tYW0KKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY3RhZ3MgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gXAorCWluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1iaW5TQ1JJUFRTIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gXAorCWluc3RhbGwtaW5jbHVkZUhFQURFUlMgaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIFwKKwlpbnN0YWxsY2hlY2stYmluU0NSSVBUUyBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgXAorCXBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gXAorCXVuaW5zdGFsbC1iaW5TQ1JJUFRTIHVuaW5zdGFsbC1pbmNsdWRlSEVBREVSUyB1bmluc3RhbGwtaW5mby1hbQorCisKK2VsZmxpbnQ6ICQoc3JjZGlyKS9lbGZsaW50LmluCisJc2VkICJzL0BFVVZFUlNJT05ALyQoVkVSU0lPTikvIiAkPCA+ICRACisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9mYWtlLXNyYy9hZGRyMmxpbmUgYi9mYWtlLXNyYy9hZGRyMmxpbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlZDBkNQotLS0gL2Rldi9udWxsCisrKyBiL2Zha2Utc3JjL2FkZHIybGluZQpAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9iYXNoCitleGVjIGFkZHIybGluZSAiJEAiCmRpZmYgLS1naXQgYS9mYWtlLXNyYy9kd2FyZi5oIGIvZmFrZS1zcmMvZHdhcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRhYWYxCi0tLSAvZGV2L251bGwKKysrIGIvZmFrZS1zcmMvZHdhcmYuaApAQCAtMCwwICsxLDU1NyBAQAorLyogVGhpcyBmaWxlIGRlZmluZXMgc3RhbmRhcmQgRFdBUkYgdHlwZXMsIHN0cnVjdHVyZXMsIGFuZCBtYWNyb3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfRFdBUkZfSAorI2RlZmluZQlfRFdBUkZfSCAxCisKKy8qIERXQVJGIHRhZ3MuICAqLworZW51bQorICB7CisgICAgRFdfVEFHX2FycmF5X3R5cGUgPSAweDAxLAorICAgIERXX1RBR19jbGFzc190eXBlID0gMHgwMiwKKyAgICBEV19UQUdfZW50cnlfcG9pbnQgPSAweDAzLAorICAgIERXX1RBR19lbnVtZXJhdGlvbl90eXBlID0gMHgwNCwKKyAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlciA9IDB4MDUsCisgICAgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uID0gMHgwOCwKKyAgICBEV19UQUdfbGFiZWwgPSAweDBhLAorICAgIERXX1RBR19sZXhpY2FsX2Jsb2NrID0gMHgwYiwKKyAgICBEV19UQUdfbWVtYmVyID0gMHgwZCwKKyAgICBEV19UQUdfcG9pbnRlcl90eXBlID0gMHgwZiwKKyAgICBEV19UQUdfcmVmZXJlbmNlX3R5cGUgPSAweDEwLAorICAgIERXX1RBR19jb21waWxlX3VuaXQgPSAweDExLAorICAgIERXX1RBR19zdHJpbmdfdHlwZSA9IDB4MTIsCisgICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlID0gMHgxMywKKyAgICBEV19UQUdfc3Vicm91dGluZV90eXBlID0gMHgxNSwKKyAgICBEV19UQUdfdHlwZWRlZiA9IDB4MTYsCisgICAgRFdfVEFHX3VuaW9uX3R5cGUgPSAweDE3LAorICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzID0gMHgxOCwKKyAgICBEV19UQUdfdmFyaWFudCA9IDB4MTksCisgICAgRFdfVEFHX2NvbW1vbl9ibG9jayA9IDB4MWEsCisgICAgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24gPSAweDFiLAorICAgIERXX1RBR19pbmhlcml0YW5jZSA9IDB4MWMsCisgICAgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSA9IDB4MWQsCisgICAgRFdfVEFHX21vZHVsZSA9IDB4MWUsCisgICAgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSA9IDB4MWYsCisgICAgRFdfVEFHX3NldF90eXBlID0gMHgyMCwKKyAgICBEV19UQUdfc3VicmFuZ2VfdHlwZSA9IDB4MjEsCisgICAgRFdfVEFHX3dpdGhfc3RtdCA9IDB4MjIsCisgICAgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiA9IDB4MjMsCisgICAgRFdfVEFHX2Jhc2VfdHlwZSA9IDB4MjQsCisgICAgRFdfVEFHX2NhdGNoX2Jsb2NrID0gMHgyNSwKKyAgICBEV19UQUdfY29uc3RfdHlwZSA9IDB4MjYsCisgICAgRFdfVEFHX2NvbnN0YW50ID0gMHgyNywKKyAgICBEV19UQUdfZW51bWVyYXRvciA9IDB4MjgsCisgICAgRFdfVEFHX2ZpbGVfdHlwZSA9IDB4MjksCisgICAgRFdfVEFHX2ZyaWVuZCA9IDB4MmEsCisgICAgRFdfVEFHX25hbWVsaXN0ID0gMHgyYiwKKyAgICBEV19UQUdfbmFtZWxpc3RfaXRlbSA9IDB4MmMsCisgICAgRFdfVEFHX3BhY2tlZF90eXBlID0gMHgyZCwKKyAgICBEV19UQUdfc3VicHJvZ3JhbSA9IDB4MmUsCisgICAgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0gPSAweDJmLAorICAgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSA9IDB4MzAsCisgICAgRFdfVEFHX3Rocm93bl90eXBlID0gMHgzMSwKKyAgICBEV19UQUdfdHJ5X2Jsb2NrID0gMHgzMiwKKyAgICBEV19UQUdfdmFyaWFudF9wYXJ0ID0gMHgzMywKKyAgICBEV19UQUdfdmFyaWFibGUgPSAweDM0LAorICAgIERXX1RBR192b2xhdGlsZV90eXBlID0gMHgzNSwKKyAgICBEV19UQUdfbG9fdXNlciA9IDB4NDA4MCwKKyAgICBEV19UQUdfTUlQU19sb29wID0gMHg0MDgxLAorICAgIERXX1RBR19mb3JtYXRfbGFiZWwgPSAweDQxMDEsCisgICAgRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlID0gMHg0MTAyLAorICAgIERXX1RBR19jbGFzc190ZW1wbGF0ZSA9IDB4NDEwMywKKyAgICBEV19UQUdfaGlfdXNlciA9IDB4ZmZmZgorICB9OworCisKKy8qIENoaWxkcmVuIGRldGVybWluYXRpb24gZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0NISUxEUkVOX25vID0gMCwKKyAgICBEV19DSElMRFJFTl95ZXMgPSAxCisgIH07CisKKworLyogRFdBUkYgYXR0cmlidXRlcyBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfQVRfc2libGluZyA9IDB4MDEsCisgICAgRFdfQVRfbG9jYXRpb24gPSAweDAyLAorICAgIERXX0FUX25hbWUgPSAweDAzLAorICAgIERXX0FUX29yZGVyaW5nID0gMHgwOSwKKyAgICBEV19BVF9zdWJzY3JfZGF0YSA9IDB4MGEsCisgICAgRFdfQVRfYnl0ZV9zaXplID0gMHgwYiwKKyAgICBEV19BVF9iaXRfb2Zmc2V0ID0gMHgwYywKKyAgICBEV19BVF9iaXRfc2l6ZSA9IDB4MGQsCisgICAgRFdfQVRfZWxlbWVudF9saXN0ID0gMHgwZiwKKyAgICBEV19BVF9zdG10X2xpc3QgPSAweDEwLAorICAgIERXX0FUX2xvd19wYyA9IDB4MTEsCisgICAgRFdfQVRfaGlnaF9wYyA9IDB4MTIsCisgICAgRFdfQVRfbGFuZ3VhZ2UgPSAweDEzLAorICAgIERXX0FUX21lbWJlciA9IDB4MTQsCisgICAgRFdfQVRfZGlzY3IgPSAweDE1LAorICAgIERXX0FUX2Rpc2NyX3ZhbHVlID0gMHgxNiwKKyAgICBEV19BVF92aXNpYmlsaXR5ID0gMHgxNywKKyAgICBEV19BVF9pbXBvcnQgPSAweDE4LAorICAgIERXX0FUX3N0cmluZ19sZW5ndGggPSAweDE5LAorICAgIERXX0FUX2NvbW1vbl9yZWZlcmVuY2UgPSAweDFhLAorICAgIERXX0FUX2NvbXBfZGlyID0gMHgxYiwKKyAgICBEV19BVF9jb25zdF92YWx1ZSA9IDB4MWMsCisgICAgRFdfQVRfY29udGFpbmluZ190eXBlID0gMHgxZCwKKyAgICBEV19BVF9kZWZhdWx0X3ZhbHVlID0gMHgxZSwKKyAgICBEV19BVF9pbmxpbmUgPSAweDIwLAorICAgIERXX0FUX2lzX29wdGlvbmFsID0gMHgyMSwKKyAgICBEV19BVF9sb3dlcl9ib3VuZCA9IDB4MjIsCisgICAgRFdfQVRfcHJvZHVjZXIgPSAweDI1LAorICAgIERXX0FUX3Byb3RvdHlwZWQgPSAweDI3LAorICAgIERXX0FUX3JldHVybl9hZGRyID0gMHgyYSwKKyAgICBEV19BVF9zdGFydF9zY29wZSA9IDB4MmMsCisgICAgRFdfQVRfc3RyaWRlX3NpemUgPSAweDJlLAorICAgIERXX0FUX3VwcGVyX2JvdW5kID0gMHgyZiwKKyAgICBEV19BVF9hYnN0cmFjdF9vcmlnaW4gPSAweDMxLAorICAgIERXX0FUX2FjY2Vzc2liaWxpdHkgPSAweDMyLAorICAgIERXX0FUX2FkZHJlc3NfY2xhc3MgPSAweDMzLAorICAgIERXX0FUX2FydGlmaWNpYWwgPSAweDM0LAorICAgIERXX0FUX2Jhc2VfdHlwZXMgPSAweDM1LAorICAgIERXX0FUX2NhbGxpbmdfY29udmVudGlvbiA9IDB4MzYsCisgICAgRFdfQVRfY291bnQgPSAweDM3LAorICAgIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uID0gMHgzOCwKKyAgICBEV19BVF9kZWNsX2NvbHVtbiA9IDB4MzksCisgICAgRFdfQVRfZGVjbF9maWxlID0gMHgzYSwKKyAgICBEV19BVF9kZWNsX2xpbmUgPSAweDNiLAorICAgIERXX0FUX2RlY2xhcmF0aW9uID0gMHgzYywKKyAgICBEV19BVF9kaXNjcl9saXN0ID0gMHgzZCwKKyAgICBEV19BVF9lbmNvZGluZyA9IDB4M2UsCisgICAgRFdfQVRfZXh0ZXJuYWwgPSAweDNmLAorICAgIERXX0FUX2ZyYW1lX2Jhc2UgPSAweDQwLAorICAgIERXX0FUX2ZyaWVuZCA9IDB4NDEsCisgICAgRFdfQVRfaWRlbnRpZmllcl9jYXNlID0gMHg0MiwKKyAgICBEV19BVF9tYWNyb19pbmZvID0gMHg0MywKKyAgICBEV19BVF9uYW1lbGlzdF9pdGVtcyA9IDB4NDQsCisgICAgRFdfQVRfcHJpb3JpdHkgPSAweDQ1LAorICAgIERXX0FUX3NlZ21lbnQgPSAweDQ2LAorICAgIERXX0FUX3NwZWNpZmljYXRpb24gPSAweDQ3LAorICAgIERXX0FUX3N0YXRpY19saW5rID0gMHg0OCwKKyAgICBEV19BVF90eXBlID0gMHg0OSwKKyAgICBEV19BVF91c2VfbG9jYXRpb24gPSAweDRhLAorICAgIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciA9IDB4NGIsCisgICAgRFdfQVRfdmlydHVhbGl0eSA9IDB4NGMsCisgICAgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24gPSAweDRkLAorICAgIERXX0FUX2xvX3VzZXIgPSAweDIwMDAsCisgICAgRFdfQVRfTUlQU19mZGUgPSAweDIwMDEsCisgICAgRFdfQVRfTUlQU19sb29wX2JlZ2luID0gMHgyMDAyLAorICAgIERXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luID0gMHgyMDAzLAorICAgIERXX0FUX01JUFNfZXBpbG9nX2JlZ2luID0gMHgyMDA0LAorICAgIERXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yID0gMHgyMDA1LAorICAgIERXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGggPSAweDIwMDYsCisgICAgRFdfQVRfTUlQU19saW5rYWdlX25hbWUgPSAweDIwMDcsCisgICAgRFdfQVRfTUlQU19zdHJpZGUgPSAweDIwMDgsCisgICAgRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lID0gMHgyMDA5LAorICAgIERXX0FUX01JUFNfY2xvbmVfb3JpZ2luID0gMHgyMDBhLAorICAgIERXX0FUX01JUFNfaGFzX2lubGluZXMgPSAweDIwMGIsCisgICAgRFdfQVRfTUlQU19zdHJpZGVfYnl0ZSA9IDB4MjAwYywKKyAgICBEV19BVF9NSVBTX3N0cmlkZV9lbGVtID0gMHgyMDBkLAorICAgIERXX0FUX01JUFNfcHRyX2RvcGV0eXBlID0gMHgyMDBlLAorICAgIERXX0FUX01JUFNfYWxsb2NhdGFibGVfZG9wZXR5cGUgPSAweDIwMGYsCisgICAgRFdfQVRfTUlQU19hc3N1bWVkX3NoYXBlX2RvcGV0eXBlID0gMHgyMDEwLAorICAgIERXX0FUX01JUFNfYXNzdW1lZF9zaXplID0gMHgyMDExLAorICAgIERXX0FUX3NmX25hbWVzID0gMHgyMTAxLAorICAgIERXX0FUX3NyY19pbmZvID0gMHgyMTAyLAorICAgIERXX0FUX21hY19pbmZvID0gMHgyMTAzLAorICAgIERXX0FUX3NyY19jb29yZHMgPSAweDIxMDQsCisgICAgRFdfQVRfYm9keV9iZWdpbiA9IDB4MjEwNSwKKyAgICBEV19BVF9ib2R5X2VuZCA9IDB4MjEwNiwKKyAgICBEV19BVF9oaV91c2VyID0gMHgzZmZmCisgIH07CisKKworLyogRFdBUkYgZm9ybSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfRk9STV9hZGRyID0gMHgwMSwKKyAgICBEV19GT1JNX2Jsb2NrMiA9IDB4MDMsCisgICAgRFdfRk9STV9ibG9jazQgPSAweDA0LAorICAgIERXX0ZPUk1fZGF0YTIgPSAweDA1LAorICAgIERXX0ZPUk1fZGF0YTQgPSAweDA2LAorICAgIERXX0ZPUk1fZGF0YTggPSAweDA3LAorICAgIERXX0ZPUk1fc3RyaW5nID0gMHgwOCwKKyAgICBEV19GT1JNX2Jsb2NrID0gMHgwOSwKKyAgICBEV19GT1JNX2Jsb2NrMSA9IDB4MGEsCisgICAgRFdfRk9STV9kYXRhMSA9IDB4MGIsCisgICAgRFdfRk9STV9mbGFnID0gMHgwYywKKyAgICBEV19GT1JNX3NkYXRhID0gMHgwZCwKKyAgICBEV19GT1JNX3N0cnAgPSAweDBlLAorICAgIERXX0ZPUk1fdWRhdGEgPSAweDBmLAorICAgIERXX0ZPUk1fcmVmX2FkZHIgPSAweDEwLAorICAgIERXX0ZPUk1fcmVmMSA9IDB4MTEsCisgICAgRFdfRk9STV9yZWYyID0gMHgxMiwKKyAgICBEV19GT1JNX3JlZjQgPSAweDEzLAorICAgIERXX0ZPUk1fcmVmOCA9IDB4MTQsCisgICAgRFdfRk9STV9yZWZfdWRhdGEgPSAweDE1LAorICAgIERXX0ZPUk1faW5kaXJlY3QgPSAweDE2CisgIH07CisKKworLyogRFdBUkYgbG9jYXRpb24gb3BlcmF0aW9uIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19PUF9hZGRyID0gMHgwMywJCS8qIENvbnN0YW50IGFkZHJlc3MuICAqLworICAgIERXX09QX2RlcmVmID0gMHgwNiwKKyAgICBEV19PUF9jb25zdDF1ID0gMHgwOCwJLyogVW5zaWduZWQgMS1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdDFzID0gMHgwOSwJLyogU2lnbmVkIDEtYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfY29uc3QydSA9IDB4MGEsCS8qIFVuc2lnbmVkIDItYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfY29uc3QycyA9IDB4MGIsCS8qIFNpZ25lZCAyLWJ5dGUgY29uc3RhbnQuICAqLworICAgIERXX09QX2NvbnN0NHUgPSAweDBjLAkvKiBVbnNpZ25lZCA0LWJ5dGUgY29uc3RhbnQuICAqLworICAgIERXX09QX2NvbnN0NHMgPSAweDBkLAkvKiBTaWduZWQgNC1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdDh1ID0gMHgwZSwJLyogVW5zaWduZWQgOC1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdDhzID0gMHgwZiwJLyogU2lnbmVkIDgtYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfY29uc3R1ID0gMHgxMCwJLyogVW5zaWduZWQgTEVCMTI4IGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdHMgPSAweDExLAkvKiBTaWduZWQgTEVCMTI4IGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9kdXAgPSAweDEyLAorICAgIERXX09QX2Ryb3AgPSAweDEzLAorICAgIERXX09QX292ZXIgPSAweDE0LAorICAgIERXX09QX3BpY2sgPSAweDE1LAkJLyogMS1ieXRlIHN0YWNrIGluZGV4LiAgKi8KKyAgICBEV19PUF9zd2FwID0gMHgxNiwKKyAgICBEV19PUF9yb3QgPSAweDE3LAorICAgIERXX09QX3hkZXJlZiA9IDB4MTgsCisgICAgRFdfT1BfYWJzID0gMHgxOSwKKyAgICBEV19PUF9hbmQgPSAweDFhLAorICAgIERXX09QX2RpdiA9IDB4MWIsCisgICAgRFdfT1BfbWludXMgPSAweDFjLAorICAgIERXX09QX21vZCA9IDB4MWQsCisgICAgRFdfT1BfbXVsID0gMHgxZSwKKyAgICBEV19PUF9uZWcgPSAweDFmLAorICAgIERXX09QX25vdCA9IDB4MjAsCisgICAgRFdfT1Bfb3IgPSAweDIxLAorICAgIERXX09QX3BsdXMgPSAweDIyLAorICAgIERXX09QX3BsdXNfdWNvbnN0ID0gMHgyMywJLyogVW5zaWduZWQgTEVCMTI4IGFkZGVuZC4gICovCisgICAgRFdfT1Bfc2hsID0gMHgyNCwKKyAgICBEV19PUF9zaHIgPSAweDI1LAorICAgIERXX09QX3NocmEgPSAweDI2LAorICAgIERXX09QX3hvciA9IDB4MjcsCisgICAgRFdfT1BfYnJhID0gMHgyOCwJCS8qIFNpZ25lZCAyLWJ5dGUgY29uc3RhbnQuICAqLworICAgIERXX09QX2VxID0gMHgyOSwKKyAgICBEV19PUF9nZSA9IDB4MmEsCisgICAgRFdfT1BfZ3QgPSAweDJiLAorICAgIERXX09QX2xlID0gMHgyYywKKyAgICBEV19PUF9sdCA9IDB4MmQsCisgICAgRFdfT1BfbmUgPSAweDJlLAorICAgIERXX09QX3NraXAgPSAweDJmLAkJLyogU2lnbmVkIDItYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfbGl0MCA9IDB4MzAsCQkvKiBMaXRlcmFsIDAuICAqLworICAgIERXX09QX2xpdDEgPSAweDMxLAkJLyogTGl0ZXJhbCAxLiAgKi8KKyAgICBEV19PUF9saXQyID0gMHgzMiwJCS8qIExpdGVyYWwgMi4gICovCisgICAgRFdfT1BfbGl0MyA9IDB4MzMsCQkvKiBMaXRlcmFsIDMuICAqLworICAgIERXX09QX2xpdDQgPSAweDM0LAkJLyogTGl0ZXJhbCA0LiAgKi8KKyAgICBEV19PUF9saXQ1ID0gMHgzNSwJCS8qIExpdGVyYWwgNS4gICovCisgICAgRFdfT1BfbGl0NiA9IDB4MzYsCQkvKiBMaXRlcmFsIDYuICAqLworICAgIERXX09QX2xpdDcgPSAweDM3LAkJLyogTGl0ZXJhbCA3LiAgKi8KKyAgICBEV19PUF9saXQ4ID0gMHgzOCwJCS8qIExpdGVyYWwgOC4gICovCisgICAgRFdfT1BfbGl0OSA9IDB4MzksCQkvKiBMaXRlcmFsIDkuICAqLworICAgIERXX09QX2xpdDEwID0gMHgzYSwJCS8qIExpdGVyYWwgMTAuICAqLworICAgIERXX09QX2xpdDExID0gMHgzYiwJCS8qIExpdGVyYWwgMTEuICAqLworICAgIERXX09QX2xpdDEyID0gMHgzYywJCS8qIExpdGVyYWwgMTIuICAqLworICAgIERXX09QX2xpdDEzID0gMHgzZCwJCS8qIExpdGVyYWwgMTMuICAqLworICAgIERXX09QX2xpdDE0ID0gMHgzZSwJCS8qIExpdGVyYWwgMTQuICAqLworICAgIERXX09QX2xpdDE1ID0gMHgzZiwJCS8qIExpdGVyYWwgMTUuICAqLworICAgIERXX09QX2xpdDE2ID0gMHg0MCwJCS8qIExpdGVyYWwgMTYuICAqLworICAgIERXX09QX2xpdDE3ID0gMHg0MSwJCS8qIExpdGVyYWwgMTcuICAqLworICAgIERXX09QX2xpdDE4ID0gMHg0MiwJCS8qIExpdGVyYWwgMTguICAqLworICAgIERXX09QX2xpdDE5ID0gMHg0MywJCS8qIExpdGVyYWwgMTkuICAqLworICAgIERXX09QX2xpdDIwID0gMHg0NCwJCS8qIExpdGVyYWwgMjAuICAqLworICAgIERXX09QX2xpdDIxID0gMHg0NSwJCS8qIExpdGVyYWwgMjEuICAqLworICAgIERXX09QX2xpdDIyID0gMHg0NiwJCS8qIExpdGVyYWwgMjIuICAqLworICAgIERXX09QX2xpdDIzID0gMHg0NywJCS8qIExpdGVyYWwgMjMuICAqLworICAgIERXX09QX2xpdDI0ID0gMHg0OCwJCS8qIExpdGVyYWwgMjQuICAqLworICAgIERXX09QX2xpdDI1ID0gMHg0OSwJCS8qIExpdGVyYWwgMjUuICAqLworICAgIERXX09QX2xpdDI2ID0gMHg0YSwJCS8qIExpdGVyYWwgMjYuICAqLworICAgIERXX09QX2xpdDI3ID0gMHg0YiwJCS8qIExpdGVyYWwgMjcuICAqLworICAgIERXX09QX2xpdDI4ID0gMHg0YywJCS8qIExpdGVyYWwgMjguICAqLworICAgIERXX09QX2xpdDI5ID0gMHg0ZCwJCS8qIExpdGVyYWwgMjkuICAqLworICAgIERXX09QX2xpdDMwID0gMHg0ZSwJCS8qIExpdGVyYWwgMzAuICAqLworICAgIERXX09QX2xpdDMxID0gMHg0ZiwJCS8qIExpdGVyYWwgMzEuICAqLworICAgIERXX09QX3JlZzAgPSAweDUwLAkJLyogUmVnaXN0ZXIgMC4gICovCisgICAgRFdfT1BfcmVnMSA9IDB4NTEsCQkvKiBSZWdpc3RlciAxLiAgKi8KKyAgICBEV19PUF9yZWcyID0gMHg1MiwJCS8qIFJlZ2lzdGVyIDIuICAqLworICAgIERXX09QX3JlZzMgPSAweDUzLAkJLyogUmVnaXN0ZXIgMy4gICovCisgICAgRFdfT1BfcmVnNCA9IDB4NTQsCQkvKiBSZWdpc3RlciA0LiAgKi8KKyAgICBEV19PUF9yZWc1ID0gMHg1NSwJCS8qIFJlZ2lzdGVyIDUuICAqLworICAgIERXX09QX3JlZzYgPSAweDU2LAkJLyogUmVnaXN0ZXIgNi4gICovCisgICAgRFdfT1BfcmVnNyA9IDB4NTcsCQkvKiBSZWdpc3RlciA3LiAgKi8KKyAgICBEV19PUF9yZWc4ID0gMHg1OCwJCS8qIFJlZ2lzdGVyIDguICAqLworICAgIERXX09QX3JlZzkgPSAweDU5LAkJLyogUmVnaXN0ZXIgOS4gICovCisgICAgRFdfT1BfcmVnMTAgPSAweDVhLAkJLyogUmVnaXN0ZXIgMTAuICAqLworICAgIERXX09QX3JlZzExID0gMHg1YiwJCS8qIFJlZ2lzdGVyIDExLiAgKi8KKyAgICBEV19PUF9yZWcxMiA9IDB4NWMsCQkvKiBSZWdpc3RlciAxMi4gICovCisgICAgRFdfT1BfcmVnMTMgPSAweDVkLAkJLyogUmVnaXN0ZXIgMTMuICAqLworICAgIERXX09QX3JlZzE0ID0gMHg1ZSwJCS8qIFJlZ2lzdGVyIDE0LiAgKi8KKyAgICBEV19PUF9yZWcxNSA9IDB4NWYsCQkvKiBSZWdpc3RlciAxNS4gICovCisgICAgRFdfT1BfcmVnMTYgPSAweDYwLAkJLyogUmVnaXN0ZXIgMTYuICAqLworICAgIERXX09QX3JlZzE3ID0gMHg2MSwJCS8qIFJlZ2lzdGVyIDE3LiAgKi8KKyAgICBEV19PUF9yZWcxOCA9IDB4NjIsCQkvKiBSZWdpc3RlciAxOC4gICovCisgICAgRFdfT1BfcmVnMTkgPSAweDYzLAkJLyogUmVnaXN0ZXIgMTkuICAqLworICAgIERXX09QX3JlZzIwID0gMHg2NCwJCS8qIFJlZ2lzdGVyIDIwLiAgKi8KKyAgICBEV19PUF9yZWcyMSA9IDB4NjUsCQkvKiBSZWdpc3RlciAyMS4gICovCisgICAgRFdfT1BfcmVnMjIgPSAweDY2LAkJLyogUmVnaXN0ZXIgMjIuICAqLworICAgIERXX09QX3JlZzIzID0gMHg2NywJCS8qIFJlZ2lzdGVyIDI0LiAgKi8KKyAgICBEV19PUF9yZWcyNCA9IDB4NjgsCQkvKiBSZWdpc3RlciAyNC4gICovCisgICAgRFdfT1BfcmVnMjUgPSAweDY5LAkJLyogUmVnaXN0ZXIgMjUuICAqLworICAgIERXX09QX3JlZzI2ID0gMHg2YSwJCS8qIFJlZ2lzdGVyIDI2LiAgKi8KKyAgICBEV19PUF9yZWcyNyA9IDB4NmIsCQkvKiBSZWdpc3RlciAyNy4gICovCisgICAgRFdfT1BfcmVnMjggPSAweDZjLAkJLyogUmVnaXN0ZXIgMjguICAqLworICAgIERXX09QX3JlZzI5ID0gMHg2ZCwJCS8qIFJlZ2lzdGVyIDI5LiAgKi8KKyAgICBEV19PUF9yZWczMCA9IDB4NmUsCQkvKiBSZWdpc3RlciAzMC4gICovCisgICAgRFdfT1BfcmVnMzEgPSAweDZmLAkJLyogUmVnaXN0ZXIgMzEuICAqLworICAgIERXX09QX2JyZWcwID0gMHg3MCwJCS8qIEJhc2UgcmVnaXN0ZXIgMC4gICovCisgICAgRFdfT1BfYnJlZzEgPSAweDcxLAkJLyogQmFzZSByZWdpc3RlciAxLiAgKi8KKyAgICBEV19PUF9icmVnMiA9IDB4NzIsCQkvKiBCYXNlIHJlZ2lzdGVyIDIuICAqLworICAgIERXX09QX2JyZWczID0gMHg3MywJCS8qIEJhc2UgcmVnaXN0ZXIgMy4gICovCisgICAgRFdfT1BfYnJlZzQgPSAweDc0LAkJLyogQmFzZSByZWdpc3RlciA0LiAgKi8KKyAgICBEV19PUF9icmVnNSA9IDB4NzUsCQkvKiBCYXNlIHJlZ2lzdGVyIDUuICAqLworICAgIERXX09QX2JyZWc2ID0gMHg3NiwJCS8qIEJhc2UgcmVnaXN0ZXIgNi4gICovCisgICAgRFdfT1BfYnJlZzcgPSAweDc3LAkJLyogQmFzZSByZWdpc3RlciA3LiAgKi8KKyAgICBEV19PUF9icmVnOCA9IDB4NzgsCQkvKiBCYXNlIHJlZ2lzdGVyIDguICAqLworICAgIERXX09QX2JyZWc5ID0gMHg3OSwJCS8qIEJhc2UgcmVnaXN0ZXIgOS4gICovCisgICAgRFdfT1BfYnJlZzEwID0gMHg3YSwJLyogQmFzZSByZWdpc3RlciAxMC4gICovCisgICAgRFdfT1BfYnJlZzExID0gMHg3YiwJLyogQmFzZSByZWdpc3RlciAxMS4gICovCisgICAgRFdfT1BfYnJlZzEyID0gMHg3YywJLyogQmFzZSByZWdpc3RlciAxMi4gICovCisgICAgRFdfT1BfYnJlZzEzID0gMHg3ZCwJLyogQmFzZSByZWdpc3RlciAxMy4gICovCisgICAgRFdfT1BfYnJlZzE0ID0gMHg3ZSwJLyogQmFzZSByZWdpc3RlciAxNC4gICovCisgICAgRFdfT1BfYnJlZzE1ID0gMHg3ZiwJLyogQmFzZSByZWdpc3RlciAxNS4gICovCisgICAgRFdfT1BfYnJlZzE2ID0gMHg4MCwJLyogQmFzZSByZWdpc3RlciAxNi4gICovCisgICAgRFdfT1BfYnJlZzE3ID0gMHg4MSwJLyogQmFzZSByZWdpc3RlciAxNy4gICovCisgICAgRFdfT1BfYnJlZzE4ID0gMHg4MiwJLyogQmFzZSByZWdpc3RlciAxOC4gICovCisgICAgRFdfT1BfYnJlZzE5ID0gMHg4MywJLyogQmFzZSByZWdpc3RlciAxOS4gICovCisgICAgRFdfT1BfYnJlZzIwID0gMHg4NCwJLyogQmFzZSByZWdpc3RlciAyMC4gICovCisgICAgRFdfT1BfYnJlZzIxID0gMHg4NSwJLyogQmFzZSByZWdpc3RlciAyMS4gICovCisgICAgRFdfT1BfYnJlZzIyID0gMHg4NiwJLyogQmFzZSByZWdpc3RlciAyMi4gICovCisgICAgRFdfT1BfYnJlZzIzID0gMHg4NywJLyogQmFzZSByZWdpc3RlciAyMy4gICovCisgICAgRFdfT1BfYnJlZzI0ID0gMHg4OCwJLyogQmFzZSByZWdpc3RlciAyNC4gICovCisgICAgRFdfT1BfYnJlZzI1ID0gMHg4OSwJLyogQmFzZSByZWdpc3RlciAyNS4gICovCisgICAgRFdfT1BfYnJlZzI2ID0gMHg4YSwJLyogQmFzZSByZWdpc3RlciAyNi4gICovCisgICAgRFdfT1BfYnJlZzI3ID0gMHg4YiwJLyogQmFzZSByZWdpc3RlciAyNy4gICovCisgICAgRFdfT1BfYnJlZzI4ID0gMHg4YywJLyogQmFzZSByZWdpc3RlciAyOC4gICovCisgICAgRFdfT1BfYnJlZzI5ID0gMHg4ZCwJLyogQmFzZSByZWdpc3RlciAyOS4gICovCisgICAgRFdfT1BfYnJlZzMwID0gMHg4ZSwJLyogQmFzZSByZWdpc3RlciAzMC4gICovCisgICAgRFdfT1BfYnJlZzMxID0gMHg4ZiwJLyogQmFzZSByZWdpc3RlciAzMS4gICovCisgICAgRFdfT1BfcmVneCA9IDB4OTAsCQkvKiBVbnNpZ25lZCBMRUIxMjggcmVnaXN0ZXIuICAqLworICAgIERXX09QX2ZicmVnID0gMHg5MSwJCS8qIFNpZ25lZCBMRUIxMjggcmVnaXN0ZXIuICAqLworICAgIERXX09QX2JyZWd4ID0gMHg5MiwJCS8qIFVMRUIxMjggcmVnaXN0ZXIgZm9sbG93ZWQgYnkgU0xFQjEyOCBvZmYuICovCisgICAgRFdfT1BfcGllY2UgPSAweDkzLAkJLyogVUxFQjEyOCBzaXplIG9mIHBpZWNlIGFkZHJlc3NlZC4gKi8KKyAgICBEV19PUF9kZXJlZl9zaXplID0gMHg5NCwJLyogMS1ieXRlIHNpemUgb2YgZGF0YSByZXRyaWV2ZWQuICAqLworICAgIERXX09QX3hkZXJlZl9zaXplID0gMHg5NSwJLyogMS1ieXRlIHNpemUgb2YgZGF0YSByZXRyaWV2ZWQuICAqLworICAgIERXX09QX25vcCA9IDB4OTYsCisgICAgRFdfT1BfcHVzaF9vYmplY3RfYWRkcmVzcyA9IDB4OTcsCisgICAgRFdfT1BfY2FsbDIgPSAweDk4LAorICAgIERXX09QX2NhbGw0ID0gMHg5OSwKKyAgICBEV19PUF9jYWxsX3JlZiA9IDB4OWEsCisKKyAgICBEV19PUF9sb191c2VyID0gMHhlMCwJLyogSW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydC4gICovCisgICAgRFdfT1BfaGlfdXNlciA9IDB4ZmYJLyogSW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQuICAqLworICB9OworCisKKy8qIERXQVJGIGJhc2UgdHlwZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfQVRFX3ZvaWQgPSAweDAsCisgICAgRFdfQVRFX2FkZHJlc3MgPSAweDEsCisgICAgRFdfQVRFX2Jvb2xlYW4gPSAweDIsCisgICAgRFdfQVRFX2NvbXBsZXhfZmxvYXQgPSAweDMsCisgICAgRFdfQVRFX2Zsb2F0ID0gMHg0LAorICAgIERXX0FURV9zaWduZWQgPSAweDUsCisgICAgRFdfQVRFX3NpZ25lZF9jaGFyID0gMHg2LAorICAgIERXX0FURV91bnNpZ25lZCA9IDB4NywKKyAgICBEV19BVEVfdW5zaWduZWRfY2hhciA9IDB4OCwKKworICAgIERXX0FURV9sb191c2VyID0gMHg4MCwKKyAgICBEV19BVEVfaGlfdXNlciA9IDB4ZmYKKyAgfTsKKworCisvKiBEV0FSRiBhY2Nlc3NpYmlsaXR5IGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19BQ0NFU1NfcHVibGljID0gMSwKKyAgICBEV19BQ0NFU1NfcHJvdGVjdGVkID0gMiwKKyAgICBEV19BQ0NFU1NfcHJpdmF0ZSA9IDMKKyAgfTsKKworCisvKiBEV0FSRiB2aXNpYmlsaXR5IGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19WSVNfbG9jYWwgPSAxLAorICAgIERXX1ZJU19leHBvcnRlZCA9IDIsCisgICAgRFdfVklTX3F1YWxpZmllZCA9IDMKKyAgfTsKKworCisvKiBEV0FSRiB2aXJ0dWFsaXR5IGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19WSVJUVUFMSVRZX25vbmUgPSAwLAorICAgIERXX1ZJUlRVQUxJVFlfdmlydHVhbCA9IDEsCisgICAgRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWwgPSAyCisgIH07CisKKworLyogRFdBUkYgbGFuZ3VhZ2UgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0xBTkdfQzg5ID0gMHgwMDAxLAorICAgIERXX0xBTkdfQyA9IDB4MDAwMiwKKyAgICBEV19MQU5HX0FkYTgzID0gMHgwMDAzLAorICAgIERXX0xBTkdfQ19wbHVzX3BsdXMJPSAweDAwMDQsCisgICAgRFdfTEFOR19Db2JvbDc0ID0gMHgwMDA1LAorICAgIERXX0xBTkdfQ29ib2w4NSA9IDB4MDAwNiwKKyAgICBEV19MQU5HX0ZvcnRyYW43NyA9IDB4MDAwNywKKyAgICBEV19MQU5HX0ZvcnRyYW45MCA9IDB4MDAwOCwKKyAgICBEV19MQU5HX1Bhc2NhbDgzID0gMHgwMDA5LAorICAgIERXX0xBTkdfTW9kdWxhMiA9IDB4MDAwYSwKKyAgICBEV19MQU5HX0phdmEgPSAweDAwMGIsCisgICAgRFdfTEFOR19DOTkgPSAweDAwMGMsCisgICAgRFdfTEFOR19BZGE5NSA9IDB4MDAwZCwKKyAgICBEV19MQU5HX0ZvcnRyYW45NSA9IDB4MDAwZSwKKyAgICBEV19MQU5HX1BMMSA9IDB4MDAwZiwKKyAgICBEV19MQU5HX2xvX3VzZXIgPSAweDgwMDAsCisgICAgRFdfTEFOR19NaXBzX0Fzc2VtYmxlciA9IDB4ODAwMSwKKyAgICBEV19MQU5HX2hpX3VzZXIgPSAweGZmZmYKKyAgfTsKKworCisvKiBEV0FSRiBpZGVudGlmaWVyIGNhc2UgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0lEX2Nhc2Vfc2Vuc2l0aXZlID0gMCwKKyAgICBEV19JRF91cF9jYXNlID0gMSwKKyAgICBEV19JRF9kb3duX2Nhc2UgPSAyLAorICAgIERXX0lEX2Nhc2VfaW5zZW5zaXRpdmUgPSAzCisgIH07CisKKworLyogRFdBUkYgY2FsbGluZyBjb252ZW50aW9ucyBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfQ0Nfbm9ybWFsID0gMHgxLAorICAgIERXX0NDX3Byb2dyYW0gPSAweDIsCisgICAgRFdfQ0Nfbm9jYWxsID0gMHgzLAorICAgIERXX0NDX2xvX3VzZXIgPSAweDQwLAorICAgIERXX0NDX2hpX3VzZXIgPSAweGZmCisgIH07CisKKworLyogRFdBUkYgaW5saW5lIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19JTkxfbm90X2lubGluZWQgPSAwLAorICAgIERXX0lOTF9pbmxpbmVkID0gMSwKKyAgICBEV19JTkxfZGVjbGFyZWRfbm90X2lubGluZWQgPSAyLAorICAgIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkID0gMworICB9OworCisKKy8qIERXQVJGIG9yZGVyaW5nIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19PUkRfcm93X21ham9yID0gMCwKKyAgICBEV19PUkRfY29sX21ham9yID0gMQorICB9OworCisKKy8qIERXQVJGIGRpc2NyaW1pbmFudCBkZXNjcmlwdG9yIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19EU0NfbGFiZWwgPSAwLAorICAgIERXX0RTQ19yYW5nZSA9IDEKKyAgfTsKKworCisvKiBEV0FSRiBzdGFuZGFyZCBvcGNvZGUgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0xOU19jb3B5ID0gMSwKKyAgICBEV19MTlNfYWR2YW5jZV9wYyA9IDIsCisgICAgRFdfTE5TX2FkdmFuY2VfbGluZSA9IDMsCisgICAgRFdfTE5TX3NldF9maWxlID0gNCwKKyAgICBEV19MTlNfc2V0X2NvbHVtbiA9IDUsCisgICAgRFdfTE5TX25lZ2F0ZV9zdG10ID0gNiwKKyAgICBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrID0gNywKKyAgICBEV19MTlNfY29uc3RfYWRkX3BjID0gOCwKKyAgICBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYyA9IDksCisgICAgRFdfTE5TX3NldF9wcm9sb2d1ZV9lbmQgPSAxMCwKKyAgICBEV19MTlNfc2V0X2VwaWxvZ19iZWdpbiA9IDExCisgIH07CisKKworLyogRFdBUkYgZXh0ZW5kZWQgb3BjaWRlIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19MTkVfZW5kX3NlcXVlbmNlID0gMSwKKyAgICBEV19MTkVfc2V0X2FkZHJlc3MgPSAyLAorICAgIERXX0xORV9kZWZpbmVfZmlsZSA9IDMKKyAgfTsKKworCisvKiBEV0FSRiBtYWNpbmZvIHR5cGUgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX01BQ0lORk9fZGVmaW5lID0gMSwKKyAgICBEV19NQUNJTkZPX3VuZGVmID0gMiwKKyAgICBEV19NQUNJTkZPX3N0YXJ0X2ZpbGUgPSAzLAorICAgIERXX01BQ0lORk9fZW5kX2ZpbGUgPSA0LAorICAgIERXX01BQ0lORk9fdmVuZG9yX2V4dCA9IDI1NQorICB9OworCisKKy8qIERXQVJGIGNhbGwgZnJhbWUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0NGQV9hZHZhbmNlX2xvYyA9IDB4NDAsCisgICAgRFdfQ0ZBX29mZnNldCA9IDB4ODAsCisgICAgRFdfQ0ZBX3Jlc3RvcmUgPSAweGMwLAorICAgIERXX0NGQV9leHRlbmRlZCA9IDAsCisKKyAgICBEV19DRkFfbm9wID0gMHgwMCwKKyAgICBEV19DRkFfc2V0X2xvYyA9IDB4MDEsCisgICAgRFdfQ0ZBX2FkdmFuY2VfbG9jMSA9IDB4MDIsCisgICAgRFdfQ0ZBX2FkdmFuY2VfbG9jMiA9IDB4MDMsCisgICAgRFdfQ0ZBX2FkdmFuY2VfbG9jNCA9IDB4MDQsCisgICAgRFdfQ0ZBX29mZnNldF9leHRlbmRlZCA9IDB4MDUsCisgICAgRFdfQ0ZBX3Jlc3RvcmVfZXh0ZW5kZWQgPSAweDA2LAorICAgIERXX0NGQV91bmRlZmluZWQgPSAweDA3LAorICAgIERXX0NGQV9zYW1lX3ZhbHVlID0gMHgwOCwKKyAgICBEV19DRkFfcmVnaXN0ZXIgPSAweDA5LAorICAgIERXX0NGQV9yZW1lbWJlcl9zdGF0ZSA9IDB4MGEsCisgICAgRFdfQ0ZBX3Jlc3RvcmVfc3RhdGUgPSAweDBiLAorICAgIERXX0NGQV9kZWZfY2ZhID0gMHgwYywKKyAgICBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciA9IDB4MGQsCisgICAgRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ID0gMHgwZSwKKyAgICBEV19DRkFfZGVmX2NmYV9leHByZXNzaW9uID0gMHgwZiwKKyAgICBEV19DRkFfZXhwcmVzc2lvbiA9IDB4MTAsCisgICAgRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZiA9IDB4MTEsCisgICAgRFdfQ0ZBX2RlZl9jZmFfc2YgPSAweDEyLAorICAgIERXX0NGQV9kZWZfY2ZhX29mZnNldF9zZiA9IDB4MTMsCisgICAgRFdfQ0ZBX2xvd191c2VyID0gMHgxYywKKyAgICBEV19DRkFfTUlQU19hZHZhbmNlX2xvYzggPSAweDFkLAorICAgIERXX0NGQV9HTlVfd2luZG93X3NhdmUgPSAweDJkLAorICAgIERXX0NGQV9HTlVfYXJnc19zaXplID0gMHgyZSwKKyAgICBEV19DRkFfaGlnaF91c2VyID0gMHgzZgorICB9OworCisKKy8qIERXQVJGIFhYWC4gICovCisjZGVmaW5lIERXX0FERFJfbm9uZQkwCisKKyNlbmRpZgkvKiBkd2FyZi5oICovCmRpZmYgLS1naXQgYS9mYWtlLXNyYy9lbGZsaW50LmluIGIvZmFrZS1zcmMvZWxmbGludC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjdhZjkzCi0tLSAvZGV2L251bGwKKysrIGIvZmFrZS1zcmMvZWxmbGludC5pbgpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9iYXNoCitwcmludGYgJ2V1LWVsZmxpbnQgaXMgb25seSBhdmFpbGFibGUgaW4gdGhlIGZ1bGwtZmVhdHVyZWQgZWxmdXRpbHMgcGFja2FnZVxuJyAyPiYxCitwcmludGYgJ1NlZSAvdXNyL3NoYXJlL2RvYy9lbGZ1dGlscy1ARVVWRVJTSU9OQC9GVUxMJworZXhpdCAxCmRpZmYgLS1naXQgYS9mYWtlLXNyYy9ubSBiL2Zha2Utc3JjL25tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYTA2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9mYWtlLXNyYy9ubQpAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9iYXNoCitleGVjIG5tICIkQCIKZGlmZiAtLWdpdCBhL2Zha2Utc3JjL3JlYWRlbGYgYi9mYWtlLXNyYy9yZWFkZWxmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWY2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9mYWtlLXNyYy9yZWFkZWxmCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL2Jhc2gKK2V4ZWMgcmVhZGVsZiAiJEAiCmRpZmYgLS1naXQgYS9mYWtlLXNyYy9zaXplIGIvZmFrZS1zcmMvc2l6ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjZiMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmFrZS1zcmMvc2l6ZQpAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9iYXNoCitleGVjIHNpemUgIiRAIgpkaWZmIC0tZ2l0IGEvZmFrZS1zcmMvc3RyaXAgYi9mYWtlLXNyYy9zdHJpcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDFlNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmFrZS1zcmMvc3RyaXAKQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL2Jhc2gKK1sgIiQxIiAhPSAiLWYiIC1hICIkMiIgIT0gIi1mIiBdICYmIGV4ZWMgc3RyaXAgIiRAIgoraWYgWyAiJDEiID0gIi1mIiBdOyB0aGVuCisgIG9wdHM9CisgIGRlYnVnPSIkMiIKKyAgZmlsZT0iJDMiCisgIFsgJCMgLW5lIDMgXSAmJiBleGl0IDEKKyAgZmlsZSAiJGZpbGUiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSByZWxvY2F0YWJsZSAmJiBvcHRzPS1nCitlbGlmIFsgIiQxIiA9ICItZyIgXTsgdGhlbgorICBvcHRzPS1nCisgIGRlYnVnPSIkMyIKKyAgZmlsZT0iJDQiCisgIFsgJCMgLW5lIDQgXSAmJiBleGl0IDEKK2Vsc2UKKyAgZXhpdCAxCitmaQorc2V0IC1lCitvYmpjb3B5IC0tb25seS1rZWVwLWRlYnVnICIkZmlsZSIgIiRkZWJ1ZyIKK3N0cmlwICRvcHRzICIkZmlsZSIKK29iamNvcHkgLS1hZGQtZ251LWRlYnVnbGluaz0iJGRlYnVnIiAiJGZpbGUiCmRpZmYgLS1naXQgYS9saWIvLmN2c2lnbm9yZSBiL2xpYi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODQ1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbGliL0NoYW5nZUxvZyBiL2xpYi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkYzIxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9DaGFuZ2VMb2cKQEAgLTAsMCArMSwzOSBAQAorMjAwNS0wNS0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogY3JjMzJfZmlsZS5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtIChsaWJldV9hX1NPVVJDRVMpOiBBZGQgaXQuCisJKiBzeXN0ZW0uaDogRGVjbGFyZSBjcmMzMl9maWxlLgorCisyMDA1LTA0LTMwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IFVzZSAtZmZ1bmN0aW9uLXNlY3Rpb25zIGZvciB4bWFsbG9jLmMuCisKKzIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBkeW5hbWljc2l6ZWhhc2guYyAobG9va3VwKTogTWFyayB2YWwgcGFyYW1ldGVyIGFzIHBvc3NpYmx5IHVudXNlZC4KKworMjAwNS0wMi0wNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGZpeGVkc2l6ZWhhc2guaDogTWFyayB1bnVzZWQgcGFyYW1ldGVycy4gIENvcnJlY3QgQ0xBU1MgYW5kCisJY29uc3Qgb3JkZXIgZm9yIGZzaGFzaF9maW5kLgorCisJKiBNYWtlZmlsZS5hbTogQ2xlYW51cCBBTV9DRkxBR1MgaGFuZGxpbmcuICBBZGQgLVd1bnVzZWQgLVdleHRyYS4KKworMjAwNS0wMi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIFtNVURGTEFQXSAoQU1fQ0ZMQUdTKTogQWRkIC1mcGljIGFuZCAtZm11ZGZsYXAuCisKKzIwMDQtMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBidWlsZGluZyB3aXRoIG11ZGZsYXAuCisKKzIwMDMtMDktMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1mcGljLgorCisJKiBNYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBBZGQgbGlzdC5oLgorCSogbGlzdC5oOiBOZXcgZmlsZS4KKworMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlLmFtIGIvbGliL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2I1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBjcmVhdGUgTWFrZWZpbGUuaW4KKyMjCisjIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisjIworIyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisjIworIyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMjCisjIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMjIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjIworREVGUyA9IC1EX0dOVV9TT1VSQ0UgLURIQVZFX0NPTkZJR19ICitpZiBNVURGTEFQCitBTV9DRkxBR1MgPSAtZm11ZGZsYXAKK2Vsc2UKK0FNX0NGTEFHUyA9CitlbmRpZgorQU1fQ0ZMQUdTICs9IC1mcGljIC1XYWxsIC1Xc2hhZG93IC1XZXJyb3IgLVd1bnVzZWQgLVdleHRyYSAkKCQoKkYpX0NGTEFHUykKK0lOQ0xVREVTID0gLUkkKHNyY2RpcikvLi4vbGliZWxmIC1JLi4KKworbm9pbnN0X0xJQlJBUklFUyA9IGxpYmV1LmEKKworbGliZXVfYV9TT1VSQ0VTID0geHN0cmR1cC5jIHhzdHJuZHVwLmMgeG1hbGxvYy5jIG5leHRfcHJpbWUuYyBcCisJCSAgY3JjMzIuYyBjcmMzMl9maWxlLmMKKworbm9pbnN0X0hFQURFUlMgPSBmaXhlZHNpemVoYXNoLmggc3lzdGVtLmggZHluYW1pY3NpemVoYXNoLmggbGlzdC5oCitFWFRSQV9ESVNUID0gZHluYW1pY3NpemVoYXNoLmMKKworeG1hbGxvY19DRkxBR1MgPSAtZmZ1bmN0aW9uLXNlY3Rpb25zCmRpZmYgLS1naXQgYS9saWIvY3JjMzIuYyBiL2xpYi9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOThlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3JjMzIuYwpAQCAtMCwwICsxLDg2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisKKy8qIFRhYmxlIGNvbXB1dGVkIHdpdGggTWFyayBBZGxlcidzIG1ha2VjcmMuYyB1dGlsaXR5LiAgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjcmMzMl90YWJsZVsyNTZdID0KK3sKKyAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwgMHgwNzZkYzQxOSwKKyAgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywgMHgwZWRiODgzMiwgMHg3OWRjYjhhNCwKKyAgMHhlMGQ1ZTkxZSwgMHg5N2QyZDk4OCwgMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNywKKyAgMHg5MGJmMWQ5MSwgMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKKyAgMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywgMHgxMzZjOTg1NiwKKyAgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSwgMHg4YTY1YzllYywgMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwKKyAgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwgMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNCwKKyAgMHhhMjY3NzE3MiwgMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YiwKKyAgMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwgMHgzMmQ4NmNlMywKKyAgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwgMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSwKKyAgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwgMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwKKyAgMHhiOGJkYTUwZiwgMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCwKKyAgMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwgMHg3NmRjNDE5MCwKKyAgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwgMHg3MWIxODU4OSwgMHgwNmI2YjUxZiwKKyAgMHg5ZmJmZTRhNSwgMHhlOGI4ZDQzMywgMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwKKyAgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKKyAgMHg2YjZiNTFmNCwgMHgxYzZjNjE2MiwgMHg4NTY1MzBkOCwgMHhmMjYyMDA0ZSwgMHg2YzA2OTVlZCwKKyAgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywgMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwKKyAgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywgMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMywKKyAgMHhmYmQ0NGM2NSwgMHg0ZGIyNjE1OCwgMHgzYWI1NTFjZSwgMHhhM2JjMDA3NCwgMHhkNGJiMzBlMiwKKyAgMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwgMHg0MzY5ZTk2YSwKKyAgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwgMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSwKKyAgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwgMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwKKyAgMHhjOTBjMjA4NiwgMHg1NzY4YjUyNSwgMHgyMDZmODViMywgMHhiOTY2ZDQwOSwgMHhjZTYxZTQ5ZiwKKyAgMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwgMHg1OWIzM2QxNywKKyAgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwgMHhlZGI4ODMyMCwgMHg5YWJmYjNiNiwKKyAgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwgMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSwKKyAgMHg3M2RjMTY4MywgMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKKyAgMHhlNDBlY2YwYiwgMHg5MzA5ZmY5ZCwgMHgwYTAwYWUyNywgMHg3ZDA3OWViMSwgMHhmMDBmOTM0NCwKKyAgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwgMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwKKyAgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywgMHhmZWQ0MWI3NiwgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YSwKKyAgMHg2N2RkNGFjYywgMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSwKKyAgMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwgMHhkMWJiNjdmMSwKKyAgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwgMHhkODBkMmJkYSwgMHhhZjBhMWI0YywKKyAgMHgzNjAzNGFmNiwgMHg0MTA0N2E2MCwgMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwKKyAgMHg0NjY5YmU3OSwgMHhjYjYxYjM4YywgMHhiYzY2ODMxYSwgMHgyNTZmZDJhMCwgMHg1MjY4ZTIzNiwKKyAgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZSwKKyAgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwgMHhjMmQ3ZmZhNywgMHhiNWQwY2YzMSwKKyAgMHgyY2Q5OWU4YiwgMHg1YmRlYWUxZCwgMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YywKKyAgMHgwMjZkOTMwYSwgMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKKyAgMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwgMHg5MmQyOGU5YiwKKyAgMHhlNWQ1YmUwZCwgMHg3Y2RjZWZiNywgMHgwYmRiZGYyMSwgMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwKKyAgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwgMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSwKKyAgMHgxOGI3NDc3NywgMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YywKKyAgMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwgMHhhMDBhZTI3OCwKKyAgMHhkNzBkZDJlZSwgMHg0ZTA0ODM1NCwgMHgzOTAzYjNjMiwgMHhhNzY3MjY2MSwgMHhkMDYwMTZmNywKKyAgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwgMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwKKyAgMHgzN2Q4M2JmMCwgMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSwKKyAgMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwgMHhiYWQwMzYwNSwKKyAgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwgMHhiMzY2N2EyZSwgMHhjNDYxNGFiOCwKKyAgMHg1ZDY4MWIwMiwgMHgyYTZmMmI5NCwgMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYiwKKyAgMHgyZDAyZWY4ZAorfTsKKwordWludDMyX3QKK2NyYzMyICh1aW50MzJfdCBjcmMsIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgdW5zaWduZWQgY2hhciAqZW5kOworCisgIGNyYyA9IH5jcmM7CisgIGZvciAoZW5kID0gYnVmICsgbGVuOyBidWYgPCBlbmQ7ICsrYnVmKQorICAgIGNyYyA9IGNyYzMyX3RhYmxlWyhjcmMgXiAqYnVmKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsKKyAgcmV0dXJuIH5jcmM7Cit9CmRpZmYgLS1naXQgYS9saWIvY3JjMzJfZmlsZS5jIGIvbGliL2NyYzMyX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQ0NjhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NyYzMyX2ZpbGUuYwpAQCAtMCwwICsxLDU5IEBACisjaW5jbHVkZSAic3lzdGVtLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKK2ludAorY3JjMzJfZmlsZSAoaW50IGZkLCB1aW50MzJfdCAqcmVzcCkKK3sKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbMTAyNCAqIDhdOworICB1aW50MzJfdCBjcmMgPSAwOworICBvZmZfdCBvZmYgPSAwOworICBzc2l6ZV90IGNvdW50OworCisgIHN0cnVjdCBzdGF0IHN0OworICBpZiAoZnN0YXQgKGZkLCAmc3QpID09IDApCisgICAgeworICAgICAgLyogVHJ5IG1hcHBpbmcgaW4gdGhlIGZpbGUgZGF0YS4gICovCisgICAgICBzaXplX3QgbWFwc2l6ZSA9IHN0LnN0X3NpemU7CisgICAgICB2b2lkICptYXBwZWQgPSBtbWFwIChOVUxMLCBtYXBzaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgICAgICBpZiAobWFwcGVkID09IE1BUF9GQUlMRUQgJiYgZXJybm8gPT0gRU5PTUVNKQorCXsKKwkgIGNvbnN0IHNpemVfdCBwYWdlc2l6ZSA9IHN5c2NvbmYgKF9TQ19QQUdFX1NJWkUpOworCSAgbWFwc2l6ZSA9ICgobWFwc2l6ZSAvIDIpICsgcGFnZXNpemUgLSAxKSAmIC1wYWdlc2l6ZTsKKwkgIHdoaWxlIChtYXBzaXplID49IHBhZ2VzaXplCisJCSAmJiAobWFwcGVkID0gbW1hcCAoTlVMTCwgbWFwc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwKKwkJCQkgICAgZmQsIDApKSA9PSBNQVBfRkFJTEVEICYmIGVycm5vID09IEVOT01FTSkKKwkgICAgbWFwc2l6ZSAvPSAyOworCX0KKyAgICAgIGlmIChtYXBwZWQgIT0gTUFQX0ZBSUxFRCkKKwl7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKHN0LnN0X3NpemUgPD0gKG9mZl90KSBtYXBzaXplKQorCQl7CisJCSAgKnJlc3AgPSBjcmMzMiAoY3JjLCBtYXBwZWQsIHN0LnN0X3NpemUpOworCQkgIG11bm1hcCAobWFwcGVkLCBtYXBzaXplKTsKKwkJICByZXR1cm4gMDsKKwkJfQorCSAgICAgIGNyYyA9IGNyYzMyIChjcmMsIG1hcHBlZCwgbWFwc2l6ZSk7CisJICAgICAgb2ZmICs9IG1hcHNpemU7CisJICAgICAgc3Quc3Rfc2l6ZSAtPSBtYXBzaXplOworCSAgICB9IHdoaWxlIChtbWFwIChtYXBwZWQsIG1hcHNpemUsIFBST1RfUkVBRCwgTUFQX0ZJWEVEfE1BUF9QUklWQVRFLAorCQkJICAgZmQsIG9mZikgPT0gbWFwcGVkKTsKKwkgIG11bm1hcCAobWFwcGVkLCBtYXBzaXplKTsKKwl9CisgICAgfQorCisgIHdoaWxlICgoY291bnQgPSBURU1QX0ZBSUxVUkVfUkVUUlkgKHByZWFkIChmZCwgYnVmZmVyLCBzaXplb2YgYnVmZmVyLAorCQkJCQkgICAgIG9mZikpKSA+IDApCisgICAgeworICAgICAgb2ZmICs9IGNvdW50OworICAgICAgY3JjID0gY3JjMzIgKGNyYywgYnVmZmVyLCBjb3VudCk7CisgICAgfQorCisgICpyZXNwID0gY3JjOworCisgIHJldHVybiBjb3VudCA9PSAwID8gMCA6IC0xOworfQpkaWZmIC0tZ2l0IGEvbGliL2R5bmFtaWNzaXplaGFzaC5jIGIvbGliL2R5bmFtaWNzaXplaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzU5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZHluYW1pY3NpemVoYXNoLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5c3RlbS5oPgorCisvKiBCZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBtdXN0IGJlIGRlZmluZWQ6CisKKyAgIE5BTUUgICAgICBuYW1lIG9mIHRoZSBoYXNoIHRhYmxlIHN0cnVjdHVyZS4KKyAgIFRZUEUgICAgICBkYXRhIHR5cGUgb2YgdGhlIGhhc2ggdGFibGUgZW50cmllcworICAgQ09NUEFSRSAgIGNvbXBhcmlzb24gZnVuY3Rpb24gdGFraW5nIHR3byBwb2ludGVycyB0byBUWVBFIG9iamVjdHMKKworICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgaWYgcHJlc2VudCBzZWxlY3QgZmVhdHVyZXM6CisKKyAgIElURVJBVEUgICBpdGVyYXRpbmcgb3ZlciB0aGUgdGFibGUgZW50cmllcyBpcyBwb3NzaWJsZQorICAgUkVWRVJTRSAgIGl0ZXJhdGUgaW4gcmV2ZXJzZSBvcmRlciBvZiBpbnNlcnQKKyAqLworCisKK3N0YXRpYyBzaXplX3QKK2xvb2t1cCAoaHRhYiwgaHZhbCwgdmFsKQorICAgICBOQU1FICpodGFiOworICAgICB1bnNpZ25lZCBsb25nIGludCBodmFsOworICAgICBUWVBFIHZhbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7Cit7CisgIC8qIEZpcnN0IGhhc2ggZnVuY3Rpb246IHNpbXBseSB0YWtlIHRoZSBtb2R1bCBidXQgcHJldmVudCB6ZXJvLiAgKi8KKyAgc2l6ZV90IGlkeCA9IDEgKyBodmFsICUgaHRhYi0+c2l6ZTsKKworICBpZiAoaHRhYi0+dGFibGVbaWR4XS5oYXNodmFsICE9IDApCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaGFzaDsKKworICAgICAgaWYgKGh0YWItPnRhYmxlW2lkeF0uaGFzaHZhbCA9PSBodmFsCisJICAmJiBDT01QQVJFIChodGFiLT50YWJsZVtpZHhdLmRhdGEsIHZhbCkgPT0gMCkKKwlyZXR1cm4gaWR4OworCisgICAgICAvKiBTZWNvbmQgaGFzaCBmdW5jdGlvbiBhcyBzdWdnZXN0ZWQgaW4gW0tudXRoXS4gICovCisgICAgICBoYXNoID0gMSArIGh2YWwgJSAoaHRhYi0+c2l6ZSAtIDIpOworCisgICAgICBkbworCXsKKwkgIGlmIChpZHggPD0gaGFzaCkKKwkgICAgaWR4ID0gaHRhYi0+c2l6ZSArIGlkeCAtIGhhc2g7CisJICBlbHNlCisJICAgIGlkeCAtPSBoYXNoOworCisJICAvKiBJZiBlbnRyeSBpcyBmb3VuZCB1c2UgaXQuICAqLworCSAgaWYgKGh0YWItPnRhYmxlW2lkeF0uaGFzaHZhbCA9PSBodmFsCisJICAgICAgJiYgQ09NUEFSRSAoaHRhYi0+dGFibGVbaWR4XS5kYXRhLCB2YWwpID09IDApCisJICAgIHJldHVybiBpZHg7CisJfQorICAgICAgd2hpbGUgKGh0YWItPnRhYmxlW2lkeF0uaGFzaHZhbCk7CisgICAgfQorICByZXR1cm4gaWR4OworfQorCisKK3N0YXRpYyB2b2lkCitpbnNlcnRfZW50cnlfMiAoTkFNRSAqaHRhYiwgdW5zaWduZWQgbG9uZyBpbnQgaHZhbCwgc2l6ZV90IGlkeCwgVFlQRSBkYXRhKQoreworI2lmZGVmIElURVJBVEUKKyAgaWYgKGh0YWItPnRhYmxlW2lkeF0uaGFzaHZhbCA9PSAwKQorICAgIHsKKyMgaWZkZWYgUkVWRVJTRQorICAgICAgaHRhYi0+dGFibGVbaWR4XS5uZXh0ID0gaHRhYi0+Zmlyc3Q7CisgICAgICBodGFiLT5maXJzdCA9ICZodGFiLT50YWJsZVtpZHhdOworIyBlbHNlCisgICAgICAvKiBBZGQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgbGlzdC4gICovCisgICAgICBpZiAoaHRhYi0+Zmlyc3QgPT0gTlVMTCkKKwlodGFiLT5maXJzdCA9IGh0YWItPnRhYmxlW2lkeF0ubmV4dCA9ICZodGFiLT50YWJsZVtpZHhdOworICAgICAgZWxzZQorCXsKKwkgIGh0YWItPnRhYmxlW2lkeF0ubmV4dCA9IGh0YWItPmZpcnN0LT5uZXh0OworCSAgaHRhYi0+Zmlyc3QgPSBodGFiLT5maXJzdC0+bmV4dCA9ICZodGFiLT50YWJsZVtpZHhdOworCX0KKyMgZW5kaWYKKyAgICB9CisjZW5kaWYKKworICBodGFiLT50YWJsZVtpZHhdLmhhc2h2YWwgPSBodmFsOworICBodGFiLT50YWJsZVtpZHhdLmRhdGEgPSBkYXRhOworCisgICsraHRhYi0+ZmlsbGVkOworICBpZiAoMTAwICogaHRhYi0+ZmlsbGVkID4gOTAgKiBodGFiLT5zaXplKQorICAgIHsKKyAgICAgIC8qIFRhYmxlIGlzIGZpbGxlZCBtb3JlIHRoYW4gOTAlLiAgUmVzaXplIHRoZSB0YWJsZS4gICovCisjaWZkZWYgSVRFUkFURQorICAgICAgX190eXBlb2ZfXyAoaHRhYi0+Zmlyc3QpIGZpcnN0OworIyBpZm5kZWYgUkVWRVJTRQorICAgICAgX190eXBlb2ZfXyAoaHRhYi0+Zmlyc3QpIHJ1bnA7CisjIGVuZGlmCisjZWxzZQorICAgICAgdW5zaWduZWQgbG9uZyBpbnQgb2xkX3NpemUgPSBodGFiLT5zaXplOworI2VuZGlmCisjZGVmaW5lIF9UQUJMRShuYW1lKSBcCisgICAgICBuYW1lIyNfZW50ICp0YWJsZSA9IGh0YWItPnRhYmxlCisjZGVmaW5lIFRBQkxFKG5hbWUpIF9UQUJMRSAobmFtZSkKKyAgICAgIFRBQkxFKE5BTUUpOworCisgICAgICBodGFiLT5zaXplID0gbmV4dF9wcmltZSAoaHRhYi0+c2l6ZSAqIDIpOworICAgICAgaHRhYi0+ZmlsbGVkID0gMDsKKyNpZmRlZiBJVEVSQVRFCisgICAgICBmaXJzdCA9IGh0YWItPmZpcnN0OworICAgICAgaHRhYi0+Zmlyc3QgPSBOVUxMOworI2VuZGlmCisgICAgICBodGFiLT50YWJsZSA9IGNhbGxvYyAoKDEgKyBodGFiLT5zaXplKSwgc2l6ZW9mIChodGFiLT50YWJsZVswXSkpOworICAgICAgaWYgKGh0YWItPnRhYmxlID09IE5VTEwpCisJeworCSAgLyogV2UgY2Fubm90IGVubGFyZ2UgdGhlIHRhYmxlLiAgTGl2ZSB3aXRoIHdoYXQgd2UgZ290LiAgVGhpcworCSAgICAgbWlnaHQgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wIGF0IHNvbWUgcG9pbnQsIHRob3VnaC4gICovCisJICBodGFiLT50YWJsZSA9IHRhYmxlOworCSAgcmV0dXJuOworCX0KKworICAgICAgLyogQWRkIHRoZSBvbGQgZW50cmllcyB0byB0aGUgbmV3IHRhYmxlLiAgV2hlbiBpdGVyYXRpb24gaXMKKwkgc3VwcG9ydGVkIHdlIG1haW50YWluIHRoZSBvcmRlci4gICovCisjaWZkZWYgSVRFUkFURQorIyBpZmRlZiBSRVZFUlNFCisgICAgICB3aGlsZSAoZmlyc3QgIT0gTlVMTCkKKwl7CisJICBpbnNlcnRfZW50cnlfMiAoaHRhYiwgZmlyc3QtPmhhc2h2YWwsCisJCQkgIGxvb2t1cCAoaHRhYiwgZmlyc3QtPmhhc2h2YWwsIGZpcnN0LT5kYXRhKSwKKwkJCSAgZmlyc3QtPmRhdGEpOworCisJICBmaXJzdCA9IGZpcnN0LT5uZXh0OworCX0KKyMgZWxzZQorICAgICAgYXNzZXJ0IChmaXJzdCAhPSBOVUxMKTsKKyAgICAgIHJ1bnAgPSBmaXJzdCA9IGZpcnN0LT5uZXh0OworICAgICAgZG8KKwlpbnNlcnRfZW50cnlfMiAoaHRhYiwgcnVucC0+aGFzaHZhbCwKKwkJCWxvb2t1cCAoaHRhYiwgcnVucC0+aGFzaHZhbCwgcnVucC0+ZGF0YSksIHJ1bnAtPmRhdGEpOworICAgICAgd2hpbGUgKChydW5wID0gcnVucC0+bmV4dCkgIT0gZmlyc3QpOworIyBlbmRpZgorI2Vsc2UKKyAgICAgIGZvciAoaWR4ID0gMTsgaWR4IDw9IG9sZF9zaXplOyArK2lkeCkKKwlpZiAodGFibGVbaWR4XS5oYXNodmFsICE9IDApCisJICBpbnNlcnRfZW50cnlfMiAoaHRhYiwgdGFibGVbaWR4XS5oYXNodmFsLAorCQkJICBsb29rdXAgKGh0YWIsIHRhYmxlW2lkeF0uaGFzaHZhbCwgdGFibGVbaWR4XS5kYXRhKSwKKwkJCSAgdGFibGVbaWR4XS5kYXRhKTsKKyNlbmRpZgorCisgICAgICBmcmVlICh0YWJsZSk7CisgICAgfQorfQorCisKK2ludAorI2RlZmluZSBJTklUKG5hbWUpIF9JTklUIChuYW1lKQorI2RlZmluZSBfSU5JVChuYW1lKSBcCisgIG5hbWUjI19pbml0CitJTklUKE5BTUUpIChodGFiLCBpbml0X3NpemUpCisgICAgIE5BTUUgKmh0YWI7CisgICAgIHVuc2lnbmVkIGxvbmcgaW50IGluaXRfc2l6ZTsKK3sKKyAgLyogV2UgbmVlZCB0aGUgc2l6ZSB0byBiZSBhIHByaW1lLiAgKi8KKyAgaW5pdF9zaXplID0gbmV4dF9wcmltZSAoaW5pdF9zaXplKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBkYXRhIHN0cnVjdHVyZS4gICovCisgIGh0YWItPnNpemUgPSBpbml0X3NpemU7CisgIGh0YWItPmZpbGxlZCA9IDA7CisjaWZkZWYgSVRFUkFURQorICBodGFiLT5maXJzdCA9IE5VTEw7CisjZW5kaWYKKyAgaHRhYi0+dGFibGUgPSAodm9pZCAqKSBjYWxsb2MgKChpbml0X3NpemUgKyAxKSwgc2l6ZW9mIChodGFiLT50YWJsZVswXSkpOworICBpZiAoaHRhYi0+dGFibGUgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIDA7Cit9CisKKworaW50CisjZGVmaW5lIEZSRUUobmFtZSkgX0ZSRUUgKG5hbWUpCisjZGVmaW5lIF9GUkVFKG5hbWUpIFwKKyAgbmFtZSMjX2ZyZWUKK0ZSRUUoTkFNRSkgKGh0YWIpCisgICAgIE5BTUUgKmh0YWI7Cit7CisgIGZyZWUgKGh0YWItPnRhYmxlKTsKKyAgcmV0dXJuIDA7Cit9CisKKworaW50CisjZGVmaW5lIElOU0VSVChuYW1lKSBfSU5TRVJUIChuYW1lKQorI2RlZmluZSBfSU5TRVJUKG5hbWUpIFwKKyAgbmFtZSMjX2luc2VydAorSU5TRVJUKE5BTUUpIChodGFiLCBodmFsLCBkYXRhKQorICAgICBOQU1FICpodGFiOworICAgICB1bnNpZ25lZCBsb25nIGludCBodmFsOworICAgICBUWVBFIGRhdGE7Cit7CisgIHNpemVfdCBpZHg7CisKKyAgLyogTWFrZSB0aGUgaGFzaCB2YWx1ZSBub256ZXJvLiAgKi8KKyAgaHZhbCA9IGh2YWwgPzogMTsKKworICBpZHggPSBsb29rdXAgKGh0YWIsIGh2YWwsIGRhdGEpOworCisgIGlmIChodGFiLT50YWJsZVtpZHhdLmhhc2h2YWwgIT0gMCkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgb2xkIHZhbHVlLiAgKi8KKyAgICByZXR1cm4gLTE7CisKKyAgLyogQW4gZW1wdHkgYnVja2V0IGhhcyBiZWVuIGZvdW5kLiAgKi8KKyAgaW5zZXJ0X2VudHJ5XzIgKGh0YWIsIGh2YWwsIGlkeCwgZGF0YSk7CisgIHJldHVybiAwOworfQorCisKKyNpZmRlZiBPVkVSV1JJVEUKK2ludAorI2RlZmluZSBJTlNFUlQobmFtZSkgX0lOU0VSVCAobmFtZSkKKyNkZWZpbmUgX0lOU0VSVChuYW1lKSBcCisgIG5hbWUjI19vdmVyd3JpdGUKK0lOU0VSVChOQU1FKSAoaHRhYiwgaHZhbCwgZGF0YSkKKyAgICAgTkFNRSAqaHRhYjsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbDsKKyAgICAgVFlQRSBkYXRhOworeworICBzaXplX3QgaWR4OworCisgIC8qIE1ha2UgdGhlIGhhc2ggdmFsdWUgbm9uemVyby4gICovCisgIGh2YWwgPSBodmFsID86IDE7CisKKyAgaWR4ID0gbG9va3VwIChodGFiLCBodmFsLCBkYXRhKTsKKworICAvKiBUaGUgY29ycmVjdCBidWNrZXQgaGFzIGJlZW4gZm91bmQuICAqLworICBpbnNlcnRfZW50cnlfMiAoaHRhYiwgaHZhbCwgaWR4LCBkYXRhKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCitUWVBFCisjZGVmaW5lIEZJTkQobmFtZSkgX0ZJTkQgKG5hbWUpCisjZGVmaW5lIF9GSU5EKG5hbWUpIFwKKyAgbmFtZSMjX2ZpbmQKK0ZJTkQoTkFNRSkgKGh0YWIsIGh2YWwsIHZhbCkKKyAgICAgTkFNRSAqaHRhYjsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbDsKKyAgICAgVFlQRSB2YWw7Cit7CisgIHNpemVfdCBpZHg7CisKKyAgLyogTWFrZSB0aGUgaGFzaCB2YWx1ZSBub256ZXJvLiAgKi8KKyAgaHZhbCA9IGh2YWwgPzogMTsKKworICBpZHggPSBsb29rdXAgKGh0YWIsIGh2YWwsIHZhbCk7CisKKyAgaWYgKGh0YWItPnRhYmxlW2lkeF0uaGFzaHZhbCA9PSAwKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBodGFiLT50YWJsZVtpZHhdLmRhdGE7Cit9CisKKworI2lmZGVmIElURVJBVEUKKyMgZGVmaW5lIElURVJBVEVGQ1QobmFtZSkgX0lURVJBVEVGQ1QgKG5hbWUpCisjIGRlZmluZSBfSVRFUkFURUZDVChuYW1lKSBcCisgIG5hbWUjI19pdGVyYXRlCitUWVBFCitJVEVSQVRFRkNUKE5BTUUpIChodGFiLCBwdHIpCisgICAgIE5BTUUgKmh0YWI7CisgICAgIHZvaWQgKipwdHI7Cit7CisgIHZvaWQgKnAgPSAqcHRyOworCisjIGRlZmluZSBUWVBFTkFNRShuYW1lKSBfVFlQRU5BTUUgKG5hbWUpCisjIGRlZmluZSBfVFlQRU5BTUUobmFtZSkgbmFtZSMjX2VudAorCisjIGlmZGVmIFJFVkVSU0UKKyAgaWYgKHAgPT0gTlVMTCkKKyAgICBwID0gaHRhYi0+Zmlyc3Q7CisgIGVsc2UKKyAgICBwID0gKChUWVBFTkFNRShOQU1FKSAqKSBwKS0+bmV4dDsKKworICBpZiAocCA9PSBOVUxMKQorICAgIHsKKyAgICAgICpwdHIgPSBOVUxMOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorIyBlbHNlCisgIGlmIChwID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGh0YWItPmZpcnN0ID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgICBwID0gaHRhYi0+Zmlyc3QtPm5leHQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHAgPT0gaHRhYi0+Zmlyc3QpCisJcmV0dXJuIE5VTEw7CisKKyAgICAgIHAgPSAoKFRZUEVOQU1FKE5BTUUpICopIHApLT5uZXh0OworICAgIH0KKyMgZW5kaWYKKworICAvKiBQcmVwYXJlIHRoZSBuZXh0IGVsZW1lbnQuICBJZiBwb3NzaWJsZSB0aGlzIHdpbGwgcHVsbCB0aGUgZGF0YQorICAgICBpbnRvIHRoZSBjYWNoZSwgZm9yIHJlYWRpbmcuICAqLworICBfX2J1aWx0aW5fcHJlZmV0Y2ggKCgoVFlQRU5BTUUoTkFNRSkgKikgcCktPm5leHQsIDAsIDIpOworCisgIHJldHVybiAoKFRZUEVOQU1FKE5BTUUpICopICgqcHRyID0gcCkpLT5kYXRhOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZHluYW1pY3NpemVoYXNoLmggYi9saWIvZHluYW1pY3NpemVoYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhNzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9keW5hbWljc2l6ZWhhc2guaApAQCAtMCwwICsxLDEwNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIG11c3QgYmUgZGVmaW5lZDoKKworICAgTkFNRSAgICAgIG5hbWUgb2YgdGhlIGhhc2ggdGFibGUgc3RydWN0dXJlLgorICAgVFlQRSAgICAgIGRhdGEgdHlwZSBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyaWVzCisKKyAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGlmIHByZXNlbnQgc2VsZWN0IGZlYXR1cmVzOgorCisgICBJVEVSQVRFICAgaXRlcmF0aW5nIG92ZXIgdGhlIHRhYmxlIGVudHJpZXMgaXMgcG9zc2libGUKKyAqLworCisKKy8qIE9wdGlvbmFsbHkgaW5jbHVkZSBhbiBlbnRyeSBwb2ludGluZyB0byB0aGUgZmlyc3QgdXNlZCBlbnRyeS4gICovCisjaWZkZWYgSVRFUkFURQorIyBkZWZpbmUgRklSU1QobmFtZSkJbmFtZSMjX2VudCAqZmlyc3Q7CisjIGRlZmluZSBORVhUKG5hbWUpCXN0cnVjdCBuYW1lIyNfZW50ICpuZXh0OworI2Vsc2UKKyMgZGVmaW5lIEZJUlNUKG5hbWUpCisjIGRlZmluZSBORVhUKG5hbWUpCisjZW5kaWYKKworCisvKiBEZWZpbmVkIHNlcGFyYXRlbHkuICAqLworZXh0ZXJuIHNpemVfdCBuZXh0X3ByaW1lIChzaXplX3Qgc2VlZCk7CisKKworLyogVGFibGUgZW50cnkgdHlwZS4gICovCisjZGVmaW5lIF9EWU5IQVNIRU5UVFlQRShuYW1lKSBcCisgIHR5cGVkZWYgc3RydWN0IG5hbWUjI19lbnQJCQkJCQkgICAgICBcCisgIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5zaWduZWQgbG9uZyBpbnQgaGFzaHZhbDsJCQkJCQkgICAgICBcCisgICAgVFlQRSBkYXRhOwkJCQkJCQkJICAgICAgXAorICAgIE5FWFQgKG5hbWUpCQkJCQkJCQkgICAgICBcCisgIH0gbmFtZSMjX2VudAorI2RlZmluZSBEWU5IQVNIRU5UVFlQRShuYW1lKSBfRFlOSEFTSEVOVFRZUEUgKG5hbWUpCitEWU5IQVNIRU5UVFlQRSAoTkFNRSk7CisKKworLyogVHlwZSBvZiB0aGUgZHluYW1pYyBoYXNoIHRhYmxlIGRhdGEgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgX0RZTkhBU0hUWVBFKG5hbWUpIFwKK3R5cGVkZWYgc3RydWN0CQkJCQkJCQkgICAgICBcCit7CQkJCQkJCQkJICAgICAgXAorICB1bnNpZ25lZCBsb25nIGludCBzaXplOwkJCQkJCSAgICAgIFwKKyAgdW5zaWduZWQgbG9uZyBpbnQgZmlsbGVkOwkJCQkJCSAgICAgIFwKKyAgbmFtZSMjX2VudCAqdGFibGU7CQkJCQkJCSAgICAgIFwKKyAgRklSU1QJKG5hbWUpCQkJCQkJCQkgICAgICBcCit9IG5hbWUKKyNkZWZpbmUgRFlOSEFTSFRZUEUobmFtZSkgX0RZTkhBU0hUWVBFIChuYW1lKQorRFlOSEFTSFRZUEUgKE5BTUUpOworCisKKworI2RlZmluZSBfRlVOQ1RJT05TKG5hbWUpIFwKKy8qIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUuICAqLwkJCQkJICAgICAgXAorZXh0ZXJuIGludCBuYW1lIyNfaW5pdCAobmFtZSAqaHRhYiwgdW5zaWduZWQgbG9uZyBpbnQgaW5pdF9zaXplKTsJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorLyogRnJlZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBoYXNoIHRhYmxlLiAgKi8JCQkJICAgICAgXAorZXh0ZXJuIGludCBuYW1lIyNfZnJlZSAobmFtZSAqaHRhYik7CQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisvKiBJbnNlcnQgbmV3IGVudHJ5LiAgKi8JCQkJCQkgICAgICBcCitleHRlcm4gaW50IG5hbWUjI19pbnNlcnQgKG5hbWUgKmh0YWIsIHVuc2lnbmVkIGxvbmcgaW50IGh2YWwsIFRZUEUgZGF0YSk7ICAgICBcCisJCQkJCQkJCQkgICAgICBcCisvKiBJbnNlcnQgbmV3IGVudHJ5LCBwb3NzaWJseSBvdmVyd3JpdGUgb2xkIGVudHJ5LiAgKi8JCQkgICAgICBcCitleHRlcm4gaW50IG5hbWUjI19vdmVyd3JpdGUgKG5hbWUgKmh0YWIsIHVuc2lnbmVkIGxvbmcgaW50IGh2YWwsIFRZUEUgZGF0YSk7ICBcCisJCQkJCQkJCQkgICAgICBcCisvKiBGaW5kIGVudHJ5IGluIGhhc2ggdGFibGUuICAqLwkJCQkJICAgICAgXAorZXh0ZXJuIFRZUEUgbmFtZSMjX2ZpbmQgKG5hbWUgKmh0YWIsIHVuc2lnbmVkIGxvbmcgaW50IGh2YWwsIFRZUEUgdmFsKTsKKyNkZWZpbmUgRlVOQ1RJT05TKG5hbWUpIF9GVU5DVElPTlMgKG5hbWUpCitGVU5DVElPTlMgKE5BTUUpCisKKworI2lmZGVmIElURVJBVEUKKyMgZGVmaW5lIF9YRlVOQ1RJT05TKG5hbWUpIFwKKy8qIEdldCBuZXh0IGVsZW1lbnQgaW4gdGFibGUuICAqLwkJCQkJICAgICAgXAorZXh0ZXJuIFRZUEUgbmFtZSMjX2l0ZXJhdGUgKG5hbWUgKmh0YWIsIHZvaWQgKipwdHIpOworIyBkZWZpbmUgWEZVTkNUSU9OUyhuYW1lKSBfWEZVTkNUSU9OUyAobmFtZSkKK1hGVU5DVElPTlMgKE5BTUUpCisjZW5kaWYKKworI2lmbmRlZiBOT19VTkRFRgorIyB1bmRlZiBEWU5IQVNIRU5UVFlQRQorIyB1bmRlZiBEWU5IQVNIVFlQRQorIyB1bmRlZiBGVU5DVElPTlMKKyMgdW5kZWYgX0ZVTkNUSU9OUworIyB1bmRlZiBYRlVOQ1RJT05TCisjIHVuZGVmIF9YRlVOQ1RJT05TCisjIHVuZGVmIE5BTUUKKyMgdW5kZWYgVFlQRQorIyB1bmRlZiBJVEVSQVRFCisjIHVuZGVmIENPTVBBUkUKKyMgdW5kZWYgRklSU1QKKyMgdW5kZWYgTkVYVAorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZml4ZWRzaXplaGFzaC5oIGIvbGliL2ZpeGVkc2l6ZWhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWM2MDdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2ZpeGVkc2l6ZWhhc2guaApAQCAtMCwwICsxLDI1NSBAQAorLyogRml4ZWQgc2l6ZSBoYXNoIHRhYmxlIHdpdGggaW50ZXJuYWwgbGlua2luZy4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0uaD4KKworI2RlZmluZSBDT05DQVQodDEsdDIpIF9fQ09OQ0FUICh0MSx0MikKKworLyogQmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUgdGhlIGZvbGxvd2luZyBtYWNyb3MgbXVzdCBiZSBkZWZpbmVkOgorCisgICBUWVBFICAgICAgICAgICBkYXRhIHR5cGUgb2YgdGhlIGhhc2ggdGFibGUgZW50cmllcworICAgSEFTSEZDVCAgICAgICAgbmFtZSBvZiB0aGUgaGFzaGluZyBmdW5jdGlvbiB0byB1c2UKKyAgIEhBU0hUWVBFICAgICAgIHR5cGUgdXNlZCBmb3IgdGhlIGhhc2hpbmcgdmFsdWUKKyAgIENPTVBBUkUgICAgICAgIGNvbXBhcmlzb24gZnVuY3Rpb24gdGFraW5nIHR3byBwb2ludGVycyB0byBUWVBFIG9iamVjdHMKKyAgIENMQVNTICAgICAgICAgIGNhbiBiZSBkZWZpbmVkIHRvIGBzdGF0aWMnIHRvIGF2b2lkIGV4cG9ydGluZyB0aGUgZnVuY3Rpb25zCisgICBQUkVGSVggICAgICAgICBwcmVmaXggdG8gYmUgdXNlZCBmb3IgZnVuY3Rpb24gYW5kIGRhdGEgdHlwZSBuYW1lcworICAgU1RPUkVfUE9JTlRFUiAgaWYgZGVmaW5lZCB0aGUgdGFibGUgc3RvcmVzIGEgcG9pbnRlciBhbmQgbm90IGFuIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgIG9mIHR5cGUgVFlQRQorICAgSU5TRVJUX0hBU0ggICAgaWYgZGVmaW5lZCBhbHRlcm5hdGUgaW5zZXJ0IGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgaGFzaAorICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgZGVmaW5lZAorICAgTk9fRklOSV9GQ1QgICAgaWYgZGVmaW5lZCB0aGUgZmluaSBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZAorKi8KKworCisvKiBEZWZpbmVkIHNlcGFyYXRlbHkuICAqLworZXh0ZXJuIHNpemVfdCBuZXh0X3ByaW1lIChzaXplX3Qgc2VlZCk7CisKKworLyogU2V0IGRlZmF1bHQgdmFsdWVzLiAgKi8KKyNpZm5kZWYgSEFTSFRZUEUKKyMgZGVmaW5lIEhBU0hUWVBFIHNpemVfdAorI2VuZGlmCisKKyNpZm5kZWYgQ0xBU1MKKyMgZGVmaW5lIENMQVNTCisjZW5kaWYKKworI2lmbmRlZiBQUkVGSVgKKyMgZGVmaW5lIFBSRUZJWAorI2VuZGlmCisKKworLyogVGhlIGRhdGEgc3RydWN0dXJlLiAgKi8KK3N0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaCkKK3sKKyAgc2l6ZV90IG5zbG90czsKKyAgc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoZW50KQorICB7CisgICAgSEFTSFRZUEUgaHZhbDsKKyNpZmRlZiBTVE9SRV9QT0lOVEVSCisjIGRlZmluZSBFTlRSWVAoZWwpIChlbCkuZW50cnkKKyAgICBUWVBFICplbnRyeTsKKyNlbHNlCisjIGRlZmluZSBFTlRSWVAoZWwpICYoZWwpLmVudHJ5CisgICAgVFlQRSBlbnRyeTsKKyNlbmRpZgorICB9IHRhYmxlWzBdOworfTsKKworCisvKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGhhc2hpbmcgdGFibGUuICAqLworQ0xBU1Mgc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoKSAqCitDT05DQVQoUFJFRklYLGZzaGFzaF9pbml0KSAoc2l6ZV90IG5lbGVtcykKK3sKKyAgc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoKSAqcmVzdWx0OworICAvKiBXZSBjaG9vc2UgYSBzaXplIGZvciB0aGUgaGFzaGluZyB0YWJsZSAxNTAlIG92ZXIgdGhlIG51bWJlciBvZgorICAgICBlbnRyaWVzLiAgVGhpcyB3aWxsIGd1YXJhbnRlZSBzaG9ydCBtZWRpdW0gc2VhcmNoIGxlbmd0aHMuICAqLworICBjb25zdCBzaXplX3QgbWF4X3NpemVfdCA9IH4oKHNpemVfdCkgMCk7CisKKyAgaWYgKG5lbGVtcyA+PSAobWF4X3NpemVfdCAvIDMpICogMikKKyAgICB7CisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBBZGp1c3QgdGhlIHNpemUgdG8gYmUgdXNlZCBmb3IgdGhlIGhhc2hpbmcgdGFibGUuICAqLworICBuZWxlbXMgPSBuZXh0X3ByaW1lIChNQVggKChuZWxlbXMgKiAzKSAvIDIsIDEwKSk7CisKKyAgLyogQWxsb2NhdGUgdGhlIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgcmVzdWx0LiAgKi8KKyAgcmVzdWx0ID0gKHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaCkgKikKKyAgICB4Y2FsbG9jIChzaXplb2YgKHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaCkpCisJICAgICArIChuZWxlbXMgKyAxKSAqIHNpemVvZiAoc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoZW50KSksIDEpOworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVzdWx0LT5uc2xvdHMgPSBuZWxlbXM7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisjaWZuZGVmIE5PX0ZJTklfRkNUCitDTEFTUyB2b2lkCitDT05DQVQoUFJFRklYLGZzaGFzaF9maW5pKSAoc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoKSAqaHRhYikKK3sKKyAgZnJlZSAoaHRhYik7Cit9CisjZW5kaWYKKworCitzdGF0aWMgc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoZW50KSAqCitDT05DQVQoUFJFRklYLGZzaGFzaF9sb29rdXApIChzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2gpICpodGFiLAorCQkJICAgICAgSEFTSFRZUEUgaHZhbCwgVFlQRSAqZGF0YSkKK3sKKyAgc2l6ZV90IGlkeCA9IDEgKyBodmFsICUgaHRhYi0+bnNsb3RzOworCisgIGlmIChodGFiLT50YWJsZVtpZHhdLmh2YWwgIT0gMCkKKyAgICB7CisgICAgICBIQVNIVFlQRSBoYXNoOworCisgICAgICAvKiBTZWUgd2hldGhlciB0aGlzIGlzIHRoZSBzYW1lIGVudHJ5LiAgKi8KKyAgICAgIGlmIChodGFiLT50YWJsZVtpZHhdLmh2YWwgPT0gaHZhbAorCSAgJiYgQ09NUEFSRSAoZGF0YSwgRU5UUllQIChodGFiLT50YWJsZVtpZHhdKSkgPT0gMCkKKwlyZXR1cm4gJmh0YWItPnRhYmxlW2lkeF07CisKKyAgICAgIC8qIFNlY29uZCBoYXNoIGZ1bmN0aW9uIGFzIHN1Z2dlc3RlZCBpbiBbS251dGhdLiAgKi8KKyAgICAgIGhhc2ggPSAxICsgaHZhbCAlIChodGFiLT5uc2xvdHMgLSAyKTsKKworICAgICAgZG8KKwl7CisJICBpZiAoaWR4IDw9IGhhc2gpCisJICAgIGlkeCA9IGh0YWItPm5zbG90cyArIGlkeCAtIGhhc2g7CisJICBlbHNlCisJICAgIGlkeCAtPSBoYXNoOworCisJICBpZiAoaHRhYi0+dGFibGVbaWR4XS5odmFsID09IGh2YWwKKwkgICAgICAmJiBDT01QQVJFIChkYXRhLCBFTlRSWVAoaHRhYi0+dGFibGVbaWR4XSkpID09IDApCisJICAgIHJldHVybiAmaHRhYi0+dGFibGVbaWR4XTsKKwl9CisgICAgICB3aGlsZSAoaHRhYi0+dGFibGVbaWR4XS5odmFsICE9IDApOworICAgIH0KKworICByZXR1cm4gJmh0YWItPnRhYmxlW2lkeF07Cit9CisKKworQ0xBU1MgaW50CitfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKK0NPTkNBVChQUkVGSVgsZnNoYXNoX2luc2VydCkgKHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaCkgKmh0YWIsCisJCQkgICAgICBjb25zdCBjaGFyICpzdHIsCisJCQkgICAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgVFlQRSAqZGF0YSkKK3sKKyAgSEFTSFRZUEUgaHZhbCA9IEhBU0hGQ1QgKHN0ciwgbGVuID86IHN0cmxlbiAoc3RyKSk7CisgIHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaGVudCkgKnNsb3Q7CisKKyAgc2xvdCA9IENPTkNBVChQUkVGSVgsZnNoYXNoX2xvb2t1cCkgKGh0YWIsIGh2YWwsIGRhdGEpOworIGlmIChzbG90LT5odmFsICE9IDApCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIG9sZCB2YWx1ZS4gICovCisgICAgcmV0dXJuIC0xOworCisgIHNsb3QtPmh2YWwgPSBodmFsOworI2lmZGVmIFNUT1JFX1BPSU5URVIKKyAgc2xvdC0+ZW50cnkgPSBkYXRhOworI2Vsc2UKKyAgc2xvdC0+ZW50cnkgPSAqZGF0YTsKKyNlbmRpZgorCisgIHJldHVybiAwOworfQorCisKKyNpZmRlZiBJTlNFUlRfSEFTSAorQ0xBU1MgaW50CitfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKK0NPTkNBVChQUkVGSVgsZnNoYXNoX2luc2VydF9oYXNoKSAoc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoKSAqaHRhYiwKKwkJCQkgICBIQVNIVFlQRSBodmFsLCBUWVBFICpkYXRhKQoreworICBzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2hlbnQpICpzbG90OworCisgIHNsb3QgPSBDT05DQVQoUFJFRklYLGZzaGFzaF9sb29rdXApIChodGFiLCBodmFsLCBkYXRhKTsKKyAgaWYgKHNsb3QtPmh2YWwgIT0gMCkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgb2xkIHZhbHVlLiAgKi8KKyAgICByZXR1cm4gLTE7CisKKyAgc2xvdC0+aHZhbCA9IGh2YWw7CisjaWZkZWYgU1RPUkVfUE9JTlRFUgorICBzbG90LT5lbnRyeSA9IGRhdGE7CisjZWxzZQorICBzbG90LT5lbnRyeSA9ICpkYXRhOworI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCitDTEFTUyBpbnQKK19fYXR0cmlidXRlX18gKCh1bnVzZWQpKQorQ09OQ0FUKFBSRUZJWCxmc2hhc2hfb3ZlcndyaXRlKSAoc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoKSAqaHRhYiwKKwkJCQkgY29uc3QgY2hhciAqc3RyLAorCQkJCSBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCQkgVFlQRSAqZGF0YSkKK3sKKyAgSEFTSFRZUEUgaHZhbCA9IEhBU0hGQ1QgKHN0ciwgbGVuID86IHN0cmxlbiAoc3RyKSk7CisgIHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaGVudCkgKnNsb3Q7CisKKyAgc2xvdCA9IENPTkNBVChQUkVGSVgsZnNoYXNoX2xvb2t1cCkgKGh0YWIsIGh2YWwsIGRhdGEpOworICBzbG90LT5odmFsID0gaHZhbDsKKyNpZmRlZiBTVE9SRV9QT0lOVEVSCisgIHNsb3QtPmVudHJ5ID0gZGF0YTsKKyNlbHNlCisgIHNsb3QtPmVudHJ5ID0gKmRhdGE7CisjZW5kaWYKKworICByZXR1cm4gMDsKK30KKworCitDTEFTUyBjb25zdCBUWVBFICoKK0NPTkNBVChQUkVGSVgsZnNoYXNoX2ZpbmQpIChjb25zdCBzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2gpICpodGFiLAorCQkJICAgIGNvbnN0IGNoYXIgKnN0ciwKKwkJCSAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgVFlQRSAqZGF0YSkKK3sKKyAgSEFTSFRZUEUgaHZhbCA9IEhBU0hGQ1QgKHN0ciwgbGVuID86IHN0cmxlbiAoc3RyKSk7CisgIHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaGVudCkgKnNsb3Q7CisKKyAgc2xvdCA9IENPTkNBVChQUkVGSVgsZnNoYXNoX2xvb2t1cCkgKChzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2gpICopIGh0YWIsCisJCQkJICAgICAgIGh2YWwsIGRhdGEpOworICBpZiAoc2xvdC0+aHZhbCA9PSAwKQorICAgIC8qIE5vdCBmb3VuZC4gICovCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIEVOVFJZUCgqc2xvdCk7Cit9CisKKworLyogVW5zZXQgdGhlIG1hY3JvcyB3ZSBleHBlY3QuICAqLworI3VuZGVmIFRZUEUKKyN1bmRlZiBIQVNIRkNUCisjdW5kZWYgSEFTSFRZUEUKKyN1bmRlZiBDT01QQVJFCisjdW5kZWYgQ0xBU1MKKyN1bmRlZiBQUkVGSVgKKyN1bmRlZiBJTlNFUlRfSEFTSAorI3VuZGVmIFNUT1JFX1BPSU5URVIKKyN1bmRlZiBOT19GSU5JX0ZDVApkaWZmIC0tZ2l0IGEvbGliL2xpc3QuaCBiL2xpYi9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzOWEwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9saXN0LmgKQEAgLTAsMCArMSw4NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIExJU1RfSAorI2RlZmluZSBMSVNUX0gJMQorCisvKiBBZGQgZWxlbWVudCB0byB0aGUgZW5kIG9mIGEgY2lyY3VsYXIsIGRvdWJsZS1saW5rZWQgbGlzdC4gICovCisjZGVmaW5lIENEQkxfTElTVF9BRERfUkVBUihmaXJzdCwgbmV3cCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIF9fdHlwZW9mIChuZXdwKSBfbmV3cCA9IChuZXdwKTsJCQkJCSAgICAgIFwKKyAgICBhc3NlcnQgKF9uZXdwLT5uZXh0ID09IE5VTEwpOwkJCQkJICAgICAgXAorICAgIGFzc2VydCAoX25ld3AtPnByZXZpb3VzID09IE5VTEwpOwkJCQkJICAgICAgXAorICAgIGlmICh1bmxpa2VseSAoKGZpcnN0KSA9PSBOVUxMKSkJCQkJCSAgICAgIFwKKyAgICAgIChmaXJzdCkgPSBfbmV3cC0+bmV4dCA9IF9uZXdwLT5wcmV2aW91cyA9IF9uZXdwOwkJCSAgICAgIFwKKyAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCV9uZXdwLT5uZXh0ID0gKGZpcnN0KTsJCQkJCQkgICAgICBcCisJX25ld3AtPnByZXZpb3VzID0gKGZpcnN0KS0+cHJldmlvdXM7CQkJCSAgICAgIFwKKwlfbmV3cC0+cHJldmlvdXMtPm5leHQgPSBfbmV3cC0+bmV4dC0+cHJldmlvdXMgPSBfbmV3cDsJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qIFJlbW92ZSBlbGVtZW50IGZyb20gY2lyY3VsYXIsIGRvdWJsZS1saW5rZWQgbGlzdC4gICovCisjZGVmaW5lIENEQkxfTElTVF9ERUwoZmlyc3QsIGVsZW0pIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3R5cGVvZiAoZWxlbSkgX2VsZW0gPSAoZWxlbSk7CQkJCQkgICAgICBcCisgICAgLyogQ2hlY2sgd2hldGhlciB0aGUgZWxlbWVudCBpcyBpbmRlZWQgb24gdGhlIGxpc3QuICAqLwkJICAgICAgXAorICAgIGFzc2VydCAoZmlyc3QgIT0gTlVMTCAmJiBfZWxlbSAhPSBOVUxMCQkJCSAgICAgIFwKKwkgICAgJiYgKGZpcnN0ICE9IGVsZW0JCQkJCQkgICAgICBcCisJCXx8ICh7IF9fdHlwZW9mIChlbGVtKSBfcnVucCA9IGZpcnN0LT5uZXh0OwkJICAgICAgXAorCQkgICAgICB3aGlsZSAoX3J1bnAgIT0gZmlyc3QpCQkJCSAgICAgIFwKKwkJCWlmIChfcnVucCA9PSBfZWxlbSkJCQkJICAgICAgXAorCQkJICBicmVhazsJCQkJCSAgICAgIFwKKwkJCWVsc2UJCQkJCQkgICAgICBcCisJCSAgICAgICAgICBfcnVucCA9IF9ydW5wLT5uZXh0OwkJCQkgICAgICBcCisJCSAgICAgIF9ydW5wID09IF9lbGVtOyB9KSkpOwkJCQkgICAgICBcCisgICAgaWYgKHVubGlrZWx5IChfZWxlbS0+bmV4dCA9PSBfZWxlbSkpCQkJCSAgICAgIFwKKyAgICAgIGZpcnN0ID0gTlVMTDsJCQkJCQkJICAgICAgXAorICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJX2VsZW0tPm5leHQtPnByZXZpb3VzID0gX2VsZW0tPnByZXZpb3VzOwkJCSAgICAgIFwKKwlfZWxlbS0+cHJldmlvdXMtPm5leHQgPSBfZWxlbS0+bmV4dDsJCQkJICAgICAgXAorCWlmICh1bmxpa2VseSAoZmlyc3QgPT0gX2VsZW0pKQkJCQkJICAgICAgXAorCSAgZmlyc3QgPSBfZWxlbS0+bmV4dDsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICAgICBhc3NlcnQgKChfZWxlbS0+bmV4dCA9IF9lbGVtLT5wcmV2aW91cyA9IE5VTEwsIDEpKTsJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBBZGQgZWxlbWVudCB0byB0aGUgZnJvbnQgb2YgYSBzaW5nbGUtbGlua2VkIGxpc3QuICAqLworI2RlZmluZSBTTkdMX0xJU1RfUFVTSChmaXJzdCwgbmV3cCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIF9fdHlwZW9mIChuZXdwKSBfbmV3cCA9IChuZXdwKTsJCQkJCSAgICAgIFwKKyAgICBhc3NlcnQgKF9uZXdwLT5uZXh0ID09IE5VTEwpOwkJCQkJICAgICAgXAorICAgIF9uZXdwLT5uZXh0ID0gZmlyc3Q7CQkJCQkJICAgICAgXAorICAgIGZpcnN0ID0gX25ld3A7CQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBBZGQgZWxlbWVudCB0byB0aGUgcmVhciBvZiBhIGNpcmN1bGFyIHNpbmdsZS1saW5rZWQgbGlzdC4gICovCisjZGVmaW5lIENTTkdMX0xJU1RfQUREX1JFQVIoZmlyc3QsIG5ld3ApIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3R5cGVvZiAobmV3cCkgX25ld3AgPSAobmV3cCk7CQkJCQkgICAgICBcCisgICAgYXNzZXJ0IChfbmV3cC0+bmV4dCA9PSBOVUxMKTsJCQkJCSAgICAgIFwKKyAgICBpZiAodW5saWtlbHkgKChmaXJzdCkgPT0gTlVMTCkpCQkJCQkgICAgICBcCisgICAgICAoZmlyc3QpID0gX25ld3AtPm5leHQgPSBfbmV3cDsJCQkJCSAgICAgIFwKKyAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCV9uZXdwLT5uZXh0ID0gKGZpcnN0KS0+bmV4dDsJCQkJCSAgICAgIFwKKwkoZmlyc3QpID0gKGZpcnN0KS0+bmV4dCA9IF9uZXdwOwkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKyNlbmRpZgkvKiBsaXN0LmggKi8KZGlmZiAtLWdpdCBhL2xpYi9uZXh0X3ByaW1lLmMgYi9saWIvbmV4dF9wcmltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjA4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV4dF9wcmltZS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIERldGVybWluZSBwcmltZSBudW1iZXIuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8qIFRlc3Qgd2hldGhlciBDQU5ESURBVEUgaXMgYSBwcmltZS4gICovCitzdGF0aWMgaW50Citpc19wcmltZSAoc2l6ZV90IGNhbmRpZGF0ZSkKK3sKKyAgLyogTm8gZXZlbiBudW1iZXIgYW5kIG5vbmUgbGVzcyB0aGFuIDEwIHdpbGwgYmUgcGFzc2VkIGhlcmUuICAqLworICBzaXplX3QgZGl2biA9IDM7CisgIHNpemVfdCBzcSA9IGRpdm4gKiBkaXZuOworCisgIHdoaWxlIChzcSA8IGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUgJSBkaXZuICE9IDApCisgICAgeworICAgICAgc2l6ZV90IG9sZF9zcSA9IHNxOworICAgICAgKytkaXZuOworICAgICAgc3EgKz0gNCAqIGRpdm47CisgICAgICBpZiAoc3EgPCBvbGRfc3EpCisJcmV0dXJuIDE7CisgICAgICArK2Rpdm47CisgICAgfQorCisgIHJldHVybiBjYW5kaWRhdGUgJSBkaXZuICE9IDA7Cit9CisKKworLyogV2UgbmVlZCBwcmltZXMgZm9yIHRoZSB0YWJsZSBzaXplLiAgKi8KK3NpemVfdAorbmV4dF9wcmltZSAoc2l6ZV90IHNlZWQpCit7CisgIC8qIE1ha2UgaXQgZGVmaW5pdGVseSBvZGQuICAqLworICBzZWVkIHw9IDE7CisKKyAgd2hpbGUgKCFpc19wcmltZSAoc2VlZCkpCisgICAgc2VlZCArPSAyOworCisgIHJldHVybiBzZWVkOworfQpkaWZmIC0tZ2l0IGEvbGliL3N5c3RlbS5oIGIvbGliL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOWMyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3lzdGVtLmgKQEAgLTAsMCArMSw0MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBMSUJfU1lTVEVNX0gKKyNkZWZpbmUgTElCX1NZU1RFTV9ICTEKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitleHRlcm4gdm9pZCAqeG1hbGxvYyAoc2l6ZV90KSBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpOworZXh0ZXJuIHZvaWQgKnhjYWxsb2MgKHNpemVfdCwgc2l6ZV90KSBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpOworZXh0ZXJuIHZvaWQgKnhyZWFsbG9jICh2b2lkICosIHNpemVfdCkgX19hdHRyaWJ1dGVfXyAoKF9fbWFsbG9jX18pKTsKKworZXh0ZXJuIGNoYXIgKnhzdHJkdXAgKGNvbnN0IGNoYXIgKikgX19hdHRyaWJ1dGVfXyAoKF9fbWFsbG9jX18pKTsKK2V4dGVybiBjaGFyICp4c3RybmR1cCAoY29uc3QgY2hhciAqLCBzaXplX3QpIF9fYXR0cmlidXRlX18gKChfX21hbGxvY19fKSk7CisKKworZXh0ZXJuIHVpbnQzMl90IGNyYzMyICh1aW50MzJfdCBjcmMsIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitleHRlcm4gaW50IGNyYzMyX2ZpbGUgKGludCBmZCwgdWludDMyX3QgKnJlc3ApOworCisvKiBBIHNwZWNpYWwgZ2V0dGV4dCBmdW5jdGlvbiB3ZSB1c2UgaWYgdGhlIHN0cmluZ3MgYXJlIHRvbyBzaG9ydC4gICovCisjZGVmaW5lIHNnZXR0ZXh0KFN0cikgXAorICAoeyBjb25zdCBjaGFyICpfX3JlcyA9IHN0cnJjaHIgKGdldHRleHQgKFN0ciksICd8Jyk7CQkJICAgICAgXAorICAgICBfX3JlcyA/IF9fcmVzICsgMSA6IFN0cjsgfSkKKworI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyKSBTdHIKKworI2VuZGlmIC8qIHN5c3RlbS5oICovCmRpZmYgLS1naXQgYS9saWIveG1hbGxvYy5jIGIvbGliL3htYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTM0ZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3htYWxsb2MuYwpAQCAtMCwwICsxLDY4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAic3lzdGVtLmgiCisKKyNpZm5kZWYgXworIyBkZWZpbmUgXyhzdHIpIGdldHRleHQgKHN0cikKKyNlbmRpZgorCisKKy8qIEFsbG9jYXRlIE4gYnl0ZXMgb2YgbWVtb3J5IGR5bmFtaWNhbGx5LCB3aXRoIGVycm9yIGNoZWNraW5nLiAgKi8KK3ZvaWQgKgoreG1hbGxvYyAobikKKyAgICAgc2l6ZV90IG47Cit7CisgIHZvaWQgKnA7CisKKyAgcCA9IG1hbGxvYyAobik7CisgIGlmIChwID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgXygibWVtb3J5IGV4aGF1c3RlZCIpKTsKKyAgcmV0dXJuIHA7Cit9CisKKworLyogQWxsb2NhdGUgbWVtb3J5IGZvciBOIGVsZW1lbnRzIG9mIFMgYnl0ZXMsIHdpdGggZXJyb3IgY2hlY2tpbmcuICAqLwordm9pZCAqCit4Y2FsbG9jIChuLCBzKQorICAgICBzaXplX3QgbiwgczsKK3sKKyAgdm9pZCAqcDsKKworICBwID0gY2FsbG9jIChuLCBzKTsKKyAgaWYgKHAgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBfKCJtZW1vcnkgZXhoYXVzdGVkIikpOworICByZXR1cm4gcDsKK30KKworCisvKiBDaGFuZ2UgdGhlIHNpemUgb2YgYW4gYWxsb2NhdGVkIGJsb2NrIG9mIG1lbW9yeSBQIHRvIE4gYnl0ZXMsCisgICB3aXRoIGVycm9yIGNoZWNraW5nLiAgKi8KK3ZvaWQgKgoreHJlYWxsb2MgKHAsIG4pCisgICAgIHZvaWQgKnA7CisgICAgIHNpemVfdCBuOworeworICBwID0gcmVhbGxvYyAocCwgbik7CisgIGlmIChwID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgXygibWVtb3J5IGV4aGF1c3RlZCIpKTsKKyAgcmV0dXJuIHA7Cit9CmRpZmYgLS1naXQgYS9saWIveHN0cmR1cC5jIGIvbGliL3hzdHJkdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDcwYTYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3hzdHJkdXAuYwpAQCAtMCwwICsxLDI3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic3lzdGVtLmgiCisKKworLyogUmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIGNvcHkgb2YgU1RSSU5HLiAgKi8KK2NoYXIgKgoreHN0cmR1cCAoc3RyaW5nKQorICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHJldHVybiBzdHJjcHkgKHhtYWxsb2MgKHN0cmxlbiAoc3RyaW5nKSArIDEpLCBzdHJpbmcpOworfQpkaWZmIC0tZ2l0IGEvbGliL3hzdHJuZHVwLmMgYi9saWIveHN0cm5kdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDZmMzYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3hzdHJuZHVwLmMKQEAgLTAsMCArMSwzMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisKKy8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBjb3B5IG9mIFNUUklORy4gICovCitjaGFyICoKK3hzdHJuZHVwIChzdHJpbmcsIG4pCisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICAgc2l6ZV90IG47Cit7CisgIGNoYXIgKnJlczsKKyAgc2l6ZV90IGxlbiA9IHN0cm5sZW4gKHN0cmluZywgbik7CisgICooKGNoYXIgKikgbWVtcGNweSAoKHJlcyA9IHhtYWxsb2MgKGxlbiArIDEpKSwgc3RyaW5nLCBsZW4pKSA9ICdcMCc7CisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9saWJhc20vLmN2c2lnbm9yZSBiL2xpYmFzbS8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODQ1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbGliYXNtL0NoYW5nZUxvZyBiL2xpYmFzbS9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3YjQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9DaGFuZ2VMb2cKQEAgLTAsMCArMSw1MiBAQAorMjAwNS0wMi0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlIChBTV9DRkxBR1MpOiBBZGQgLVd1bnVzZWQgLVdleHRyYSAtV2Zvcm1hdD0yLgorCisJKiBhc21fZW5kLmMgKHRleHRfZW5kKTogTWFyayBwYXJhbWV0ZXIgYXMgcG9zc2libHkgdW51c2VkLgorCisyMDA1LTAyLTA2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IFJlbW92ZSBsaW50IGhhbmRsaW5nLgorCisyMDA1LTAyLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogYXNtX2VuZC5jIChiaW5hcnlfZW5kKTogRG9uJ3QgdGVybWluYXRlIHdpdGggZXJyb3IoKSBpbiBjYXNlCisJc29tZXRoaW5nIGdvZXMgd3JvbmcuCisKKwkqIE1ha2VmaWxlLmFtOiBDaGVjayBmb3IgdGV4dCByZWxvY2F0aW9ucyBpbiBjb25zdHJ1Y3RlZCBEU08uCisKKwkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBNb3JlIHdhcm5pbmdzLiAgQWRkIC1mbXVkZmxhcCBmb3IgTVVERkxBUC4KKworCSogYXNtX2VuZC5jIChiaW5hcnlfZW5kKTogUmVtb3ZlIHNoYWRvd2luZyB2YXJpYWJsZXMuCisJTGl0dGxlIGNsZWFudXBzLgorCisJKiBhc21fbmV3c3ltLmM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0cmluZyBwYXJhbWV0ZXIuCisKKzIwMDUtMDItMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBhc21fbmV3c2NuX2luZ3JwLmMgKGFzbV9uZXdzY25faW5ncnApOiBVc2UgSU5UVVNFIHRvIHJlZmVyZW5jZQorCWFzbV9uZXdzY24uCisKKzIwMDQtMDktMjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBhc21fZXJyb3IuYzogTWFrZSBjb21waWxlIHdpdGggZ2NjIDQuMC4KKworMjAwNC0wMS0yMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggbXVkZmxhcC4KKworMjAwNC0wMS0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGxpYmFzbVAuaCAoXyk6IFVzZSBlbGZ1dGlscyBkb21haW4uCisKKzIwMDQtMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBidWlsZGluZyB3aXRoIG11ZGZsYXAuCisKKzIwMDMtMDgtMTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5pbjogRGVwZW5kIG9uIGxpYmVibC5hLCBub3QgbGliZWJsLnNvLgorCisyMDAzLTA4LTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTW92ZWQgdG8gQ1ZTIGFyY2hpdmUuCmRpZmYgLS1naXQgYS9saWJhc20vTWFrZWZpbGUuYW0gYi9saWJhc20vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiMTlkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDg2IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGNyZWF0ZSBNYWtlZmlsZS5pbgorIyMKKyMjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisjIworIyMgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworIyMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorIyMKKyMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworIyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisjIyBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisjIyBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyMjIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuCisjIworREVGUyA9IC1EX0dOVV9TT1VSQ0UgLURIQVZFX0NPTkZJR19ICitpZiBNVURGTEFQCitBTV9DRkxBR1MgPSAtZm11ZGZsYXAKK2Vsc2UKK0FNX0NGTEFHUyA9CitlbmRpZgorQU1fQ0ZMQUdTICs9IC1XYWxsIC1Xc2hhZG93IC1XZXJyb3IgLVd1bnVzZWQgLVdleHRyYSAtV2Zvcm1hdD0yCitJTkNMVURFUyA9IC1JLiAtSSQoc3JjZGlyKSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9saWJlbGYgLUkkKHRvcF9zcmNkaXIpL2xpYmVibCBcCisJICAgLUkkKHRvcF9zcmNkaXIpL2xpYgorR0NDX0lOQ0xVREUgPSAtSSQoc2hlbGwgJChDQykgLXByaW50LWZpbGUtbmFtZT1pbmNsdWRlKQorVkVSU0lPTiA9IDEKKworbGliX0xJQlJBUklFUyA9IGxpYmFzbS5hCitpZiAhTVVERkxBUAorbm9pbnN0X0xJQlJBUklFUyA9IGxpYmFzbV9waWMuYQorbm9pbnN0X1BST0dSQU1TID0gJChub2luc3RfTElCUkFSSUVTOl9waWMuYT0uc28pCitlbmRpZgorZXVpbmNsdWRlZGlyID0gJHtpbmNsdWRlZGlyfS9lbGZ1dGlscworZXVpbmNsdWRlX0hFQURFUlMgPSBsaWJhc20uaAorCitsaWJhc21fYV9TT1VSQ0VTID0gYXNtX2JlZ2luLmMgYXNtX2Fib3J0LmMgYXNtX2VuZC5jIGFzbV9lcnJvci5jIFwKKwkJICAgYXNtX2dldGVsZi5jIGFzbV9uZXdzY24uYyBhc21fbmV3c2NuX2luZ3JwLmMgXAorCQkgICBhc21fbmV3c3Vic2NuLmMgYXNtX25ld3N5bS5jIGFzbV9uZXdjb21zeW0uYyBcCisJCSAgIGFzbV9uZXdhYnNzeW0uYyBcCisJCSAgIGFzbV9uZXdzY25ncnAuYyBhc21fc2NuZ3JwX25ld3NpZ25hdHVyZS5jIFwKKwkJICAgYXNtX2ZpbGwuYyBhc21fYWxpZ24uYyBhc21fYWRkc3Ryei5jIFwKKwkJICAgYXNtX2FkZGludDguYyBhc21fYWRkdWludDguYyBcCisJCSAgIGFzbV9hZGRpbnQxNi5jIGFzbV9hZGR1aW50MTYuYyBcCisJCSAgIGFzbV9hZGRpbnQzMi5jIGFzbV9hZGR1aW50MzIuYyBcCisJCSAgIGFzbV9hZGRpbnQ2NC5jIGFzbV9hZGR1aW50NjQuYyBcCisJCSAgIGFzbV9hZGR1bGViMTI4LmMgYXNtX2FkZHNsZWIxMjguYyBcCisJCSAgIHN5bWJvbGhhc2guYworCitpZiAhTVVERkxBUAorbGliYXNtX3BpY19hX1NPVVJDRVMgPQorYW1fbGliYXNtX3BpY19hX09CSkVDVFMgPSAkKGxpYmFzbV9hX1NPVVJDRVM6LmM9Lm9zKQorCitsaWJhc21fc29fU09VUkNFUyA9CitsaWJhc20uc286IGxpYmFzbV9waWMuYSBsaWJhc20ubWFwCisJJChDQykgLXNoYXJlZCAtbyAkQCAtV2wsLS13aG9sZS1hcmNoaXZlLCQ8LC0tbm8td2hvbGUtYXJjaGl2ZSBcCisJICAgICAgLVdsLC0tdmVyc2lvbi1zY3JpcHQsJChzcmNkaXIpL2xpYmFzbS5tYXAsLS1uby11bmRlZmluZWQgXAorCSAgICAgIC1XbCwtLXNvbmFtZSwkQC4kKFZFUlNJT04pIFwKKwkgICAgICAuLi9saWJlYmwvbGliZWJsLmEgLi4vbGliZWxmL2xpYmVsZi5zbworCWlmIHJlYWRlbGYgLWQgJEAgfCBmZ3JlcCAtcSBURVhUUkVMOyB0aGVuIGV4aXQgMTsgZmkKKwlsbiAtZnMgJEAgJEAuJChWRVJTSU9OKQorCisKKyUub3M6ICUuYyAlLm8KKwlpZiAkKENPTVBJTEUpIC1jIC1vICRAIC1mcGljIC1EUElDIC1EU0hBUkVEIC1NVCAkQCAtTUQgLU1QIFwKKwkgIC1NRiAiJChERVBESVIpLyQqLlRwbyIgYHRlc3QgLWYgJyQ8JyB8fCBlY2hvICckKHNyY2RpcikvJ2AkPDsgXAorCXRoZW4gY2F0ICIkKERFUERJUikvJCouVHBvIiA+PiAiJChERVBESVIpLyQqLlBvIjsgXAorCSAgICAgcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBcCisJZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgXAorCWZpCisKK2luc3RhbGw6IGluc3RhbGwtYW0gbGliYXNtLnNvCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCisJJChJTlNUQUxMX1BST0dSQU0pIGxpYmFzbS5zbyAkKERFU1RESVIpJChsaWJkaXIpL2xpYmFzbS0kKFBBQ0tBR0VfVkVSU0lPTikuc28KKwlsbiAtZnMgbGliYXNtLSQoUEFDS0FHRV9WRVJTSU9OKS5zbyAkKERFU1RESVIpJChsaWJkaXIpL2xpYmFzbS5zby4kKFZFUlNJT04pCisJbG4gLWZzIGxpYmFzbS5zby4kKFZFUlNJT04pICQoREVTVERJUikkKGxpYmRpcikvbGliYXNtLnNvCisKK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisJcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJhc20tJChQQUNLQUdFX1ZFUlNJT04pLnNvCisJcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJhc20uc28uJChWRVJTSU9OKQorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliYXNtLnNvCisJcm1kaXIgLS1pZ25vcmUtZmFpbC1vbi1ub24tZW1wdHkgJChERVNURElSKSQoaW5jbHVkZWRpcikvZWxmdXRpbHMKK2VuZGlmCisKK25vaW5zdF9IRUFERVJTID0gbGliYXNtUC5oIHN5bWJvbGhhc2guaAorRVhUUkFfRElTVCA9IGxpYmFzbS5tYXAKKworQ0xFQU5GSUxFUyA9ICQoYW1fbGliYXNtX3BpY19hX09CSkVDVFMpCmRpZmYgLS1naXQgYS9saWJhc20vYXNtX2Fib3J0LmMgYi9saWJhc20vYXNtX2Fib3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1NzU3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9hc21fYWJvcnQuYwpAQCAtMCwwICsxLDQ1IEBACisvKiBBYm9ydCBvcGVyYXRpb25zIG9uIHRoZSBhc3NlbWJsZXIgY29udGV4dCwgZnJlZSBhbGwgcmVzb3VyY2VzLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxsaWJhc21QLmg+CisjaW5jbHVkZSA8bGliZWxmLmg+CisKKworaW50Cithc21fYWJvcnQgKGN0eCkKKyAgICAgQXNtQ3R4X3QgKmN0eDsKK3sKKyAgaWYgKGN0eCA9PSBOVUxMKQorICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nIGVhcmxpZXIuICAqLworICAgIHJldHVybiAtMTsKKworICBpZiAobGlrZWx5ICghIGN0eC0+dGV4dHApKQorICAgIC8qIEZpcnN0IGZyZWUgdGhlIEVMRiBmaWxlLiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVzdWx0LiAgKi8KKyAgICAodm9pZCkgZWxmX2VuZCAoY3R4LT5vdXQuZWxmKTsKKworICAvKiBOb3cgY2xvc2UgdGhlIHRlbXBvcmFyeSBmaWxlIGFuZCByZW1vdmUgaXQuICAqLworICAodm9pZCkgdW5saW5rIChjdHgtPnRtcF9mbmFtZSk7CisKKyAgLyogRnJlZSB0aGUgcmVzb3VyY2VzLiAgKi8KKyAgX19saWJhc21fZmluaWN0eCAoY3R4KTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fYWRkaW50MTYuYyBiL2xpYmFzbS9hc21fYWRkaW50MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODEyNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXNtL2FzbV9hZGRpbnQxNi5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIEFkZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2RlZmluZSBTSVpFIDE2CisKKyNpbmNsdWRlICJhc21fYWRkaW50OC5jIgpkaWZmIC0tZ2l0IGEvbGliYXNtL2FzbV9hZGRpbnQzMi5jIGIvbGliYXNtL2FzbV9hZGRpbnQzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YWMzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX2FkZGludDMyLmMKQEAgLTAsMCArMSwxNyBAQAorLyogQWRkIGludGVnZXIgdG8gYSBzZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjZGVmaW5lIFNJWkUgMzIKKworI2luY2x1ZGUgImFzbV9hZGRpbnQ4LmMiCmRpZmYgLS1naXQgYS9saWJhc20vYXNtX2FkZGludDY0LmMgYi9saWJhc20vYXNtX2FkZGludDY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkOTNmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9hc21fYWRkaW50NjQuYwpAQCAtMCwwICsxLDE3IEBACisvKiBBZGQgaW50ZWdlciB0byBhIHNlY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNkZWZpbmUgU0laRSA2NAorCisjaW5jbHVkZSAiYXNtX2FkZGludDguYyIKZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fYWRkaW50OC5jIGIvbGliYXNtL2FzbV9hZGRpbnQ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkOWJmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9hc21fYWRkaW50OC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiBBZGQgaW50ZWdlciB0byBhIHNlY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJhc21QLmg+CisKKyNpZm5kZWYgU0laRQorIyBkZWZpbmUgU0laRSA4CisjZW5kaWYKKworI2RlZmluZSBGQ1Qoc2l6ZSkgX0ZDVChzaXplKQorI2RlZmluZSBfRkNUKHNpemUpIGFzbV9hZGRpbnQjI3NpemUKKyNkZWZpbmUgVFlQRShzaXplKSBfVFlQRShzaXplKQorI2RlZmluZSBfVFlQRShzaXplKSBpbnQjI3NpemUjI190CisjZGVmaW5lIEJTV0FQKHNpemUpIF9CU1dBUChzaXplKQorI2RlZmluZSBfQlNXQVAoc2l6ZSkgYnN3YXBfIyNzaXplCisKKworaW50CitGQ1QoU0laRSkgKGFzbXNjbiwgbnVtKQorICAgICBBc21TY25fdCAqYXNtc2NuOworICAgICBUWVBFKFNJWkUpIG51bTsKK3sKKyAgaWYgKGFzbXNjbiA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBpZiAoYXNtc2NuLT50eXBlID09IFNIVF9OT0JJVFMgJiYgdW5saWtlbHkgKG51bSAhPSAwKSkKKyAgICB7CisgICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfVFlQRSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmICh1bmxpa2VseSAoYXNtc2NuLT5jdHgtPnRleHRwKSkKKyAgICB7CisgICAgICAvLyBYWFggTmVlZHMgdG8gdXNlIGJhY2tlbmQgc3BlY2lmaWVkIHBzZXVkby1vcHMKKyAgICAgIGlmIChTSVpFID09IDgpCisJcHJpbnRmICgiXHQuYnl0ZVx0JSIgUFJJZDggIlxuIiwgKGludDhfdCkgbnVtKTsKKyAgICAgIGVsc2UgaWYgKFNJWkUgPT0gMTYpCisJcHJpbnRmICgiXHQudmFsdWVcdCUiIFBSSWQxNiAiXG4iLCAoaW50MTZfdCkgbnVtKTsKKyAgICAgIGVsc2UgaWYgKFNJWkUgPT0gMzIpCisJcHJpbnRmICgiXHQubG9uZ1x0JSIgUFJJZDMyICJcbiIsIChpbnQzMl90KSBudW0pOworICAgICAgZWxzZQorCXsKKwkgIC8vIFhYWCBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgZm9yIDY0LWJpdCBtYWNoaW5lcworCSAgYm9vbCBpc19sZWIgPSAoZWxmX2dldGlkZW50IChhc21zY24tPmN0eC0+b3V0LmVsZiwgTlVMTClbRUlfREFUQV0KKwkJCSA9PSBFTEZEQVRBMkxTQik7CisKKwkgIHByaW50ZiAoIlx0LmxvbmdcdCUiIFBSSWQzMiAiXG5cdC5sb25nXHQlIiBQUklkMzIgIlxuIiwKKwkJICAoaW50MzJfdCkgKGlzX2xlYgorCQkJICAgICA/IG51bSAlIDB4MTAwMDAwMDAwbGwgOiBudW0gLyAweDEwMDAwMDAwMGxsKSwKKwkJICAoaW50MzJfdCkgKGlzX2xlYgorCQkJICAgICA/IG51bSAvIDB4MTAwMDAwMDAwbGwgOiBudW0gJSAweDEwMDAwMDAwMGxsKSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZiBTSVpFID4gOAorICAgICAgYm9vbCBpc19sZWIgPSAoZWxmX2dldGlkZW50IChhc21zY24tPmN0eC0+b3V0LmVsZiwgTlVMTClbRUlfREFUQV0KKwkJICAgICA9PSBFTEZEQVRBMkxTQik7CisjZW5kaWYKKyAgICAgIFRZUEUoU0laRSkgdmFyID0gbnVtOworCisgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggcm9vbS4gICovCisgICAgICBpZiAoX19saWJhc21fZW5zdXJlX3NlY3Rpb25fc3BhY2UgKGFzbXNjbiwgU0laRSAvIDgpICE9IDApCisJcmV0dXJuIC0xOworCisjaWYgU0laRSA+IDgKKyAgICAgIGlmICgoQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOICYmICFpc19sZWIpCisJICB8fCAoQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOICYmIGlzX2xlYikpCisJdmFyID0gQlNXQVAoU0laRSkgKHZhcik7CisjZW5kaWYKKworICAgICAgLyogQ29weSB0aGUgdmFyaWFibGUgdmFsdWUuICAqLworICAgICAgaWYgKGxpa2VseSAoYXNtc2NuLT50eXBlID09IFNIVF9OT0JJVFMpKQorCW1lbWNweSAoJmFzbXNjbi0+Y29udGVudC0+ZGF0YVthc21zY24tPmNvbnRlbnQtPmxlbl0sICZ2YXIsIFNJWkUgLyA4KTsKKworICAgICAgLyogQWRqdXN0IHRoZSBwb2ludGVyIGluIHRoZSBkYXRhIGJ1ZmZlci4gICovCisgICAgICBhc21zY24tPmNvbnRlbnQtPmxlbiArPSBTSVpFIC8gODsKKworICAgICAgLyogSW5jcmVtZW50IHRoZSBvZmZzZXQgaW4gdGhlIChzdWIpc2VjdGlvbi4gICovCisgICAgICBhc21zY24tPm9mZnNldCArPSBTSVpFIC8gODsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CitJTlRERUYoRkNUKFNJWkUpKQpkaWZmIC0tZ2l0IGEvbGliYXNtL2FzbV9hZGRzbGViMTI4LmMgYi9saWJhc20vYXNtX2FkZHNsZWIxMjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjYxYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXNtL2FzbV9hZGRzbGViMTI4LmMKQEAgLTAsMCArMSw4NCBAQAorLyogQWRkIHNpZ25lZCBsaXR0bGUgZW5kaWFuIGJhc2UgMTI4IGludGVnZXIgdG8gYSBzZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmFzbVAuaD4KKworCitpbnQKK2FzbV9hZGRzbGViMTI4IChhc21zY24sIG51bSkKKyAgICAgQXNtU2NuX3QgKmFzbXNjbjsKKyAgICAgaW50MzJfdCBudW07Cit7CisgIGlmIChhc21zY24gPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGFzbXNjbi0+dHlwZSA9PSBTSFRfTk9CSVRTICYmIHVubGlrZWx5IChudW0gIT0gMCkpCisgICAgeworICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX1RZUEUpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAodW5saWtlbHkgKGFzbXNjbi0+Y3R4LT50ZXh0cCkpCisgICAgcHJpbnRmICgiXHQuc2xlYjEyOFx0JSIgUFJJZDMyICJcbiIsIG51bSk7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyIHRtcGJ1Zlsoc2l6ZW9mIChudW0pICogOCArIDYpIC8gN107CisgICAgICBjaGFyICpkZXN0ID0gdG1wYnVmOworICAgICAgdWludDMyX3QgYnl0ZTsKKyAgICAgIGludDMyX3QgZW5kdmFsID0gbnVtID4+IDMxOworCisgICAgICBpZiAobnVtID09IDApCisJYnl0ZSA9IDA7CisgICAgICBlbHNlCisJd2hpbGUgKDEpCisJICB7CisJICAgIGJ5dGUgPSBudW0gJiAweDdmOworCisJICAgIG51bSA+Pj0gNzsKKwkgICAgaWYgKG51bSA9PSBlbmR2YWwpCisJICAgICAgLyogVGhpcyBpcyB0aGUgbGFzdCBieXRlLiAgKi8KKwkgICAgICBicmVhazsKKworCSAgICAqZGVzdCsrID0gYnl0ZSB8IDB4ODA7CisJICB9CisKKyAgICAgICpkZXN0KysgPSBieXRlOworCisgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcHJvZHVjZWQuICAqLworICAgICAgc2l6ZV90IG5ieXRlcyA9IGRlc3QgLSB0bXBidWY7CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCByb29tLiAgKi8KKyAgICAgIGlmIChfX2xpYmFzbV9lbnN1cmVfc2VjdGlvbl9zcGFjZSAoYXNtc2NuLCBuYnl0ZXMpICE9IDApCisJcmV0dXJuIC0xOworCisgICAgICAvKiBDb3B5IHRoZSBieXRlcy4gICovCisgICAgICBpZiAobGlrZWx5IChhc21zY24tPnR5cGUgIT0gU0hUX05PQklUUykpCisJbWVtY3B5ICgmYXNtc2NuLT5jb250ZW50LT5kYXRhW2FzbXNjbi0+Y29udGVudC0+bGVuXSwgdG1wYnVmLCBuYnl0ZXMpOworCisgICAgICAvKiBBZGp1c3QgdGhlIHBvaW50ZXIgaW4gdGhlIGRhdGEgYnVmZmVyLiAgKi8KKyAgICAgIGFzbXNjbi0+Y29udGVudC0+bGVuICs9IG5ieXRlczsKKworICAgICAgLyogSW5jcmVtZW50IHRoZSBvZmZzZXQgaW4gdGhlIChzdWIpc2VjdGlvbi4gICovCisgICAgICBhc21zY24tPm9mZnNldCArPSBuYnl0ZXM7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXNtL2FzbV9hZGRzdHJ6LmMgYi9saWJhc20vYXNtX2FkZHN0cnouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTgzYjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXNtL2FzbV9hZGRzdHJ6LmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qIEFkZCBzdHJpbmcgdG8gYSBzZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGliYXNtUC5oPgorCisKKy8qIEFkZCB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nIFNUUiBvZiBzaXplIExFTiB0byAoc3ViKXNlY3Rpb24gQVNNU0NOLiAgKi8KK2ludAorYXNtX2FkZHN0cnogKGFzbXNjbiwgc3RyLCBsZW4pCisgICAgIEFzbVNjbl90ICphc21zY247CisgICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgICAgc2l6ZV90IGxlbjsKK3sKKyAgaWYgKGFzbXNjbiA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBpZiAodW5saWtlbHkgKGFzbXNjbi0+dHlwZSA9PSBTSFRfTk9CSVRTKSkKKyAgICB7CisgICAgICBpZiAobGVuID09IDApCisJeworCSAgaWYgKHN0clswXSAhPSAnXDAnKQorCSAgICB7CisJICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX1RZUEUpOworCSAgICAgIHJldHVybiAtMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBzaXplX3QgY250OworCisJICBmb3IgKGNudCA9IDA7IGNudCA8IGxlbjsgKytjbnQpCisJICAgIGlmIChzdHJbY250XSAhPSAnXDAnKQorCSAgICAgIHsKKwkJX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX1RZUEUpOworCQlyZXR1cm4gLTE7CisJICAgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGxlbiA9PSAwKQorICAgIGxlbiA9IHN0cmxlbiAoc3RyKSArIDE7CisKKyAgaWYgKHVubGlrZWx5IChhc21zY24tPmN0eC0+dGV4dHApKQorICAgIHsKKyAgICAgIGJvb2wgbmV4dGxpbmUgPSB0cnVlOworCisgICAgICBkbworCXsKKwkgIGlmIChuZXh0bGluZSkKKwkgICAgeworCSAgICAgIGZwdXRzICgiXHQuc3RyaW5nXHRcIiIsIGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSk7CisJICAgICAgbmV4dGxpbmUgPSBmYWxzZTsKKwkgICAgfQorCisJICBpZiAoKnN0ciA9PSAnXDAnKQorCSAgICBmcHV0cyAoIlxcMDAwIiwgYXNtc2NuLT5jdHgtPm91dC5maWxlKTsKKwkgIGVsc2UgaWYgKCEgaXNhc2NpaSAoKnN0cikpCisJICAgIGZwcmludGYgKGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSwgIlxcJTAzbyIsCisJCSAgICAgKHVuc2lnbmVkIGludCkgKigodW5zaWduZWQgY2hhciAqKXN0cikpOworCSAgZWxzZSBpZiAoKnN0ciA9PSAnXFwnKQorCSAgICBmcHV0cyAoIlxcXFwiLCBhc21zY24tPmN0eC0+b3V0LmZpbGUpOworCSAgZWxzZSBpZiAoKnN0ciA9PSAnXG4nKQorCSAgICB7CisJICAgICAgZnB1dHMgKCJcXG5cIiIsIGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSk7CisJICAgICAgbmV4dGxpbmUgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIGZwdXRjICgqc3RyLCBhc21zY24tPmN0eC0+b3V0LmZpbGUpOworCisJICArK3N0cjsKKwl9CisgICAgICB3aGlsZSAoLS1sZW4gPiAwICYmIChsZW4gPiAxIHx8ICpzdHIgIT0gJ1wwJykpOworCisgICAgICBpZiAoISBuZXh0bGluZSkKKwlmcHV0cyAoIlwiXG4iLCBhc21zY24tPmN0eC0+b3V0LmZpbGUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbS4gICovCisgICAgICBpZiAoX19saWJhc21fZW5zdXJlX3NlY3Rpb25fc3BhY2UgKGFzbXNjbiwgbGVuKSAhPSAwKQorCXJldHVybiAtMTsKKworICAgICAgLyogQ29weSB0aGUgc3RyaW5nLiAgKi8KKyAgICAgIG1lbWNweSAoJmFzbXNjbi0+Y29udGVudC0+ZGF0YVthc21zY24tPmNvbnRlbnQtPmxlbl0sIHN0ciwgbGVuKTsKKworICAgICAgLyogQWRqdXN0IHRoZSBwb2ludGVyIGluIHRoZSBkYXRhIGJ1ZmZlci4gICovCisgICAgICBhc21zY24tPmNvbnRlbnQtPmxlbiArPSBsZW47CisKKyAgICAgIC8qIEluY3JlbWVudCB0aGUgb2Zmc2V0IGluIHRoZSAoc3ViKXNlY3Rpb24uICAqLworICAgICAgYXNtc2NuLT5vZmZzZXQgKz0gbGVuOworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fYWRkdWludDE2LmMgYi9saWJhc20vYXNtX2FkZHVpbnQxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMWU2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX2FkZHVpbnQxNi5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIEFkZCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2RlZmluZSBTSVpFIDE2CisKKyNpbmNsdWRlICJhc21fYWRkdWludDguYyIKZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fYWRkdWludDMyLmMgYi9saWJhc20vYXNtX2FkZHVpbnQzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMjU3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX2FkZHVpbnQzMi5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIEFkZCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2RlZmluZSBTSVpFIDMyCisKKyNpbmNsdWRlICJhc21fYWRkdWludDguYyIKZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fYWRkdWludDY0LmMgYi9saWJhc20vYXNtX2FkZHVpbnQ2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZGE0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX2FkZHVpbnQ2NC5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIEFkZCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2RlZmluZSBTSVpFIDY0CisKKyNpbmNsdWRlICJhc21fYWRkdWludDguYyIKZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fYWRkdWludDguYyBiL2xpYmFzbS9hc21fYWRkdWludDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZiMzQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXNtL2FzbV9hZGR1aW50OC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIEFkZCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmFzbVAuaD4KKworI2lmbmRlZiBTSVpFCisjIGRlZmluZSBTSVpFIDgKKyNlbmRpZgorCisjZGVmaW5lIFVGQ1Qoc2l6ZSkgX1VGQ1Qoc2l6ZSkKKyNkZWZpbmUgX1VGQ1Qoc2l6ZSkgYXNtX2FkZHVpbnQjI3NpemUKKyNkZWZpbmUgRkNUKHNpemUpIF9GQ1Qoc2l6ZSkKKyNkZWZpbmUgX0ZDVChzaXplKSBhc21fYWRkaW50IyNzaXplCisjZGVmaW5lIFVUWVBFKHNpemUpIF9VVFlQRShzaXplKQorI2RlZmluZSBfVVRZUEUoc2l6ZSkgdWludCMjc2l6ZSMjX3QKKyNkZWZpbmUgVFlQRShzaXplKSBfVFlQRShzaXplKQorI2RlZmluZSBfVFlQRShzaXplKSBpbnQjI3NpemUjI190CisKKworaW50CitVRkNUKFNJWkUpIChhc21zY24sIG51bSkKKyAgICAgQXNtU2NuX3QgKmFzbXNjbjsKKyAgICAgVVRZUEUoU0laRSkgbnVtOworeworICByZXR1cm4gSU5UVVNFKEZDVChTSVpFKSkgKGFzbXNjbiwgKFRZUEUoU0laRSkpIG51bSk7Cit9CmRpZmYgLS1naXQgYS9saWJhc20vYXNtX2FkZHVsZWIxMjguYyBiL2xpYmFzbS9hc21fYWRkdWxlYjEyOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMWQyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX2FkZHVsZWIxMjguYwpAQCAtMCwwICsxLDgwIEBACisvKiBBZGQgaW50ZWdlciB0byBhIHNlY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXNtUC5oIgorCisKK2ludAorYXNtX2FkZHVsZWIxMjggKGFzbXNjbiwgbnVtKQorICAgICBBc21TY25fdCAqYXNtc2NuOworICAgICB1aW50MzJfdCBudW07Cit7CisgIGlmIChhc21zY24gPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGFzbXNjbi0+dHlwZSA9PSBTSFRfTk9CSVRTICYmIHVubGlrZWx5IChudW0gIT0gMCkpCisgICAgeworICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX1RZUEUpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAodW5saWtlbHkgKGFzbXNjbi0+Y3R4LT50ZXh0cCkpCisgICAgcHJpbnRmICgiXHQudWxlYjEyOFx0JSIgUFJJdTMyICJcbiIsIG51bSk7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyIHRtcGJ1Zlsoc2l6ZW9mIChudW0pICogOCArIDYpIC8gN107CisgICAgICBjaGFyICpkZXN0ID0gdG1wYnVmOworICAgICAgdWludDMyX3QgYnl0ZTsKKworICAgICAgd2hpbGUgKDEpCisJeworCSAgYnl0ZSA9IG51bSAmIDB4N2Y7CisKKwkgIG51bSA+Pj0gNzsKKwkgIGlmIChudW0gPT0gMCkKKwkgICAgLyogVGhpcyBpcyB0aGUgbGFzdCBieXRlLiAgKi8KKwkgICAgYnJlYWs7CisKKwkgICpkZXN0KysgPSBieXRlIHwgMHg4MDsKKwl9CisKKyAgICAgICpkZXN0KysgPSBieXRlOworCisgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcHJvZHVjZWQuICAqLworICAgICAgc2l6ZV90IG5ieXRlcyA9IGRlc3QgLSB0bXBidWY7CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCByb29tLiAgKi8KKyAgICAgIGlmIChfX2xpYmFzbV9lbnN1cmVfc2VjdGlvbl9zcGFjZSAoYXNtc2NuLCBuYnl0ZXMpICE9IDApCisJcmV0dXJuIC0xOworCisgICAgICAvKiBDb3B5IHRoZSBieXRlcy4gICovCisgICAgICBpZiAobGlrZWx5IChhc21zY24tPnR5cGUgIT0gU0hUX05PQklUUykpCisJbWVtY3B5ICgmYXNtc2NuLT5jb250ZW50LT5kYXRhW2FzbXNjbi0+Y29udGVudC0+bGVuXSwgdG1wYnVmLCBuYnl0ZXMpOworCisgICAgICAvKiBBZGp1c3QgdGhlIHBvaW50ZXIgaW4gdGhlIGRhdGEgYnVmZmVyLiAgKi8KKyAgICAgIGFzbXNjbi0+Y29udGVudC0+bGVuICs9IG5ieXRlczsKKworICAgICAgLyogSW5jcmVtZW50IHRoZSBvZmZzZXQgaW4gdGhlIChzdWIpc2VjdGlvbi4gICovCisgICAgICBhc21zY24tPm9mZnNldCArPSBuYnl0ZXM7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXNtL2FzbV9hbGlnbi5jIGIvbGliYXNtL2FzbV9hbGlnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzUwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX2FsaWduLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qIEFsaWduIHNlY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPGxpYmFzbVAuaD4KKyNpbmNsdWRlIDxzeXN0ZW0uaD4KKworCitpbnQKK2FzbV9hbGlnbiAoYXNtc2NuLCB2YWx1ZSkKKyAgICAgQXNtU2NuX3QgKmFzbXNjbjsKKyAgICAgR0VsZl9Xb3JkIHZhbHVlOworeworICBpZiAoYXNtc2NuID09IE5VTEwpCisgICAgLyogQW4gZWFybGllciBlcnJvci4gICovCisgICAgcmV0dXJuIC0xOworCisgICAgICAvKiBUaGUgYWxpZ25tZW50IHZhbHVlIG11c3QgYmUgYSBwb3dlciBvZiB0d28uICAqLworICBpZiAodW5saWtlbHkgKCEgcG93ZXJvZjIgKHZhbHVlKSkpCisgICAgeworICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0lOVkFMSUQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByd2xvY2tfd3Jsb2NrIChhc21zY24tPmN0eC0+bG9jayk7CisKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgLyogRmlsbGJ5dGVzIG5lY2Vzc2FyeT8gICovCisgIGlmICgoYXNtc2NuLT5vZmZzZXQgJiAodmFsdWUgLSAxKSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBBZGQgZmlsbGJ5dGVzLiAgKi8KKyAgICAgIHNpemVfdCBjbnQ7CisgICAgICBzaXplX3QgYnl0ZXB0cjsKKworICAgICAgY250ID0gdmFsdWUgLSAoYXNtc2NuLT5vZmZzZXQgJiAodmFsdWUgLSAxKSk7CisKKyAgICAgIC8qIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byBhZGQgdGhlIGZpbGwgYnl0ZXMuICAqLworICAgICAgcmVzdWx0ID0gX19saWJhc21fZW5zdXJlX3NlY3Rpb25fc3BhY2UgKGFzbXNjbiwgY250KTsKKyAgICAgIGlmIChyZXN1bHQgIT0gMCkKKwlnb3RvIG91dDsKKworICAgICAgLyogRmlsbCBpbiB0aGUgYnl0ZXMuICBXZSBhbGlnbiB0aGUgcGF0dGVybiBhY2NvcmRpbmcgdG8gdGhlCisJIGN1cnJlbnQgb2Zmc2V0LiAgKi8KKyAgICAgIGJ5dGVwdHIgPSBhc21zY24tPm9mZnNldCAlIGFzbXNjbi0+cGF0dGVybi0+bGVuOworCisgICAgICAvKiBVcGRhdGUgdGhlIHRvdGFsIHNpemUuICAqLworICAgICAgYXNtc2NuLT5vZmZzZXQgKz0gY250OworCisgICAgICBkbworCXsKKwkgIGFzbXNjbi0+Y29udGVudC0+ZGF0YVthc21zY24tPmNvbnRlbnQtPmxlbisrXQorCSAgICA9IGFzbXNjbi0+cGF0dGVybi0+Ynl0ZXNbYnl0ZXB0cisrXTsKKworCSAgaWYgKGJ5dGVwdHIgPT0gYXNtc2NuLT5wYXR0ZXJuLT5sZW4pCisJICAgIGJ5dGVwdHIgPSAwOworCX0KKyAgICAgIHdoaWxlICgtLWNudCA+IDApOworICAgIH0KKworICAvKiBSZW1lbWJlciB0aGUgbWF4aW11bSBhbGlnbm1lbnQgZm9yIHRoaXMgc3Vic2VjdGlvbi4gICovCisgIGlmIChhc21zY24tPm1heF9hbGlnbiA8IHZhbHVlKQorICAgIHsKKyAgICAgIGFzbXNjbi0+bWF4X2FsaWduID0gdmFsdWU7CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgcGFyZW50IGFzIHdlbGwgKGlmIGl0IGV4aXN0cykuICAqLworICAgICAgaWYgKGFzbXNjbi0+c3Vic2VjdGlvbl9pZCAhPSAwKQorCXsKKwkgIHJ3bG9ja193cmxvY2sgKGFzbXNjbi0+ZGF0YS51cC0+Y3R4LT5sb2NrKTsKKworCSAgaWYgKGFzbXNjbi0+ZGF0YS51cC0+bWF4X2FsaWduIDwgdmFsdWUpCisJICAgIGFzbXNjbi0+ZGF0YS51cC0+bWF4X2FsaWduID0gdmFsdWU7CisKKwkgIHJ3bG9ja191bmxvY2sgKGFzbXNjbi0+ZGF0YS51cC0+Y3R4LT5sb2NrKTsKKwl9CisgICAgfQorCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChhc21zY24tPmN0eC0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBFbnN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IExFTiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgIGZvciBBU01TQ04uICAqLworaW50CitfX2xpYmFzbV9lbnN1cmVfc2VjdGlvbl9zcGFjZSAoYXNtc2NuLCBsZW4pCisgICAgIEFzbVNjbl90ICphc21zY247CisgICAgIHNpemVfdCBsZW47Cit7CisgIC8qIFRoZSBibG9ja3Mgd2l0aCB0aGUgc2VjdGlvbiBjb250ZW50IGFyZSBrZXB0IGluIGEgY2lyY3VsYXIKKyAgICAgc2luZ2xlLWxpbmtlZCBsaXN0LiAgKi8KKyAgc2l6ZV90IHNpemU7CisKKyAgaWYgKGFzbXNjbi0+Y29udGVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IGJsb2NrLiAgKi8KKyAgICAgIHNpemUgPSBNQVggKDIgKiBsZW4sIDk2MCk7CisKKyAgICAgIGFzbXNjbi0+Y29udGVudCA9IChzdHJ1Y3QgQXNtRGF0YSAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IEFzbURhdGEpCisJCQkJCQkgICArIHNpemUpOworICAgICAgaWYgKGFzbXNjbi0+Y29udGVudCA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgICAgYXNtc2NuLT5jb250ZW50LT5uZXh0ID0gYXNtc2NuLT5jb250ZW50OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBBc21EYXRhICpuZXdwOworCisgICAgICBpZiAoYXNtc2NuLT5jb250ZW50LT5tYXhsZW4gLSBhc21zY24tPmNvbnRlbnQtPmxlbiA+PSBsZW4pCisJLyogTm90aGluZyB0byBkbywgdGhlcmUgaXMgZW5vdWdoIHNwYWNlLiAgKi8KKwlyZXR1cm4gMDsKKworICAgICAgc2l6ZSA9IE1BWCAoMiAqbGVuLCBNSU4gKDMyNzY4LCAyICogYXNtc2NuLT5vZmZzZXQpKTsKKworICAgICAgbmV3cCA9IChzdHJ1Y3QgQXNtRGF0YSAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IEFzbURhdGEpICsgc2l6ZSk7CisgICAgICBpZiAobmV3cCA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgICAgbmV3cC0+bmV4dCA9IGFzbXNjbi0+Y29udGVudC0+bmV4dDsKKyAgICAgIGFzbXNjbi0+Y29udGVudCA9IGFzbXNjbi0+Y29udGVudC0+bmV4dCA9IG5ld3A7CisgICAgfQorCisgIGFzbXNjbi0+Y29udGVudC0+bGVuID0gMDsKKyAgYXNtc2NuLT5jb250ZW50LT5tYXhsZW4gPSBzaXplOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXNtL2FzbV9iZWdpbi5jIGIvbGliYXNtL2FzbV9iZWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OTZmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX2JlZ2luLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qIENyZWF0ZSBkZXNjcmlwdG9yIGZvciBhc3NlbWJsaW5nLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlICJsaWJhc21QLmgiCisjaW5jbHVkZSA8c3lzdGVtLmg+CisKKworc3RhdGljIEFzbUN0eF90ICoKK3ByZXBhcmVfdGV4dF9vdXRwdXQgKEFzbUN0eF90ICpyZXN1bHQpCit7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIEFzbUN0eF90ICoKK3ByZXBhcmVfYmluYXJ5X291dHB1dCAoQXNtQ3R4X3QgKnJlc3VsdCwgaW50IG1hY2hpbmUsIGludCBrbGFzcywgaW50IGRhdGEpCit7CisgIEdFbGZfRWhkciAqZWhkcjsKKyAgR0VsZl9FaGRyIGVoZHJfbWVtOworCisgIC8qIENyZWF0ZSB0aGUgRUxGIGRlc2NyaXB0b3IgZm9yIHRoZSBmaWxlLiAgKi8KKyAgcmVzdWx0LT5vdXQuZWxmID0gZWxmX2JlZ2luIChyZXN1bHQtPmZkLCBFTEZfQ19XUklURV9NTUFQLCBOVUxMKTsKKyAgaWYgKHJlc3VsdC0+b3V0LmVsZiA9PSBOVUxMKQorICAgIHsKKyAgICBlcnJfbGliZWxmOgorICAgICAgdW5saW5rIChyZXN1bHQtPnRtcF9mbmFtZSk7CisgICAgICBjbG9zZSAocmVzdWx0LT5mZCk7CisgICAgICBmcmVlIChyZXN1bHQpOworICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0xJQkVMRik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSBFTEYgaGVhZGVyIGZvciB0aGUgb3V0cHV0IGZpbGUuICAqLworICBpZiAoZ2VsZl9uZXdlaGRyIChyZXN1bHQtPm91dC5lbGYsIGtsYXNzKSA9PSAwKQorICAgIGdvdG8gZXJyX2xpYmVsZjsKKworICBlaGRyID0gZ2VsZl9nZXRlaGRyIChyZXN1bHQtPm91dC5lbGYsICZlaGRyX21lbSk7CisgIC8qIElmIHRoaXMgZmFpbGVkIHdlIGFyZSBpbiB0cm91YmxlLiAgKi8KKyAgYXNzZXJ0IChlaGRyICE9IE5VTEwpOworCisgIC8qIFdlIGNyZWF0ZSBhbiBvYmplY3QgZmlsZS4gICovCisgIGVoZHItPmVfdHlwZSA9IEVUX1JFTDsKKyAgLyogU2V0IHRoZSBFTEYgdmVyc2lvbi4gICovCisgIGVoZHItPmVfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7CisKKyAgLyogVXNlIHRoZSBtYWNoaW5lIHZhbHVlIHRoZSB1c2VyIHByb3ZpZGVkLiAgKi8KKyAgZWhkci0+ZV9tYWNoaW5lID0gbWFjaGluZTsKKyAgLyogU2FtZSBmb3IgdGhlIGNsYXNzIGFuZCBlbmRpYW5uZXNzLiAgKi8KKyAgZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPSBrbGFzczsKKyAgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9IGRhdGE7CisKKyAgbWVtY3B5ICgmZWhkci0+ZV9pZGVudFtFSV9NQUcwXSwgRUxGTUFHLCBTRUxGTUFHKTsKKworICAvKiBXcml0ZSB0aGUgRUxGIGhlYWRlciBpbmZvcm1hdGlvbiBiYWNrLiAgKi8KKyAgKHZvaWQpIGdlbGZfdXBkYXRlX2VoZHIgKHJlc3VsdC0+b3V0LmVsZiwgZWhkcik7CisKKyAgLyogTm8gc2VjdGlvbiBzbyBmYXIuICAqLworICByZXN1bHQtPnNlY3Rpb25fbGlzdCA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZS4gICovCisgIGFzbV9zeW1ib2xfdGFiX2luaXQgKCZyZXN1bHQtPnN5bWJvbF90YWIsIDY3KTsKKyAgcmVzdWx0LT5uc3ltYm9sX3RhYiA9IDA7CisgIC8qIEFuZCB0aGUgc3RyaW5nIHRhYmxlcy4gICovCisgIHJlc3VsdC0+c2VjdGlvbl9zdHJ0YWIgPSBlYmxfc3RydGFiaW5pdCAodHJ1ZSk7CisgIHJlc3VsdC0+c3ltYm9sX3N0cnRhYiA9IGVibF9zdHJ0YWJpbml0ICh0cnVlKTsKKworICAvKiBXZSBoYXZlIG5vIHNlY3Rpb24gZ3JvdXBzIHNvIGZhci4gICovCisgIHJlc3VsdC0+Z3JvdXBzID0gTlVMTDsKKyAgcmVzdWx0LT5uZ3JvdXBzID0gMDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK0FzbUN0eF90ICoKK2FzbV9iZWdpbiAoZm5hbWUsIHRleHRwLCBtYWNoaW5lLCBrbGFzcywgZGF0YSkKKyAgICAgY29uc3QgY2hhciAqZm5hbWU7CisgICAgIGJvb2wgdGV4dHA7CisgICAgIGludCBtYWNoaW5lOworICAgICBpbnQga2xhc3M7CisgICAgIGludCBkYXRhOworeworICBzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSk7CisgIEFzbUN0eF90ICpyZXN1bHQ7CisKKworICAvKiBGaXJzdCBvcmRlciBvZiBidXNpbmVzczogZmluZCB0aGUgYXBwcm9wcmlhdGUgYmFja2VuZC4gIElmIGl0CisgICAgIGRvZXMgbm90IGV4aXN0IHdlIGRvbid0IGhhdmUgdG8gbG9vayBmdXJ0aGVyLiAgKi8KKyAgLy8gWFhYCisKKyAgLyogQ3JlYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBXZSBkbyBub3QgZ2VuZXJhdGUgdGhlIG91dHB1dCBmaWxlCisgICAgIHJpZ2h0IGF3YXkuICBJbnN0ZWFkIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBzYW1lCisgICAgIGRpcmVjdG9yeSB3aGljaCwgaWYgZXZlcnl0aGluZyBnb2VzIGFscmlnaHQsIHdpbGwgcmVwbGFjZSBhCisgICAgIHBvc3NpYmx5IGV4aXN0aW5nIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gICovCisgIHJlc3VsdCA9IChBc21DdHhfdCAqKSBtYWxsb2MgKHNpemVvZiAoQXNtQ3R4X3QpICsgMiAqIGZuYW1lX2xlbiArIDkpOworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jay4gICovCisgIHJ3bG9ja19pbml0IChyZXN1bHQtPmxvY2spOworCisgIC8qIENyZWF0ZSB0aGUgbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUuICAqLworICByZXN1bHQtPmZuYW1lID0gc3RwY3B5IChtZW1wY3B5IChyZXN1bHQtPnRtcF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbiksCisJCQkgICIuWFhYWFhYIikgKyAxOworICBtZW1jcHkgKHJlc3VsdC0+Zm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4gKyAxKTsKKworICAvKiBDcmVhdGUgdGhlIHRlbXBvcmFyeSBmaWxlLiAgKi8KKyAgcmVzdWx0LT5mZCA9IG1rc3RlbXAgKHJlc3VsdC0+dG1wX2ZuYW1lKTsKKyAgaWYgKHJlc3VsdC0+ZmQgPT0gLTEpCisgICAgeworICAgICAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKyAgICAgIGZyZWUgKHJlc3VsdCk7CisgICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfQ0FOTk9UX0NSRUFURSk7CisgICAgICBlcnJubyA9IHNhdmVfZXJybm87CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY291bnRlciBmb3IgdGVtcG9yYXJ5IHN5bWJvbHMuICAqLworICByZXN1bHQtPnRlbXBzeW1fY291bnQgPSAwOworCisgIC8qIE5vdyB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGV4dHVhbCBhbmQgYmluYXJ5IG91dHB1dC4gICAqLworICByZXN1bHQtPnRleHRwID0gdGV4dHA7CisgIGlmICh0ZXh0cCkKKyAgICByZXN1bHQgPSBwcmVwYXJlX3RleHRfb3V0cHV0IChyZXN1bHQpOworICBlbHNlCisgICAgcmVzdWx0ID0gcHJlcGFyZV9iaW5hcnlfb3V0cHV0IChyZXN1bHQsIG1hY2hpbmUsIGtsYXNzLCBkYXRhKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliYXNtL2FzbV9lbmQuYyBiL2xpYmFzbS9hc21fZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmMDFmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9hc21fZW5kLmMKQEAgLTAsMCArMSw1OTMgQEAKKy8qIEZpbmFsaXplIG9wZXJhdGlvbnMgb24gdGhlIGFzc2VtYmxlciBjb250ZXh0LCBmcmVlIGFsbCByZXNvdXJjZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJvci5oPgorI2luY2x1ZGUgPGxpYmludGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxsaWJhc21QLmg+CisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3lzdGVtLmg+CisKKworc3RhdGljIGludAordGV4dF9lbmQgKEFzbUN0eF90ICpjdHggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICAvLyBYWFggRG9lcyBhbnl0aGluZyBoYXZlIHRvIGJlIGRvbmU/CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2JpbmFyeV9lbmQgKEFzbUN0eF90ICpjdHgpCit7CisgIHZvaWQgKnN5bXRhYiA9IE5VTEw7CisgIHN0cnVjdCBFYmxfU3RyZW50ICpzeW1zY25fc3RyZW50ID0gTlVMTDsKKyAgc3RydWN0IEVibF9TdHJlbnQgKnN0cnNjbl9zdHJlbnQgPSBOVUxMOworICBzdHJ1Y3QgRWJsX1N0cmVudCAqeG5keHNjbl9zdHJlbnQgPSBOVUxMOworICBFbGZfU2NuICpzaHN0cnNjbjsKKyAgc3RydWN0IEVibF9TdHJlbnQgKnNoc3Ryc2NuX3N0cmVudDsKKyAgc2l6ZV90IHNoc3Ryc2NubmR4OworICBzaXplX3Qgc3ltc2NubmR4ID0gMDsKKyAgc2l6ZV90IHN0cnNjbm5keCA9IDA7CisgIHNpemVfdCB4bmR4c2NubmR4ID0gMDsKKyAgRWxmX0RhdGEgKmRhdGE7CisgIEVsZl9EYXRhICpzaHN0cnRhYmRhdGE7CisgIEVsZl9EYXRhICpzdHJ0YWJkYXRhID0gTlVMTDsKKyAgRWxmX0RhdGEgKnhuZHhkYXRhID0gTlVMTDsKKyAgR0VsZl9TaGRyIHNoZHJfbWVtOworICBHRWxmX1NoZHIgKnNoZHI7CisgIEdFbGZfRWhkciBlaGRyX21lbTsKKyAgR0VsZl9FaGRyICplaGRyOworICBBc21TY25fdCAqYXNtc2NuOworICBpbnQgcmVzdWx0ID0gMDsKKworICAvKiBJdGVyYXRlIG92ZXIgdGhlIGNyZWF0ZWQgc2VjdGlvbnMgYW5kIGNvbXB1dGUgdGhlIG9mZnNldHMgb2YgdGhlCisgICAgIHZhcmlvdXMgc3Vic2VjdGlvbnMgYW5kIGZpbGwgaW4gdGhlIGNvbnRlbnQuICAqLworICBmb3IgKGFzbXNjbiA9IGN0eC0+c2VjdGlvbl9saXN0OyBhc21zY24gIT0gTlVMTDsgYXNtc2NuID0gYXNtc2NuLT5hbGxuZXh0KQorICAgIHsKKyNpZiAwCisgICAgICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChjdHgtPm91dC5lbGYsIGFzbXNjbi0+ZGF0YS5tYWluLnNjbm5keCk7CisjZWxzZQorICAgICAgRWxmX1NjbiAqc2NuID0gYXNtc2NuLT5kYXRhLm1haW4uc2NuOworI2VuZGlmCisgICAgICBvZmZfdCBvZmZzZXQgPSAwOworICAgICAgQXNtU2NuX3QgKmFzbXN1YnNjbiA9IGFzbXNjbjsKKworICAgICAgZG8KKwl7CisJICBzdHJ1Y3QgQXNtRGF0YSAqY29udGVudCA9IGFzbXN1YnNjbi0+Y29udGVudDsKKwkgIGJvb2wgZmlyc3QgPSB0cnVlOworCisJICBvZmZzZXQgPSAoKG9mZnNldCArIGFzbXN1YnNjbi0+bWF4X2FsaWduIC0gMSkKKwkJICAgICYgfihhc21zdWJzY24tPm1heF9hbGlnbiAtIDEpKTsKKworCSAgLyogVXBkYXRlIHRoZSBvZmZzZXQgZm9yIHRoaXMgc3Vic2VjdGlvbi4gIFRoaXMgZmllbGQgbm93CisJICAgICBzdG9yZXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgYnkgaW4gdGhpcyBzdWJzZWN0aW9uLiAgKi8KKwkgIGFzbXN1YnNjbi0+b2Zmc2V0ID0gb2Zmc2V0OworCisJICAvKiBOb3RlIHRoYXQgdGhlIGNvbnRlbnQgbGlzdCBpcyBjaXJjdWxhci4gICovCisJICBpZiAoY29udGVudCAhPSBOVUxMKQorCSAgICBkbworCSAgICAgIHsKKwkJRWxmX0RhdGEgKm5ld2RhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKKworCQlpZiAobmV3ZGF0YSA9PSBOVUxMKQorCQkgIHsKKwkJICAgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9MSUJFTEYpOworCQkgICAgcmV0dXJuIC0xOworCQkgIH0KKworCQluZXdkYXRhLT5kX2J1ZiA9IGNvbnRlbnQtPmRhdGE7CisJCW5ld2RhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7CisJCW5ld2RhdGEtPmRfc2l6ZSA9IGNvbnRlbnQtPmxlbjsKKwkJbmV3ZGF0YS0+ZF9vZmYgPSBvZmZzZXQ7CisJCW5ld2RhdGEtPmRfYWxpZ24gPSBmaXJzdCA/IGFzbXN1YnNjbi0+bWF4X2FsaWduIDogMTsKKworCQlvZmZzZXQgKz0gY29udGVudC0+bGVuOworCSAgICAgIH0KKwkgICAgd2hpbGUgKChjb250ZW50ID0gY29udGVudC0+bmV4dCkgIT0gYXNtc3Vic2NuLT5jb250ZW50KTsKKwl9CisgICAgICB3aGlsZSAoKGFzbXN1YnNjbiA9IGFzbXN1YnNjbi0+c3VibmV4dCkgIT0gTlVMTCk7CisgICAgfQorCisKKyAgLyogQ3JlYXRlIHRoZSBzeW1ib2wgdGFibGUgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgaWYgKGN0eC0+bnN5bWJvbF90YWIgPiAwKQorICAgIHsKKyAgICAgIC8qIENyZWF0ZSB0aGUgc3ltYm9sIHRhYmxlIGFuZCBzdHJpbmcgdGFibGUgc2VjdGlvbiBuYW1lcy4gICovCisgICAgICBzeW1zY25fc3RyZW50ID0gZWJsX3N0cnRhYmFkZCAoY3R4LT5zZWN0aW9uX3N0cnRhYiwgIi5zeW10YWIiLCA4KTsKKyAgICAgIHN0cnNjbl9zdHJlbnQgPSBlYmxfc3RydGFiYWRkIChjdHgtPnNlY3Rpb25fc3RydGFiLCAiLnN0cnRhYiIsIDgpOworCisgICAgICAvKiBDcmVhdGUgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgc2VjdGlvbi4gICovCisgICAgICBFbGZfU2NuICpzdHJzY24gPSBlbGZfbmV3c2NuIChjdHgtPm91dC5lbGYpOworICAgICAgc3RydGFiZGF0YSA9IGVsZl9uZXdkYXRhIChzdHJzY24pOworICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc3Ryc2NuLCAmc2hkcl9tZW0pOworICAgICAgaWYgKHN0cnRhYmRhdGEgPT0gTlVMTCB8fCBzaGRyID09IE5VTEwpCisJeworCSAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0xJQkVMRik7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgc3Ryc2NubmR4ID0gZWxmX25keHNjbiAoc3Ryc2NuKTsKKworICAgICAgZWJsX3N0cnRhYmZpbmFsaXplIChjdHgtPnN5bWJvbF9zdHJ0YWIsIHN0cnRhYmRhdGEpOworCisgICAgICBzaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKKyAgICAgIGFzc2VydCAoc2hkci0+c2hfZW50c2l6ZSA9PSAwKTsKKworICAgICAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHN0cnNjbiwgc2hkcik7CisKKyAgICAgIC8qIENyZWF0ZSB0aGUgc3ltYm9sIHRhYmxlIHNlY3Rpb24uICAqLworICAgICAgRWxmX1NjbiAqc3ltc2NuID0gZWxmX25ld3NjbiAoY3R4LT5vdXQuZWxmKTsKKyAgICAgIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc3ltc2NuKTsKKyAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnNoZHJfbWVtKTsKKyAgICAgIGlmIChkYXRhID09IE5VTEwgfHwgc2hkciA9PSBOVUxMKQorCXsKKwkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9MSUJFTEYpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIHN5bXNjbm5keCA9IGVsZl9uZHhzY24gKHN5bXNjbik7CisKKyAgICAgIC8qIFdlIGtub3cgaG93IG1hbnkgc3ltYm9scyB0aGVyZSB3aWxsIGJlIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLworICAgICAgZGF0YS0+ZF9zaXplID0gZ2VsZl9mc2l6ZSAoY3R4LT5vdXQuZWxmLCBFTEZfVF9TWU0sCisJCQkJIGN0eC0+bnN5bWJvbF90YWIgKyAxLCBFVl9DVVJSRU5UKTsKKyAgICAgIHN5bXRhYiA9IG1hbGxvYyAoZGF0YS0+ZF9zaXplKTsKKyAgICAgIGlmIChzeW10YWIgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisgICAgICBkYXRhLT5kX2J1ZiA9IHN5bXRhYjsKKyAgICAgIGRhdGEtPmRfdHlwZSA9IEVMRl9UX1NZTTsKKyAgICAgIGRhdGEtPmRfb2ZmID0gMDsKKworICAgICAgLyogQ2xlYXIgdGhlIGZpcnN0IGVudHJ5LiAgKi8KKyAgICAgIEdFbGZfU3ltIHN5bWVudDsKKyAgICAgIG1lbXNldCAoJnN5bWVudCwgJ1wwJywgc2l6ZW9mIChzeW1lbnQpKTsKKyAgICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zeW0gKGRhdGEsIDAsICZzeW1lbnQpOworCisgICAgICAvKiBJdGVyYXRlIG92ZXIgdGhlIHN5bWJvbCB0YWJsZS4gICovCisgICAgICB2b2lkICpydW5wID0gTlVMTDsKKyAgICAgIGludCBwdHJfbG9jYWwgPSAxOwkvKiBTdGFydCB3aXRoIGluZGV4IDE7IHplcm8gcmVtYWlucyB1bnVzZWQuICAqLworICAgICAgaW50IHB0cl9ub25sb2NhbCA9IGN0eC0+bnN5bWJvbF90YWI7CisgICAgICB1aW50MzJfdCAqeHNobmR4ID0gTlVMTDsKKyAgICAgIEFzbVN5bV90ICpzeW07CisgICAgICB3aGlsZSAoKHN5bSA9IGFzbV9zeW1ib2xfdGFiX2l0ZXJhdGUgKCZjdHgtPnN5bWJvbF90YWIsICZydW5wKSkgIT0gTlVMTCkKKwlpZiAoYXNtX2VtaXRfc3ltYm9sX3AgKGVibF9zdHJpbmcgKHN5bS0+c3RyZW50KSkpCisJICB7CisJICAgIGFzc2VydCAocHRyX2xvY2FsIDw9IHB0cl9ub25sb2NhbCk7CisKKwkgICAgc3ltZW50LnN0X25hbWUgPSBlYmxfc3RydGFib2Zmc2V0IChzeW0tPnN0cmVudCk7CisJICAgIHN5bWVudC5zdF9pbmZvID0gR0VMRl9TVF9JTkZPIChzeW0tPmJpbmRpbmcsIHN5bS0+dHlwZSk7CisJICAgIHN5bWVudC5zdF9vdGhlciA9IDA7CisJICAgIHN5bWVudC5zdF92YWx1ZSA9IHN5bS0+c2NuLT5vZmZzZXQgKyBzeW0tPm9mZnNldDsKKwkgICAgc3ltZW50LnN0X3NpemUgPSBzeW0tPnNpemU7CisKKwkgICAgLyogQWRkIGxvY2FsIHN5bWJvbHMgYXQgdGhlIGJlZ2lubmluZywgdGhlIG90aGVyIGZyb20KKwkgICAgICAgdGhlIGVuZC4gICovCisJICAgIGludCBwdHIgPSBzeW0tPmJpbmRpbmcgPT0gU1RCX0xPQ0FMID8gcHRyX2xvY2FsKysgOiBwdHJfbm9ubG9jYWwtLTsKKworCSAgICAvKiBEZXRlcm1pbmUgdGhlIHNlY3Rpb24gaW5kZXguICBXZSBoYXZlIHRvIGhhbmRsZSB0aGUKKwkgICAgICAgb3ZlcmZsb3cgY29ycmVjdGx5LiAgKi8KKwkgICAgRWxmX1NjbiAqc2NuID0gKHN5bS0+c2NuLT5zdWJzZWN0aW9uX2lkID09IDAKKwkJCSAgICA/IHN5bS0+c2NuLT5kYXRhLm1haW4uc2NuCisJCQkgICAgOiBzeW0tPnNjbi0+ZGF0YS51cC0+ZGF0YS5tYWluLnNjbik7CisKKwkgICAgRWxmMzJfV29yZCBuZHg7CisJICAgIGlmICh1bmxpa2VseSAoc2NuID09IEFTTV9BQlNfU0NOKSkKKwkgICAgICBuZHggPSBTSE5fQUJTOworCSAgICBlbHNlIGlmICh1bmxpa2VseSAoc2NuID09IEFTTV9DT01fU0NOKSkKKwkgICAgICBuZHggPSBTSE5fQ09NTU9OOworCSAgICBlbHNlIGlmICh1bmxpa2VseSAoKG5keCA9IGVsZl9uZHhzY24gKHNjbikpID49IFNITl9MT1JFU0VSVkUpKQorCSAgICAgIHsKKwkJaWYgKHVubGlrZWx5ICh4c2huZHggPT0gTlVMTCkpCisJCSAgeworCQkgICAgLyogVGhlIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvbiBkb2VzIG5vdCB5ZXQKKwkJICAgICAgIGV4aXN0LiAgKi8KKwkJICAgIEVsZl9TY24gKnhuZHhzY247CisKKwkJICAgIHhuZHhzY24gPSBlbGZfbmV3c2NuIChjdHgtPm91dC5lbGYpOworCQkgICAgeG5keGRhdGEgPSBlbGZfbmV3ZGF0YSAoeG5keHNjbik7CisJCSAgICBzaGRyID0gZ2VsZl9nZXRzaGRyICh4bmR4c2NuLCAmc2hkcl9tZW0pOworCQkgICAgaWYgKHhuZHhkYXRhID09IE5VTEwgfHwgc2hkciA9PSBOVUxMKQorCQkgICAgICB7CisJCQlfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfTElCRUxGKTsKKwkJCXJldHVybiAtMTsKKwkJICAgICAgfQorCQkgICAgeG5keHNjbm5keCA9IGVsZl9uZHhzY24gKHhuZHhzY24pOworCisJCSAgICBzaGRyLT5zaF90eXBlID0gU0hUX1NZTVRBQl9TSE5EWDsKKwkJICAgIHNoZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZjMyX1dvcmQpOworCQkgICAgc2hkci0+c2hfYWRkcmFsaWduID0gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKKwkJICAgIHNoZHItPnNoX2xpbmsgPSBzeW1zY25uZHg7CisKKwkJICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyICh4bmR4c2NuLCBzaGRyKTsKKworCQkgICAgeG5keHNjbl9zdHJlbnQgPSBlYmxfc3RydGFiYWRkIChjdHgtPnNlY3Rpb25fc3RydGFiLAorCQkJCQkJICAgICIuc3ltdGFiX3NobmR4IiwgMTQpOworCisJCSAgICAvKiBOb3RlIHRoYXQgdXNpbmcgJ2VsZjMyX2ZzaXplJyBpbnN0ZWFkIG9mCisJCSAgICAgICAnZ2VsZl9mc2l6ZScgaGVyZSBpcyBjb3JyZWN0LiAgKi8KKwkJICAgIHhuZHhkYXRhLT5kX3NpemUgPSBlbGYzMl9mc2l6ZSAoRUxGX1RfV09SRCwKKwkJCQkJCSAgICBjdHgtPm5zeW1ib2xfdGFiICsgMSwKKwkJCQkJCSAgICBFVl9DVVJSRU5UKTsKKwkJICAgIHhzaG5keCA9IHhuZHhkYXRhLT5kX2J1ZiA9IGNhbGxvYyAoMSwgeG5keGRhdGEtPmRfc2l6ZSk7CisJCSAgICBpZiAoeHNobmR4ID09IE5VTEwpCisJCSAgICAgIHJldHVybiAtMTsKKwkJICAgIC8qIFVzaW5nIEVMRl9UX1dPUkQgaGVyZSByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGUKKwkJICAgICAgIDMyLSBhbmQgNjQtYml0IHR5cGVzIGFyZSB0aGUgc2FtZSBzaXplLiAgKi8KKwkJICAgIHhuZHhkYXRhLT5kX3R5cGUgPSBFTEZfVF9XT1JEOworCQkgICAgeG5keGRhdGEtPmRfb2ZmID0gMDsKKwkJICB9CisKKwkJLyogU3RvcmUgdGhlIHJlYWwgc2VjdGlvbiBpbmRleCBpbiB0aGUgZXh0ZW5kZWQgc2V0aW9uCisJCSAgIGluZGV4IHRhYmxlLiAgKi8KKwkJYXNzZXJ0ICgoc2l6ZV90KSBwdHIgPCBjdHgtPm5zeW1ib2xfdGFiICsgMSk7CisJCXhzaG5keFtwdHJdID0gbmR4OworCisJCS8qIEFuZCBzaWduYWwgdGhhdCB0aGlzIGhhcHBlbmVkLiAgKi8KKwkJbmR4ID0gU0hOX1hJTkRFWDsKKwkgICAgICB9CisJICAgIHN5bWVudC5zdF9zaG5keCA9IG5keDsKKworCSAgICAvKiBSZW1lbWJlciB3aGVyZSB3ZSBwdXQgdGhlIHN5bWJvbC4gICovCisJICAgIHN5bS0+c3ltaWR4ID0gcHRyOworCisJICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zeW0gKGRhdGEsIHB0ciwgJnN5bWVudCk7CisJICB9CisKKyAgICAgIGFzc2VydCAocHRyX2xvY2FsID09IHB0cl9ub25sb2NhbCArIDEpOworCisgICAgICBzaGRyLT5zaF90eXBlID0gU0hUX1NZTVRBQjsKKyAgICAgIHNoZHItPnNoX2xpbmsgPSBzdHJzY25uZHg7CisgICAgICBzaGRyLT5zaF9pbmZvID0gcHRyX2xvY2FsOworICAgICAgc2hkci0+c2hfZW50c2l6ZSA9IGdlbGZfZnNpemUgKGN0eC0+b3V0LmVsZiwgRUxGX1RfU1lNLCAxLCBFVl9DVVJSRU5UKTsKKyAgICAgIHNoZHItPnNoX2FkZHJhbGlnbiA9IGdlbGZfZnNpemUgKGN0eC0+b3V0LmVsZiwgRUxGX1RfQUREUiwgMSwKKwkJCQkgICAgICAgRVZfQ1VSUkVOVCk7CisKKyAgICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChzeW1zY24sIHNoZHIpOworICAgIH0KKworCisgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24gYW5kIGZpbGwgaW4gdGhlCisgICAgIHJlZmVyZW5jZXMgaW4gdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCisgIHNoc3Ryc2NuID0gZWxmX25ld3NjbiAoY3R4LT5vdXQuZWxmKTsKKyAgc2hzdHJ0YWJkYXRhID0gZWxmX25ld2RhdGEgKHNoc3Ryc2NuKTsKKyAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2hzdHJzY24sICZzaGRyX21lbSk7CisgIGlmIChzaHN0cnNjbiA9PSBOVUxMIHx8IHNoc3RydGFiZGF0YSA9PSBOVUxMIHx8IHNoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfTElCRUxGKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKworICAvKiBBZGQgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCisgIHNoc3Ryc2NuX3N0cmVudCA9IGVibF9zdHJ0YWJhZGQgKGN0eC0+c2VjdGlvbl9zdHJ0YWIsICIuc2hzdHJ0YWIiLCAxMCk7CisKKyAgZWJsX3N0cnRhYmZpbmFsaXplIChjdHgtPnNlY3Rpb25fc3RydGFiLCBzaHN0cnRhYmRhdGEpOworCisgIHNoZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOworICBhc3NlcnQgKHNoZHItPnNoX2VudHNpemUgPT0gMCk7CisgIHNoZHItPnNoX25hbWUgPSBlYmxfc3RydGFib2Zmc2V0IChzaHN0cnNjbl9zdHJlbnQpOworCisgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChzaHN0cnNjbiwgc2hkcik7CisKKworICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gZ3JvdXBzLiAgKi8KKyAgaWYgKGN0eC0+Z3JvdXBzICE9IE5VTEwpCisgICAgeworICAgICAgQXNtU2NuR3JwX3QgKnJ1bnAgPSBjdHgtPmdyb3Vwcy0+bmV4dDsKKworICAgICAgZG8KKwl7CisJICBFbGZfU2NuICpzY247CisJICBFbGYzMl9Xb3JkICpncnBkYXRhOworCisJICBzY24gPSBydW5wLT5zY247CisJICBhc3NlcnQgKHNjbiAhPSBOVUxMKTsKKwkgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKwkgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworCSAgZGF0YSA9IGVsZl9uZXdkYXRhIChzY24pOworCSAgaWYgKGRhdGEgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9MSUJFTEYpOworCSAgICAgIHJldHVybiAtMTsKKwkgICAgfQorCisJICAvKiBJdCBpcyBjb3JyZWN0IHRvIHVzZSAnZWxmMzJfZnNpemUnIGluc3RlYWQgb2YgJ2dlbGZfZnNpemUnCisJICAgICBoZXJlLiAgKi8KKwkgIGRhdGEtPmRfc2l6ZSA9IGVsZjMyX2ZzaXplIChFTEZfVF9XT1JELCBydW5wLT5ubWVtYmVycyArIDEsCisJCQkJICAgICAgRVZfQ1VSUkVOVCk7CisJICBncnBkYXRhID0gZGF0YS0+ZF9idWYgPSBtYWxsb2MgKGRhdGEtPmRfc2l6ZSk7CisJICBpZiAoZ3JwZGF0YSA9PSBOVUxMKQorCSAgICByZXR1cm4gLTE7CisJICBkYXRhLT5kX3R5cGUgPSBFTEZfVF9XT1JEOworCSAgZGF0YS0+ZF9vZmYgPSAwOworCSAgZGF0YS0+ZF9hbGlnbiA9IGVsZjMyX2ZzaXplIChFTEZfVF9XT1JELCAxLCBFVl9DVVJSRU5UKTsKKworCSAgLyogVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNlY3Rpb24gaXMgZmlsbGVkIHdpdGggdGhlIGZsYWcgd29yZC4gICovCisJICAqZ3JwZGF0YSsrID0gcnVucC0+ZmxhZ3M7CisKKwkgIGlmIChydW5wLT5tZW1iZXJzICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBBc21TY25fdCAqbWVtYmVyID0gcnVucC0+bWVtYmVycy0+ZGF0YS5tYWluLm5leHRfaW5fZ3JvdXA7CisKKwkgICAgICBkbworCQl7CisJCSAgLyogT25seSBzZWN0aW9ucywgbm90IHN1YnNlY3Rpb25zLCBjYW4gYmUgcmVnaXN0ZXJlZAorCQkgICAgIGFzIG1lbWJlciBvZiBhIGdyb3VwLiAgVGhlIHN1YnNlY3Rpb25zIGdldAorCQkgICAgIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQuICAqLworCQkgIGFzc2VydCAobWVtYmVyLT5zdWJzZWN0aW9uX2lkID09IDApOworCisJCSAgKmdycGRhdGErKyA9IGVsZl9uZHhzY24gKG1lbWJlci0+ZGF0YS5tYWluLnNjbik7CisJCX0KKwkgICAgICB3aGlsZSAoKG1lbWJlciA9IG1lbWJlci0+ZGF0YS5tYWluLm5leHRfaW5fZ3JvdXApCisJCSAgICAgIT0gcnVucC0+bWVtYmVycy0+ZGF0YS5tYWluLm5leHRfaW5fZ3JvdXApOworCSAgICB9CisKKwkgIC8qIENvbnN0cnVjdCB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLworCSAgc2hkci0+c2hfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKHJ1bnAtPnN0cmVudCk7CisJICBzaGRyLT5zaF90eXBlID0gU0hUX0dST1VQOworCSAgc2hkci0+c2hfZmxhZ3MgPSAwOworCSAgc2hkci0+c2hfbGluayA9IHN5bXNjbm5keDsKKwkgIC8qIElmIHRoZSB1c2VyIGRpZCBub3Qgc3BlY2lmeSBhIHNpZ25hdHVyZSB3ZSB1c2UgdGhlIGluaXRpYWwKKwkgICAgIGVtcHR5IHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlIGFzIHRoZSBzaWduYXR1cmUuICAqLworCSAgc2hkci0+c2hfaW5mbyA9IChydW5wLT5zaWduYXR1cmUgIT0gTlVMTAorCQkJICAgPyBydW5wLT5zaWduYXR1cmUtPnN5bWlkeCA6IDApOworCisJICAodm9pZCkgZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKKwl9CisgICAgICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBjdHgtPmdyb3Vwcy0+bmV4dCk7CisgICAgfQorCisKKyAgLyogQWRkIHRoZSBuYW1lIHRvIHRoZSBzeW1ib2wgc2VjdGlvbi4gICovCisgIGlmIChsaWtlbHkgKHN5bXNjbm5keCAhPSAwKSkKKyAgICB7CisgICAgICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChjdHgtPm91dC5lbGYsIHN5bXNjbm5keCk7CisKKyAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKworICAgICAgc2hkci0+c2hfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKHN5bXNjbl9zdHJlbnQpOworCisgICAgICAodm9pZCkgZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKKworCisgICAgICAvKiBBZGQgdGhlIG5hbWUgdG8gdGhlIHN0cmluZyBzZWN0aW9uLiAgKi8KKyAgICAgIGFzc2VydCAoc3Ryc2NubmR4ICE9IDApOworICAgICAgc2NuID0gZWxmX2dldHNjbiAoY3R4LT5vdXQuZWxmLCBzdHJzY25uZHgpOworCisgICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIHNoZHItPnNoX25hbWUgPSBlYmxfc3RydGFib2Zmc2V0IChzdHJzY25fc3RyZW50KTsKKworICAgICAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7CisKKworICAgICAgLyogQWRkIHRoZSBuYW1lIHRvIHRoZSBleHRlbmRlZCBzeW1ib2wgaW5kZXggc2VjdGlvbi4gICovCisgICAgICBpZiAoeG5keHNjbm5keCAhPSAwKQorCXsKKwkgIHNjbiA9IGVsZl9nZXRzY24gKGN0eC0+b3V0LmVsZiwgeG5keHNjbm5keCk7CisKKwkgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKworCSAgc2hkci0+c2hfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKHhuZHhzY25fc3RyZW50KTsKKworCSAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7CisJfQorICAgIH0KKworCisgIC8qIEl0ZXJhdGUgb3ZlciB0aGUgY3JlYXRlZCBzZWN0aW9ucyBhbmQgZmlsbCBpbiB0aGUgbmFtZXMuICAqLworICBmb3IgKGFzbXNjbiA9IGN0eC0+c2VjdGlvbl9saXN0OyBhc21zY24gIT0gTlVMTDsgYXNtc2NuID0gYXNtc2NuLT5hbGxuZXh0KQorICAgIHsKKyAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKGFzbXNjbi0+ZGF0YS5tYWluLnNjbiwgJnNoZHJfbWVtKTsKKyAgICAgIC8qIFRoaXMgYmV0dGVyIHNob3VsZCBub3QgZmFpbC4gICovCisgICAgICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisKKyAgICAgIHNoZHItPnNoX25hbWUgPSBlYmxfc3RydGFib2Zmc2V0IChhc21zY24tPmRhdGEubWFpbi5zdHJlbnQpOworCisgICAgICAvKiBXZSBub3cga25vdyB0aGUgbWF4aW11bSBhbGlnbm1lbnQuICAqLworICAgICAgc2hkci0+c2hfYWRkcmFsaWduID0gYXNtc2NuLT5tYXhfYWxpZ247CisKKyAgICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChhc21zY24tPmRhdGEubWFpbi5zY24sIHNoZHIpOworICAgIH0KKworICAvKiBQdXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluIHRoZSBFTEYKKyAgICAgaGVhZGVyLiAgKi8KKyAgZWhkciA9IGdlbGZfZ2V0ZWhkciAoY3R4LT5vdXQuZWxmLCAmZWhkcl9tZW0pOworICBhc3NlcnQgKGVoZHIgIT0gTlVMTCk7CisKKyAgc2hzdHJzY25uZHggPSBlbGZfbmR4c2NuIChzaHN0cnNjbik7CisgIGlmICh1bmxpa2VseSAoc2hzdHJzY25uZHggPiBTSE5fSElSRVNFUlZFKQorICAgICAgfHwgdW5saWtlbHkgKHNoc3Ryc2NubmR4ID09IFNITl9YSU5ERVgpKQorICAgIHsKKyAgICAgIC8qIFRoZSBpbmRleCBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHNlY3RpbyBpcyB0b28gbGFyZ2UuICAqLworICAgICAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAoY3R4LT5vdXQuZWxmLCAwKTsKKworICAgICAgLyogR2V0IHRoZSBoZWFkZXIgZm9yIHRoZSB6ZXJvdGggc2VjdGlvbi4gICovCisgICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisgICAgICAvKiBUaGlzIGJldHRlciBkb2VzIG5vdCBmYWlsLiAgKi8KKyAgICAgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworICAgICAgLyogVGhlIHNoX2xpbmsgZmllbGQgb2YgdGhlIHplcm90aCBzZWN0aW9uIGhlYWRlciBjb250YWlucyB0aGUgdmFsdWUuICAqLworICAgICAgc2hkci0+c2hfbGluayA9IHNoc3Ryc2NubmR4OworCisgICAgICAodm9pZCkgZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKKworICAgICAgLyogVGhpcyBpcyB0aGUgc2lnbiBmb3IgdGhlIG92ZXJmbG93LiAgKi8KKyAgICAgIGVoZHItPmVfc2hzdHJuZHggPSBTSE5fWElOREVYOworICAgIH0KKyAgZWxzZQorICAgIGVoZHItPmVfc2hzdHJuZHggPSBlbGZfbmR4c2NuIChzaHN0cnNjbik7CisKKyAgZ2VsZl91cGRhdGVfZWhkciAoY3R4LT5vdXQuZWxmLCBlaGRyKTsKKworICAvKiBXcml0ZSBvdXQgdGhlIEVMRiBmaWxlLiAgKi8KKyAgaWYgKHVubGlrZWx5IChlbGZfdXBkYXRlIChjdHgtPm91dC5lbGYsIEVMRl9DX1dSSVRFX01NQVApKSA8IDApCisgICAgeworICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0xJQkVMRik7CisgICAgICByZXN1bHQgPSAtMTsKKyAgICB9CisKKyAgLyogV2UgZG8gbm90IG5lZWQgdGhlIHNlY3Rpb24gaGVhZGVyIGFuZCBzeW1ib2wgc3RyaW5nIHRhYmxlcyBhbnltb3JlLiAgKi8KKyAgZnJlZSAoc2hzdHJ0YWJkYXRhLT5kX2J1Zik7CisgIGlmIChzdHJ0YWJkYXRhICE9IE5VTEwpCisgICAgZnJlZSAoc3RydGFiZGF0YS0+ZF9idWYpOworICAvKiBXZSBtaWdodCBoYXZlIGFsbG9jYXRlZCB0aGUgZXh0ZW5kZWQgc3ltYm9sIHRhYmxlIGluZGV4LiAgKi8KKyAgaWYgKHhuZHhkYXRhICE9IE5VTEwpCisgICAgZnJlZSAoeG5keGRhdGEtPmRfYnVmKTsKKworICAvKiBGcmVlIHNlY3Rpb24gZ3JvdXBzIG1lbW9yeS4gICovCisgIEFzbVNjbkdycF90ICpzY25ncnAgPSBjdHgtPmdyb3VwczsKKyAgaWYgKHNjbmdycCAhPSBOVUxMKQorICAgIGRvCisgICAgICBmcmVlIChlbGZfZ2V0ZGF0YSAoc2NuZ3JwLT5zY24sIE5VTEwpLT5kX2J1Zik7CisgICAgd2hpbGUgKChzY25ncnAgPSBzY25ncnAtPm5leHQpICE9IGN0eC0+Z3JvdXBzKTsKKworICAvKiBGaW5hbGl6ZSB0aGUgRUxGIGhhbmRsaW5nLiAgKi8KKyAgaWYgKHVubGlrZWx5IChlbGZfZW5kIChjdHgtPm91dC5lbGYpKSAhPSAwKQorICAgIHsKKyAgICAgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9MSUJFTEYpOworICAgICAgcmVzdWx0ID0gLTE7CisgICAgfQorCisgIC8qIEZyZWUgdGhlIHRlbXBvcmFyeSByZXNvdXJjZXMuICAqLworICBmcmVlIChzeW10YWIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworaW50Cithc21fZW5kIChjdHgpCisgICAgIEFzbUN0eF90ICpjdHg7Cit7CisgIGludCByZXN1bHQ7CisKKyAgaWYgKGN0eCA9PSBOVUxMKQorICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nIGVhcmxpZXIuICAqLworICAgIHJldHVybiAtMTsKKworICByZXN1bHQgPSB1bmxpa2VseSAoY3R4LT50ZXh0cCkgPyB0ZXh0X2VuZCAoY3R4KSA6IGJpbmFyeV9lbmQgKGN0eCk7CisgIGlmIChyZXN1bHQgIT0gMCkKKyAgICByZXR1cm4gcmVzdWx0OworCisgIC8qIE1ha2UgdGhlIG5ldyBmaWxlIGdsb2JhbGx5IHJlYWRhYmxlIGFuZCB1c2VyL2dyb3VwLXdyaXRhYmxlLiAgKi8KKyAgaWYgKGZjaG1vZCAoY3R4LT5mZCwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEgpICE9IDApCisgICAgeworICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0NBTk5PVF9DSE1PRCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qIFJlbmFtZSBvdXRwdXQgZmlsZS4gICovCisgIGlmIChyZW5hbWUgKGN0eC0+dG1wX2ZuYW1lLCBjdHgtPmZuYW1lKSAhPSAwKQorICAgIHsKKyAgICAgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9DQU5OT1RfUkVOQU1FKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgLyogRnJlZSB0aGUgcmVzb3VyY2VzLiAgKi8KKyAgX19saWJhc21fZmluaWN0eCAoY3R4KTsKKworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorZnJlZV9zZWN0aW9uIChBc21TY25fdCAqc2NucCkKK3sKKyAgdm9pZCAqb2xkcDsKKworICBpZiAoc2NucC0+c3VibmV4dCAhPSBOVUxMKQorICAgIGZyZWVfc2VjdGlvbiAoc2NucC0+c3VibmV4dCk7CisKKyAgc3RydWN0IEFzbURhdGEgKmRhdGEgPSBzY25wLT5jb250ZW50OworICBpZiAoZGF0YSAhPSBOVUxMKQorICAgIGRvCisgICAgICB7CisJb2xkcCA9IGRhdGE7CisJZGF0YSA9IGRhdGEtPm5leHQ7CisJZnJlZSAob2xkcCk7CisgICAgICB9CisgICAgd2hpbGUgKG9sZHAgIT0gc2NucC0+Y29udGVudCk7CisKKyAgZnJlZSAoc2NucCk7Cit9CisKKwordm9pZAorX19saWJhc21fZmluaWN0eCAoY3R4KQorICAgICBBc21DdHhfdCAqY3R4OworeworICAvKiBJdGVyYXRlIHRocm91Z2ggc2VjdGlvbiB0YWJsZSBhbmQgZnJlZSBpbmRpdmlkdWFsIGVudHJpZXMuICAqLworICBBc21TY25fdCAqc2NuID0gY3R4LT5zZWN0aW9uX2xpc3Q7CisgIHdoaWxlIChzY24gIT0gTlVMTCkKKyAgICB7CisgICAgICBBc21TY25fdCAqb2xkcCA9IHNjbjsKKyAgICAgIHNjbiA9IHNjbi0+YWxsbmV4dDsKKyAgICAgIGZyZWVfc2VjdGlvbiAob2xkcCk7CisgICAgfQorCisgIC8qIEZyZWUgdGhlIHJlc291cmNlcyBvZiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKyAgdm9pZCAqcnVucCA9IE5VTEw7CisgIEFzbVN5bV90ICpzeW07CisgIHdoaWxlICgoc3ltID0gYXNtX3N5bWJvbF90YWJfaXRlcmF0ZSAoJmN0eC0+c3ltYm9sX3RhYiwgJnJ1bnApKSAhPSBOVUxMKQorICAgIGZyZWUgKHN5bSk7CisgIGFzbV9zeW1ib2xfdGFiX2ZyZWUgKCZjdHgtPnN5bWJvbF90YWIpOworCisKKyAgLyogRnJlZSBzZWN0aW9uIGdyb3Vwcy4gICovCisgIEFzbVNjbkdycF90ICpzY25ncnAgPSBjdHgtPmdyb3VwczsKKyAgaWYgKHNjbmdycCAhPSBOVUxMKQorICAgIGRvCisgICAgICB7CisJQXNtU2NuR3JwX3QgKm9sZHAgPSBzY25ncnA7CisKKwlzY25ncnAgPSBzY25ncnAtPm5leHQ7CisJZnJlZSAob2xkcCk7CisgICAgICB9CisgICAgd2hpbGUgKHNjbmdycCAhPSBjdHgtPmdyb3Vwcyk7CisKKworICBpZiAodW5saWtlbHkgKGN0eC0+dGV4dHApKQorICAgIHsKKyAgICAgIC8qIENsb3NlIHRoZSBzdHJlYW0uICAqLworICAgICAgZmNsb3NlIChjdHgtPm91dC5maWxlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBDbG9zZSB0aGUgb3V0cHV0IGZpbGUuICAqLworICAgICAgLyogWFhYIFdlIHNob3VsZCB0ZXN0IGZvciBlcnJvcnMgaGVyZSBidXQgd2hhdCB3b3VsZCB3ZSBkbyBpZiB3ZSdkCisJIGZpbmQgYW55LiAgKi8KKyAgICAgICh2b2lkKSBjbG9zZSAoY3R4LT5mZCk7CisKKyAgICAgIC8qIEFuZCB0aGUgc3RyaW5nIHRhYmxlcy4gICovCisgICAgICBlYmxfc3RydGFiZnJlZSAoY3R4LT5zZWN0aW9uX3N0cnRhYik7CisgICAgICBlYmxfc3RydGFiZnJlZSAoY3R4LT5zeW1ib2xfc3RydGFiKTsKKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jay4gICovCisgIHJ3bG9ja19maW5pIChjdHgtPmxvY2spOworCisgIC8qIEZpbmFsbHkgZnJlZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuICAgKi8KKyAgZnJlZSAoY3R4KTsKK30KZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fZXJyb3IuYyBiL2xpYmFzbS9hc21fZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJkODFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXNtL2FzbV9lcnJvci5jCkBAIC0wLDAgKzEsMTgzIEBACisvKiBFcnJvciBoYW5kbGluZyBpbiBsaWJhc20uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGliYXNtUC5oIgorCisKKy8qIFRoaXMgaXMgdGhlIGtleSBmb3IgdGhlIHRocmVhZCBzcGVjaWZpYyBtZW1vcnkuICAqLworc3RhdGljIHRsc19rZXlfdCBrZXk7CisKKy8qIFRoZSBlcnJvciBudW1iZXIuICBVc2VkIGluIG5vbi10aHJlYWRlZCBwcm9ncmFtcy4gICovCitzdGF0aWMgaW50IGdsb2JhbF9lcnJvcjsKK3N0YXRpYyBib29sIHRocmVhZGVkOworLyogV2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCitvbmNlX2RlZmluZSAoc3RhdGljLCBvbmNlKTsKKworLyogVGhlIGluaXRpYWxpemF0aW9uIGFuZCBkZXN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworc3RhdGljIHZvaWQgaW5pdCAodm9pZCk7CitzdGF0aWMgdm9pZCBmcmVlX2tleV9tZW0gKHZvaWQgKm1lbSk7CisKKworaW50Cithc21fZXJybm8gKHZvaWQpCit7CisgIGludCByZXN1bHQ7CisKKyAgLyogSWYgd2UgaGF2ZSBub3QgeWV0IGluaXRpYWxpemVkIHRoZSBidWZmZXIgZG8gaXQgbm93LiAgKi8KKyAgb25jZV9leGVjdXRlIChvbmNlLCBpbml0KTsKKworICBpZiAodGhyZWFkZWQpCisgICAgeworICAgICAgLyogV2UgaGF2ZSBhIGtleS4gIFVzZSBpdCB0byBnZXQgdGhlIHRocmVhZC1zcGVjaWZpYyBidWZmZXIuICAqLworICAgICAgaW50ICpidWZmZXIgPSBnZXRzcGVjaWZpYyAoa2V5KTsKKyAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkKKwl7CisJICAvKiBObyBidWZmZXIgYWxsb2NhdGVkIHNvIGZhci4gICovCisJICBidWZmZXIgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpKTsKKwkgIGlmIChidWZmZXIgPT0gTlVMTCkKKwkgICAgLyogTm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlLiAgV2UgdXNlIHRoZSBzdGF0aWMgYnVmZmVyLiAgKi8KKwkgICAgYnVmZmVyID0gJmdsb2JhbF9lcnJvcjsKKworCSAgc2V0c3BlY2lmaWMgKGtleSwgYnVmZmVyKTsKKworCSAgKmJ1ZmZlciA9IDA7CisJfQorCisgICAgICByZXN1bHQgPSAqYnVmZmVyOworICAgICAgKmJ1ZmZlciA9IEFTTV9FX05PRVJST1I7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICByZXN1bHQgPSBnbG9iYWxfZXJyb3I7CisgIGdsb2JhbF9lcnJvciA9IEFTTV9FX05PRVJST1I7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKwordm9pZAorX19saWJhc21fc2V0ZXJybm8gKHZhbHVlKQorICAgICBpbnQgdmFsdWU7Cit7CisgIC8qIElmIHdlIGhhdmUgbm90IHlldCBpbml0aWFsaXplZCB0aGUgYnVmZmVyIGRvIGl0IG5vdy4gICovCisgIG9uY2VfZXhlY3V0ZSAob25jZSwgaW5pdCk7CisKKyAgaWYgKHRocmVhZGVkKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYSBrZXkuICBVc2UgaXQgdG8gZ2V0IHRoZSB0aHJlYWQtc3BlY2lmaWMgYnVmZmVyLiAgKi8KKyAgICAgIGludCAqYnVmZmVyID0gZ2V0c3BlY2lmaWMgKGtleSk7CisgICAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBObyBidWZmZXIgYWxsb2NhdGVkIHNvIGZhci4gICovCisgICAgICAgICAgYnVmZmVyID0gbWFsbG9jIChzaXplb2YgKGludCkpOworICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIC8qIE5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZS4gIFdlIHVzZSB0aGUgc3RhdGljIGJ1ZmZlci4gICovCisgICAgICAgICAgICBidWZmZXIgPSAmZ2xvYmFsX2Vycm9yOworCisgICAgICAgICAgc2V0c3BlY2lmaWMgKGtleSwgYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAqYnVmZmVyID0gdmFsdWU7CisgICAgfQorCisgIGdsb2JhbF9lcnJvciA9IHZhbHVlOworfQorCisKKy8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZSBmb3IgdGhlIGVycm9yLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICptc2dzW0FTTV9FX05VTV0gPQoreworICBbQVNNX0VfTk9FUlJPUl0gPSBOXygibm8gZXJyb3IiKSwKKyAgW0FTTV9FX05PTUVNXSA9IE5fKCJvdXQgb2YgbWVtb3J5IiksCisgIFtBU01fRV9DQU5OT1RfQ1JFQVRFXSA9IE5fKCJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlIiksCisgIFtBU01fRV9JTlZBTElEXSA9IE5fKCJpbnZhbGlkIHBhcmFtZXRlciIpLAorICBbQVNNX0VfQ0FOTk9UX0NITU9EXSA9IE5fKCJjYW5ub3QgY2hhbmdlIG1vZGUgb2Ygb3V0cHV0IGZpbGUiKSwKKyAgW0FTTV9FX0NBTk5PVF9SRU5BTUVdID0gTl8oImNhbm5vdCByZW5hbWUgb3V0cHV0IGZpbGUiKSwKKyAgW0FTTV9FX0RVUExTWU1dID0gTl8oImR1cGxpY2F0ZSBzeW1ib2wiKSwKKyAgW0FTTV9FX1RZUEVdID0gTl8oImludmFsaWQgc2VjdGlvbiB0eXBlIGZvciBvcGVyYXRpb24iKQorfTsKKworY29uc3QgY2hhciAqCithc21fZXJybXNnIChlcnJvcikKKyAgICAgaW50IGVycm9yOworeworICBpbnQgbGFzdF9lcnJvcjsKKworICAvKiBJZiB3ZSBoYXZlIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgdGhlIGJ1ZmZlciBkbyBpdCBub3cuICAqLworICBvbmNlX2V4ZWN1dGUgKG9uY2UsIGluaXQpOworCisgIGlmICgoZXJyb3IgPT0gMCB8fCBlcnJvciA9PSAtMSkgJiYgdGhyZWFkZWQpCisgICAgeworICAgICAgLyogV2UgaGF2ZSBhIGtleS4gIFVzZSBpdCB0byBnZXQgdGhlIHRocmVhZC1zcGVjaWZpYyBidWZmZXIuICAqLworICAgICAgaW50ICpidWZmZXIgPSAoaW50ICopIGdldHNwZWNpZmljIChrZXkpOworICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorCXsKKwkgIC8qIE5vIGJ1ZmZlciBhbGxvY2F0ZWQgc28gZmFyLiAgKi8KKwkgIGJ1ZmZlciA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkpOworCSAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorCSAgICAvKiBObyBtb3JlIG1lbW9yeSBhdmFpbGFibGUuICBXZSB1c2UgdGhlIHN0YXRpYyBidWZmZXIuICAqLworCSAgICBidWZmZXIgPSAmZ2xvYmFsX2Vycm9yOworCisJICBzZXRzcGVjaWZpYyAoa2V5LCBidWZmZXIpOworCSAgKmJ1ZmZlciA9IDA7CisJfQorCisgICAgICBsYXN0X2Vycm9yID0gKmJ1ZmZlcjsKKyAgICB9CisgIGVsc2UKKyAgICBsYXN0X2Vycm9yID0gZ2xvYmFsX2Vycm9yOworCisgIGlmIChlcnJvciA8IC0xKQorICAgIHJldHVybiBfKCJVbmtub3duIGVycm9yIik7CisgIGlmIChlcnJvciA9PSAwICYmIGxhc3RfZXJyb3IgPT0gMCkKKyAgICAvKiBObyBlcnJvci4gICovCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGVycm9yICE9IC0xKQorICAgIGxhc3RfZXJyb3IgPSBlcnJvcjsKKworICBpZiAobGFzdF9lcnJvciA9PSBBU01fRV9MSUJFTEYpCisgICAgcmV0dXJuIGVsZl9lcnJtc2cgKC0xKTsKKworICByZXR1cm4gXyhtc2dzW2xhc3RfZXJyb3JdKTsKK30KKworCisvKiBGcmVlIHRoZSB0aHJlYWQgc3BlY2lmaWMgZGF0YSwgdGhpcyBpcyBkb25lIGlmIGEgdGhyZWFkIHRlcm1pbmF0ZXMuICAqLworc3RhdGljIHZvaWQKK2ZyZWVfa2V5X21lbSAodm9pZCAqbWVtKQoreworICBmcmVlIChtZW0pOworICBzZXRzcGVjaWZpYyAoa2V5LCBOVUxMKTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBrZXkgZm9yIHRoZSBnbG9iYWwgdmFyaWFibGUuICAqLworc3RhdGljIHZvaWQKK2luaXQgKHZvaWQpCit7CisgIC8vIFhYWCBTY3JldyB5b3UsIGdjYzQsIHRoZSB1bnVzZWQgZnVuY3Rpb24gYXR0cmlidXRlIGRvZXMgbm90IHdvcmsuCisgIF9fYXNtICgiIiA6OiAiciIgKGZyZWVfa2V5X21lbSkpOworCisgIGlmIChrZXlfY3JlYXRlICgma2V5LCBmcmVlX2tleV9tZW0pID09IDApCisgICAgLyogQ3JlYXRpbmcgdGhlIGtleSBzdWNjZWVkZWQuICAqLworICAgIHRocmVhZGVkID0gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fZmlsbC5jIGIvbGliYXNtL2FzbV9maWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiNjQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9hc21fZmlsbC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIERldGVybWluZSBmaWxsIHBhdHRlcm4gZm9yIGEgc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGliYXNtUC5oPgorI2luY2x1ZGUgPHN5c3RlbS5oPgorCisKK2ludAorYXNtX2ZpbGwgKGFzbXNjbiwgYnl0ZXMsIGxlbikKKyAgICAgQXNtU2NuX3QgKmFzbXNjbjsKKyAgICAgdm9pZCAqYnl0ZXM7CisgICAgIHNpemVfdCBsZW47Cit7CisgIHN0cnVjdCBGaWxsUGF0dGVybiAqcGF0dGVybjsKKyAgc3RydWN0IEZpbGxQYXR0ZXJuICpvbGRfcGF0dGVybjsKKworICBpZiAoYXNtc2NuID09IE5VTEwpCisgICAgLyogU29tZSBlYXJsaWVyIGVycm9yLiAgKi8KKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGJ5dGVzID09IE5VTEwpCisgICAgLyogVXNlIHRoZSBkZWZhdWx0IHBhdHRlcm4uICAqLworICAgIHBhdHRlcm4gPSAoc3RydWN0IEZpbGxQYXR0ZXJuICopIF9fbGliYXNtX2RlZmF1bHRfcGF0dGVybjsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFsbG9jYXRlIGFwcHJvcHJpYXRlIG1lbW9yeS4gICovCisgICAgICBwYXR0ZXJuID0gKHN0cnVjdCBGaWxsUGF0dGVybiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IEZpbGxQYXR0ZXJuKQorCQkJCQkgICAgICAgKyBsZW4pOworICAgICAgaWYgKHBhdHRlcm4gPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKyAgICAgIHBhdHRlcm4tPmxlbiA9IGxlbjsKKyAgICAgIG1lbWNweSAocGF0dGVybi0+Ynl0ZXMsIGJ5dGVzLCBsZW4pOworICAgIH0KKworICBvbGRfcGF0dGVybiA9IGFzbXNjbi0+cGF0dGVybjsKKyAgYXNtc2NuLT5wYXR0ZXJuID0gcGF0dGVybjsKKworICAvKiBGcmVlIHRoZSBvbGQgZGF0YSBzdHJ1Y3R1cmUgaWYgd2UgaGF2ZSBhbGxvY2F0ZWQgaXQuICAqLworICBpZiAob2xkX3BhdHRlcm4gIT0gX19saWJhc21fZGVmYXVsdF9wYXR0ZXJuKQorICAgIGZyZWUgKG9sZF9wYXR0ZXJuKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fZ2V0ZWxmLmMgYi9saWJhc20vYXNtX2dldGVsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmIwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX2dldGVsZi5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIFJldHVybiBFTEYgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2VtYmxlciBjb250ZXh0LgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxsaWJhc21QLmg+CisKKworRWxmICoKK2FzbV9nZXRlbGYgKGN0eCkKKyAgICAgQXNtQ3R4X3QgKmN0eDsKK3sKKyAgcmV0dXJuIGN0eCAhPSBOVUxMID8gY3R4LT5vdXQuZWxmIDogTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fbmV3YWJzc3ltLmMgYi9saWJhc20vYXNtX25ld2Fic3N5bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTQ2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX25ld2Fic3N5bS5jCkBAIC0wLDAgKzEsMTIxIEBACisvKiBDcmVhdGUgbmV3IEFCUyBzeW1ib2wuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJhc21QLmg+CisjaW5jbHVkZSA8c3lzdGVtLmg+CisKKworLyogT2JqZWN0IGZvciBzcGVjaWFsIENPTU1PTiBzZWN0aW9uLiAgKi8KK3N0YXRpYyBjb25zdCBBc21TY25fdCBfX2xpYmFzbV9hYnNfc2NuID0KKyAgeworICAgIC5kYXRhID0geworICAgICAgLm1haW4gPSB7CisJLnNjbiA9IEFTTV9BQlNfU0NOCisgICAgICB9CisgICAgfQorICB9OworCisKK0FzbVN5bV90ICoKK2FzbV9uZXdhYnNzeW0gKGN0eCwgbmFtZSwgc2l6ZSwgdmFsdWUsIHR5cGUsIGJpbmRpbmcpCisgICAgIEFzbUN0eF90ICpjdHg7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIEdFbGZfWHdvcmQgc2l6ZTsKKyAgICAgR0VsZl9BZGRyIHZhbHVlOworICAgICBpbnQgdHlwZTsKKyAgICAgaW50IGJpbmRpbmc7Cit7CisgIEFzbVN5bV90ICpyZXN1bHQ7CisKKyAgaWYgKGN0eCA9PSBOVUxMKQorICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nIGJlZm9yZS4gICovCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQ29tbW9uIHN5bWJvbHMgYXJlIHB1YmxpYy4gIFRoZXJlZm9yZSB0aGUgdXNlciBtdXN0IHByb3ZpZGUgYQorICAgICBuYW1lLiAgKi8KKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfSU5WQUxJRCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcndsb2NrX3dybG9jayAoY3R4LT5sb2NrKTsKKworICByZXN1bHQgPSAoQXNtU3ltX3QgKikgbWFsbG9jIChzaXplb2YgKEFzbVN5bV90KSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXN1bHQtPnNjbiA9IChBc21TY25fdCAqKSAmX19saWJhc21fYWJzX3NjbjsKKyAgcmVzdWx0LT5zaXplID0gc2l6ZTsKKyAgcmVzdWx0LT50eXBlID0gdHlwZTsKKyAgcmVzdWx0LT5iaW5kaW5nID0gYmluZGluZzsKKyAgcmVzdWx0LT5zeW1pZHggPSAwOworICByZXN1bHQtPnN0cmVudCA9IGVibF9zdHJ0YWJhZGQgKGN0eC0+c3ltYm9sX3N0cnRhYiwgbmFtZSwgMCk7CisKKyAgLyogVGhlIHZhbHVlIG9mIGFuIEFCUyBzeW1ib2wgbXVzdCBub3QgYmUgbW9kaWZpZWQuICBTaW5jZSB0aGVyZSBhcmUKKyAgICAgbm8gc3Vic2VjdGlvbiBhbmQgdGhlIGluaXRpYWwgb2Zmc2V0IG9mIHRoZSBzZWN0aW9uIGlzIDAgd2UgY2FuCisgICAgIGdldCB0aGUgYWxpZ25tZW50IHJlY29yZGVkIGJ5IHN0b3JpbmcgaXQgaW50byB0aGUgb2Zmc2V0CisgICAgIGZpZWxkLiAgKi8KKyAgcmVzdWx0LT5vZmZzZXQgPSB2YWx1ZTsKKworICBpZiAodW5saWtlbHkgKGN0eC0+dGV4dHApKQorICAgIHsKKyAgICAgIC8qIEFuIGFic29sdXRlIHN5bWJvbCBjYW4gYmUgZGVmaW5lZCBieSBnaXZpbmcgYSBzeW1ib2wgYQorCSBzcGVjaWZpYyB2YWx1ZS4gICovCisgICAgICBpZiAoYmluZGluZyA9PSBTVEJfR0xPQkFMKQorCWZwcmludGYgKGN0eC0+b3V0LmZpbGUsICJcdC5nbG9ibCAlc1xuIiwgbmFtZSk7CisgICAgICBlbHNlIGlmIChiaW5kaW5nID09IFNUQl9XRUFLKQorCWZwcmludGYgKGN0eC0+b3V0LmZpbGUsICJcdC53ZWFrICVzXG4iLCBuYW1lKTsKKworICAgICAgaWYgKHR5cGUgPT0gU1RUX09CSkVDVCkKKwlmcHJpbnRmIChjdHgtPm91dC5maWxlLCAiXHQudHlwZSAlcyxAb2JqZWN0XG4iLCBuYW1lKTsKKyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gU1RUX0ZVTkMpCisJZnByaW50ZiAoY3R4LT5vdXQuZmlsZSwgIlx0LnR5cGUgJXMsQGZ1bmN0aW9uXG4iLCBuYW1lKTsKKworICAgICAgZnByaW50ZiAoY3R4LT5vdXQuZmlsZSwgIiVzID0gJWxsdVxuIiwKKwkgICAgICAgbmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIHZhbHVlKTsKKworICAgICAgaWYgKHNpemUgIT0gMCkKKwlmcHJpbnRmIChjdHgtPm91dC5maWxlLCAiXHQuc2l6ZSAlcywgJWxsdVxuIiwKKwkJIG5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBzaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBQdXQgdGhlIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBzbyB0aGF0IHdlIGNhbiBsYXRlciBmaW5kIGl0LiAgKi8KKyAgICAgIGlmIChhc21fc3ltYm9sX3RhYl9pbnNlcnQgKCZjdHgtPnN5bWJvbF90YWIsIGVsZl9oYXNoIChuYW1lKSwgcmVzdWx0KQorCSAgIT0gMCkKKwl7CisJICAvKiBUaGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLiAgKi8KKwkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9EVVBMU1lNKTsKKwkgIGZyZWUgKHJlc3VsdCk7CisJICByZXN1bHQgPSBOVUxMOworCX0KKyAgICAgIGVsc2UgaWYgKG5hbWUgIT0gTlVMTCAmJiBhc21fZW1pdF9zeW1ib2xfcCAobmFtZSkpCisJLyogT25seSBjb3VudCBub24tcHJpdmF0ZSBzeW1ib2xzLiAgKi8KKwkrK2N0eC0+bnN5bWJvbF90YWI7CisgICAgfQorCisgIHJ3bG9ja191bmxvY2sgKGN0eC0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fbmV3Y29tc3ltLmMgYi9saWJhc20vYXNtX25ld2NvbXN5bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTVhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX25ld2NvbXN5bS5jCkBAIC0wLDAgKzEsMTAyIEBACisvKiBDcmVhdGUgbmV3IENPTU1PTiBzeW1ib2wuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJhc21QLmg+CisjaW5jbHVkZSA8c3lzdGVtLmg+CisKKworLyogT2JqZWN0IGZvciBzcGVjaWFsIENPTU1PTiBzZWN0aW9uLiAgKi8KK3N0YXRpYyBjb25zdCBBc21TY25fdCBfX2xpYmFzbV9jb21fc2NuID0KKyAgeworICAgIC5kYXRhID0geworICAgICAgLm1haW4gPSB7CisJLnNjbiA9IEFTTV9DT01fU0NOCisgICAgICB9CisgICAgfQorICB9OworCisKK0FzbVN5bV90ICoKK2FzbV9uZXdjb21zeW0gKGN0eCwgbmFtZSwgc2l6ZSwgYWxpZ24pCisgICAgIEFzbUN0eF90ICpjdHg7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIEdFbGZfWHdvcmQgc2l6ZTsKKyAgICAgR0VsZl9BZGRyIGFsaWduOworeworICBBc21TeW1fdCAqcmVzdWx0OworCisgIGlmIChjdHggPT0gTlVMTCkKKyAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyBiZWZvcmUuICAqLworICAgIHJldHVybiBOVUxMOworCisgIC8qIENvbW1vbiBzeW1ib2xzIGFyZSBwdWJsaWMuICBUaGVyZWZvcmUgdGhlIHVzZXIgbXVzdCBwcm92aWRlIGEKKyAgICAgbmFtZS4gICovCisgIGlmIChuYW1lID09IE5VTEwpCisgICAgeworICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0lOVkFMSUQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJ3bG9ja193cmxvY2sgKGN0eC0+bG9jayk7CisKKyAgcmVzdWx0ID0gKEFzbVN5bV90ICopIG1hbGxvYyAoc2l6ZW9mIChBc21TeW1fdCkpOworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVzdWx0LT5zY24gPSAoQXNtU2NuX3QgKikgJl9fbGliYXNtX2NvbV9zY247CisgIHJlc3VsdC0+c2l6ZSA9IHNpemU7CisgIC8qIFhYWCBEbyB3ZSBoYXZlIHRvIGFsbG93IGEgZGlmZmVyZW50IHR5cGU/ICAqLworICByZXN1bHQtPnR5cGUgPSBTVFRfT0JKRUNUOworICAvKiBYWFggRG8gd2UgaGF2ZSB0byBhbGxvdyBhIGRpZmZlcmVudCBiaW5kaW5nPyAgKi8KKyAgcmVzdWx0LT5iaW5kaW5nID0gU1RCX0dMT0JBTDsKKyAgcmVzdWx0LT5zeW1pZHggPSAwOworICByZXN1bHQtPnN0cmVudCA9IGVibF9zdHJ0YWJhZGQgKGN0eC0+c3ltYm9sX3N0cnRhYiwgbmFtZSwgMCk7CisKKyAgLyogVGhlIHZhbHVlIG9mIGEgQ09NIHN5bWJvbCBpcyB0aGUgYWxpZ25tZW50LiAgU2luY2UgdGhlcmUgYXJlIG5vCisgICAgIHN1YnNlY3Rpb24gYW5kIHRoZSBpbml0aWFsIG9mZnNldCBvZiB0aGUgc2VjdGlvbiBpcyAwIHdlIGNhbiBnZXQKKyAgICAgdGhlIGFsaWdubWVudCByZWNvcmRlZCBieSBzdG9yaW5nIGl0IGludG8gdGhlIG9mZnNldCBmaWVsZC4gICovCisgIHJlc3VsdC0+b2Zmc2V0ID0gYWxpZ247CisKKyAgaWYgKHVubGlrZWx5IChjdHgtPnRleHRwKSkKKyAgICBmcHJpbnRmIChjdHgtPm91dC5maWxlLCAiXHQuY29tbSAlcywgJSIgUFJJdU1BWCAiLCAlIiBQUkl1TUFYICJcbiIsCisJICAgICBuYW1lLCAodWludG1heF90KSBzaXplLCAodWludG1heF90KSBhbGlnbik7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBQdXQgdGhlIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBzbyB0aGF0IHdlIGNhbiBsYXRlciBmaW5kIGl0LiAgKi8KKyAgICAgIGlmIChhc21fc3ltYm9sX3RhYl9pbnNlcnQgKCZjdHgtPnN5bWJvbF90YWIsIGVsZl9oYXNoIChuYW1lKSwgcmVzdWx0KQorCSAgIT0gMCkKKwl7CisJICAvKiBUaGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLiAgKi8KKwkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9EVVBMU1lNKTsKKwkgIGZyZWUgKHJlc3VsdCk7CisJICByZXN1bHQgPSBOVUxMOworCX0KKyAgICAgIGVsc2UgaWYgKG5hbWUgIT0gTlVMTCAmJiBhc21fZW1pdF9zeW1ib2xfcCAobmFtZSkpCisJLyogT25seSBjb3VudCBub24tcHJpdmF0ZSBzeW1ib2xzLiAgKi8KKwkrK2N0eC0+bnN5bWJvbF90YWI7CisgICAgfQorCisgIHJ3bG9ja191bmxvY2sgKGN0eC0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fbmV3c2NuLmMgYi9saWJhc20vYXNtX25ld3Njbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODkwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX25ld3Njbi5jCkBAIC0wLDAgKzEsMjAyIEBACisvKiBDcmVhdGUgbmV3IHNlY3Rpb24gaW4gb3V0cHV0IGZpbGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJvci5oPgorI2luY2x1ZGUgPGxpYmludGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmFzbVAuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzeXN0ZW0uaD4KKworCisvKiBNZW1vcnkgZm9yIHRoZSBkZWZhdWx0IHBhdHRlcm4uICBUaGUgdHlwZSB1c2VzIGEgZmxleGlibGUgYXJyYXkKKyAgIHdoaWNoIGRvZXMgd29yayB3ZWxsIHdpdGggYSBzdGF0aWMgaW5pdGlhbGl6ZXIuICBTbyB3ZSBwbGF5IHNvbWUKKyAgIGRpcnR5IHRyaWNrcyBoZXJlLiAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgc3RydWN0IEZpbGxQYXR0ZXJuIHBhdHRlcm47CisgIGNoYXIgemVybzsKK30geGRlZmF1bHRfcGF0dGVybiA9CisgIHsKKyAgICAucGF0dGVybiA9CisgICAgeworICAgICAgLmxlbiA9IDEKKyAgICB9LAorICAgIC56ZXJvID0gJ1wwJworICB9OworY29uc3Qgc3RydWN0IEZpbGxQYXR0ZXJuICpfX2xpYmFzbV9kZWZhdWx0X3BhdHRlcm4gPSAmeGRlZmF1bHRfcGF0dGVybi5wYXR0ZXJuOworCisKK3N0YXRpYyBBc21TY25fdCAqCit0ZXh0X25ld3NjbiAoQXNtU2NuX3QgKnJlc3VsdCwgR0VsZl9Xb3JkIHR5cGUsIEdFbGZfWHdvcmQgZmxhZ3MpCit7CisgIC8qIEJ1ZmZlciB3aGVyZSB3ZSBjb25zdHJ1Y3QgdGhlIGZsYWcgc3RyaW5nLiAgKi8KKyAgY2hhciBmbGFnc3RyW3NpemVvZiAoR0VsZl9Yd29yZCkgKiA4ICsgNV07CisgIGNoYXIgKndwID0gZmxhZ3N0cjsKKyAgY29uc3QgY2hhciAqdHlwZXN0ciA9ICIiOworCisgIC8qIE9ubHkgd3JpdGUgb3V0IHRoZSBmbGFnIHN0cmluZyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZQorICAgICBzZWN0aW9uIGlzIHNlbGVjdGVkLiAgU29tZSBhc3NlbWJsZXJzIGNhbm5vdCBjb3BlIHdpdGggdGhlCisgICAgIC5zZWN0aW9uIHBzZXVkby1vcCBvdGhlcndpc2UuICAqLworICB3cCA9IHN0cGNweSAod3AsICIsIFwiIik7CisKKyAgaWYgKGZsYWdzICYgU0hGX1dSSVRFKQorICAgICp3cCsrID0gJ3cnOworICBpZiAoZmxhZ3MgJiBTSEZfQUxMT0MpCisgICAgKndwKysgPSAnYSc7CisgIGlmIChmbGFncyAmIFNIRl9FWEVDSU5TVFIpCisgICAgKndwKysgPSAneCc7CisgIGlmIChmbGFncyAmIFNIRl9NRVJHRSkKKyAgICAqd3ArKyA9ICdNJzsKKyAgaWYgKGZsYWdzICYgU0hGX1NUUklOR1MpCisgICAgKndwKysgPSAnUyc7CisgIGlmIChmbGFncyAmIFNIRl9MSU5LX09SREVSKQorICAgICp3cCsrID0gJ0wnOworCisgICp3cCsrID0gJyInOworCisgIGlmICh0eXBlID09IFNIVF9QUk9HQklUUykKKyAgICB0eXBlc3RyID0gIixAcHJvZ2JpdHMiOworICBlbHNlIGlmICh0eXBlID09IFNIVF9OT0JJVFMpCisgICAgdHlwZXN0ciA9ICIsQG5vYml0cyI7CisKKyAgLyogVGVybWluYXRlIHRoZSBzdHJpbmcuICAqLworICAqd3AgPSAnXDAnOworCisgIHByaW50ZiAoIlx0LnNlY3Rpb24gXCIlc1wiJXMlc1xuIiwgcmVzdWx0LT5uYW1lLCBmbGFnc3RyLCB0eXBlc3RyKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBBc21TY25fdCAqCitiaW5hcnlfbmV3c2NuIChBc21TY25fdCAqcmVzdWx0LCBHRWxmX1dvcmQgdHlwZSwgR0VsZl9Yd29yZCBmbGFncywKKwkgICAgICAgc2l6ZV90IHNjbm5hbWVfbGVuKQoreworICBHRWxmX1NoZHIgc2hkcl9tZW07CisgIEdFbGZfU2hkciAqc2hkcjsKKyAgRWxmX1NjbiAqc2NuOworCisgIC8qIFRoZSBpbml0aWFsIHN1YnNlY3Rpb24gaGFzIHRoZSBudW1iZXIgemVyby4gICovCisgIHJlc3VsdC0+c3Vic2VjdGlvbl9pZCA9IDA7CisKKyAgLyogV2Ugc3RhcnQgYXQgb2Zmc2V0IHplcm8uICAqLworICByZXN1bHQtPm9mZnNldCA9IDA7CisgIC8qIEFuZCBnZW5lcmljIGFsaWdubWVudC4gICovCisgIHJlc3VsdC0+bWF4X2FsaWduID0gMTsKKworICAvKiBObyBvdXRwdXQgeWV0LiAgKi8KKyAgcmVzdWx0LT5jb250ZW50ID0gTlVMTDsKKworICAvKiBQdXQgdGhlIGRlZmF1bHQgZmlsbCBwYXR0ZXJuIGluIHBsYWNlLiAgKi8KKyAgcmVzdWx0LT5wYXR0ZXJuID0gKHN0cnVjdCBGaWxsUGF0dGVybiAqKSBfX2xpYmFzbV9kZWZhdWx0X3BhdHRlcm47CisKKyAgLyogVGhlcmUgYXJlIG5vIHN1YnNlY3Rpb25zIHNvIGZhci4gICovCisgIHJlc3VsdC0+c3VibmV4dCA9IE5VTEw7CisKKyAgLyogQWRkIHRoZSBuYW1lIHRvIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLworICByZXN1bHQtPmRhdGEubWFpbi5zdHJlbnQgPSBlYmxfc3RydGFiYWRkIChyZXN1bHQtPmN0eC0+c2VjdGlvbl9zdHJ0YWIsCisJCQkJCSAgICByZXN1bHQtPm5hbWUsIHNjbm5hbWVfbGVuKTsKKyAgYXNzZXJ0IChyZXN1bHQtPmRhdGEubWFpbi5zdHJlbnQgIT0gTlVMTCk7CisKKyAgLyogQ3JlYXRlIHRoZSBuZXcgRUxGIHNlY3Rpb24uICAqLworICByZXN1bHQtPmRhdGEubWFpbi5zY24gPSBzY24gPSBlbGZfbmV3c2NuIChyZXN1bHQtPmN0eC0+b3V0LmVsZik7CisgIGlmIChzY24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChyZXN1bHQpOworICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0xJQkVMRik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogTm90IHBhcnQgb2YgYSBzZWN0aW9uIGdyb3VwICh5ZXQpLiAgKi8KKyAgcmVzdWx0LT5kYXRhLm1haW4ubmV4dF9pbl9ncm91cCA9IE5VTEw7CisKKyAgLyogUmVtZW1iZXIgdGhlIGZsYWdzLiAgKi8KKyAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworCisgIHNoZHItPnNoX2ZsYWdzID0gZmxhZ3M7CisgIHJlc3VsdC0+dHlwZSA9IHNoZHItPnNoX3R5cGUgPSB0eXBlOworCisgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworQXNtU2NuX3QgKgorYXNtX25ld3NjbiAoY3R4LCBzY25uYW1lLCB0eXBlLCBmbGFncykKKyAgICAgQXNtQ3R4X3QgKmN0eDsKKyAgICAgY29uc3QgY2hhciAqc2NubmFtZTsKKyAgICAgR0VsZl9Xb3JkIHR5cGU7CisgICAgIEdFbGZfWHdvcmQgZmxhZ3M7Cit7CisgIHNpemVfdCBzY25uYW1lX2xlbiA9IHN0cmxlbiAoc2NubmFtZSkgKyAxOworICB1bnNpZ25lZCBsb25nIGludCBodmFsOworICBBc21TY25fdCAqcmVzdWx0OworCisgIC8qIElmIG5vIGNvbnRleHQgaXMgZ2l2ZW4gdGhlcmUgbWlnaHQgYmUgYW4gZWFybGllciBlcnJvci4gICovCisgIGlmIChjdHggPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBDaGVjayB3aGV0aGVyIG9ubHkgZmxhZ3MgYXJlIHNldCB3aGljaCBhcmVzZWxlY3RhYmxlIGJ5IHRoZSB1c2VyLiAgKi8KKyAgaWYgKHVubGlrZWx5ICgoZmxhZ3MgJiB+KFNIRl9XUklURSB8IFNIRl9BTExPQyB8IFNIRl9FWEVDSU5TVFIgfCBTSEZfTUVSR0UKKwkJCSAgIHwgU0hGX1NUUklOR1MgfCBTSEZfTElOS19PUkRFUikpICE9IDApCisgICAgICAvKiBXZSBhbGxvdyBvbmx5IHR3byBzZWN0aW9uIHR5cGVzOiBkYXRhIGFuZCBkYXRhIHdpdGhvdXQgZmlsZQorCSByZXByZXNlbnRhdGlvbi4gICovCisgICAgICB8fCAodHlwZSAhPSBTSFRfUFJPR0JJVFMgJiYgdW5saWtlbHkgKHR5cGUgIT0gU0hUX05PQklUUykpKQorICAgIHsKKyAgICAgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9JTlZBTElEKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBodmFsID0gZWxmX2hhc2ggKHNjbm5hbWUpOworCisgIHJ3bG9ja193cmxvY2sgKGN0eC0+bG9jayk7CisKKyAgLyogVGhpcyBpcyBhIG5ldyBzZWN0aW9uLiAgKi8KKyAgcmVzdWx0ID0gKEFzbVNjbl90ICopIG1hbGxvYyAoc2l6ZW9mIChBc21TY25fdCkgKyBzY25uYW1lX2xlbik7CisgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBBZGQgdGhlIG5hbWUuICAqLworICAgICAgbWVtY3B5IChyZXN1bHQtPm5hbWUsIHNjbm5hbWUsIHNjbm5hbWVfbGVuKTsKKworICAgICAgLyogQWRkIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvbnRleHQuICAqLworICAgICAgcmVzdWx0LT5jdHggPSBjdHg7CisKKyAgICAgIC8qIFBlcmZvcm0gb3BlcmF0aW9ucyBhY2NvcmRpbmcgdG8gb3V0cHV0IG1vZGUuICAqLworICAgICAgcmVzdWx0ID0gKHVubGlrZWx5IChjdHgtPnRleHRwKQorCQk/IHRleHRfbmV3c2NuIChyZXN1bHQsIHR5cGUsIGZsYWdzKQorCQk6IGJpbmFyeV9uZXdzY24gKHJlc3VsdCwgdHlwZSwgZmxhZ3MsIHNjbm5hbWVfbGVuKSk7CisKKyAgICAgIC8qIElmIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsIGZpbmFsbHkgYWRkIHRoZSBuZXcgc2VjdGlvbiB0byB0aGUgaGFzaAorCSB0YWJsZS4gICovCisgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCisJeworCSAgcmVzdWx0LT5hbGxuZXh0ID0gY3R4LT5zZWN0aW9uX2xpc3Q7CisJICBjdHgtPnNlY3Rpb25fbGlzdCA9IHJlc3VsdDsKKwl9CisgICAgfQorCisgIHJ3bG9ja191bmxvY2sgKGN0eC0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KK0lOVERFRihhc21fbmV3c2NuKQpkaWZmIC0tZ2l0IGEvbGliYXNtL2FzbV9uZXdzY25faW5ncnAuYyBiL2xpYmFzbS9hc21fbmV3c2NuX2luZ3JwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiZGM2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9hc21fbmV3c2NuX2luZ3JwLmMKQEAgLTAsMCArMSw2NiBAQAorLyogQ3JlYXRlIG5ldyBzZWN0aW9uLCB3aGljaCBpcyBtZW1iZXIgb2YgYSBncm91cCwgaW4gb3V0cHV0IGZpbGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImxpYmFzbVAuaCIKKworCitBc21TY25fdCAqCithc21fbmV3c2NuX2luZ3JwIChjdHgsIHNjbm5hbWUsIHR5cGUsIGZsYWdzLCBncnApCisgICAgIEFzbUN0eF90ICpjdHg7CisgICAgIGNvbnN0IGNoYXIgKnNjbm5hbWU7CisgICAgIEdFbGZfV29yZCB0eXBlOworICAgICBHRWxmX1h3b3JkIGZsYWdzOworICAgICBBc21TY25HcnBfdCAqZ3JwOworeworICBBc21TY25fdCAqcmVzdWx0ID0gSU5UVVNFIChhc21fbmV3c2NuKSAoY3R4LCBzY25uYW1lLCB0eXBlLCBmbGFncyk7CisKKyAgaWYgKGxpa2VseSAocmVzdWx0ICE9IE5VTEwpKQorICAgIHsKKyAgICAgIC8qIFdlIG1hbmFnZWQgdG8gY3JlYXRlIGEgc2VjdGlvbiBncm91cC4gIEFkZCBpdCB0byB0aGUgc2VjdGlvbgorCSBncm91cC4gICovCisgICAgICBpZiAoZ3JwLT5ubWVtYmVycyA9PSAwKQorCXsKKwkgIGFzc2VydCAoZ3JwLT5tZW1iZXJzID09IE5VTEwpOworCSAgZ3JwLT5tZW1iZXJzID0gcmVzdWx0LT5kYXRhLm1haW4ubmV4dF9pbl9ncm91cCA9IHJlc3VsdDsKKwl9CisgICAgICBlbHNlCisJeworCSAgcmVzdWx0LT5kYXRhLm1haW4ubmV4dF9pbl9ncm91cAorCSAgICA9IGdycC0+bWVtYmVycy0+ZGF0YS5tYWluLm5leHRfaW5fZ3JvdXA7CisJICBncnAtPm1lbWJlcnMgPSBncnAtPm1lbWJlcnMtPmRhdGEubWFpbi5uZXh0X2luX2dyb3VwID0gcmVzdWx0OworCX0KKworICAgICAgKytncnAtPm5tZW1iZXJzOworCisgICAgICAvKiBTZXQgdGhlIFNIRl9HUk9VUCBmbGFnLiAgKi8KKyAgICAgIGlmIChsaWtlbHkgKCEgY3R4LT50ZXh0cCkpCisJeworCSAgR0VsZl9TaGRyIHNoZHJfbWVtOworCSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChyZXN1bHQtPmRhdGEubWFpbi5zY24sICZzaGRyX21lbSk7CisKKwkgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKwkgIHNoZHItPnNoX2ZsYWdzIHw9IFNIRl9HUk9VUDsKKworCSAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHJlc3VsdC0+ZGF0YS5tYWluLnNjbiwgc2hkcik7CisJfQorICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliYXNtL2FzbV9uZXdzY25ncnAuYyBiL2xpYmFzbS9hc21fbmV3c2NuZ3JwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjOGJlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9hc21fbmV3c2NuZ3JwLmMKQEAgLTAsMCArMSw5MCBAQAorLyogQ3JlYXRlIG5ldyBzZWN0aW9uIGdyb3VwLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhc21QLmgiCisjaW5jbHVkZSA8c3lzdGVtLmg+CisKKworCitBc21TY25HcnBfdCAqCithc21fbmV3c2NuZ3JwIChjdHgsIGdycG5hbWUsIHNpZ25hdHVyZSwgZmxhZ3MpCisgICAgIEFzbUN0eF90ICpjdHg7CisgICAgIGNvbnN0IGNoYXIgKmdycG5hbWU7CisgICAgIEFzbVN5bV90ICpzaWduYXR1cmU7CisgICAgIEVsZjMyX1dvcmQgZmxhZ3M7Cit7CisgIEFzbVNjbkdycF90ICpyZXN1bHQ7CisgIHNpemVfdCBncnBuYW1lX2xlbiA9IHN0cmxlbiAoZ3JwbmFtZSkgKyAxOworCisgIGlmIChjdHggPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoKGZsYWdzICYgfkdSUF9DT01EQVQpICE9IDApCisgICAgeworICAgICAgLyogVGhpcyBpcyBub3QgYSBzdXBwb3J0ZWQgZmxhZy4gICovCisgICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfSU5WQUxJRCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmVzdWx0ID0gKEFzbVNjbkdycF90ICopIG1hbGxvYyAoc2l6ZW9mIChBc21TY25HcnBfdCkgKyBncnBuYW1lX2xlbik7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXN1bHQtPnNpZ25hdHVyZSA9IHNpZ25hdHVyZTsKKyAgcmVzdWx0LT5tZW1iZXJzID0gTlVMTDsKKyAgcmVzdWx0LT5ubWVtYmVycyA9IDA7CisgIHJlc3VsdC0+ZmxhZ3MgPSBmbGFnczsKKworICBtZW1jcHkgKHJlc3VsdC0+bmFtZSwgZ3JwbmFtZSwgZ3JwbmFtZV9sZW4pOworICByZXN1bHQtPnN0cmVudCA9IGVibF9zdHJ0YWJhZGQgKGN0eC0+c2VjdGlvbl9zdHJ0YWIsIHJlc3VsdC0+bmFtZSwKKwkJCQkgIGdycG5hbWVfbGVuKTsKKworICBpZiAodW5saWtlbHkgKGN0eC0+dGV4dHApKQorICAgIC8vIFhYWCBUQkkuICBXaGF0IGlzIHRoZSBmb3JtYXQ/CisgICAgYWJvcnQgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICByZXN1bHQtPnNjbiA9IGVsZl9uZXdzY24gKGN0eC0+b3V0LmVsZik7CisgICAgICBpZiAocmVzdWx0LT5zY24gPT0gTlVMTCkKKwl7CisJICAvKiBDb3VsZG4ndCBhbGxvY2F0ZSBhIG5ldyBzZWN0aW9uLiAgKi8KKwkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9MSUJFTEYpOworCSAgZnJlZSAocmVzdWx0KTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisKKyAgLyogRW5xdWV1ZSBpcyB0aGUgY29udGV4dCBkYXRhIHN0cnVjdHVyZS4gICovCisgIGlmIChjdHgtPm5ncm91cHMgPT0gMCkKKyAgICB7CisgICAgICBhc3NlcnQgKGN0eC0+Z3JvdXBzID09IE5VTEwpOworICAgICAgY3R4LT5ncm91cHMgPSByZXN1bHQtPm5leHQgPSByZXN1bHQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVzdWx0LT5uZXh0ID0gY3R4LT5ncm91cHMtPm5leHQ7CisgICAgICBjdHgtPmdyb3VwcyA9IGN0eC0+Z3JvdXBzLT5uZXh0ID0gcmVzdWx0OworICAgIH0KKyAgKytjdHgtPm5ncm91cHM7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmFzbS9hc21fbmV3c3Vic2NuLmMgYi9saWJhc20vYXNtX25ld3N1YnNjbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Njc3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX25ld3N1YnNjbi5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIENyZWF0ZSBuZXcgc3Vic2VjdGlvbiBzZWN0aW9uIGluIGdpdmVuIHNlY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpYmFzbVAuaD4KKyNpbmNsdWRlIDxzeXN0ZW0uaD4KKworCitBc21TY25fdCAqCithc21fbmV3c3Vic2NuIChhc21zY24sIG5yKQorICAgICBBc21TY25fdCAqYXNtc2NuOworICAgICB1bnNpZ25lZCBpbnQgbnI7Cit7CisgIEFzbVNjbl90ICpydW5wOworICBBc21TY25fdCAqbmV3cDsKKworICAvKiBKdXN0IHJldHVybiBpZiBubyBzZWN0aW9uIGlzIGdpdmVuLiAgVGhlIGVycm9yIG11c3QgaGF2ZSBiZWVuCisgICAgIHNvbWV3aGVyZSBlbHNlLiAgKi8KKyAgaWYgKGFzbXNjbiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGFscmVhZHkgYSBzdWJzZWN0aW9uIHdpdGggdGhpcyBudW1iZXIuICAqLworICBydW5wID0gYXNtc2NuLT5zdWJzZWN0aW9uX2lkID09IDAgPyBhc21zY24gOiBhc21zY24tPmRhdGEudXA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChydW5wLT5zdWJzZWN0aW9uX2lkID09IG5yKQorCS8qIEZvdW5kIGl0LiAgKi8KKwlyZXR1cm4gcnVucDsKKworICAgICAgaWYgKHJ1bnAtPnN1Ym5leHQgPT0gTlVMTCB8fCBydW5wLT5zdWJuZXh0LT5zdWJzZWN0aW9uX2lkID4gbnIpCisJYnJlYWs7CisKKyAgICAgIHJ1bnAgPSBydW5wLT5zdWJuZXh0OworICAgIH0KKworICBuZXdwID0gKEFzbVNjbl90ICopIG1hbGxvYyAoc2l6ZW9mIChBc21TY25fdCkpOworICBpZiAobmV3cCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFNhbWUgYXNzZW1ibGVyIGNvbnRleHQgdGhhbiB0aGUgb3JpZ2luYWwgc2VjdGlvbi4gICovCisgIG5ld3AtPmN0eCA9IHJ1bnAtPmN0eDsKKworICAvKiBVc2VyIHByb3ZpZGVkIHRoZSBzdWJzZWN0aW8gbklELiAgKi8KKyAgbmV3cC0+c3Vic2VjdGlvbl9pZCA9IG5yOworCisgIC8qIEluaGVyaXQgdGhlIHBhcmVudCdzIHR5cGUuICAqLworICBuZXdwLT50eXBlID0gcnVucC0+dHlwZTsKKworICAvKiBQb2ludGVyIHRvIHRoZSB6ZXJvdGggc3Vic2VjdGlvbi4gICovCisgIG5ld3AtPmRhdGEudXAgPSBydW5wLT5zdWJzZWN0aW9uX2lkID09IDAgPyBydW5wIDogcnVucC0+ZGF0YS51cDsKKworICAvKiBXZSBzdGFydCBhdCBvZmZzZXQgemVyby4gICovCisgIG5ld3AtPm9mZnNldCA9IDA7CisgIC8qIEFuZCBnZW5lcmljIGFsaWdubWVudC4gICovCisgIG5ld3AtPm1heF9hbGlnbiA9IDE7CisKKyAgLyogTm8gb3V0cHV0IHlldC4gICovCisgIG5ld3AtPmNvbnRlbnQgPSBOVUxMOworCisgIC8qIEluaGVyaXQgdGhlIGZpbGwgcGF0dGVybiBmcm9tIHRoZSBzZWN0aW9uIHRoaXMgb25lIGlzIGRlcml2ZWQgZnJvbS4gICovCisgIG5ld3AtPnBhdHRlcm4gPSBhc21zY24tPnBhdHRlcm47CisKKyAgLyogRW5xdWV1ZSBhdCB0aGUgcmlnaHQgcG9zaXRpb24gaW4gdGhlIGxpc3QuICAqLworICBuZXdwLT5zdWJuZXh0ID0gcnVucC0+c3VibmV4dDsKKyAgcnVucC0+c3VibmV4dCA9IG5ld3A7CisKKyAgcmV0dXJuIG5ld3A7Cit9CmRpZmYgLS1naXQgYS9saWJhc20vYXNtX25ld3N5bS5jIGIvbGliYXNtL2FzbV9uZXdzeW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGFkOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXNtL2FzbV9uZXdzeW0uYwpAQCAtMCwwICsxLDEyMyBAQAorLyogRGVmaW5lIG5ldyBzeW1ib2wgZm9yIGN1cnJlbnQgcG9zaXRpb24gaW4gZ2l2ZW4gc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmFzbVAuaD4KKyNpbmNsdWRlIDxzeXN0ZW0uaD4KKworCitBc21TeW1fdCAqCithc21fbmV3c3ltIChhc21zY24sIG5hbWUsIHNpemUsIHR5cGUsIGJpbmRpbmcpCisgICAgIEFzbVNjbl90ICphc21zY247CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIEdFbGZfWHdvcmQgc2l6ZTsKKyAgICAgaW50IHR5cGU7CisgICAgIGludCBiaW5kaW5nOworeworI2RlZmluZSBURU1QU1lNTEVOIDEwCisgIGNoYXIgdGVtcHN5bVtURU1QU1lNTEVOXTsKKyAgQXNtU3ltX3QgKnJlc3VsdDsKKworICBpZiAoYXNtc2NuID09IE5VTEwpCisgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcgYmVmb3JlLiAgKi8KKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBzeW1ib2wgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBJZiBhIGxvY2FsIHN5bWJvbCBuYW1lIGlzIGNyZWF0ZWQgdGhlIHN5bWJvbCBiZXR0ZXIgaGF2ZQorCSBsb2NhbCBiaW5kaW5nLiAgKi8KKyAgICAgIGlmIChiaW5kaW5nICE9IFNUQl9MT0NBTCkKKwl7CisJICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfSU5WQUxJRCk7CisJICByZXR1cm4gTlVMTDsKKwl9CisKKyAgICAgIC8vIFhYWCBUaGlzIHJlcXVpcmVzIGdldHRpbmcgdGhlIGZvcm1hdCBmcm9tIHRoZSBtYWNoaW5lIGJhY2tlbmQuICAqLworICAgICAgc25wcmludGYgKHRlbXBzeW0sIFRFTVBTWU1MRU4sICIuTCUwN3UiLCBhc21zY24tPmN0eC0+dGVtcHN5bV9jb3VudCsrKTsKKworICAgICAgbmFtZSA9IHRlbXBzeW07CisgICAgfQorCisgIHNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbiAobmFtZSkgKyAxOworCisgIHJlc3VsdCA9IChBc21TeW1fdCAqKSBtYWxsb2MgKHNpemVvZiAoQXNtU3ltX3QpICsgbmFtZV9sZW4pOworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcndsb2NrX3dybG9jayAoYXNtc2NuLT5jdHgtPmxvY2spOworCisgIHJlc3VsdC0+c2NuID0gYXNtc2NuOworICByZXN1bHQtPm9mZnNldCA9IGFzbXNjbi0+b2Zmc2V0OworICByZXN1bHQtPnNpemUgPSBzaXplOworICByZXN1bHQtPnR5cGUgPSB0eXBlOworICByZXN1bHQtPmJpbmRpbmcgPSBiaW5kaW5nOworICByZXN1bHQtPnN5bWlkeCA9IDA7CisgIHJlc3VsdC0+c3RyZW50ID0gZWJsX3N0cnRhYmFkZCAoYXNtc2NuLT5jdHgtPnN5bWJvbF9zdHJ0YWIsCisJCQkJICBtZW1jcHkgKHJlc3VsdCArIDEsIG5hbWUsIG5hbWVfbGVuKSwgMCk7CisKKyAgaWYgKHVubGlrZWx5IChhc21zY24tPmN0eC0+dGV4dHApKQorICAgIHsKKyAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIG5hbWUgYW5kIGRvbid0IG5lZWQgdG8ga25vdyB3aGV0aGVyCisJIGl0IGlzIGEgbG9jYWwgbmFtZSBvciBub3QuICAqLworICAgICAgLyogRmlyc3QgcHJpbnQgdGhlIGJpbmRpbmcgcHNldWRvLW9wLiAgKi8KKyAgICAgIGlmIChiaW5kaW5nID09IFNUQl9HTE9CQUwpCisJZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXHQuZ2xvYmxcdCVzXG4iLCBuYW1lKTsKKyAgICAgIGVsc2UgaWYgKGJpbmRpbmcgPT0gU1RCX1dFQUspCisJZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXHQud2Vha1x0JXNcbiIsIG5hbWUpOworCisgICAgICAvKiBOZXh0IHRoZSBzeW1ib2wgdHlwZS4gICovCisgICAgICBpZiAodHlwZSA9PSBTVFRfT0JKRUNUKQorCWZwcmludGYgKGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSwgIlx0LnR5cGVcdCVzLEBvYmplY3RcbiIsIG5hbWUpOworICAgICAgZWxzZSBpZiAodHlwZSA9PSBTVFRfRlVOQykKKwlmcHJpbnRmIChhc21zY24tPmN0eC0+b3V0LmZpbGUsICJcdC50eXBlXHQlcyxAZnVuY3Rpb25cbiIsIG5hbWUpOworCisgICAgICAvKiBGaW5hbGx5IHRoZSBzaXplIGFuZCB0aGUgbGFiZWwuICAqLworICAgICAgZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXHQuc2l6ZVx0JXMsJSIgUFJJdU1BWCAiXG4lczpcbiIsCisJICAgICAgIG5hbWUsICh1aW50bWF4X3QpIHNpemUsIG5hbWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFB1dCB0aGUgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlIHNvIHRoYXQgd2UgY2FuIGxhdGVyIGZpbmQgaXQuICAqLworICAgICAgaWYgKGFzbV9zeW1ib2xfdGFiX2luc2VydCAoJmFzbXNjbi0+Y3R4LT5zeW1ib2xfdGFiLCBlbGZfaGFzaCAobmFtZSksCisJCQkJIHJlc3VsdCkgIT0gMCkKKwl7CisJICAvKiBUaGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLiAgKi8KKwkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9EVVBMU1lNKTsKKwkgIC8qIE5vdGUgdGhhdCB3ZSBjYW4gZnJlZSB0aGUgZW50cnkgc2luY2UgdGhlcmUgbXVzdCBiZSBubworCSAgICAgcmVmZXJlbmNlIGluIHRoZSBzdHJpbmcgdGFibGUgdG8gdGhlIHN0cmluZy4gIFdlIGNhbiBvbmx5CisJICAgICBmYWlsIHRvIGluc2VydCB0aGUgc3ltYm9sIGludG8gdGhlIHN5bWJvbCB0YWJsZSBpZiB0aGVyZQorCSAgICAgaXMgYWxyZWFkeSBhIHN5bWJvbCB3aXRoIHRoaXMgbmFtZS4gIEluIHRoaXMgY2FzZSB0aGUKKwkgICAgIGVibF9zdHJ0YWJhZGQgZnVuY3Rpb24gd291bGQgdXNlIHRoZSBwcmV2aW91c2x5IHByb3ZpZGVkCisJICAgICBuYW1lLiAgKi8KKwkgIGZyZWUgKHJlc3VsdCk7CisJICByZXN1bHQgPSBOVUxMOworCX0KKyAgICAgIGVsc2UgaWYgKG5hbWUgIT0gdGVtcHN5bSAmJiBhc21fZW1pdF9zeW1ib2xfcCAobmFtZSkpCisJLyogT25seSBjb3VudCBub24tcHJpdmF0ZSBzeW1ib2xzLiAgKi8KKwkrK2FzbXNjbi0+Y3R4LT5uc3ltYm9sX3RhYjsKKyAgICB9CisKKyAgcndsb2NrX3VubG9jayAoYXNtc2NuLT5jdHgtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJhc20vYXNtX3NjbmdycF9uZXdzaWduYXR1cmUuYyBiL2xpYmFzbS9hc21fc2NuZ3JwX25ld3NpZ25hdHVyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MDQyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vYXNtX3NjbmdycF9uZXdzaWduYXR1cmUuYwpAQCAtMCwwICsxLDMzIEBACisvKiBVcGRhdGUgc2lnbmF0dXJlIG9mIHNlY3Rpb24gZ3JvdXAuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhc21QLmgiCisKKworaW50Cithc21fc2NuZ3JwX25ld3NpZ25hdHVyZSAoZ3JwLCBzaWduYXR1cmUpCisgICAgIEFzbVNjbkdycF90ICpncnA7CisgICAgIEFzbVN5bV90ICpzaWduYXR1cmU7Cit7CisgIGlmIChncnAgPT0gTlVMTCB8fCBzaWduYXR1cmUgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKworICBncnAtPnNpZ25hdHVyZSA9ICBzaWduYXR1cmU7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhc20vbGliYXNtLmggYi9saWJhc20vbGliYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkZDZmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmFzbS9saWJhc20uaApAQCAtMCwwICsxLDE1NSBAQAorLyogSW50ZXJmYWNlIGZvciBsaWJhc20uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBfTElCQVNNX0gKKyNkZWZpbmUgX0xJQkFTTV9IIDEKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGdlbGYuaD4KKworCisvKiBPcGFxdWUgdHlwZSBmb3IgdGhlIGFzc2VtYmxlciBjb250ZXh0IGRlc2NyaXB0b3IuICAqLwordHlwZWRlZiBzdHJ1Y3QgQXNtQ3R4IEFzbUN0eF90OworCisvKiBPcGFxdWUgdHlwZSBmb3IgYSBzZWN0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0IEFzbVNjbiBBc21TY25fdDsKKworLyogT3BhcXVlIHR5cGUgZm9yIGEgc2VjdGlvbiBncm91cC4gICovCit0eXBlZGVmIHN0cnVjdCBBc21TY25HcnAgQXNtU2NuR3JwX3Q7CisKKy8qIE9wYXF1ZSB0eXBlIGZvciBhIHN5bWJvbC4gICovCit0eXBlZGVmIHN0cnVjdCBBc21TeW0gQXNtU3ltX3Q7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBDcmVhdGUgb3V0cHV0IGZpbGUgYW5kIHJldHVybiBkZXNjcmlwdG9yIGZvciBhc3NlbWJsZXIgY29udGV4dC4gIElmCisgICBURVhUUCBpcyB0cnVlIHRoZSBvdXRwdXQgaXMgYW4gYXNzZW1ibGVyIGZvcm1hdCB0ZXh0IGZpbGUuCisgICBPdGhlcndpc2UgYW4gb2JqZWN0IGZpbGUgaXMgY3JlYXRlZC4gIFRoZSBNQUNISU5FIHBhcmFtZXRlcgorICAgY29ycmVzcG9uZHMgdG8gYW4gRU1fIGNvbnN0YW50IGZyb20gPGVsZi5oPiwgS0xBU1Mgc3BlY2lmaWVzIHRoZQorICAgY2xhc3MgKDMyLSBvciA2NC1iaXQpLCBhbmQgREFUQSBzcGVjaWZpZXMgdGhlIGJ5dGUgb3JkZXIgKGxpdHRsZSBvcgorICAgYmlnIGVuZGlhbikuICAqLworZXh0ZXJuIEFzbUN0eF90ICphc21fYmVnaW4gKGNvbnN0IGNoYXIgKmZuYW1lLCBib29sIHRleHRwLCBpbnQgbWFjaGluZSwKKwkJCSAgICBpbnQga2xhc3MsIGludCBkYXRhKTsKKworLyogQWJvcnQgdGhlIG9wZXJhdGlvbiBvbiB0aGUgYXNzZW1ibGVyIGNvbnRleHQgYW5kIGZyZWUgYWxsIHJlc291cmNlcy4gICovCitleHRlcm4gaW50IGFzbV9hYm9ydCAoQXNtQ3R4X3QgKmN0eCk7CisKKy8qIEZpbmFsaXplIG91dHB1dCBmaWxlIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMuICAqLworZXh0ZXJuIGludCBhc21fZW5kIChBc21DdHhfdCAqY3R4KTsKKworCisvKiBSZXR1cm4gaGFuZGxlIGZvciB0aGUgbmFtZWQgc2VjdGlvbi4gIElmIGl0IHdhcyBub3QgdXNlZCBiZWZvcmUKKyAgIGNyZWF0ZSBpdC4gICovCitleHRlcm4gQXNtU2NuX3QgKmFzbV9uZXdzY24gKEFzbUN0eF90ICpjdHgsIGNvbnN0IGNoYXIgKnNjbm5hbWUsCisJCQkgICAgIEdFbGZfV29yZCB0eXBlLCBHRWxmX1h3b3JkIGZsYWdzKTsKKworCisvKiBTaW1pbGFyIHRvICdhc21fbmV3c2NuJywgYnV0IG1ha2UgaXQgcGFydCBvZiBzZWN0aW9uIGdyb3VwIEdSUC4gICovCitleHRlcm4gQXNtU2NuX3QgKmFzbV9uZXdzY25faW5ncnAgKEFzbUN0eF90ICpjdHgsIGNvbnN0IGNoYXIgKnNjbm5hbWUsCisJCQkJICAgR0VsZl9Xb3JkIHR5cGUsIEdFbGZfWHdvcmQgZmxhZ3MsCisJCQkJICAgQXNtU2NuR3JwX3QgKmdycCk7CisKKy8qIENyZWF0ZSBuZXcgc3Vic2VjdGlvbiBOUiBpbiB0aGUgZ2l2ZW4gc2VjdGlvbi4gICovCitleHRlcm4gQXNtU2NuX3QgKmFzbV9uZXdzdWJzY24gKEFzbVNjbl90ICphc21zY24sIHVuc2lnbmVkIGludCBucik7CisKKworLyogUmV0dXJuIGhhbmRsZSBmb3IgbmV3IHNlY3Rpb24gZ3JvdXAuICBUaGUgc2lnbmF0dXJlIHN5bWJvbCBjYW4gYmUKKyAgIHNldCBsYXRlci4gICovCitleHRlcm4gQXNtU2NuR3JwX3QgKmFzbV9uZXdzY25ncnAgKEFzbUN0eF90ICpjdHgsIGNvbnN0IGNoYXIgKmdycG5hbWUsCisJCQkJICAgQXNtU3ltX3QgKnNpZ25hdHVyZSwgRWxmMzJfV29yZCBmbGFncyk7CisKKy8qIFNldCBvciBvdmVyd3JpdGUgc2lnbmF0dXJlIHN5bWJvbCBmb3IgZ3JvdXAuICAqLworZXh0ZXJuIGludCBhc21fc2NuZ3JwX25ld3NpZ25hdHVyZSAoQXNtU2NuR3JwX3QgKmdycCwgQXNtU3ltX3QgKnNpZ25hdHVyZSk7CisKKworLyogQWRkIHplcm8gdGVybWluYXRlZCBzdHJpbmcgU1RSIG9mIHNpemUgTEVOIHRvIChzdWIpc2VjdGlvbiBBU01TQ04uICAqLworZXh0ZXJuIGludCBhc21fYWRkc3RyeiAoQXNtU2NuX3QgKmFzbXNjbiwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKKworLyogQWRkIDgtYml0IHNpZ25lZCBpbnRlZ2VyIE5VTSB0byAoc3ViKXNlY3Rpb24gQVNNU0NOLiAgKi8KK2V4dGVybiBpbnQgYXNtX2FkZGludDggKEFzbVNjbl90ICphc21zY24sIGludDhfdCBudW0pOworCisvKiBBZGQgOC1iaXQgdW5zaWduZWQgaW50ZWdlciBOVU0gdG8gKHN1YilzZWN0aW9uIEFTTVNDTi4gICovCitleHRlcm4gaW50IGFzbV9hZGR1aW50OCAoQXNtU2NuX3QgKmFzbXNjbiwgdWludDhfdCBudW0pOworCisvKiBBZGQgMTYtYml0IHNpZ25lZCBpbnRlZ2VyIE5VTSB0byAoc3ViKXNlY3Rpb24gQVNNU0NOLiAgKi8KK2V4dGVybiBpbnQgYXNtX2FkZGludDE2IChBc21TY25fdCAqYXNtc2NuLCBpbnQxNl90IG51bSk7CisKKy8qIEFkZCAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBOVU0gdG8gKHN1YilzZWN0aW9uIEFTTVNDTi4gICovCitleHRlcm4gaW50IGFzbV9hZGR1aW50MTYgKEFzbVNjbl90ICphc21zY24sIHVpbnQxNl90IG51bSk7CisKKy8qIEFkZCAzMi1iaXQgc2lnbmVkIGludGVnZXIgTlVNIHRvIChzdWIpc2VjdGlvbiBBU01TQ04uICAqLworZXh0ZXJuIGludCBhc21fYWRkaW50MzIgKEFzbVNjbl90ICphc21zY24sIGludDMyX3QgbnVtKTsKKworLyogQWRkIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIE5VTSB0byAoc3ViKXNlY3Rpb24gQVNNU0NOLiAgKi8KK2V4dGVybiBpbnQgYXNtX2FkZHVpbnQzMiAoQXNtU2NuX3QgKmFzbXNjbiwgdWludDMyX3QgbnVtKTsKKworLyogQWRkIDY0LWJpdCBzaWduZWQgaW50ZWdlciBOVU0gdG8gKHN1YilzZWN0aW9uIEFTTVNDTi4gICovCitleHRlcm4gaW50IGFzbV9hZGRpbnQ2NCAoQXNtU2NuX3QgKmFzbXNjbiwgaW50NjRfdCBudW0pOworCisvKiBBZGQgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgTlVNIHRvIChzdWIpc2VjdGlvbiBBU01TQ04uICAqLworZXh0ZXJuIGludCBhc21fYWRkdWludDY0IChBc21TY25fdCAqYXNtc2NuLCB1aW50NjRfdCBudW0pOworCisKKy8qIEFkZCBzaWduZWQgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOCBpbnRlZ2VyIE5VTSB0byAoc3ViKXNlY3Rpb24gQVNNU0NOLiAgKi8KK2V4dGVybiBpbnQgYXNtX2FkZHNsZWIxMjggKEFzbVNjbl90ICphc21zY24sIGludDMyX3QgbnVtKTsKKworLyogQWRkIHVuc2lnbmVkIGxpdHRsZSBlbmRpYW4gYmFzZSAxMjggaW50ZWdlciBOVU0gdG8gKHN1YilzZWN0aW9uIEFTTVNDTi4gICovCitleHRlcm4gaW50IGFzbV9hZGR1bGViMTI4IChBc21TY25fdCAqYXNtc2NuLCB1aW50MzJfdCBudW0pOworCisKKy8qIERlZmluZSBuZXcgc3ltYm9sIE5BTUUgZm9yIGN1cnJlbnQgcG9zaXRpb24gaW4gZ2l2ZW4gc2VjdGlvbiBBU01TQ04uICAqLworZXh0ZXJuIEFzbVN5bV90ICphc21fbmV3c3ltIChBc21TY25fdCAqYXNtc2NuLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBHRWxmX1h3b3JkIHNpemUsIGludCB0eXBlLCBpbnQgYmluZGluZyk7CisKKworLyogRGVmaW5lIG5ldyBjb21tb24gc3ltYm9sIE5BTUUgd2l0aCBnaXZlbiBTSVpFIGFuZCBhbGlnbm1lbnQuICAqLworZXh0ZXJuIEFzbVN5bV90ICphc21fbmV3Y29tc3ltIChBc21DdHhfdCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLAorCQkJCUdFbGZfWHdvcmQgc2l6ZSwgR0VsZl9BZGRyIGFsaWduKTsKKworLyogRGVmaW5lIG5ldyBjb21tb24gc3ltYm9sIE5BTUUgd2l0aCBnaXZlbiBTSVpFLCBWQUxVRSwgVFlQRSwgYW5kIEJJTkRJTkcuICAqLworZXh0ZXJuIEFzbVN5bV90ICphc21fbmV3YWJzc3ltIChBc21DdHhfdCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLAorCQkJCUdFbGZfWHdvcmQgc2l6ZSwgR0VsZl9BZGRyIHZhbHVlLAorCQkJCWludCB0eXBlLCBpbnQgYmluZGluZyk7CisKKworLyogQWxpZ24gKHN1YilzZWN0aW9uIG9mZnNldCBhY2NvcmRpbmcgdG8gVkFMVUUuICAqLworZXh0ZXJuIGludCBhc21fYWxpZ24gKEFzbVNjbl90ICphc21zY24sIEdFbGZfV29yZCB2YWx1ZSk7CisKKy8qIFNldCB0aGUgYnl0ZSBwYXR0ZXJuIHVzZWQgdG8gZmlsbCBnYXBzIGNyZWF0ZWQgYnkgYWxpZ25tZW50LiAgKi8KK2V4dGVybiBpbnQgYXNtX2ZpbGwgKEFzbVNjbl90ICphc21zY24sIHZvaWQgKmJ5dGVzLCBzaXplX3QgbGVuKTsKKworCisvKiBSZXR1cm4gRUxGIGRlc2NyaXB0b3IgY3JlYXRlZCBmb3IgdGhlIG91dHB1dCBmaWxlIG9mIHRoZSBnaXZlbiBjb250ZXh0LiAgKi8KK2V4dGVybiBFbGYgKmFzbV9nZXRlbGYgKEFzbUN0eF90ICpjdHgpOworCisKKy8qIFJldHVybiBlcnJvciBjb2RlIG9mIGxhc3QgZmFpbGluZyBmdW5jdGlvbiBjYWxsLiAgVGhpcyB2YWx1ZSBpcyBrZXB0CisgICBzZXBhcmF0ZWx5IGZvciBlYWNoIHRocmVhZC4gICovCitleHRlcm4gaW50IGFzbV9lcnJubyAodm9pZCk7CisKKy8qIFJldHVybiBlcnJvciBzdHJpbmcgZm9yIEVSUk9SLiAgSWYgRVJST1IgaXMgemVybywgcmV0dXJuIGVycm9yIHN0cmluZworICAgZm9yIG1vc3QgcmVjZW50IGVycm9yIG9yIE5VTEwgaXMgbm9uZSBvY2N1cnJlZC4gIElmIEVSUk9SIGlzIC0xIHRoZQorICAgYmVoYXZpb3VyIGlzIHNpbWlsYXIgdG8gdGhlIGxhc3QgY2FzZSBleGNlcHQgdGhhdCBub3QgTlVMTCBidXQgYSBsZWdhbAorICAgc3RyaW5nIGlzIHJldHVybmVkLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICphc21fZXJybXNnIChpbnQgX19lcnJvcik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBsaWJhc20uaCAqLwpkaWZmIC0tZ2l0IGEvbGliYXNtL2xpYmFzbS5tYXAgYi9saWJhc20vbGliYXNtLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGI1YjViCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXNtL2xpYmFzbS5tYXAKQEAgLTAsMCArMSwzMyBAQAorRUxGVVRJTFNfMS4wIHsKKyAgZ2xvYmFsOgorICAgIGFzbV9hYm9ydDsKKyAgICBhc21fYWRkaW50MTY7CisgICAgYXNtX2FkZGludDMyOworICAgIGFzbV9hZGRpbnQ2NDsKKyAgICBhc21fYWRkaW50ODsKKyAgICBhc21fYWRkc2xlYjEyODsKKyAgICBhc21fYWRkc3RyejsKKyAgICBhc21fYWRkdWludDE2OworICAgIGFzbV9hZGR1aW50MzI7CisgICAgYXNtX2FkZHVpbnQ2NDsKKyAgICBhc21fYWRkdWludDg7CisgICAgYXNtX2FkZHVsZWIxMjg7CisgICAgYXNtX2FsaWduOworICAgIGFzbV9iZWdpbjsKKyAgICBhc21fZW5kOworICAgIGFzbV9lcnJtc2c7CisgICAgYXNtX2Vycm5vOworICAgIGFzbV9maWxsOworICAgIGFzbV9nZXRlbGY7CisgICAgYXNtX25ld2Fic3N5bTsKKyAgICBhc21fbmV3Y29tc3ltOworICAgIGFzbV9uZXdzY247CisgICAgYXNtX25ld3Njbl9pbmdycDsKKyAgICBhc21fbmV3c2NuZ3JwOworICAgIGFzbV9uZXdzdWJzY247CisgICAgYXNtX25ld3N5bTsKKyAgICBhc21fc2NuZ3JwX25ld3NpZ25hdHVyZTsKKworICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL2xpYmFzbS9saWJhc21QLmggYi9saWJhc20vbGliYXNtUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDk1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vbGliYXNtUC5oCkBAIC0wLDAgKzEsMjY4IEBACisvKiBJbnRlcm5hbCBkZWZpbml0aW9ucyBmb3IgbGliYXNtLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZm5kZWYgX0xJQkFTTVBfSAorI2RlZmluZSBfTElCQVNNUF9IIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxsaWJhc20uaD4KKyNpbmNsdWRlIDxsaWJlYmwuaD4KKworLyogZ2V0dGV4dCBoZWxwZXIgbWFjcm9zLiAgKi8KKyNkZWZpbmUgXyhTdHIpIGRnZXR0ZXh0ICgiZWxmdXRpbHMiLCBTdHIpCisKKworLyogS25vd24gZXJyb3IgY29kZXMuICAqLworZW51bQorICB7CisgICAgQVNNX0VfTk9FUlJPUiwKKyAgICBBU01fRV9OT01FTSwJCS8qIE5vIG1vcmUgbWVtb3J5LiAgKi8KKyAgICBBU01fRV9DQU5OT1RfQ1JFQVRFLAkvKiBPdXRwdXQgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZC4gICovCisgICAgQVNNX0VfSU5WQUxJRCwJCS8qIEludmFsaWQgcGFyYW1ldGVycy4gICovCisgICAgQVNNX0VfQ0FOTk9UX0NITU9ELAkJLyogQ2Fubm90IGNoYW5nZSBtb2RlIG9mIG91dHB1dCBmaWxlLiAgKi8KKyAgICBBU01fRV9DQU5OT1RfUkVOQU1FLAkvKiBDYW5ub3QgcmVuYW1lIG91dHB1dCBmaWxlLiAgKi8KKyAgICBBU01fRV9EVVBMU1lNLAkJLyogRHVwbGljYXRlIHN5bWJvbCBkZWZpbml0aW9uLiAgKi8KKyAgICBBU01fRV9MSUJFTEYsCQkvKiBSZWZlciB0byBlcnJvciBpbiBsaWJlbGYuICAqLworICAgIEFTTV9FX1RZUEUsCQkJLyogSW52YWxpZCBzZWN0aW9uIHR5cGUgZm9yIG9wZXJhdGlvbi4gICovCisgICAgQVNNX0VfTlVNCQkJLyogS2VlcCB0aGlzIGVudHJ5IGFzIHRoZSBsYXN0LiAgKi8KKyAgfTsKKworCisvKiBTcGVjaWFsIHNlY3Rpb25zLiAgKi8KKyNkZWZpbmUgQVNNX0FCU19TQ04gKChFbGZfU2NuICopIDEpCisjZGVmaW5lIEFTTV9DT01fU0NOICgoRWxmX1NjbiAqKSAyKQorCisKKy8qIEFuZCB0aGUgaGFzaCB0YWJsZSBmb3Igc3ltYm9scy4gICovCisjaW5jbHVkZSA8c3ltYm9saGFzaC5oPgorCisKKy8qIERlc2NyaXB0b3IgZm9yIGEgc2VjdGlvbi4gICovCitzdHJ1Y3QgQXNtU2NuCit7CisgIC8qIFRoZSB1bmRlcmx5aW5nIGFzc2VtYmxlciBjb250ZXh0LiAgKi8KKyAgQXNtQ3R4X3QgKmN0eDsKKworICAvKiBTdWJzZWN0aW9uIElELiAgKi8KKyAgdW5zaWduZWQgaW50IHN1YnNlY3Rpb25faWQ7CisKKyAgLyogU2VjdGlvbiB0eXBlLiAgKi8KKyAgR0VsZl9Xb3JkIHR5cGU7CisKKyAgdW5pb24KKyAgeworICAgIC8qIERhdGEgb25seSBzdG9yZWQgaW4gdGhlIHJlY29yZCBmb3Igc3Vic2VjdGlvbiB6ZXJvLiAgKi8KKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBUaGUgRUxGIHNlY3Rpb24uICAqLworICAgICAgRWxmX1NjbiAqc2NuOworCisgICAgICAvKiBFbnRyeSBpbiB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlLiAgKi8KKyAgICAgIHN0cnVjdCBFYmxfU3RyZW50ICpzdHJlbnQ7CisKKyAgICAgIC8qIE5leHQgbWVtYmVyIG9mIGdyb3VwLiAgKi8KKyAgICAgIHN0cnVjdCBBc21TY24gKm5leHRfaW5fZ3JvdXA7CisgICAgfSBtYWluOworCisgICAgLyogUG9pbnRlciB0byB0aGUgcmVjb3JkIGZvciBzdWJzZWN0aW9uIHplcm8uICAqLworICAgIEFzbVNjbl90ICp1cDsKKyAgfSBkYXRhOworCisgIC8qIEN1cnJlbnQgb2Zmc2V0IGluIHRoZSAoc3ViKXNlY3Rpb24uICAqLworICBHRWxmX09mZiBvZmZzZXQ7CisgIC8qIE1heGltdW0gYWxpZ25tZW50IG9mIHRoZSBzZWN0aW9uIHNvIGZhci4gICovCisgIEdFbGZfV29yZCBtYXhfYWxpZ247CisKKyAgLyogU2VjdGlvbiBjb250ZW50LiAgKi8KKyAgc3RydWN0IEFzbURhdGEKKyAgeworICAgIC8qIEN1cnJlbnRseSB1c2VkIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYmxvY2suICAqLworICAgIHNpemVfdCBsZW47CisKKyAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkLiAgKi8KKyAgICBzaXplX3QgbWF4bGVuOworCisgICAgLyogUG9pbnRlciB0byB0aGUgbmV4dCBibG9jay4gICovCisgICAgc3RydWN0IEFzbURhdGEgKm5leHQ7CisKKyAgICAvKiBUaGUgYWN0dWFsIGRhdGEuICAqLworICAgIGNoYXIgZGF0YVtmbGV4YXJyX3NpemVdOworICB9ICpjb250ZW50OworCisgIC8qIEZpbGwgcGF0dGVybi4gICovCisgIHN0cnVjdCBGaWxsUGF0dGVybgorICB7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyIGJ5dGVzW2ZsZXhhcnJfc2l6ZV07CisgIH0gKnBhdHRlcm47CisKKyAgLyogTmV4dCBzdWJzZWN0aW9uLiAgKi8KKyAgQXNtU2NuX3QgKnN1Ym5leHQ7CisKKyAgLyogTGlzdCBvZiBhbGwgYWxsb2NhdGVkIHNlY3Rpb25zLiAgKi8KKyAgQXNtU2NuX3QgKmFsbG5leHQ7CisKKyAgLyogTmFtZSBvZiB0aGUgc2VjdGlvbi4gICovCisgIGNoYXIgbmFtZVtmbGV4YXJyX3NpemVdOworfTsKKworCisvKiBEZXNjcmlwdG9yIHVzZWQgZm9yIHRoZSBhc3NlbWJsaW5nIHNlc3Npb24uICAqLworc3RydWN0IEFzbUN0eAoreworICAvKiBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlLiAgKi8KKyAgaW50IGZkOworCisgIC8qIFRydWUgaWYgdGV4dCBvdXRwdXQgaXMgd2FudGVkLiAgKi8KKyAgYm9vbCB0ZXh0cDsKKworICAvKiBPdXRwdXQgZmlsZSBoYW5kbGUuICAqLworICB1bmlvbgorICB7CisgICAgLyogRUxGIGRlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlLiAgKi8KKyAgICBFbGYgKmVsZjsKKyAgICAvKiBJL08gc3RyZWFtIGZvciB0ZXh0IG91dHB1dC4gICovCisgICAgRklMRSAqZmlsZTsKKyAgfSBvdXQ7CisKKworICAvKiBMaXN0IHdpdGggZGVmaW5lZCBzZWN0aW9ucy4gICovCisgIEFzbVNjbl90ICpzZWN0aW9uX2xpc3Q7CisgIC8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCisgIHN0cnVjdCBFYmxfU3RydGFiICpzZWN0aW9uX3N0cnRhYjsKKworICAvKiBUYWJsZSB3aXRoIGRlZmluZWQgc3ltYm9scy4gICovCisgIGFzbV9zeW1ib2xfdGFiIHN5bWJvbF90YWI7CisgIC8qIE51bWJlciBvZiBzeW1ib2xzIGluIHRoZSB0YWJsZS4gICovCisgIHVuc2lnbmVkIGludCBuc3ltYm9sX3RhYjsKKyAgLyogU3ltYm9sIHN0cmluZyB0YWJsZS4gICovCisgIHN0cnVjdCBFYmxfU3RydGFiICpzeW1ib2xfc3RydGFiOworCisgIC8qIExpc3Qgb2Ygc2VjdGlvbiBncm91cHMuICAqLworICBzdHJ1Y3QgQXNtU2NuR3JwICpncm91cHM7CisgIC8qIE51bWJlciBvZiBzZWN0aW9uIGdyb3Vwcy4gICovCisgIHNpemVfdCBuZ3JvdXBzOworCisgIC8qIEN1cnJlbnQgcmVxdWlyZWQgYWxpZ25tZW50IGZvciBjb21tb24gc3ltYm9scy4gICovCisgIEdFbGZfV29yZCBjb21tb25fYWxpZ247CisKKyAgLyogTG9jayB0byBoYW5kbGUgbXVsdGl0aHJlYWRlZCBwcm9ncmFtcy4gICovCisgIHJ3bG9ja19kZWZpbmUgKCxsb2NrKTsKKworICAvKiBDb3VudGVyIGZvciB0ZW1wb3Jhcnkgc3ltYm9scy4gICovCisgIHVuc2lnbmVkIGludCB0ZW1wc3ltX2NvdW50OworCisgIC8qIE5hbWUgb2YgdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgY2hhciAqZm5hbWU7CisgIC8qIFRoZSBuYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZS4gICovCisgIGNoYXIgdG1wX2ZuYW1lW2ZsZXhhcnJfc2l6ZV07Cit9OworCisKKy8qIERlc2NyaXB0b3IgZm9yIGEgc3ltYm9sLiAgKi8KK3N0cnVjdCBBc21TeW0KK3sKKyAgLyogUmVmZXJlbmNlIHRvIHRoZSBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBzeW1ib2wuICAqLworICBBc21TY25fdCAqc2NuOworCisgIC8qIFR5cGUgb2YgdGhlIHN5bWJvbC4gICovCisgIGludDhfdCB0eXBlOworICAvKiBCaW5kaW5nIG9mIHRoZSBzeW1ib2wuICAqLworICBpbnQ4X3QgYmluZGluZzsKKworICAvKiBTaXplIG9mIHRoZSBzeW1ib2wuICAqLworICBHRWxmX1h3b3JkIHNpemU7CisKKyAgLyogT2Zmc2V0IGluIHRoZSBzZWN0aW9uLiAgKi8KKyAgR0VsZl9PZmYgb2Zmc2V0OworCisgIC8qIFN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLworICBzaXplX3Qgc3ltaWR4OworCisgIC8qIFJlZmVyZW5jZSB0byBuYW1lIG9mIHRoZSBzeW1ib2wuICAqLworICBzdHJ1Y3QgRWJsX1N0cmVudCAqc3RyZW50OworfTsKKworCisvKiBEZXNjcmlwdG9yIGZvciBzZWN0aW9uIGdyb3VwLiAgKi8KK3N0cnVjdCBBc21TY25HcnAKK3sKKyAgLyogRW50cnkgaW4gdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCisgIHN0cnVjdCBFYmxfU3RyZW50ICpzdHJlbnQ7CisKKyAgLyogVGhlIEVMRiBzZWN0aW9uLiAgKi8KKyAgRWxmX1NjbiAqc2NuOworCisgIC8qIFRoZSBzaWduYXR1cmUuICAqLworICBzdHJ1Y3QgQXNtU3ltICpzaWduYXR1cmU7CisKKyAgLyogRmlyc3QgbWVtYmVyLiAgKi8KKyAgc3RydWN0IEFzbVNjbiAqbWVtYmVyczsKKyAgLyogTnVtYmVyIG9mIG1lbWJlcnMuICAqLworICBzaXplX3Qgbm1lbWJlcnM7CisKKyAgLyogRmxhZ3MuICAqLworICBFbGYzMl9Xb3JkIGZsYWdzOworCisgIC8qIE5leHQgZ3JvdXAuICAqLworICBzdHJ1Y3QgQXNtU2NuR3JwICpuZXh0OworCisgIC8qIE5hbWUgb2YgdGhlIHNlY3Rpb24gZ3JvdXAuICAqLworICBjaGFyIG5hbWVbZmxleGFycl9zaXplXTsKK307CisKKworLyogVGhlIGRlZmF1bHQgZmlsbCBwYXR0ZXJuOiBvbmUgemVybyBieXRlLiAgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgRmlsbFBhdHRlcm4gKl9fbGliYXNtX2RlZmF1bHRfcGF0dGVybgorICAgICBhdHRyaWJ1dGVfaGlkZGVuOworCisKKy8qIEVuc3VyZSB0aGVyZSBhcmUgYXQgbGVhc3QgTEVOIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgZm9yIEFTTVNDTi4gICovCitleHRlcm4gaW50IF9fbGliYXNtX2Vuc3VyZV9zZWN0aW9uX3NwYWNlIChBc21TY25fdCAqYXNtc2NuLCBzaXplX3QgbGVuKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKworLyogRnJlZSBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzZW1ibGVyIGNvbnRleHQuICAqLworZXh0ZXJuIHZvaWQgX19saWJhc21fZmluaWN0eCAoQXNtQ3R4X3QgKmN0eCkgaW50ZXJuYWxfZnVuY3Rpb247CisKKy8qIFNldCBlcnJvciBjb2RlLiAgKi8KK2V4dGVybiB2b2lkIF9fbGliYXNtX3NldGVycm5vIChpbnQgZXJyKSBpbnRlcm5hbF9mdW5jdGlvbjsKKworLyogUmV0dXJuIGhhbmRsZSBmb3IgdGhlIG5hbWVkIHNlY3Rpb24uICBJZiBpdCB3YXMgbm90IHVzZWQgYmVmb3JlCisgICBjcmVhdGUgaXQuICAqLworZXh0ZXJuIEFzbVNjbl90ICpfX2FzbV9uZXdzY25faW50ZXJuYWwgKEFzbUN0eF90ICpjdHgsIGNvbnN0IGNoYXIgKnNjbm5hbWUsCisJCQkJCUdFbGZfV29yZCB0eXBlLCBHRWxmX1h3b3JkIGZsYWdzKQorICAgICBhdHRyaWJ1dGVfaGlkZGVuOworCisKKy8qIEludGVybmFsIGFsaWFzZXMgb2YgdGhlIGFzbV9hZGRpbnRYWCBmdW5jdGlvbnMuICAqLworZXh0ZXJuIGludCBfX2FzbV9hZGRpbnQ4X2ludGVybmFsIChBc21TY25fdCAqYXNtc2NuLCBpbnQ4X3QgbnVtKQorICAgICBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIGludCBfX2FzbV9hZGRpbnQxNl9pbnRlcm5hbCAoQXNtU2NuX3QgKmFzbXNjbiwgaW50MTZfdCBudW0pCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gaW50IF9fYXNtX2FkZGludDMyX2ludGVybmFsIChBc21TY25fdCAqYXNtc2NuLCBpbnQzMl90IG51bSkKKyAgICAgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBpbnQgX19hc21fYWRkaW50NjRfaW50ZXJuYWwgKEFzbVNjbl90ICphc21zY24sIGludDY0X3QgbnVtKQorICAgICBhdHRyaWJ1dGVfaGlkZGVuOworCisKKworLyogVGVzdCB3aGV0aGVyIGdpdmVuIHN5bWJvbCBpcyBhbiBpbnRlcm5hbCBzeW1ib2wgYW5kIGlmIHllcywgd2hldGhlcgorICAgd2Ugc2hvdWxkIG5ldmVydGhlbGVzcyBlbWl0IGl0IGluIHRoZSBzeW1ib2wgdGFibGUuICAqLworLy8gWFhYIFRoZSBzZWNvbmQgcGFydCBzaG91bGQgcHJvYmFibHkgYmUgY29udHJvbGxlZCBieSBhbiBvcHRpb24gd2hpY2gKKy8vIGlzbid0IGltcGxlbWVudGVkIHlldAorLy8gWFhYIEFsc28sIHRoZSBmb3JtYXQgd2lsbCBjaGFuZ2Ugd2l0aCB0aGUgYmFja2VuZC4KKyNkZWZpbmUgYXNtX2VtaXRfc3ltYm9sX3AobmFtZSkgKHN0cm5jbXAgKG5hbWUsICIuTCIsIDIpICE9IDApCisKKyNlbmRpZgkvKiBsaWJhc21QLmggKi8KZGlmZiAtLWdpdCBhL2xpYmFzbS9zeW1ib2xoYXNoLmMgYi9saWJhc20vc3ltYm9saGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDJjODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vc3ltYm9saGFzaC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIFN5bWJvbCBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJhc21QLmg+CisjaW5jbHVkZSA8bGliZWJsLmg+CisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgc3ltYm9sIGhhc2ggdGFibGUuICAqLworI2RlZmluZSBUWVBFIEFzbVN5bV90ICoKKyNkZWZpbmUgTkFNRSBhc21fc3ltYm9sX3RhYgorI2RlZmluZSBJVEVSQVRFIDEKKyNkZWZpbmUgUkVWRVJTRSAxCisjZGVmaW5lIENPTVBBUkUoYSwgYikgXAorICBzdHJjbXAgKGVibF9zdHJpbmcgKChhKS0+c3RyZW50KSwgZWJsX3N0cmluZyAoKGIpLT5zdHJlbnQpKQorCisjZGVmaW5lIG5leHRfcHJpbWUgX19saWJhc21fbmV4dF9wcmltZQorZXh0ZXJuIHNpemVfdCBuZXh0X3ByaW1lIChzaXplX3QpIGF0dHJpYnV0ZV9oaWRkZW47CisKKyNpbmNsdWRlICIuLi9saWIvZHluYW1pY3NpemVoYXNoLmMiCisKKyN1bmRlZiBuZXh0X3ByaW1lCisjZGVmaW5lIG5leHRfcHJpbWUgYXR0cmlidXRlX2hpZGRlbiBfX2xpYmFzbV9uZXh0X3ByaW1lCisjaW5jbHVkZSAiLi4vbGliL25leHRfcHJpbWUuYyIKZGlmZiAtLWdpdCBhL2xpYmFzbS9zeW1ib2xoYXNoLmggYi9saWJhc20vc3ltYm9saGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzdiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhc20vc3ltYm9saGFzaC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBTWU1CT0xIQVNIX0gKKyNkZWZpbmUgU1lNQk9MSEFTSF9ICTEKKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBzeW1ib2wgaGFzaCB0YWJsZS4gICovCisjZGVmaW5lIFRZUEUgQXNtU3ltX3QgKgorI2RlZmluZSBOQU1FIGFzbV9zeW1ib2xfdGFiCisjZGVmaW5lIElURVJBVEUgMQorI2RlZmluZSBDT01QQVJFKGEsIGIpIFwKKyAgc3RyY21wIChlYmxfc3RyaW5nICgoYSktPnN0cmVudCksIGVibF9zdHJpbmcgKChiKS0+c3RyZW50KSkKKyNpbmNsdWRlIDxkeW5hbWljc2l6ZWhhc2guaD4KKworI2VuZGlmCS8qIHN5bWJvbGhhc2guaCAqLwpkaWZmIC0tZ2l0IGEvbGliY3B1Ly5jdnNpZ25vcmUgYi9saWJjcHUvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg0NWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliY3B1Ly5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYmNwdS9DaGFuZ2VMb2cgYi9saWJjcHUvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMmE0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJjcHUvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTEgQEAKKzIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZSAoQU1fQ0ZMQUdTKTogQWRkIC1XdW51c2VkIC1XZXh0cmEgLVdmb3JtYXQ9Mi4KKworMjAwNS0wMi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBEZWZpbmUsIGluc3RlYWQgb2YgYWRkaW5nIHRoaW5ncyB0byBERUZTLgorCisyMDAzLTA4LTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTW92ZWQgdG8gQ1ZTIGFyY2hpdmUuCmRpZmYgLS1naXQgYS9saWJjcHUvTWFrZWZpbGUuYW0gYi9saWJjcHUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmYjgwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmNwdS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIxIEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGNyZWF0ZSBNYWtlZmlsZS5pbgorIyMKKyMjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisjIworIyMgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworIyMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorIyMKKyMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworIyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisjIyBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisjIyBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyMjIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuCisjIworREVGUyA9IC1EX0dOVV9TT1VSQ0UgLURIQVZFX0NPTkZJR19ICitBTV9DRkxBR1MgPSAtV2FsbCAtV3NoYWRvdyAtV2Vycm9yIC1XZXh0cmEgLVdmb3JtYXQ9MiAtV3VudXNlZAorSU5DTFVERVMgPSAtSSQoc3JjZGlyKQorCitub2luc3RfTElCUkFSSUVTID0gbGliY3B1X2kzODYuYQorCitsaWJjcHVfaTM4Nl9hX1NPVVJDRVMgPSBpMzg2X2Rpcy5jCmRpZmYgLS1naXQgYS9saWJjcHUvaTM4Nl9kaXMuYyBiL2xpYmNwdS9pMzg2X2Rpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTc0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJjcHUvaTM4Nl9kaXMuYwpAQCAtMCwwICsxIEBACitpbnQgZm9vOwpkaWZmIC0tZ2l0IGEvbGliZHcvLmN2c2lnbm9yZSBiL2xpYmR3Ly5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4NDVlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3Ly5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYmR3L0NoYW5nZUxvZyBiL2xpYmR3L0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGM1ODJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNTEyIEBACisyMDA1LTA3LTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZHdhcmZfZXJyb3IuYzogQWRkIGludGVybmFsIGFsaWFzIGZvciBkd2FyZl9lcnJuby4KKwkqIGxpYmR3UC5oOiBEZWNsYXJlIF9fZHdhcmZfZXJybm9faW50ZXJuYWwuCisJKiBkd2FyZl9nZXRsb2NsaXN0LmM6IFVzZSBJTlRERUYgZm9yIGR3YXJmX2Vycm5vLgorCisJKiBkd2FyZl9lcnJvci5jIFtVU0VfVExTXTogQWN0dWFsbHkgdXNlIF9fdGhyZWFkIGluIGRlZmluaXRpb24gb2YKKwlnbG9iYWxfZXJyb3IuCisKKzIwMDUtMDYtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGR3YXJmX2dldGFyYW5nZXMuYyAoZHdhcmZfZ2V0YXJhbmdlcyk6IFNvcnQgcmVzdWx0IGFycmF5LgorCSogZHdhcmZfZ2V0YXJhbmdlX2FkZHIuYyAoZHdhcmZfZ2V0YXJhbmdlX2FkZHIpOiBVc2UgYmluYXJ5IHNlYXJjaC4KKworMjAwNS0wNi0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogbWVtb3J5LWFjY2Vzcy5oIChnZXRfdWxlYjEyOF9zdGVwLCBnZXRfdWxlYjEyOCk6IFJlbW92ZSBjYXN0cy4KKwkoZ2V0X3NsZWIxMjhfc3RlcCwgZ2V0X3NsZWIxMjgpOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldGF0dHJzLmMgKGR3YXJmX2dldGF0dHJzKTogQWRkIGNvbnN0cy4KKwkqIGR3YXJmX2dldGxvY2xpc3QuYyAoZ2V0bG9jbGlzdCk6IExpa2V3aXNlLgorCSogZHdhcmZfZm9ybWJsb2NrLmMgKGR3YXJmX2Zvcm1ibG9jayk6IExpa2V3aXNlLgorCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAoZHdhcmZfZ2V0c3JjbGluZXMpOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldGFiYnJldmF0dHIuYyAoZHdhcmZfZ2V0YWJicmV2YXR0cik6IExpa2V3aXNlLgorCSogZHdhcmZfZm9ybXJlZi5jIChkd2FyZl9mb3JtcmVmKTogTGlrZXdpc2UuCisJKiBkd2FyZl9mb3Jtc2RhdGEuYyAoZHdhcmZfZm9ybXNkYXRhKTogTGlrZXdpc2UuCisJKiBkd2FyZl9mb3JtdWRhdGEuYyAoZHdhcmZfZm9ybXVkYXRhKTogTGlrZXdpc2UuCisJKiBkd2FyZl9oYXNjaGlsZHJlbi5jIChkd2FyZl9oYXNjaGlsZHJlbik6IExpa2V3aXNlLgorCSogZHdhcmZfY2hpbGQuYyAoX19saWJkd19maW5kX2F0dHIsIF9fbGliZHdfZmluZF9hdHRyKTogTGlrZXdpc2UuCisJKiBkd2FyZl90YWcuYyAoZHdhcmZfdGFnKTogTGlrZXdpc2UuCisJKiBkd2FyZl9nZXRhYmJyZXYuYyAoX19saWJkd19nZXRhYmJyZXYpOiBMaWtld2lzZS4KKwkqIG1lbW9yeS1hY2Nlc3MuYyAoX19saWJkd19nZXRfdWxlYjEyOCwgX19saWJkd19nZXRfc2xlYjEyOCk6IExpa2V3aXNlLgorCSogbGliZHdfZm9ybS5jIChfX2xpYmR3X2Zvcm1fdmFsX2xlbik6IExpa2V3aXNlLgorCSogbGliZHdQLmg6IFVwZGF0ZSBkZWNsLgorCisyMDA1LTA2LTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgorCisJKiBtZW1vcnktYWNjZXNzLmggKGdldF91bGViMTI4X3Jlc3RfcmV0dXJuKTogTmV3IG1hY3JvLgorCVshIElTX0xJQkRXXSAoX19saWJkd19nZXRfdWxlYjEyOCk6IE5ldyBzdGF0aWMsIGRlZmluZWQgdXNpbmcgaXQuCisJKGdldF9zbGViMTI4X3Jlc3RfcmV0dXJuKTogTmV3IG1hY3JvLgorCVshIElTX0xJQkRXXSAoX19saWJkd19nZXRfc2xlYjEyOCk6IE5ldyBzdGF0aWMsIGRlZmluZWQgdXNpbmcgaXQuCisJKiBtZW1vcnktYWNjZXNzLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBpdC4KKwkoREVGUyk6IEFkZCAtRElTX0xJQkRXLgorCisyMDA1LTA1LTMxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgorCisJKiBkd2FyZl9mb3JtcmVmX2RpZS5jIChkd2FyZl9mb3JtcmVmX2RpZSk6IEFkZCBDVSBoZWFkZXIgb2Zmc2V0IHRvCisJZm9ybXJlZiBvZmZzZXQuCisKKzIwMDUtMDUtMzAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGR3YXJmX2dldGxvY2xpc3QuYyAoZHdhcmZfYWRkcmxvY2xpc3RzKTogVXNlIERXX0FUX2VudHJ5X3BjIGZvciBiYXNlCisJYWRkcmVzcyBpZiBEV19BVF9sb3dfcGMgaXMgbWlzc2luZy4gIE5vdCB0byBzcGVjLCBidXQgR0NDIGdlbmVyYXRlcyBpdC4KKworCSogZHdhcmZfZ2V0bG9jbGlzdC5jIChkd2FyZl9hZGRybG9jbGlzdHMpOiBEb24ndCBzaWduLWV4dGVuZCA0LWJ5dGUKKwlCRUdJTiB2YWx1ZS4gIEluc3RlYWQsIG1hdGNoIGJhc2UgYWRkcmVzcyBlbnRyaWVzIHNlcGFyYXRlbHkgZm9yCisJMzIvNjQgc2l6ZSBjYXNlcy4KKworMjAwNS0wNS0yOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogZHdhcmZfZ2V0bG9jbGlzdC5jIChkd2FyZl9hZGRybG9jbGlzdHMpOiBGaXggZGVjb2RpbmcgdG8gYWR2YW5jZQorCXBhc3QgbG9jYXRpb24gZXhwcmVzc2lvbiBjb250ZW50cy4KKworMjAwNS0wNS0yMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogQ29tbWVudCB0eXBvIGZpeC4KKworCSogZHdhcmZfaGFzcGMuYyAoZHdhcmZfaGFzcGMpOiBGaXggQ1UgRElFIGFkZHJlc3MgY2FsY3VsYXRpb24uCisJKiBkd2FyZl9nZXRsb2NsaXN0LmMgKGR3YXJmX2FkZHJsb2NsaXN0cyk6IExpa2V3aXNlLgorCisyMDA1LTA1LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbGliZHdQLmg6IE9ubHkgdXNlIElOVERFQ0wgZm9yIGFsaWFzIHByb3RvdHlwZXMuCisKKzIwMDUtMDUtMTkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGR3YXJmX2dldGxvY2xpc3QuYyAoYXR0cl9vayk6IFBlcm1pdCBEV19BVF9zdGF0aWNfbGluayB0b28uCisKKwkqIGR3YXJmX2dldHNjb3BldmFyLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBpdC4KKwkqIGxpYmR3Lmg6IERlY2xhcmUgZHdhcmZfZ2V0c2NvcGV2YXIuCisKKwkqIGR3YXJmX2dldHNyY2ZpbGVzLmM6IEFkZCBJTlRERUYuCisJKiBkd2FyZl9oYXNjaGlsZHJlbi5jOiBMaWtld2lzZS4KKwkqIGxpYmR3UC5oIChkd2FyZl9nZXRzcmNmaWxlcywgZHdhcmZfaGFzY2hpbGRyZW4pOiBBZGQgSU5UREVDTC4KKworCSogZHdhcmZfZ2V0c2NvcGVzLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBpdC4KKwkqIGxpYmR3Lmg6IERlY2xhcmUgZHdhcmZfZ2V0c2NvcGVzLgorCSogbGliZHcubWFwOiBBZGQgaXQuCisKKzIwMDUtMDUtMTggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGxpYmR3UC5oIChJRFhfZGVidWdfcmFuZ2VzKTogTmV3IGVudW0gY29uc3RhbnQuCisJKiBkd2FyZl9iZWdpbl9lbGYuYyAoZHdhcmZfc2NubmFtZXMpOiBBZGQgaXQgZm9yICIuZGVidWdfcmFuZ2VzIi4KKwkqIGxpYmR3UC5oIChEV0FSRl9FX05PX0RFQlVHX1JBTkdFUyk6IE5ldyBlbnVtIGNvbnN0YW50LgorCSogZHdhcmZfZXJyb3IuYyAoZXJybXNncyk6IEFkZCBpdC4KKwkqIGR3YXJmX2hhc3BjLmM6IE5ldyBmaWxlLgorCSogbGliZHcuaDogRGVjbGFyZSBkd2FyZl9oYXNwYy4KKwkqIGxpYmR3Lm1hcDogQWRkIGl0LgorCSogbGliZHdQLmg6IEFkZCBJTlRERUNMLgorCisJKiBkd2FyZl9hdHRyX2ludGVncmF0ZS5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2hhc2F0dHJfaW50ZWdyYXRlLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCB0aGVtLgorCSogbGliZHcuaDogRGVjbGFyZSBkd2FyZl9hdHRyX2ludGVncmF0ZSwgZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUuCisJKiBsaWJkdy5tYXA6IEFkZCB0aGVtLgorCisJKiBkd2FyZl9oYXNhdHRyLmM6IEFkZCBJTlRERUYuCisJKiBsaWJkd1AuaDogQWRkIElOVERFQ0wgZm9yIGl0LgorCisJKiBkd2FyZl9mb3JtcmVmX2RpZS5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgaXQuCisJKiBsaWJkdy5oIChkd2FyZl9mb3JtcmVmX2RpZSk6IERlY2xhcmUgaXQuCisJKiBsaWJkd1AuaCAoZHdhcmZfZm9ybXJlZl9kaWUpOiBBZGQgSU5UREVDTC4KKwkqIGxpYmR3Lm1hcDogQWRkIGl0LgorCisJKiBkd2FyZl9nZXRsb2NsaXN0LmMgKGF0dHJfb2ssIGdldGxvY2xpc3QpOiBOZXcgZnVuY3Rpb25zLCBicm9rZW4gb3V0CisJb2YgLi4uCisJKGR3YXJmX2dldGxvY2xpc3QpOiAuLi4gaGVyZS4gIENhbGwgdGhlbS4KKwkoZHdhcmZfYWRkcmxvY2xpc3RzKTogTmV3IGZ1bmN0aW9uLgorCSogbGliZHcuaDogRGVjbGFyZSBpdC4KKwkqIGxpYmR3Lm1hcDogQWRkIGl0LgorCisJKiBkd2FyZl9nZXRtYWNyb3MuYyAoZHdhcmZfZ2V0bWFjcm9zKTogRG9uJ3QgYmFpbCBhdAorCURXX01BQ0lORk9fZW5kX2ZpbGUuICBSZWNvZ25pemUgdHlwZSAwIGFzIHRlcm1pbmF0b3IuCisKKzIwMDUtMDUtMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGR3YXJmX2dldHNyY19kaWUuYyAoZHdhcmZfZ2V0c3JjX2RpZSk6IFVzZSBiaW5hcnkgc2VhcmNoLgorCisJKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChkd2FyZl9nZXRzcmNsaW5lcyk6IFNvcnQgcmVzdWx0IGFycmF5LCBzaW5jZQorCXRoZSBsaW5lIHByb2dyYW0gZG9lcyBub3QgcHJvZHVjZSBhbGwgZW50cmllcyBpbiBhc2NlbmRpbmcgb3JkZXIuCisKKzIwMDUtMDQtMjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBkd2FyZl9nZXRzcmNfZmlsZS5jIChkd2FyZl9nZXRzcmNfZmlsZSk6IEhhbmRsZSBtdWx0aXBsZQorCW9jY3VyZW5jZXMgKGUuZy4sIGlubGluZXMpIGJldHRlci4KKworMjAwNS0wNC0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGxpYmR3LmggKERXQVJGX0VORF9BQkJSRVYpOiBEZWZpbmUuCisJKiBkd2FyZl9nZXRhYmJyZXYuYyAoX19saWJkd19nZXRhYmJyZXYpOiBSZXR1cm4gRFdBUkZfRU5EX0FCQlJFViBpZgorCWVuZCBpcyByZWFjaGVkLgorCSogZHdhcmZfb2ZmYWJicmV2LmMgKGR3YXJmX29mZmFiYnJldik6IFJldHVybiAtMSBvbiBlcnJvciwgMSBpZiBlbmQKKwlvZiByZWNvcmRzIHJlYWNoZWQuCisJKiBkd2FyZl90YWcuYyAoX19saWJkd19maW5kYWJicmV2KTogQWxzbyByZWNvZ25pemUgRFdBUkZfRU5EX0FCQlJFVgorCWFzIGVycm9yIG9mIF9fbGliZHdfZ2V0YWJicmV2LgorCisyMDA1LTA0LTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZHdhcmZfZ2V0c3JjX2ZpbGUuYyAoZHdhcmZfZ2V0c3JjX2ZpbGUpOiBNaW5vciBvcHRpbWl6YXRpb24uCisKKwkqIGR3YXJmX2dldHNyY19maWxlLmMgKGR3YXJmX2dldHNyY19maWxlKTogQWx3YXlzIHBhc3MgbnVtYmVyIG9mCisJcmVzdWx0cyBiYWNrIHRvIGNhbGxlci4KKworMjAwNS0wNC0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogZHdhcmZfZ2V0c3JjX2ZpbGUuYyAoZHdhcmZfZ2V0c3JjX2ZpbGUpOiBVc2Ugc2l6ZV90IGZvciBDVUhMLgorCisJKiBkd2FyZl9mdW5jX2xpbmUuYyAoX19saWJkd19mdW5jX2ludHZhbCk6IFVzZSBpbnRlcm5hbF9mdW5jdGlvbiBpbgorCWRlZm4uCisKKzIwMDUtMDQtMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBkd2FyZl9nZXRzcmNfZmlsZS5jIChkd2FyZl9nZXRzcmNfZmlsZSk6IFVzZSBJTlRVU0UuCisKKwkqIGR3YXJmX2dldHNyY19maWxlLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9nZXRzcmNfZmlsZS5jLgorCSogbGliZHcuaDogRGVjbGFyZSBkd2FyZl9nZXRzcmNfZmlsZS4KKwkqIGxpYmR3Lm1hcDogQWRkIGR3YXJmX2dldHNyY19maWxlLgorCisyMDA1LTA0LTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZHdhcmZfZnVuY19lbnRyeXBjLmM6IE5ldyBmaWxlLgorCSogZHdhcmZfZnVuY19jb2wuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9mdW5jX2xpbmUuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9mdW5jX2ZpbGUuYzogTmV3IGZpbGUuCisJKiBsaWJkdy5oOiBBZGQgcHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucy4KKwkqIGxpYmR3Lm1hcDogQWRkIGR3YXJmX2Z1bmNfZW50cnlwYywgZHdhcmZfZnVuY19jb2wsIGR3YXJmX2Z1bmNfbGluZSwKKwlkd2FyZl9mdW5jX2ZpbGUuCisJKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2Z1bmNfZW50cnlwYy5jLAorCWR3YXJmX2Z1bmNfY29sLmMsIGR3YXJmX2Z1bmNfbGluZS5jLCBkd2FyZl9mdW5jX2ZpbGUuYy4KKwkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmZfRnVuY19zKTogQWRkIGN1ZGllIGVsZW1lbnQuCisJRGVjbGFyZSBfX2xpYmR3X2Z1bmNfaW50dmFsIGFuZCBfX2R3YXJmX2Zvcm1zZGF0YV9pbnRlcm5hbC4KKwkqIGR3YXJmX2dldGZ1bmNzLmM6IEFsc28gZmlsbCBpbiBjdWRpZSBpbiBEd2FyZl9GdW5jIG9iamVjdC4KKwkqIGR3YXJmX2Zvcm1zZGF0YS5jOiBVc2UgSU5UVVNFIGFuZCBJTlRERUYgdG8gYXZvaWQgUExUcy4KKworCSogZHdhcmYuaDogQWRkIHNvbWUgRFdBUkYzIGRlZmluaXRpb25zLgorCisyMDA1LTA0LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZHdhcmZfZ2V0ZnVuY3MuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9mdW5jX2hpZ2hwYy5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2Z1bmNfbG93cGMuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9mdW5jX25hbWUuYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2dldGZ1bmNzLmMsCisJZHdhcmZfZnVuY19oaWdocGMuYywgZHdhcmZfZnVuY19sb3dwYy5jLCBhbmQgZHdhcmZfZnVuY19uYW1lLmMuCisJKiBsaWJkdy5tYXA6IEFkZCBkd2FyZl9nZXRmdW5jcywgZHdhcmZfZnVuY19oaWdocGMsIGR3YXJmX2Z1bmNfbG93cGMsCisJYW5kIGR3YXJmX2Z1bmNfbmFtZS4KKwkqIGxpYmR3Lmg6IEFkZCBwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zLgorCSogZHdhcmZfY2hpbGQuYzogVXNlIElOVFVTRSBhbmQgSU5UREVGIHRvIGF2b2lkIFBMVHMuCisJKiBkd2FyZl9zaWJsaW5nb2YuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9kaWVvZmZzZXQuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9oaWdocGMuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9sb3dwYy5jOiBMaWtld2lzZS4KKwkqIGxpYmR3UC5oOiBBZGQgcHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgZnVuY3Rpb25zLgorCURlZmluZSBEd2FyZl9GdW5jX3Mgc3RydWN0dXJlLgorCisyMDA1LTAzLTI5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbGliZHcuaDogQWRkIHBhZGRpbmcgaW4gRHdhcmZfZGllLgorCisJKiBkd2FyZl9hcnJheW9yZGVyLmM6IFVzZSBJTlRVU0UgYW5kIElOVERFRiB0byBhdm9pZCBQTFRzLgorCSogZHdhcmZfYXR0ci5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2JlZ2luLmM6IExpa2V3aXNlLgorCSogZHdhcmZfYmVnaW5fZWxmLmM6IExpa2V3aXNlLgorCSogZHdhcmZfYml0b2Zmc2V0LmM6IExpa2V3aXNlLgorCSogZHdhcmZfYml0c2l6ZS5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2J5dGVzaXplLmM6IExpa2V3aXNlLgorCSogZHdhcmZfZGllbmFtZS5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2Zvcm1hZGRyLmM6IExpa2V3aXNlLgorCSogZHdhcmZfZm9ybWJsb2NrLmM6IExpa2V3aXNlLgorCSogZHdhcmZfZm9ybXJlZi5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2Zvcm1zdHJpbmcuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9mb3JtdWRhdGEuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9nZXRhcmFuZ2VfYWRkci5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldGFyYW5nZWluZm8uYzogTGlrZXdpc2UuCisJKiBkd2FyZl9nZXRhcmFuZ2VzLmM6IExpa2V3aXNlLgorCSogZHdhcmZfZ2V0bG9jbGlzdC5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldG1hY3Jvcy5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldHNyY19kaWUuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9nZXRzcmNmaWxlcy5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldHNyY2xpbmVzLmM6IExpa2V3aXNlLgorCSogZHdhcmZfaGlnaHBjLmM6IExpa2V3aXNlLgorCSogZHdhcmZfbG93cGMuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9uZXh0Y3UuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9vZmZkaWUuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9zaWJsaW5nb2YuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9zcmNsYW5nLmM6IExpa2V3aXNlLgorCSogZHdhcmZfdGFnLmM6IExpa2V3aXNlLgorCSogbGliZHdfZmluZGN1LmM6IExpa2V3aXNlLgorCSogbGliZHdQLmg6IEFkZCBwcm90b3R5cGVzIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMuCisKKwkqIGR3YXJmX2FkZHJkaWUuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9tYWNyb19vcGNvZGUuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9tYWNyb19wYXJhbTEuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9tYWNyb19wYXJhbTIuYzogTmV3IGZpbGUuCisJKiBsaWJkdy5oOiBBZGQgZGVjbGFyYXRpb25zLiAgTW92ZSBEd2FyZl9NYWNybyBkZWZpbml0aW9uIHRvIGxpYmR3UC5oLgorCSogbGliZHdQLmg6IFJlbW92ZSBEd2FyZl9NYWNybyBkZWZpbml0aW9uLgorCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9hZGRyZGllLmMsCisJZHdhcmZfbWFjcm9fb3Bjb2RlLmMsIGR3YXJmX21hY3JvX3BhcmFtMS5jLCBhbmQgZHdhcmZfbWFjcm9fcGFyYW0yLmMuCisJKiBsaWJkdy5tYXA6IEFkZCBlbnRyaWVzIGZvciBuZXcgZnVuY3Rpb25zLgorCisyMDA1LTAzLTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbGliZHcuaDogSGFuZGxlIGJyb2tlbiBnY2MgPCA0LgorCisyMDA1LTAyLTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUgKEFNX0NGTEFHUyk6IEFkZCAtV3VudXNlZCAtV2V4dHJhIC1XZm9ybWF0PTIuCisKKwkqIGR3YXJmX2JlZ2luX2VsZi5jOiBGaXggd2FybmluZ3MuCisJKiBkd2FyZl9kaWVvZmZzZXQuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9lbmQuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9lcnJvci5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldHB1Ym5hbWVzLmM6IExpa2V3aXNlLgorCisJKiBsaWJkd1AuaDogQWRkIG5ldyBlcnJvciB2YWx1ZXMuCisJKiBkd2FyZl9lcnJvci5jOiBTdXBwb3J0IG5ldyBlcnJvciB2YWx1ZXMuCisJKiBkd2FyZl9nZXRwdWJuYW1lcy5jOiBDaGVjayBwYXJhbWV0ZXIgdmFsdWUuCisKKzIwMDUtMDItMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQ2hlY2sgZm9yIHRleHQgcmVsb2NhdGlvbnMgaW4gY29uc3RydWN0ZWQgRFNPLgorCisJKiBNYWtlZmlsZS5hbSBbTVVERkxBUF0gKEFNX0NGTEFHUyk6IEFkZCAtZm11ZGZsYXAuCisKKzIwMDUtMDItMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBkd2FyZl9zaWJsaW5nb2YuYyAoZHdhcmZfc2libGluZ29mKTogQWRkIHNvbWUgYnVmZmVyIGJvdW5kYXJ5CisJY2hlY2tzIHRvIG5vdCByZWFkIG92ZXIgYnVmZmVyIGJvdW5kYXJpZXMgZm9yIGlsbC1mb3JtZWQgRFdBUkYgZGF0YS4KKworMjAwNC0wOS0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGR3YXJmX2NoaWxkLmM6IE1ha2UgY29tcGlsZSB3aXRoIGdjYyA0LjAuCisJKiBkd2FyZl9lcnJvci5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2Zvcm1ibG9jay5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldGFiYnJldi5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldGF0dHJzLmM6IExpa2V3aXNlLgorCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogTGlrZXdpc2UuCisJKiBkd2FyZl90YWcuYzogTGlrZXdpc2UuCisJKiBsaWJkd19mb3JtLmM6IExpa2V3aXNlLgorCisyMDA0LTAxLTIwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IFN1cHBvcnQgYnVpbGRpbmcgd2l0aCBtdWRmbGFwLgorCisJKiBkd2FyZl9nZXRsb2NsaXN0LmM6IEZpeCB3YXJuaW5ncyBnY2MgMy40IHNwaXRzIG91dC4KKwkqIGR3YXJmX2dldHNyY2xpbmVzLmM6IExpa2V3aXNlLgorCSogZHdhcmZfbWVtb3J5LWFjY2Vzcy5oOiBMaWtld2lzZS4KKworMjAwNC0wMS0xOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGR3YXJmX2dldHNyY2ZpbGVzLmM6IFRoaXJkIHBhcmFtZXRlciBjYW4gYmUgTlVMTC4KKworCSogbGliZHcuaDogRGVmaW5lIER3YXJmX21hY3JvLiAgRGVjbGFyZSBkd2FyZl9nZXRtYWNyb3MuCisJVGhpcmQgcGFyYW1ldGVyIG9mIGR3YXJmX2dldHNyY2ZpbGVzIGNhbiBiZSBOVUxMLgorCisJKiBsaWJkdy5tYXA6IEFkZCBkd2FyZl9nZXRtYWNyb3MuCisJKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2dldG1hY3Jvcy4KKwkqIGR3YXJmX2dldG1hY3Jvcy5jOiBOZXcgZmlsZS4KKworMjAwNC0wMS0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGxpYmR3Lmg6IFNlY29uZCBwYXJhbWV0ZXIgb2YgZHdhcmZfZ2V0YXJhbmdlcyBjYW4gYmUgTlVMTC4KKworCSogZHdhcmZfbmV4dGN1LmM6IFJldHVybiAtMSBpZiBkd2FyZiBwYXJhbWV0ZXIgaXMgTlVMTC4KKworCSogZHdhcmZfZ2V0c3JjbGluZXMuYzoKKwlVc2UgcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyBpbnN0ZWFkIG9mIF9pbmMtbGVzcyB2YXJpYW50LgorCisJKiBkd2FyZl9nZXRhcmFuZ2VzLmM6IEFsbG93IG5hcmFuZ2VzIHBhcmFtZXRlciB0byBiZSBOVUxMLgorCisJKiBsaWJkd1AuaCAoXyk6IFVzZSBlbGZ1dGlscyBkb21haW4uCisKKwkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKGR3YXJmX2dldHNyY2xpbmVzKTogQWRkIG1vcmUgYnJhbmNoIHByZWRpY3Rpb24uCisKKwkqIGR3YXJmX2dldHNyY2xpbmVzLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQuCisKKzIwMDQtMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBidWlsZGluZyB3aXRoIG11ZGZsYXAuCisKKzIwMDQtMDEtMTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBtZW1vcnktYWNjZXNzLmg6IEFkZCBsb3RzIG9mIGNvbnN0IGluIGNhc2UgYSBwb2ludGVyIHBhc3NlZCBpcyBjb25zdC4KKworCSogZHdhcmZfZm9ybWZsYWcuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9nZXRhdHRycy5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2Vycm9yLmM6IEFkZCBuZXcgZXJyb3IgdmFsdWUuCisJKiBsaWJkdy5oOiBBZGQgcHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucy4gIEFkanVzdCBwcm90b3R5cGUgZm9yCisJZHdhcmZfZ2V0cHVibmFtZXMuCisJKiBsaWJkdy5tYXA6IEFkZCBuZXcgZnVuY3Rpb25zLgorCSogZHdhcmZfZ2V0cHVibmFtZXMuYzogQ2hhbmdlIHR5cGUgb2YgcmV0dXJuIHZhbHVlIGFuZCBmb3VydGggcGFyYW1ldGVyCisJdG8gcHRyZGlmZl90LgorCSogbGliZHdQLmg6IEFkZCBuZXcgZXJyb3IgdmFsdWUuCisJKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2dldGF0dHJzLmMgYW5kCisJZHdhcmZfZm9ybWZsYWcuYy4KKworCSogZHdhcmZfZ2V0cHVibmFtZXMuYyAoZHdhcmZfZ2V0cHVibmFtZXMpOiBKdXN0IGZhaWwgaWYgZGJnIGlzIE5VTEwuCisKKzIwMDQtMDEtMTIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBkd2FyZl9nZXRhcmFuZ2VfYWRkci5jOiBOZXcgZmlsZQorCSogZHdhcmZfZ2V0YXJhbmdlaW5mby5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2dldGFyYW5nZXMuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9vbmVyYW5nZS5jOiBOZXcgZmlsZS4KKwkqIGxpYmR3Lmg6IERlY2xhcmUgbmV3IGZ1bmN0aW9ucy4gIERlZmluZSBEd2FyZl9BcmFuZ2UgYW5kCisJRHdhcmZfQXJhbmdlcy4KKwkqIGxpYmR3Lm1hcDogQWRkIG5ldyBmdW5jdGlvbnMuCisJKiBsaWJkd1AuaDogQWRkIG5ldyBlcnJvcnMuICBBZGQgYXJhbmdlcyBtZW1iZXIgdG8gc3RydWN0IER3YXJmLgorCURlZmluZSBEd2FyZl9BcmFuZ2VzX3MgYW5kIER3YXJmX0FyYW5nZV9zLgorCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9nZXRhcmFuZ2VzLmMsCisJZHdhcmZfb25lYXJhbmdlLmMsIGR3YXJmX2dldGFyYW5nZWluZm8uYywgZHdhcmZfZ2V0YXJhbmdlX2FkZHIuYy4KKwkqIGR3YXJmX2Vycm9yLmM6IEFkZCBuZXcgbWVzc2FnZS4KKworMjAwNC0wMS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgZHdhcmZfbGluZWFkZHIuYywgZHdhcmZfbGluZWNvbC5jLAorCWR3YXJmX2xpbmViZWdpbnN0YXRlbWVudC5jLCBkd2FyZl9saW5lZW5kc2VxdWVuY2UuYywgZHdhcmZfbGluZWJsb2NrLmMsCisJZHdhcmZfbGluZXByb2xvZ3VlZW5kLmMsIGR3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luLmMsIGR3YXJmX29uZXNyY2xpbmUuYy4KKwkqIGR3YXJmX2Vycm9yLmM6IEFkZCBhbm90aGVyIG1lc3NhZ2UuCisJKiBkd2FyZl9nZXRzcmNfZGllLmM6IEFkanVzdCBmb3IgRHdhcmZfRmlsZXMgYW5kIER3YXJmX0xpbmVzCisJaW50cm9kdWN0aW9uLgorCSogZHdhcmZfZmlsZXNyYy5jOiBMaWtld2lzZS4KKwkqIGR3YXJmX2dldHNyY2ZpbGVzLmM6IExpa2V3aXNlLgorCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogTGlrZXdpc2UuCisJKiBkd2FyZl9saW5lYWRkci5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2xpbmViZWdpbnN0YXRlbWVudC5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2xpbmVibG9jay5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2xpbmVjb2wuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9saW5lZW5kc2VxdWVuY2UuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9saW5lZXBpbG9ndWViZWdpbi5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2xpbmVuby5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2xpbmVwcm9sb2d1ZWVuZC5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX29uZXNyY2xpbmUuYzogTmV3IGZpbGUuCisJKiBkd2FyZl9saW5lbm8uYzogQ2hhbmdlIGludGVyZmFjZSB0byBzdG9yZSByZXN1bHQgaW4gb2JqZWN0IHBvaW50ZWQKKwl0byBieSBzZWNvbmQgcGFyYW1ldGVyLgorCSogbGliZHcuaDogQWRkIHByb3RvdHlwZXMgZm9yIG5ldyBmdW5jdGlvbnMuICBDaGFuZ2UgZHdhcmZfbGluZW5vCisJcHJvdG90eXBlLiAgRGVmaW5lIER3YXJmX0ZpbGVzIGFuZCBEd2FyZl9MaW5lcy4KKwkqIGxpYmR3Lm1hcDogQWRkIG5ldyBmdW5jdGlvbnMuCisJKiBsaWJkd1AuaDogRGVmaW5lIER3YXJmX0ZpbGVzX3MgYW5kIER3YXJmX0xpbmVzX3MuCisJKiBsaWJkd19maW5kY3UuYzogRG9uJ3QgaW5pdGlhbGl6ZSBubGluZXMgZmllbGQuCisKKwkqIGR3YXJmX3NpYmxpbmdvZjogTGl0dGxlIG9wdGltaXphdGlvbi4KKworCSogZHdhcmZfYmVnaW4uYzogUmVtZW1iZXIgdGhhdCB0aGUgRUxGIGRlc2NyaXB0b3IgbXVzdCBiZSBjbG9zZWQuCisJKiBkd2FyZl9lbmQuYzogQ2xvc2UgRUxGIGRlc2NyaXB0b3IgaWYgZnJlZV9lbGYgaXMgc2V0LgorCSogbGliZHdQLmggKHN0cnVjdCBEd2FyZik6IEFkZCBmcmVlX2VsZiBmaWVsZC4KKworCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9nZXRzdHJpbmcuYyBhbmQKKwlkd2FyZl9vZmZhYmJyZXYuYy4KKwkqIGR3YXJmX2dldHN0cmluZy5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX29mZmFiYnJldi5jOiBOZXcgZmlsZS4KKwkqIGxpYmR3Lm1hcDogQWRkIGR3YXJmX2dldHN0cmluZyBhbmQgZHdhcmZfb2ZmYWJicmV2LgorCSogZHdhcmZfZ2V0YWJicmV2LmMgKF9fbGliZHdfZ2V0YWJicmV2KTogQWRkIG5ldyBkYmcgYW5kIHJlc3VsdAorCXBhcmFtZXRlcnMuICBEb24ndCBhbGxvY2F0ZSBtZW1vcnkgaWYgbm90IG5lY2Vzc2FyeSBhbmQgZG9uJ3QgbG9va3VwCisJcHJldmlvdXMgcmVzdWx0cyBpZiBubyBDVSBnaXZlbi4KKwkoZHdhcmZfZ2V0YWJicmV2KTogQWRqdXN0IGNhbGwgdG8gX19saWJkd19nZXRhYmJyZXYuCisJKiBkd2FyZl90YWcuYzogQWRqdXN0IGNhbGwgdG8gX19saWJkd19nZXRhYmJyZXYuCisJKiBsaWJkdy5oOiBEZWNsYXJlIGR3YXJmX29mZmFiYnJldiBhbmQgZHdhcmZfZ2V0c3RyaW5nLgorCSogbGliZHdQLmg6IENoYW5nZSBwcm90b3R5cGUgZm9yIF9fbGliZHdfZ2V0YWJicmV2LgorCisJKiBkd2FyZl9nZXRhYmJyZXZhdHRyLmM6IEFkZCBvZmZzZXRwIHBhcmFtZXRlci4gIEZpbGwgaW4gYmVmb3JlCisJcmV0dXJuaW5nIGlmIHRoaXMgaXMgd2FudGVkLgorCisyMDA0LTAxLTA5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZHdhcmZfbmV4dGN1LmM6IEFkZCBuZXcgcGFyYW1ldGVyIG9mZnNldF9zaXplcC4gIEluaXRpYWxpemUgaXQKKwl3aXRoIG9mZnNldF9zaXplIHZhbHVlLgorCSogbGliZHcuaDogQWRqdXN0IGR3YXJmX25leHRjdSBwcm90b3R5cGUuCisJKiBsaWJkd1AuaCAoc3RydWN0IER3YXJmX0NVKTogQWRkIG9mZnNldF9zaXplIG1lbWJlci4KKwkqIGxpYmR3X2ZpbmRjdS5jOiBBZGp1c3QgZHdhcmZfbmV4dGN1IGNhbGwuICBJbml0aWFsaXplIG9mZnNldF9zaXplCisJbWVtYmVyIG9mIG5ldyBDVSBzdHJ1Y3QuCisJKiBkd2FyZl9mb3Jtc3RyaW5nLmM6IERlcGVuZCBvbiBvZmZzZXRfc2l6ZSBub3QgYWRkcmVzc19zaXplIGZvcgorCURXX0ZPUk1fc3RycCBoYW5kbGluZy4KKwkqIGR3YXJmX2Zvcm0uYzogTGlrZXdpc2UgZm9yIERXX0ZPUk1fc3RycCBhbmQgRFdfRk9STV9yZWZfYWRkci4KKworCSogZHdhcmZfdGFnLmMgKF9fbGliZHdfZmluZGFiYnJldik6IFJldHVybiBjb3JyZWN0IHZhbHVlIGZvcgorCWZhaWxpbmcgbG9va3VwLgorCShkd2FyZl90YWcpOiBDb3JyZWN0bHkgcmVjb2duaXplIGZhaWxlZCBsb29rdXAuCisKKwkqIGR3YXJmX2VuZC5jIChjdV9mcmVlKTogIENhbGwgdGRlc3Ryb3kgZm9yIGxvY3MgbWVtYmVyLiAgVXNlIG5ldworCWZ1bmN0aW9uIG5vb3BfZnJlZS4KKwkqIGR3YXJmX2Vycm9yLmM6IEFkZCBtZXNzYWdlIGZvciBEV0FSRl9FX05PX0JMT0NLLgorCSogZHdhcmZfZm9ybWJsb2NrLmM6IE5ldyBmaWxlLgorCSogZHdhcmZfZ2V0bG9jbGlzdC5jOiBSZXdyaXRlIHRvIGhhbmRsZSBhIHNpbmdsZSBibG9jay4KKwkqIGxpYmR3Lmg6IERlZmluZSBEd2FyZl9CbG9jay4gIFJlbmFtZSBEd2FyZl9Mb2MgbWVtYmVycy4gIFJlbW92ZQorCUR3YXJmX0xvY2Rlc2MgZGVmaW5pdGlvbi4gIERlY2xhcmUgZHdhcmZfZm9ybWJsb2NrLiAgUmVtb3ZlCisJZHdhcmZfZ2V0bG9jbGlzdGVudCBkZWNsYXJhdGlvbi4KKwkqIGxpYmR3Lm1hcDogQWRkIGR3YXJmX2Zvcm1ibG9jaywgcmVtb3ZlIGR3YXJmX2dldGxvY2xpc3RlbnQuCisJKiBsaWJkd1AuaDogRGVmaW5lIHN0cnVjdCBsb2NfcyBhbmQgRFdBUkZfRV9OT19CTE9DSy4KKwlBZGQgbG9jcyBtZW1iZXIgdG8gc3RydWN0IER3YXJmX0NVLgorCSogbGliZHdfZnVuZGN1LmM6IEluaXRpYWxpemUgbG9jcyBtZW1iZXIgb2YgbmV3IENVLgorCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9mb3JtYmxvY2suYy4KKwlSZW1vdmUgZHdhcmZfZ2V0bG9jbGlzdGVudC5jLgorCisyMDA0LTAxLTA3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbGliZHcuaDogVXNlIF9fbm9ubnVsbF9fIGF0dHJpYnV0ZSBvbmx5IGZvciBnY2MgPj0gMy4zLgorCSogbGliZHdQLmg6IExpa2V3aXNlLgorCisJKiBkd2FyZl9nZXRsb2NsaXN0LmM6IE5ldyBmaWxlLgorCSogZHdhcmZfZ2V0bG9jbGlzdGVudC5jOiBOZXcgZmlsZS4KKwkqIGxpYmR3Lmg6IERlZmluZSBEd2FyZl9Mb2MgYW5kIER3YXJmX0xvY2Rlc2MuCisJRGVjbGFyZSBkd2FyZl9nZXRsb2NsaXN0ZW50IGFuZCBkd2FyZl9nZXRsb2NsaXN0LgorCSogbGliZHcubWFwOiBBZGQgZHdhcmZfZ2V0bG9jbGlzdGVudCBhbmQgZHdhcmZfZ2V0bG9jbGlzdC4KKwkqIGxpYmR3UC5oOiBEZWZpbmUgRFdBUkZfRV9OT19MT0NMSVNULgorCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9nZXRsb2NsaXN0ZW50LmMgYW5kCisJZHdhcmZfZ2V0bG9jbGlzdC5jLgorCisJKiBkd2FyZl9lcnJvci5jOiBNb3JlIGVycm9yIG1lc3NhZ2VzLgorCisyMDA0LTAxLTA2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogUmVtb3ZlIGRlYnVnZ2luZyBzdXBwb3J0LgorCisJKiBkd2FyZl9nZXRzcmNmaWxlcy5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2ZpbGVzcmMuYzogTmV3IGZpbGUuCisJKiBsaWJkdy5oOiBEZWNsYXJlIHRoZXNlIGZ1bmN0aW9ucy4gIERlZmluZSBEd2FyZl9GaWxlLgorCSogbGliZHdQLmM6IEFkanVzdCBEd2FyZl9GaWxlX3MgZGVmaW5pdGlvbi4KKwkqIGxpYmR3Lm1hcDogQWRkIHRoZXNlIGZ1bmN0aW9ucy4KKwkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgZHdhcmZfZ2V0c3JjZmlsZXMuYyBhbmQKKwlkd2FyZl9maWxlc3JjLmMuCisJKiBkd2FyZl9nZXRzcmNsaW5lcy5jOiBJbml0aWFsaXplIGN1LT5maWxlcy4KKworMjAwNC0wMS0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGxpYmR3Lmg6IEFkZCBtb3JlIG5vbm51bGwgZnVuY3Rpb24gYXR0cmlidXRlcy4KKworCSogZHdhcmZfYmVnaW5fZWxmLmMgKGR3YXJmX2JlZ2luX2VsZik6IERvbid0IGluaXRpYWxpemUgbWVtX3RhaWwtPm5leHQuCisJKiBkd2FyZl9lbmQuYyAoY3VfZnJlZSk6IE5ldyBmdW5jdGlvbi4KKwkoZHdhcmZfZW5kKTogQWxzbyBmcmVlIENVIHRyZWUuICBDb3JyZWN0IGZyZWVpbmcgb2YgbWVtb3J5IGJsb2Nrcy4KKwkqIGR3YXJmX2Vycm9yLmMgKGVycm1zZ3MpOiBBZGQgbmV3IG1lc3NhZ2VzLgorCSogZHdhcmZfZ2V0c3JjX2RpZS5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX2dldHNyY2xpbmVzLmM6IE5ldyBmaWxlLgorCSogZHdhcmZfbGluZW5vLmM6IE5ldyBmaWxlLgorCSogZHdhcmZfbGluZXNyYy5jOiBOZXcgZmlsZS4KKwkqIGR3YXJmX25leHRjdS5jIChkd2FyZl9uZXh0Y3UpOiBVc2UgcmVhZF8qYnl0ZV91bmFsaWduZWRfaW5jCisJaW5zdGVhZCBvZiB0aGUgKl9pbmMtbGVzcyB2YXJpYW50cy4KKwkqIGxpYmR3Lmg6IERlZmluZSBEd2FyZl9MaW5lLiAgQWRkIHNvbWUgZnVuY3Rpb24gYXR0cmlidXRlcy4gIERlY2xhcmUKKwlkd2FyZl9nZXRzcmNsaW5lcywgZHdhcmZfZ2V0c3JjX2RpZSwgZHdhcmZfbGluZW5vLCBhbmQgZHdhcmZfbGluZXNyYy4KKwkqIGxpYmR3Lm1hcDogQWRkIGR3YXJmX2dldHNyY2xpbmVzLCBkd2FyZl9nZXRzcmNfZGllLCBkd2FyZl9saW5lbm8sCisJYW5kIGR3YXJmX2xpbmVzcmMuCisJKiBsaWJkd1AuaDogQWRkIG1vcmUgZXJyb3IgY29kZXMuCisJKHN0cnVjdCBEd2FyZik6IFJlbW92ZSBtZW1fdGFpbC5uZXh0IG1lbWJlci4KKwkoRHdhcmZfRmlsZSk6IERlZmluZSB0eXBlLgorCShzdHJ1Y3QgRHdhcmZfTGluZV9zKTogRGVmaW5lIHR5cGUuCisJKHN0cnVjdCBEd2FyZl9DVSk6IEFkZCBsaW5lcyBhbmQgbmxpbmVzIG1lbWJlcnMuCisJKGxpYmR3X2FsbG9jKTogRGVmaW5lIGxvY2FsIHZhcmlhYmxlIF90YWlsIGFuZCB1c2UgaXQuCisJQWRkIHNvbWUgZnVuY3Rpb24gYXR0cmlidXRlcy4KKwkqIGxpYmR3X2FsbG9jLmMgKF9fbGliZHdfYWxsb2NhdGUpOiBEb24ndCBpbml0aWFsaXplIG5leHQgbWVtYmVyLgorCSogbGliZHdfZmluZGN1LmMgKF9fbGliZHdfZmluZGN1KTogSW5pdGlhbGl6ZSBsaW5lcyBhbmQgbmxpbmVzIG1lbWJlcnMuCisJKiBtZW1vcnktYWNjZXNzLmg6IEFkZCB1bmxpa2VseSBmb3IgdGhlIGVuZGlhbiBjb252ZXJzaW9uIHBhdGhzLgorCSogTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IEFkZCAtc3RkIHBhcmFtZXRlci4KKwkobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2dldHNyY2xpbmVzLCBkd2FyZl9nZXRzcmNfZGllLAorCWR3YXJmX2xpbmVubywgYW5kIGR3YXJmX2xpbmVzcmMuCisKKzIwMDMtMDgtMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisgICAgICAgICogTW92ZWQgdG8gQ1ZTIGFyY2hpdmUuCmRpZmYgLS1naXQgYS9saWJkdy9NYWtlZmlsZS5hbSBiL2xpYmR3L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YmUzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEwOCBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBjcmVhdGUgTWFrZWZpbGUuaW4KKyMjCisjIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMjCisjIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyMgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorIyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorIyMKK0RFRlMgPSAtRF9HTlVfU09VUkNFIC1ESEFWRV9DT05GSUdfSCAtRElTX0xJQkRXCitpZiBNVURGTEFQCitBTV9DRkxBR1MgPSAtZm11ZGZsYXAKK2Vsc2UKK0FNX0NGTEFHUyA9CitlbmRpZgorQU1fQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IgLVdzaGFkb3cgLVd1bnVzZWQgLVdmb3JtYXQ9MiAtV2V4dHJhIC1zdGQ9Z251OTkKK0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JJChzcmNkaXIpLy4uL2xpYmVsZiAtSS4uIC1JJChzcmNkaXIpLy4uL2xpYgorVkVSU0lPTiA9IDEKKworbGliX0xJQlJBUklFUyA9IGxpYmR3LmEKK2lmICFNVURGTEFQCitub2luc3RfTElCUkFSSUVTID0gbGliZHdfcGljLmEKK25vaW5zdF9QUk9HUkFNUyA9ICQobm9pbnN0X0xJQlJBUklFUzpfcGljLmE9LnNvKQorZW5kaWYKKworaW5jbHVkZV9IRUFERVJTID0gZHdhcmYuaAorZXVpbmNsdWRlZGlyID0gJHtpbmNsdWRlZGlyfS9lbGZ1dGlscworZXVpbmNsdWRlX0hFQURFUlMgPSBsaWJkdy5oCisKK2xpYmR3X2FfU09VUkNFUyA9IGR3YXJmX2JlZ2luLmMgZHdhcmZfYmVnaW5fZWxmLmMgZHdhcmZfZW5kLmMgZHdhcmZfZ2V0ZWxmLmMgXAorCQkgIGR3YXJmX2dldHB1Ym5hbWVzLmMgZHdhcmZfZ2V0YWJicmV2LmMgZHdhcmZfdGFnLmMgXAorCQkgIGR3YXJmX2Vycm9yLmMgZHdhcmZfbmV4dGN1LmMgZHdhcmZfZGllbmFtZS5jIGR3YXJmX29mZmRpZS5jIFwKKwkJICBkd2FyZl9hdHRyLmMgZHdhcmZfZm9ybXN0cmluZy5jIGR3YXJmX2FiYnJldl9oYXNoLmMgXAorCQkgIGR3YXJmX2F0dHJfaW50ZWdyYXRlLmMgZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUuYyBcCisJCSAgZHdhcmZfY2hpbGQuYyBkd2FyZl9oYXNjaGlsZHJlbi5jIGR3YXJmX2Zvcm1hZGRyLmMgXAorCQkgIGR3YXJmX2Zvcm11ZGF0YS5jIGR3YXJmX2Zvcm1zZGF0YS5jIGR3YXJmX2xvd3BjLmMgXAorCQkgIGR3YXJmX2hhc3BjLmMgZHdhcmZfaGlnaHBjLmMgXAorCQkgIGR3YXJmX2Zvcm1yZWYuYyBkd2FyZl9mb3JtcmVmX2RpZS5jIGR3YXJmX3NpYmxpbmdvZi5jIFwKKwkJICBkd2FyZl9kaWVvZmZzZXQuYyBkd2FyZl9jdW9mZnNldC5jIGR3YXJmX2hhc2F0dHIuYyBcCisJCSAgZHdhcmZfaGFzZm9ybS5jIGR3YXJmX3doYXRmb3JtLmMgZHdhcmZfd2hhdGF0dHIuYyBcCisJCSAgZHdhcmZfYnl0ZXNpemUuYyBkd2FyZl9hcnJheW9yZGVyLmMgZHdhcmZfYml0c2l6ZS5jIFwKKwkJICBkd2FyZl9iaXRvZmZzZXQuYyBkd2FyZl9zcmNsYW5nLmMgZHdhcmZfZ2V0YWJicmV2dGFnLmMgXAorCQkgIGR3YXJmX2dldGFiYnJldmNvZGUuYyBkd2FyZl9hYmJyZXZoYXNjaGlsZHJlbi5jIFwKKwkJICBkd2FyZl9nZXRhdHRyY250LmMgZHdhcmZfZ2V0YWJicmV2YXR0ci5jIFwKKwkJICBkd2FyZl9nZXRzcmNsaW5lcy5jIGR3YXJmX2dldHNyY19kaWUuYyBcCisJCSAgZHdhcmZfZ2V0c2NvcGVzLmMgZHdhcmZfZ2V0c2NvcGV2YXIuYyBcCisJCSAgZHdhcmZfbGluZXNyYy5jIGR3YXJmX2xpbmVuby5jIGR3YXJmX2xpbmVhZGRyLmMgXAorCQkgIGR3YXJmX2xpbmVjb2wuYyBkd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQuYyBcCisJCSAgZHdhcmZfbGluZWVuZHNlcXVlbmNlLmMgZHdhcmZfbGluZWJsb2NrLmMgXAorCQkgIGR3YXJmX2xpbmVwcm9sb2d1ZWVuZC5jIGR3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luLmMgXAorCQkgIGR3YXJmX29uZXNyY2xpbmUuYyBkd2FyZl9mb3JtYmxvY2suYyBcCisJCSAgZHdhcmZfZ2V0c3JjZmlsZXMuYyBkd2FyZl9maWxlc3JjLmMgXAorCQkgIGR3YXJmX2dldGxvY2xpc3QuYyBkd2FyZl9nZXRzdHJpbmcuYyBkd2FyZl9vZmZhYmJyZXYuYyBcCisJCSAgZHdhcmZfZ2V0YXJhbmdlcy5jIGR3YXJmX29uZWFyYW5nZS5jIGR3YXJmX2dldGFyYW5nZWluZm8uYyBcCisJCSAgZHdhcmZfZ2V0YXJhbmdlX2FkZHIuYyBkd2FyZl9nZXRhdHRycy5jIGR3YXJmX2Zvcm1mbGFnLmMgXAorCQkgIGR3YXJmX2dldG1hY3Jvcy5jIGR3YXJmX21hY3JvX29wY29kZS5jIGR3YXJmX21hY3JvX3BhcmFtMS5jIFwKKwkJICBkd2FyZl9tYWNyb19wYXJhbTIuYyBkd2FyZl9hZGRyZGllLmMgXAorCQkgIGR3YXJmX2dldGZ1bmNzLmMgZHdhcmZfZnVuY19uYW1lLmMgZHdhcmZfZnVuY19sb3dwYy5jIFwKKwkJICBkd2FyZl9mdW5jX2hpZ2hwYy5jIGR3YXJmX2Z1bmNfZW50cnlwYy5jIGR3YXJmX2Z1bmNfZmlsZS5jIFwKKwkJICBkd2FyZl9mdW5jX2xpbmUuYyBkd2FyZl9mdW5jX2NvbC5jIGR3YXJmX2dldHNyY19maWxlLmMgXAorCQkgIGxpYmR3X2ZpbmRjdS5jIGxpYmR3X2Zvcm0uYyBsaWJkd19hbGxvYy5jIG1lbW9yeS1hY2Nlc3MuYworCisKK2lmICFNVURGTEFQCitsaWJkd19waWNfYV9TT1VSQ0VTID0KK2FtX2xpYmR3X3BpY19hX09CSkVDVFMgPSAkKGxpYmR3X2FfU09VUkNFUzouYz0ub3MpCisKK2xpYmR3X3NvX1NPVVJDRVMgPQorbGliZHcuc286IGxpYmR3X3BpYy5hICQoc3JjZGlyKS9saWJkdy5tYXAKKwkkKENDKSAtc2hhcmVkIC1vICRAIC1XbCwtLXdob2xlLWFyY2hpdmUsJDwsLS1uby13aG9sZS1hcmNoaXZlIFwKKwkgICAgICAtV2wsLS12ZXJzaW9uLXNjcmlwdCwkKHNyY2RpcikvbGliZHcubWFwLC0tbm8tdW5kZWZpbmVkIFwKKwkgICAgICAtV2wsLS1zb25hbWUsJEAuJChWRVJTSU9OKSwteixkZWZzIFwKKwkgICAgICAuLi9saWJlbGYvbGliZWxmLnNvCisJaWYgcmVhZGVsZiAtZCAkQCB8IGZncmVwIC1xIFRFWFRSRUw7IHRoZW4gZXhpdCAxOyBmaQorCWxuIC1mcyAkQCAkQC4kKFZFUlNJT04pCisKKworJS5vczogJS5jICUubworCWlmICQoQ09NUElMRSkgLWMgLW8gJEAgLWZwaWMgLURQSUMgLURTSEFSRUQgLU1UICRAIC1NRCAtTVAgXAorCSAgIC1NRiAiJChERVBESVIpLyQqLlRwbyIgYHRlc3QgLWYgJyQ8JyB8fCBlY2hvICckKHNyY2RpcikvJ2AkPDsgXAorCXRoZW4gY2F0ICIkKERFUERJUikvJCouVHBvIiA+PiAiJChERVBESVIpLyQqLlBvIjsgXAorCSAgICAgcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBcCisJZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgXAorCWZpCisKK2luc3RhbGw6IGluc3RhbGwtYW0gbGliZHcuc28KKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikKKwkkKElOU1RBTExfUFJPR1JBTSkgbGliZHcuc28gJChERVNURElSKSQobGliZGlyKS9saWJkdy0kKFBBQ0tBR0VfVkVSU0lPTikuc28KKwlsbiAtZnMgbGliZHctJChQQUNLQUdFX1ZFUlNJT04pLnNvICQoREVTVERJUikkKGxpYmRpcikvbGliZHcuc28uJChWRVJTSU9OKQorCWxuIC1mcyBsaWJkdy5zby4kKFZFUlNJT04pICQoREVTVERJUikkKGxpYmRpcikvbGliZHcuc28KKwordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmR3LSQoUEFDS0FHRV9WRVJTSU9OKS5zbworCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZHcuc28uJChWRVJTSU9OKQorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZHcuc28KKwlybWRpciAtLWlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eSAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9lbGZ1dGlscworZW5kaWYKKworbm9pbnN0X0hFQURFUlMgPSBsaWJkd1AuaCBtZW1vcnktYWNjZXNzLmggZHdhcmZfYWJicmV2X2hhc2guaAorCitFWFRSQV9ESVNUID0gbGliZHcubWFwCisKK0NMRUFORklMRVMgPSAkKGFtX2xpYmR3X3BpY19hX09CSkVDVFMpCmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZi5oIGIvbGliZHcvZHdhcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTAxMWFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmYuaApAQCAtMCwwICsxLDU4MSBAQAorLyogVGhpcyBmaWxlIGRlZmluZXMgc3RhbmRhcmQgRFdBUkYgdHlwZXMsIHN0cnVjdHVyZXMsIGFuZCBtYWNyb3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBfRFdBUkZfSAorI2RlZmluZQlfRFdBUkZfSCAxCisKKy8qIERXQVJGIHRhZ3MuICAqLworZW51bQorICB7CisgICAgRFdfVEFHX2FycmF5X3R5cGUgPSAweDAxLAorICAgIERXX1RBR19jbGFzc190eXBlID0gMHgwMiwKKyAgICBEV19UQUdfZW50cnlfcG9pbnQgPSAweDAzLAorICAgIERXX1RBR19lbnVtZXJhdGlvbl90eXBlID0gMHgwNCwKKyAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlciA9IDB4MDUsCisgICAgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uID0gMHgwOCwKKyAgICBEV19UQUdfbGFiZWwgPSAweDBhLAorICAgIERXX1RBR19sZXhpY2FsX2Jsb2NrID0gMHgwYiwKKyAgICBEV19UQUdfbWVtYmVyID0gMHgwZCwKKyAgICBEV19UQUdfcG9pbnRlcl90eXBlID0gMHgwZiwKKyAgICBEV19UQUdfcmVmZXJlbmNlX3R5cGUgPSAweDEwLAorICAgIERXX1RBR19jb21waWxlX3VuaXQgPSAweDExLAorICAgIERXX1RBR19zdHJpbmdfdHlwZSA9IDB4MTIsCisgICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlID0gMHgxMywKKyAgICBEV19UQUdfc3Vicm91dGluZV90eXBlID0gMHgxNSwKKyAgICBEV19UQUdfdHlwZWRlZiA9IDB4MTYsCisgICAgRFdfVEFHX3VuaW9uX3R5cGUgPSAweDE3LAorICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzID0gMHgxOCwKKyAgICBEV19UQUdfdmFyaWFudCA9IDB4MTksCisgICAgRFdfVEFHX2NvbW1vbl9ibG9jayA9IDB4MWEsCisgICAgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24gPSAweDFiLAorICAgIERXX1RBR19pbmhlcml0YW5jZSA9IDB4MWMsCisgICAgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSA9IDB4MWQsCisgICAgRFdfVEFHX21vZHVsZSA9IDB4MWUsCisgICAgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSA9IDB4MWYsCisgICAgRFdfVEFHX3NldF90eXBlID0gMHgyMCwKKyAgICBEV19UQUdfc3VicmFuZ2VfdHlwZSA9IDB4MjEsCisgICAgRFdfVEFHX3dpdGhfc3RtdCA9IDB4MjIsCisgICAgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiA9IDB4MjMsCisgICAgRFdfVEFHX2Jhc2VfdHlwZSA9IDB4MjQsCisgICAgRFdfVEFHX2NhdGNoX2Jsb2NrID0gMHgyNSwKKyAgICBEV19UQUdfY29uc3RfdHlwZSA9IDB4MjYsCisgICAgRFdfVEFHX2NvbnN0YW50ID0gMHgyNywKKyAgICBEV19UQUdfZW51bWVyYXRvciA9IDB4MjgsCisgICAgRFdfVEFHX2ZpbGVfdHlwZSA9IDB4MjksCisgICAgRFdfVEFHX2ZyaWVuZCA9IDB4MmEsCisgICAgRFdfVEFHX25hbWVsaXN0ID0gMHgyYiwKKyAgICBEV19UQUdfbmFtZWxpc3RfaXRlbSA9IDB4MmMsCisgICAgRFdfVEFHX3BhY2tlZF90eXBlID0gMHgyZCwKKyAgICBEV19UQUdfc3VicHJvZ3JhbSA9IDB4MmUsCisgICAgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0gPSAweDJmLAorICAgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSA9IDB4MzAsCisgICAgRFdfVEFHX3Rocm93bl90eXBlID0gMHgzMSwKKyAgICBEV19UQUdfdHJ5X2Jsb2NrID0gMHgzMiwKKyAgICBEV19UQUdfdmFyaWFudF9wYXJ0ID0gMHgzMywKKyAgICBEV19UQUdfdmFyaWFibGUgPSAweDM0LAorICAgIERXX1RBR192b2xhdGlsZV90eXBlID0gMHgzNSwKKyAgICBEV19UQUdfZHdhcmZfcHJvY2VkdXJlID0gMHgzNiwKKyAgICBEV19UQUdfcmVzdHJpY3RfdHlwZSA9IDB4MzcsCisgICAgRFdfVEFHX2ludGVyZmFjZV90eXBlID0gMHgzOCwKKyAgICBEV19UQUdfbmFtZXNwYWNlID0gMHgzOSwKKyAgICBEV19UQUdfaW1wb3J0ZWRfbW9kdWxlID0gMHgzYSwKKyAgICBEV19UQUdfdW5zcGVjaWZpZWRfdHlwZSA9IDB4M2IsCisgICAgRFdfVEFHX3BhcnRpYWxfdW5pdCA9IDB4M2MsCisgICAgRFdfVEFHX2ltcG9ydGVkX3VuaXQgPSAweDNkLAorICAgIERXX1RBR19tdXRhYmxlX3R5cGUgPSAweDNlLAorICAgIERXX1RBR19sb191c2VyID0gMHg0MDgwLAorICAgIERXX1RBR19NSVBTX2xvb3AgPSAweDQwODEsCisgICAgRFdfVEFHX2Zvcm1hdF9sYWJlbCA9IDB4NDEwMSwKKyAgICBEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGUgPSAweDQxMDIsCisgICAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzLAorICAgIERXX1RBR19oaV91c2VyID0gMHhmZmZmCisgIH07CisKKworLyogQ2hpbGRyZW4gZGV0ZXJtaW5hdGlvbiBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfQ0hJTERSRU5fbm8gPSAwLAorICAgIERXX0NISUxEUkVOX3llcyA9IDEKKyAgfTsKKworCisvKiBEV0FSRiBhdHRyaWJ1dGVzIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19BVF9zaWJsaW5nID0gMHgwMSwKKyAgICBEV19BVF9sb2NhdGlvbiA9IDB4MDIsCisgICAgRFdfQVRfbmFtZSA9IDB4MDMsCisgICAgRFdfQVRfb3JkZXJpbmcgPSAweDA5LAorICAgIERXX0FUX3N1YnNjcl9kYXRhID0gMHgwYSwKKyAgICBEV19BVF9ieXRlX3NpemUgPSAweDBiLAorICAgIERXX0FUX2JpdF9vZmZzZXQgPSAweDBjLAorICAgIERXX0FUX2JpdF9zaXplID0gMHgwZCwKKyAgICBEV19BVF9lbGVtZW50X2xpc3QgPSAweDBmLAorICAgIERXX0FUX3N0bXRfbGlzdCA9IDB4MTAsCisgICAgRFdfQVRfbG93X3BjID0gMHgxMSwKKyAgICBEV19BVF9oaWdoX3BjID0gMHgxMiwKKyAgICBEV19BVF9sYW5ndWFnZSA9IDB4MTMsCisgICAgRFdfQVRfbWVtYmVyID0gMHgxNCwKKyAgICBEV19BVF9kaXNjciA9IDB4MTUsCisgICAgRFdfQVRfZGlzY3JfdmFsdWUgPSAweDE2LAorICAgIERXX0FUX3Zpc2liaWxpdHkgPSAweDE3LAorICAgIERXX0FUX2ltcG9ydCA9IDB4MTgsCisgICAgRFdfQVRfc3RyaW5nX2xlbmd0aCA9IDB4MTksCisgICAgRFdfQVRfY29tbW9uX3JlZmVyZW5jZSA9IDB4MWEsCisgICAgRFdfQVRfY29tcF9kaXIgPSAweDFiLAorICAgIERXX0FUX2NvbnN0X3ZhbHVlID0gMHgxYywKKyAgICBEV19BVF9jb250YWluaW5nX3R5cGUgPSAweDFkLAorICAgIERXX0FUX2RlZmF1bHRfdmFsdWUgPSAweDFlLAorICAgIERXX0FUX2lubGluZSA9IDB4MjAsCisgICAgRFdfQVRfaXNfb3B0aW9uYWwgPSAweDIxLAorICAgIERXX0FUX2xvd2VyX2JvdW5kID0gMHgyMiwKKyAgICBEV19BVF9wcm9kdWNlciA9IDB4MjUsCisgICAgRFdfQVRfcHJvdG90eXBlZCA9IDB4MjcsCisgICAgRFdfQVRfcmV0dXJuX2FkZHIgPSAweDJhLAorICAgIERXX0FUX3N0YXJ0X3Njb3BlID0gMHgyYywKKyAgICBEV19BVF9zdHJpZGVfc2l6ZSA9IDB4MmUsCisgICAgRFdfQVRfdXBwZXJfYm91bmQgPSAweDJmLAorICAgIERXX0FUX2Fic3RyYWN0X29yaWdpbiA9IDB4MzEsCisgICAgRFdfQVRfYWNjZXNzaWJpbGl0eSA9IDB4MzIsCisgICAgRFdfQVRfYWRkcmVzc19jbGFzcyA9IDB4MzMsCisgICAgRFdfQVRfYXJ0aWZpY2lhbCA9IDB4MzQsCisgICAgRFdfQVRfYmFzZV90eXBlcyA9IDB4MzUsCisgICAgRFdfQVRfY2FsbGluZ19jb252ZW50aW9uID0gMHgzNiwKKyAgICBEV19BVF9jb3VudCA9IDB4MzcsCisgICAgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24gPSAweDM4LAorICAgIERXX0FUX2RlY2xfY29sdW1uID0gMHgzOSwKKyAgICBEV19BVF9kZWNsX2ZpbGUgPSAweDNhLAorICAgIERXX0FUX2RlY2xfbGluZSA9IDB4M2IsCisgICAgRFdfQVRfZGVjbGFyYXRpb24gPSAweDNjLAorICAgIERXX0FUX2Rpc2NyX2xpc3QgPSAweDNkLAorICAgIERXX0FUX2VuY29kaW5nID0gMHgzZSwKKyAgICBEV19BVF9leHRlcm5hbCA9IDB4M2YsCisgICAgRFdfQVRfZnJhbWVfYmFzZSA9IDB4NDAsCisgICAgRFdfQVRfZnJpZW5kID0gMHg0MSwKKyAgICBEV19BVF9pZGVudGlmaWVyX2Nhc2UgPSAweDQyLAorICAgIERXX0FUX21hY3JvX2luZm8gPSAweDQzLAorICAgIERXX0FUX25hbWVsaXN0X2l0ZW1zID0gMHg0NCwKKyAgICBEV19BVF9wcmlvcml0eSA9IDB4NDUsCisgICAgRFdfQVRfc2VnbWVudCA9IDB4NDYsCisgICAgRFdfQVRfc3BlY2lmaWNhdGlvbiA9IDB4NDcsCisgICAgRFdfQVRfc3RhdGljX2xpbmsgPSAweDQ4LAorICAgIERXX0FUX3R5cGUgPSAweDQ5LAorICAgIERXX0FUX3VzZV9sb2NhdGlvbiA9IDB4NGEsCisgICAgRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyID0gMHg0YiwKKyAgICBEV19BVF92aXJ0dWFsaXR5ID0gMHg0YywKKyAgICBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbiA9IDB4NGQsCisgICAgRFdfQVRfYWxsb2NhdGVkID0gMHg0ZSwKKyAgICBEV19BVF9hc3NvY2lhdGVkID0gMHg0ZiwKKyAgICBEV19BVF9kYXRhX2xvY2F0aW9uID0gMHg1MCwKKyAgICBEV19BVF9zdHJpZGUgPSAweDUxLAorICAgIERXX0FUX2VudHJ5X3BjID0gMHg1MiwKKyAgICBEV19BVF91c2VfVVRGOCA9IDB4NTMsCisgICAgRFdfQVRfZXh0ZW5zaW9uID0gMHg1NCwKKyAgICBEV19BVF9yYW5nZXMgPSAweDU1LAorICAgIERXX0FUX3RyYW1wb2xpbmUgPSAweDU2LAorICAgIERXX0FUX2NhbGxfY29sdW1uID0gMHg1NywKKyAgICBEV19BVF9jYWxsX2ZpbGUgPSAweDU4LAorICAgIERXX0FUX2NhbGxfbGluZSA9IDB4NTksCisgICAgRFdfQVRfZGVzY3JpcHRpb24gPSAweDVhLAorICAgIERXX0FUX2xvX3VzZXIgPSAweDIwMDAsCisgICAgRFdfQVRfTUlQU19mZGUgPSAweDIwMDEsCisgICAgRFdfQVRfTUlQU19sb29wX2JlZ2luID0gMHgyMDAyLAorICAgIERXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luID0gMHgyMDAzLAorICAgIERXX0FUX01JUFNfZXBpbG9nX2JlZ2luID0gMHgyMDA0LAorICAgIERXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yID0gMHgyMDA1LAorICAgIERXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGggPSAweDIwMDYsCisgICAgRFdfQVRfTUlQU19saW5rYWdlX25hbWUgPSAweDIwMDcsCisgICAgRFdfQVRfTUlQU19zdHJpZGUgPSAweDIwMDgsCisgICAgRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lID0gMHgyMDA5LAorICAgIERXX0FUX01JUFNfY2xvbmVfb3JpZ2luID0gMHgyMDBhLAorICAgIERXX0FUX01JUFNfaGFzX2lubGluZXMgPSAweDIwMGIsCisgICAgRFdfQVRfTUlQU19zdHJpZGVfYnl0ZSA9IDB4MjAwYywKKyAgICBEV19BVF9NSVBTX3N0cmlkZV9lbGVtID0gMHgyMDBkLAorICAgIERXX0FUX01JUFNfcHRyX2RvcGV0eXBlID0gMHgyMDBlLAorICAgIERXX0FUX01JUFNfYWxsb2NhdGFibGVfZG9wZXR5cGUgPSAweDIwMGYsCisgICAgRFdfQVRfTUlQU19hc3N1bWVkX3NoYXBlX2RvcGV0eXBlID0gMHgyMDEwLAorICAgIERXX0FUX01JUFNfYXNzdW1lZF9zaXplID0gMHgyMDExLAorICAgIERXX0FUX3NmX25hbWVzID0gMHgyMTAxLAorICAgIERXX0FUX3NyY19pbmZvID0gMHgyMTAyLAorICAgIERXX0FUX21hY19pbmZvID0gMHgyMTAzLAorICAgIERXX0FUX3NyY19jb29yZHMgPSAweDIxMDQsCisgICAgRFdfQVRfYm9keV9iZWdpbiA9IDB4MjEwNSwKKyAgICBEV19BVF9ib2R5X2VuZCA9IDB4MjEwNiwKKyAgICBEV19BVF9oaV91c2VyID0gMHgzZmZmCisgIH07CisKKworLyogRFdBUkYgZm9ybSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfRk9STV9hZGRyID0gMHgwMSwKKyAgICBEV19GT1JNX2Jsb2NrMiA9IDB4MDMsCisgICAgRFdfRk9STV9ibG9jazQgPSAweDA0LAorICAgIERXX0ZPUk1fZGF0YTIgPSAweDA1LAorICAgIERXX0ZPUk1fZGF0YTQgPSAweDA2LAorICAgIERXX0ZPUk1fZGF0YTggPSAweDA3LAorICAgIERXX0ZPUk1fc3RyaW5nID0gMHgwOCwKKyAgICBEV19GT1JNX2Jsb2NrID0gMHgwOSwKKyAgICBEV19GT1JNX2Jsb2NrMSA9IDB4MGEsCisgICAgRFdfRk9STV9kYXRhMSA9IDB4MGIsCisgICAgRFdfRk9STV9mbGFnID0gMHgwYywKKyAgICBEV19GT1JNX3NkYXRhID0gMHgwZCwKKyAgICBEV19GT1JNX3N0cnAgPSAweDBlLAorICAgIERXX0ZPUk1fdWRhdGEgPSAweDBmLAorICAgIERXX0ZPUk1fcmVmX2FkZHIgPSAweDEwLAorICAgIERXX0ZPUk1fcmVmMSA9IDB4MTEsCisgICAgRFdfRk9STV9yZWYyID0gMHgxMiwKKyAgICBEV19GT1JNX3JlZjQgPSAweDEzLAorICAgIERXX0ZPUk1fcmVmOCA9IDB4MTQsCisgICAgRFdfRk9STV9yZWZfdWRhdGEgPSAweDE1LAorICAgIERXX0ZPUk1faW5kaXJlY3QgPSAweDE2CisgIH07CisKKworLyogRFdBUkYgbG9jYXRpb24gb3BlcmF0aW9uIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19PUF9hZGRyID0gMHgwMywJCS8qIENvbnN0YW50IGFkZHJlc3MuICAqLworICAgIERXX09QX2RlcmVmID0gMHgwNiwKKyAgICBEV19PUF9jb25zdDF1ID0gMHgwOCwJLyogVW5zaWduZWQgMS1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdDFzID0gMHgwOSwJLyogU2lnbmVkIDEtYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfY29uc3QydSA9IDB4MGEsCS8qIFVuc2lnbmVkIDItYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfY29uc3QycyA9IDB4MGIsCS8qIFNpZ25lZCAyLWJ5dGUgY29uc3RhbnQuICAqLworICAgIERXX09QX2NvbnN0NHUgPSAweDBjLAkvKiBVbnNpZ25lZCA0LWJ5dGUgY29uc3RhbnQuICAqLworICAgIERXX09QX2NvbnN0NHMgPSAweDBkLAkvKiBTaWduZWQgNC1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdDh1ID0gMHgwZSwJLyogVW5zaWduZWQgOC1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdDhzID0gMHgwZiwJLyogU2lnbmVkIDgtYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfY29uc3R1ID0gMHgxMCwJLyogVW5zaWduZWQgTEVCMTI4IGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdHMgPSAweDExLAkvKiBTaWduZWQgTEVCMTI4IGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9kdXAgPSAweDEyLAorICAgIERXX09QX2Ryb3AgPSAweDEzLAorICAgIERXX09QX292ZXIgPSAweDE0LAorICAgIERXX09QX3BpY2sgPSAweDE1LAkJLyogMS1ieXRlIHN0YWNrIGluZGV4LiAgKi8KKyAgICBEV19PUF9zd2FwID0gMHgxNiwKKyAgICBEV19PUF9yb3QgPSAweDE3LAorICAgIERXX09QX3hkZXJlZiA9IDB4MTgsCisgICAgRFdfT1BfYWJzID0gMHgxOSwKKyAgICBEV19PUF9hbmQgPSAweDFhLAorICAgIERXX09QX2RpdiA9IDB4MWIsCisgICAgRFdfT1BfbWludXMgPSAweDFjLAorICAgIERXX09QX21vZCA9IDB4MWQsCisgICAgRFdfT1BfbXVsID0gMHgxZSwKKyAgICBEV19PUF9uZWcgPSAweDFmLAorICAgIERXX09QX25vdCA9IDB4MjAsCisgICAgRFdfT1Bfb3IgPSAweDIxLAorICAgIERXX09QX3BsdXMgPSAweDIyLAorICAgIERXX09QX3BsdXNfdWNvbnN0ID0gMHgyMywJLyogVW5zaWduZWQgTEVCMTI4IGFkZGVuZC4gICovCisgICAgRFdfT1Bfc2hsID0gMHgyNCwKKyAgICBEV19PUF9zaHIgPSAweDI1LAorICAgIERXX09QX3NocmEgPSAweDI2LAorICAgIERXX09QX3hvciA9IDB4MjcsCisgICAgRFdfT1BfYnJhID0gMHgyOCwJCS8qIFNpZ25lZCAyLWJ5dGUgY29uc3RhbnQuICAqLworICAgIERXX09QX2VxID0gMHgyOSwKKyAgICBEV19PUF9nZSA9IDB4MmEsCisgICAgRFdfT1BfZ3QgPSAweDJiLAorICAgIERXX09QX2xlID0gMHgyYywKKyAgICBEV19PUF9sdCA9IDB4MmQsCisgICAgRFdfT1BfbmUgPSAweDJlLAorICAgIERXX09QX3NraXAgPSAweDJmLAkJLyogU2lnbmVkIDItYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfbGl0MCA9IDB4MzAsCQkvKiBMaXRlcmFsIDAuICAqLworICAgIERXX09QX2xpdDEgPSAweDMxLAkJLyogTGl0ZXJhbCAxLiAgKi8KKyAgICBEV19PUF9saXQyID0gMHgzMiwJCS8qIExpdGVyYWwgMi4gICovCisgICAgRFdfT1BfbGl0MyA9IDB4MzMsCQkvKiBMaXRlcmFsIDMuICAqLworICAgIERXX09QX2xpdDQgPSAweDM0LAkJLyogTGl0ZXJhbCA0LiAgKi8KKyAgICBEV19PUF9saXQ1ID0gMHgzNSwJCS8qIExpdGVyYWwgNS4gICovCisgICAgRFdfT1BfbGl0NiA9IDB4MzYsCQkvKiBMaXRlcmFsIDYuICAqLworICAgIERXX09QX2xpdDcgPSAweDM3LAkJLyogTGl0ZXJhbCA3LiAgKi8KKyAgICBEV19PUF9saXQ4ID0gMHgzOCwJCS8qIExpdGVyYWwgOC4gICovCisgICAgRFdfT1BfbGl0OSA9IDB4MzksCQkvKiBMaXRlcmFsIDkuICAqLworICAgIERXX09QX2xpdDEwID0gMHgzYSwJCS8qIExpdGVyYWwgMTAuICAqLworICAgIERXX09QX2xpdDExID0gMHgzYiwJCS8qIExpdGVyYWwgMTEuICAqLworICAgIERXX09QX2xpdDEyID0gMHgzYywJCS8qIExpdGVyYWwgMTIuICAqLworICAgIERXX09QX2xpdDEzID0gMHgzZCwJCS8qIExpdGVyYWwgMTMuICAqLworICAgIERXX09QX2xpdDE0ID0gMHgzZSwJCS8qIExpdGVyYWwgMTQuICAqLworICAgIERXX09QX2xpdDE1ID0gMHgzZiwJCS8qIExpdGVyYWwgMTUuICAqLworICAgIERXX09QX2xpdDE2ID0gMHg0MCwJCS8qIExpdGVyYWwgMTYuICAqLworICAgIERXX09QX2xpdDE3ID0gMHg0MSwJCS8qIExpdGVyYWwgMTcuICAqLworICAgIERXX09QX2xpdDE4ID0gMHg0MiwJCS8qIExpdGVyYWwgMTguICAqLworICAgIERXX09QX2xpdDE5ID0gMHg0MywJCS8qIExpdGVyYWwgMTkuICAqLworICAgIERXX09QX2xpdDIwID0gMHg0NCwJCS8qIExpdGVyYWwgMjAuICAqLworICAgIERXX09QX2xpdDIxID0gMHg0NSwJCS8qIExpdGVyYWwgMjEuICAqLworICAgIERXX09QX2xpdDIyID0gMHg0NiwJCS8qIExpdGVyYWwgMjIuICAqLworICAgIERXX09QX2xpdDIzID0gMHg0NywJCS8qIExpdGVyYWwgMjMuICAqLworICAgIERXX09QX2xpdDI0ID0gMHg0OCwJCS8qIExpdGVyYWwgMjQuICAqLworICAgIERXX09QX2xpdDI1ID0gMHg0OSwJCS8qIExpdGVyYWwgMjUuICAqLworICAgIERXX09QX2xpdDI2ID0gMHg0YSwJCS8qIExpdGVyYWwgMjYuICAqLworICAgIERXX09QX2xpdDI3ID0gMHg0YiwJCS8qIExpdGVyYWwgMjcuICAqLworICAgIERXX09QX2xpdDI4ID0gMHg0YywJCS8qIExpdGVyYWwgMjguICAqLworICAgIERXX09QX2xpdDI5ID0gMHg0ZCwJCS8qIExpdGVyYWwgMjkuICAqLworICAgIERXX09QX2xpdDMwID0gMHg0ZSwJCS8qIExpdGVyYWwgMzAuICAqLworICAgIERXX09QX2xpdDMxID0gMHg0ZiwJCS8qIExpdGVyYWwgMzEuICAqLworICAgIERXX09QX3JlZzAgPSAweDUwLAkJLyogUmVnaXN0ZXIgMC4gICovCisgICAgRFdfT1BfcmVnMSA9IDB4NTEsCQkvKiBSZWdpc3RlciAxLiAgKi8KKyAgICBEV19PUF9yZWcyID0gMHg1MiwJCS8qIFJlZ2lzdGVyIDIuICAqLworICAgIERXX09QX3JlZzMgPSAweDUzLAkJLyogUmVnaXN0ZXIgMy4gICovCisgICAgRFdfT1BfcmVnNCA9IDB4NTQsCQkvKiBSZWdpc3RlciA0LiAgKi8KKyAgICBEV19PUF9yZWc1ID0gMHg1NSwJCS8qIFJlZ2lzdGVyIDUuICAqLworICAgIERXX09QX3JlZzYgPSAweDU2LAkJLyogUmVnaXN0ZXIgNi4gICovCisgICAgRFdfT1BfcmVnNyA9IDB4NTcsCQkvKiBSZWdpc3RlciA3LiAgKi8KKyAgICBEV19PUF9yZWc4ID0gMHg1OCwJCS8qIFJlZ2lzdGVyIDguICAqLworICAgIERXX09QX3JlZzkgPSAweDU5LAkJLyogUmVnaXN0ZXIgOS4gICovCisgICAgRFdfT1BfcmVnMTAgPSAweDVhLAkJLyogUmVnaXN0ZXIgMTAuICAqLworICAgIERXX09QX3JlZzExID0gMHg1YiwJCS8qIFJlZ2lzdGVyIDExLiAgKi8KKyAgICBEV19PUF9yZWcxMiA9IDB4NWMsCQkvKiBSZWdpc3RlciAxMi4gICovCisgICAgRFdfT1BfcmVnMTMgPSAweDVkLAkJLyogUmVnaXN0ZXIgMTMuICAqLworICAgIERXX09QX3JlZzE0ID0gMHg1ZSwJCS8qIFJlZ2lzdGVyIDE0LiAgKi8KKyAgICBEV19PUF9yZWcxNSA9IDB4NWYsCQkvKiBSZWdpc3RlciAxNS4gICovCisgICAgRFdfT1BfcmVnMTYgPSAweDYwLAkJLyogUmVnaXN0ZXIgMTYuICAqLworICAgIERXX09QX3JlZzE3ID0gMHg2MSwJCS8qIFJlZ2lzdGVyIDE3LiAgKi8KKyAgICBEV19PUF9yZWcxOCA9IDB4NjIsCQkvKiBSZWdpc3RlciAxOC4gICovCisgICAgRFdfT1BfcmVnMTkgPSAweDYzLAkJLyogUmVnaXN0ZXIgMTkuICAqLworICAgIERXX09QX3JlZzIwID0gMHg2NCwJCS8qIFJlZ2lzdGVyIDIwLiAgKi8KKyAgICBEV19PUF9yZWcyMSA9IDB4NjUsCQkvKiBSZWdpc3RlciAyMS4gICovCisgICAgRFdfT1BfcmVnMjIgPSAweDY2LAkJLyogUmVnaXN0ZXIgMjIuICAqLworICAgIERXX09QX3JlZzIzID0gMHg2NywJCS8qIFJlZ2lzdGVyIDI0LiAgKi8KKyAgICBEV19PUF9yZWcyNCA9IDB4NjgsCQkvKiBSZWdpc3RlciAyNC4gICovCisgICAgRFdfT1BfcmVnMjUgPSAweDY5LAkJLyogUmVnaXN0ZXIgMjUuICAqLworICAgIERXX09QX3JlZzI2ID0gMHg2YSwJCS8qIFJlZ2lzdGVyIDI2LiAgKi8KKyAgICBEV19PUF9yZWcyNyA9IDB4NmIsCQkvKiBSZWdpc3RlciAyNy4gICovCisgICAgRFdfT1BfcmVnMjggPSAweDZjLAkJLyogUmVnaXN0ZXIgMjguICAqLworICAgIERXX09QX3JlZzI5ID0gMHg2ZCwJCS8qIFJlZ2lzdGVyIDI5LiAgKi8KKyAgICBEV19PUF9yZWczMCA9IDB4NmUsCQkvKiBSZWdpc3RlciAzMC4gICovCisgICAgRFdfT1BfcmVnMzEgPSAweDZmLAkJLyogUmVnaXN0ZXIgMzEuICAqLworICAgIERXX09QX2JyZWcwID0gMHg3MCwJCS8qIEJhc2UgcmVnaXN0ZXIgMC4gICovCisgICAgRFdfT1BfYnJlZzEgPSAweDcxLAkJLyogQmFzZSByZWdpc3RlciAxLiAgKi8KKyAgICBEV19PUF9icmVnMiA9IDB4NzIsCQkvKiBCYXNlIHJlZ2lzdGVyIDIuICAqLworICAgIERXX09QX2JyZWczID0gMHg3MywJCS8qIEJhc2UgcmVnaXN0ZXIgMy4gICovCisgICAgRFdfT1BfYnJlZzQgPSAweDc0LAkJLyogQmFzZSByZWdpc3RlciA0LiAgKi8KKyAgICBEV19PUF9icmVnNSA9IDB4NzUsCQkvKiBCYXNlIHJlZ2lzdGVyIDUuICAqLworICAgIERXX09QX2JyZWc2ID0gMHg3NiwJCS8qIEJhc2UgcmVnaXN0ZXIgNi4gICovCisgICAgRFdfT1BfYnJlZzcgPSAweDc3LAkJLyogQmFzZSByZWdpc3RlciA3LiAgKi8KKyAgICBEV19PUF9icmVnOCA9IDB4NzgsCQkvKiBCYXNlIHJlZ2lzdGVyIDguICAqLworICAgIERXX09QX2JyZWc5ID0gMHg3OSwJCS8qIEJhc2UgcmVnaXN0ZXIgOS4gICovCisgICAgRFdfT1BfYnJlZzEwID0gMHg3YSwJLyogQmFzZSByZWdpc3RlciAxMC4gICovCisgICAgRFdfT1BfYnJlZzExID0gMHg3YiwJLyogQmFzZSByZWdpc3RlciAxMS4gICovCisgICAgRFdfT1BfYnJlZzEyID0gMHg3YywJLyogQmFzZSByZWdpc3RlciAxMi4gICovCisgICAgRFdfT1BfYnJlZzEzID0gMHg3ZCwJLyogQmFzZSByZWdpc3RlciAxMy4gICovCisgICAgRFdfT1BfYnJlZzE0ID0gMHg3ZSwJLyogQmFzZSByZWdpc3RlciAxNC4gICovCisgICAgRFdfT1BfYnJlZzE1ID0gMHg3ZiwJLyogQmFzZSByZWdpc3RlciAxNS4gICovCisgICAgRFdfT1BfYnJlZzE2ID0gMHg4MCwJLyogQmFzZSByZWdpc3RlciAxNi4gICovCisgICAgRFdfT1BfYnJlZzE3ID0gMHg4MSwJLyogQmFzZSByZWdpc3RlciAxNy4gICovCisgICAgRFdfT1BfYnJlZzE4ID0gMHg4MiwJLyogQmFzZSByZWdpc3RlciAxOC4gICovCisgICAgRFdfT1BfYnJlZzE5ID0gMHg4MywJLyogQmFzZSByZWdpc3RlciAxOS4gICovCisgICAgRFdfT1BfYnJlZzIwID0gMHg4NCwJLyogQmFzZSByZWdpc3RlciAyMC4gICovCisgICAgRFdfT1BfYnJlZzIxID0gMHg4NSwJLyogQmFzZSByZWdpc3RlciAyMS4gICovCisgICAgRFdfT1BfYnJlZzIyID0gMHg4NiwJLyogQmFzZSByZWdpc3RlciAyMi4gICovCisgICAgRFdfT1BfYnJlZzIzID0gMHg4NywJLyogQmFzZSByZWdpc3RlciAyMy4gICovCisgICAgRFdfT1BfYnJlZzI0ID0gMHg4OCwJLyogQmFzZSByZWdpc3RlciAyNC4gICovCisgICAgRFdfT1BfYnJlZzI1ID0gMHg4OSwJLyogQmFzZSByZWdpc3RlciAyNS4gICovCisgICAgRFdfT1BfYnJlZzI2ID0gMHg4YSwJLyogQmFzZSByZWdpc3RlciAyNi4gICovCisgICAgRFdfT1BfYnJlZzI3ID0gMHg4YiwJLyogQmFzZSByZWdpc3RlciAyNy4gICovCisgICAgRFdfT1BfYnJlZzI4ID0gMHg4YywJLyogQmFzZSByZWdpc3RlciAyOC4gICovCisgICAgRFdfT1BfYnJlZzI5ID0gMHg4ZCwJLyogQmFzZSByZWdpc3RlciAyOS4gICovCisgICAgRFdfT1BfYnJlZzMwID0gMHg4ZSwJLyogQmFzZSByZWdpc3RlciAzMC4gICovCisgICAgRFdfT1BfYnJlZzMxID0gMHg4ZiwJLyogQmFzZSByZWdpc3RlciAzMS4gICovCisgICAgRFdfT1BfcmVneCA9IDB4OTAsCQkvKiBVbnNpZ25lZCBMRUIxMjggcmVnaXN0ZXIuICAqLworICAgIERXX09QX2ZicmVnID0gMHg5MSwJCS8qIFNpZ25lZCBMRUIxMjggcmVnaXN0ZXIuICAqLworICAgIERXX09QX2JyZWd4ID0gMHg5MiwJCS8qIFVMRUIxMjggcmVnaXN0ZXIgZm9sbG93ZWQgYnkgU0xFQjEyOCBvZmYuICovCisgICAgRFdfT1BfcGllY2UgPSAweDkzLAkJLyogVUxFQjEyOCBzaXplIG9mIHBpZWNlIGFkZHJlc3NlZC4gKi8KKyAgICBEV19PUF9kZXJlZl9zaXplID0gMHg5NCwJLyogMS1ieXRlIHNpemUgb2YgZGF0YSByZXRyaWV2ZWQuICAqLworICAgIERXX09QX3hkZXJlZl9zaXplID0gMHg5NSwJLyogMS1ieXRlIHNpemUgb2YgZGF0YSByZXRyaWV2ZWQuICAqLworICAgIERXX09QX25vcCA9IDB4OTYsCisgICAgRFdfT1BfcHVzaF9vYmplY3RfYWRkcmVzcyA9IDB4OTcsCisgICAgRFdfT1BfY2FsbDIgPSAweDk4LAorICAgIERXX09QX2NhbGw0ID0gMHg5OSwKKyAgICBEV19PUF9jYWxsX3JlZiA9IDB4OWEsCisKKyAgICBEV19PUF9sb191c2VyID0gMHhlMCwJLyogSW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydC4gICovCisgICAgRFdfT1BfaGlfdXNlciA9IDB4ZmYJLyogSW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQuICAqLworICB9OworCisKKy8qIERXQVJGIGJhc2UgdHlwZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfQVRFX3ZvaWQgPSAweDAsCisgICAgRFdfQVRFX2FkZHJlc3MgPSAweDEsCisgICAgRFdfQVRFX2Jvb2xlYW4gPSAweDIsCisgICAgRFdfQVRFX2NvbXBsZXhfZmxvYXQgPSAweDMsCisgICAgRFdfQVRFX2Zsb2F0ID0gMHg0LAorICAgIERXX0FURV9zaWduZWQgPSAweDUsCisgICAgRFdfQVRFX3NpZ25lZF9jaGFyID0gMHg2LAorICAgIERXX0FURV91bnNpZ25lZCA9IDB4NywKKyAgICBEV19BVEVfdW5zaWduZWRfY2hhciA9IDB4OCwKKyAgICBEV19BVEVfaW1hZ2luYXJ5X2Zsb2F0ID0gMHg5LAorCisgICAgRFdfQVRFX2xvX3VzZXIgPSAweDgwLAorICAgIERXX0FURV9oaV91c2VyID0gMHhmZgorICB9OworCisKKy8qIERXQVJGIGFjY2Vzc2liaWxpdHkgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0FDQ0VTU19wdWJsaWMgPSAxLAorICAgIERXX0FDQ0VTU19wcm90ZWN0ZWQgPSAyLAorICAgIERXX0FDQ0VTU19wcml2YXRlID0gMworICB9OworCisKKy8qIERXQVJGIHZpc2liaWxpdHkgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX1ZJU19sb2NhbCA9IDEsCisgICAgRFdfVklTX2V4cG9ydGVkID0gMiwKKyAgICBEV19WSVNfcXVhbGlmaWVkID0gMworICB9OworCisKKy8qIERXQVJGIHZpcnR1YWxpdHkgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX1ZJUlRVQUxJVFlfbm9uZSA9IDAsCisgICAgRFdfVklSVFVBTElUWV92aXJ0dWFsID0gMSwKKyAgICBEV19WSVJUVUFMSVRZX3B1cmVfdmlydHVhbCA9IDIKKyAgfTsKKworCisvKiBEV0FSRiBsYW5ndWFnZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfTEFOR19DODkgPSAweDAwMDEsCisgICAgRFdfTEFOR19DID0gMHgwMDAyLAorICAgIERXX0xBTkdfQWRhODMgPSAweDAwMDMsCisgICAgRFdfTEFOR19DX3BsdXNfcGx1cwk9IDB4MDAwNCwKKyAgICBEV19MQU5HX0NvYm9sNzQgPSAweDAwMDUsCisgICAgRFdfTEFOR19Db2JvbDg1ID0gMHgwMDA2LAorICAgIERXX0xBTkdfRm9ydHJhbjc3ID0gMHgwMDA3LAorICAgIERXX0xBTkdfRm9ydHJhbjkwID0gMHgwMDA4LAorICAgIERXX0xBTkdfUGFzY2FsODMgPSAweDAwMDksCisgICAgRFdfTEFOR19Nb2R1bGEyID0gMHgwMDBhLAorICAgIERXX0xBTkdfSmF2YSA9IDB4MDAwYiwKKyAgICBEV19MQU5HX0M5OSA9IDB4MDAwYywKKyAgICBEV19MQU5HX0FkYTk1ID0gMHgwMDBkLAorICAgIERXX0xBTkdfRm9ydHJhbjk1ID0gMHgwMDBlLAorICAgIERXX0xBTkdfUEwxID0gMHgwMDBmLAorICAgIERXX0xBTkdfbG9fdXNlciA9IDB4ODAwMCwKKyAgICBEV19MQU5HX01pcHNfQXNzZW1ibGVyID0gMHg4MDAxLAorICAgIERXX0xBTkdfaGlfdXNlciA9IDB4ZmZmZgorICB9OworCisKKy8qIERXQVJGIGlkZW50aWZpZXIgY2FzZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfSURfY2FzZV9zZW5zaXRpdmUgPSAwLAorICAgIERXX0lEX3VwX2Nhc2UgPSAxLAorICAgIERXX0lEX2Rvd25fY2FzZSA9IDIsCisgICAgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZSA9IDMKKyAgfTsKKworCisvKiBEV0FSRiBjYWxsaW5nIGNvbnZlbnRpb25zIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19DQ19ub3JtYWwgPSAweDEsCisgICAgRFdfQ0NfcHJvZ3JhbSA9IDB4MiwKKyAgICBEV19DQ19ub2NhbGwgPSAweDMsCisgICAgRFdfQ0NfbG9fdXNlciA9IDB4NDAsCisgICAgRFdfQ0NfaGlfdXNlciA9IDB4ZmYKKyAgfTsKKworCisvKiBEV0FSRiBpbmxpbmUgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0lOTF9ub3RfaW5saW5lZCA9IDAsCisgICAgRFdfSU5MX2lubGluZWQgPSAxLAorICAgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDIsCisgICAgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQgPSAzCisgIH07CisKKworLyogRFdBUkYgb3JkZXJpbmcgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX09SRF9yb3dfbWFqb3IgPSAwLAorICAgIERXX09SRF9jb2xfbWFqb3IgPSAxCisgIH07CisKKworLyogRFdBUkYgZGlzY3JpbWluYW50IGRlc2NyaXB0b3IgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0RTQ19sYWJlbCA9IDAsCisgICAgRFdfRFNDX3JhbmdlID0gMQorICB9OworCisKKy8qIERXQVJGIHN0YW5kYXJkIG9wY29kZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfTE5TX2NvcHkgPSAxLAorICAgIERXX0xOU19hZHZhbmNlX3BjID0gMiwKKyAgICBEV19MTlNfYWR2YW5jZV9saW5lID0gMywKKyAgICBEV19MTlNfc2V0X2ZpbGUgPSA0LAorICAgIERXX0xOU19zZXRfY29sdW1uID0gNSwKKyAgICBEV19MTlNfbmVnYXRlX3N0bXQgPSA2LAorICAgIERXX0xOU19zZXRfYmFzaWNfYmxvY2sgPSA3LAorICAgIERXX0xOU19jb25zdF9hZGRfcGMgPSA4LAorICAgIERXX0xOU19maXhlZF9hZHZhbmNlX3BjID0gOSwKKyAgICBEV19MTlNfc2V0X3Byb2xvZ3VlX2VuZCA9IDEwLAorICAgIERXX0xOU19zZXRfZXBpbG9nX2JlZ2luID0gMTEsCisgICAgRFdfTE5TX3NldF9pc2EgPSAxMgorICB9OworCisKKy8qIERXQVJGIGV4dGVuZGVkIG9wY2lkZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfTE5FX2VuZF9zZXF1ZW5jZSA9IDEsCisgICAgRFdfTE5FX3NldF9hZGRyZXNzID0gMiwKKyAgICBEV19MTkVfZGVmaW5lX2ZpbGUgPSAzLAorCisgICAgRFdfTE5FX2xvX3VzZXIgPSAxMjgsCisgICAgRFdfTE5FX2hpX3VzZXIgPSAyNTUKKyAgfTsKKworCisvKiBEV0FSRiBtYWNpbmZvIHR5cGUgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX01BQ0lORk9fZGVmaW5lID0gMSwKKyAgICBEV19NQUNJTkZPX3VuZGVmID0gMiwKKyAgICBEV19NQUNJTkZPX3N0YXJ0X2ZpbGUgPSAzLAorICAgIERXX01BQ0lORk9fZW5kX2ZpbGUgPSA0LAorICAgIERXX01BQ0lORk9fdmVuZG9yX2V4dCA9IDI1NQorICB9OworCisKKy8qIERXQVJGIGNhbGwgZnJhbWUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0NGQV9hZHZhbmNlX2xvYyA9IDB4NDAsCisgICAgRFdfQ0ZBX29mZnNldCA9IDB4ODAsCisgICAgRFdfQ0ZBX3Jlc3RvcmUgPSAweGMwLAorICAgIERXX0NGQV9leHRlbmRlZCA9IDAsCisKKyAgICBEV19DRkFfbm9wID0gMHgwMCwKKyAgICBEV19DRkFfc2V0X2xvYyA9IDB4MDEsCisgICAgRFdfQ0ZBX2FkdmFuY2VfbG9jMSA9IDB4MDIsCisgICAgRFdfQ0ZBX2FkdmFuY2VfbG9jMiA9IDB4MDMsCisgICAgRFdfQ0ZBX2FkdmFuY2VfbG9jNCA9IDB4MDQsCisgICAgRFdfQ0ZBX29mZnNldF9leHRlbmRlZCA9IDB4MDUsCisgICAgRFdfQ0ZBX3Jlc3RvcmVfZXh0ZW5kZWQgPSAweDA2LAorICAgIERXX0NGQV91bmRlZmluZWQgPSAweDA3LAorICAgIERXX0NGQV9zYW1lX3ZhbHVlID0gMHgwOCwKKyAgICBEV19DRkFfcmVnaXN0ZXIgPSAweDA5LAorICAgIERXX0NGQV9yZW1lbWJlcl9zdGF0ZSA9IDB4MGEsCisgICAgRFdfQ0ZBX3Jlc3RvcmVfc3RhdGUgPSAweDBiLAorICAgIERXX0NGQV9kZWZfY2ZhID0gMHgwYywKKyAgICBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciA9IDB4MGQsCisgICAgRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ID0gMHgwZSwKKyAgICBEV19DRkFfZGVmX2NmYV9leHByZXNzaW9uID0gMHgwZiwKKyAgICBEV19DRkFfZXhwcmVzc2lvbiA9IDB4MTAsCisgICAgRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZiA9IDB4MTEsCisgICAgRFdfQ0ZBX2RlZl9jZmFfc2YgPSAweDEyLAorICAgIERXX0NGQV9kZWZfY2ZhX29mZnNldF9zZiA9IDB4MTMsCisgICAgRFdfQ0ZBX2xvd191c2VyID0gMHgxYywKKyAgICBEV19DRkFfTUlQU19hZHZhbmNlX2xvYzggPSAweDFkLAorICAgIERXX0NGQV9HTlVfd2luZG93X3NhdmUgPSAweDJkLAorICAgIERXX0NGQV9HTlVfYXJnc19zaXplID0gMHgyZSwKKyAgICBEV19DRkFfaGlnaF91c2VyID0gMHgzZgorICB9OworCisKKy8qIERXQVJGIFhYWC4gICovCisjZGVmaW5lIERXX0FERFJfbm9uZQkwCisKKyNlbmRpZgkvKiBkd2FyZi5oICovCmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9hYmJyZXZfaGFzaC5jIGIvbGliZHcvZHdhcmZfYWJicmV2X2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDllNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfYWJicmV2X2hhc2guYwpAQCAtMCwwICsxLDI5IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiBoYXNoIHRhYmxlIGZvciBEV0FSRiAuZGVidWdfYWJicmV2IHNlY3Rpb24gY29udGVudC4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2RlZmluZSBOT19VTkRFRgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisjZGVmaW5lIG5leHRfcHJpbWUgX19saWJkd2FyZl9uZXh0X3ByaW1lCitleHRlcm4gc2l6ZV90IG5leHRfcHJpbWUgKHNpemVfdCkgYXR0cmlidXRlX2hpZGRlbjsKKworI2luY2x1ZGUgPGR5bmFtaWNzaXplaGFzaC5jPgorCisjdW5kZWYgbmV4dF9wcmltZQorI2RlZmluZSBuZXh0X3ByaW1lIGF0dHJpYnV0ZV9oaWRkZW4gX19saWJkd2FyZl9uZXh0X3ByaW1lCisjaW5jbHVkZSAiLi4vbGliL25leHRfcHJpbWUuYyIKZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2FiYnJldl9oYXNoLmggYi9saWJkdy9kd2FyZl9hYmJyZXZfaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmM2NjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9hYmJyZXZfaGFzaC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIEhhc2ggdGFibGUgZm9yIERXQVJGIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbiBjb250ZW50LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9EV0FSRl9BQkJSRVZfSEFTSF9ICisjZGVmaW5lIF9EV0FSRl9BQkJSRVZfSEFTSF9ICTEKKworI2RlZmluZSBOQU1FIER3YXJmX0FiYnJldl9IYXNoCisjZGVmaW5lIFRZUEUgRHdhcmZfQWJicmV2ICoKKyNkZWZpbmUgQ09NUEFSRShhLCBiKSAoMCkKKworI2luY2x1ZGUgPGR5bmFtaWNzaXplaGFzaC5oPgorCisjZW5kaWYJLyogZHdhcmZfYWJicmV2X2hhc2guaCAqLwpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfYWJicmV2aGFzY2hpbGRyZW4uYyBiL2xpYmR3L2R3YXJmX2FiYnJldmhhc2NoaWxkcmVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2MWIyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2FiYnJldmhhc2NoaWxkcmVuLmMKQEAgLTAsMCArMSwyOSBAQAorLyogUmV0dXJuIHRydWUgaWYgYWJicmV2aWF0aW9uIGlzIGNoaWxkcmVuIGZsYWcgc2V0LgorICAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2FiYnJldmhhc2NoaWxkcmVuIChhYmJyZXYpCisgICAgIER3YXJmX0FiYnJldiAqYWJicmV2OworeworICByZXR1cm4gYWJicmV2ID09IE5VTEwgPyAtMSA6IGFiYnJldi0+aGFzX2NoaWxkcmVuOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfYWRkcmRpZS5jIGIvbGliZHcvZHdhcmZfYWRkcmRpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmQ0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9hZGRyZGllLmMKQEAgLTAsMCArMSwzOSBAQAorLyogUmV0dXJuIENVIERJRSBjb250YWluaW5nIGdpdmVuIGFkZHJlc3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitEd2FyZl9EaWUgKgorZHdhcmZfYWRkcmRpZSAoZGJnLCBhZGRyLCByZXN1bHQpCisgICAgIER3YXJmICpkYmc7CisgICAgIER3YXJmX0FkZHIgYWRkcjsKKyAgICAgRHdhcmZfRGllICpyZXN1bHQ7Cit7CisgIER3YXJmX0FyYW5nZXMgKmFyYW5nZXM7CisgIHNpemVfdCBuYXJhbmdlczsKKyAgRHdhcmZfT2ZmIG9mZjsKKworICBpZiAoSU5UVVNFKGR3YXJmX2dldGFyYW5nZXMpIChkYmcsICZhcmFuZ2VzLCAmbmFyYW5nZXMpICE9IDAKKyAgICAgIHx8IElOVFVTRShkd2FyZl9nZXRhcmFuZ2VpbmZvKSAoSU5UVVNFKGR3YXJmX2dldGFyYW5nZV9hZGRyKSAoYXJhbmdlcywKKwkJCQkJCQkJICAgIGFkZHIpLAorCQkJCSAgICAgIE5VTEwsIE5VTEwsICZvZmYpICE9IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIElOVFVTRShkd2FyZl9vZmZkaWUpIChkYmcsIG9mZiwgcmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2FycmF5b3JkZXIuYyBiL2xpYmR3L2R3YXJmX2FycmF5b3JkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVhMDlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfYXJyYXlvcmRlci5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIFJldHVybiBhcnJheSBvcmRlciBhdHRyaWJ1dGUgb2YgRElFLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2FycmF5b3JkZXIgKGRpZSkKKyAgICAgRHdhcmZfRGllICpkaWU7Cit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgRHdhcmZfV29yZCB2YWx1ZTsKKworICByZXR1cm4gSU5UVVNFKGR3YXJmX2Zvcm11ZGF0YSkgKElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9vcmRlcmluZywKKwkJCQkJCSAgICAgICZhdHRyX21lbSksCisJCQkJICAmdmFsdWUpID09IDAgPyAoaW50KSB2YWx1ZSA6IC0xOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfYXR0ci5jIGIvbGliZHcvZHdhcmZfYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmJiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9hdHRyLmMKQEAgLTAsMCArMSw0MCBAQAorLyogUmV0dXJuIHNwZWNpZmljIERXQVJGIGF0dHJpYnV0ZSBvZiBhIERJRS4KKyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworRHdhcmZfQXR0cmlidXRlICoKK2R3YXJmX2F0dHIgKGRpZSwgc2VhcmNoX25hbWUsIHJlc3VsdCkKKyAgICAgRHdhcmZfRGllICpkaWU7CisgICAgIHVuc2lnbmVkIGludCBzZWFyY2hfbmFtZTsKKyAgICAgRHdhcmZfQXR0cmlidXRlICpyZXN1bHQ7Cit7CisgIGlmIChkaWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBTZWFyY2ggZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gICovCisgIHJlc3VsdC0+dmFscCA9IF9fbGliZHdfZmluZF9hdHRyIChkaWUsIHNlYXJjaF9uYW1lLCAmcmVzdWx0LT5jb2RlLAorCQkJCSAgICAmcmVzdWx0LT5mb3JtKTsKKyAgLyogQWx3YXlzIGZpbGwgaW4gdGhlIENVIGluZm9ybWF0aW9uLiAgKi8KKyAgcmVzdWx0LT5jdSA9IGRpZS0+Y3U7CisKKyAgcmV0dXJuIHJlc3VsdC0+Y29kZSA9PSBzZWFyY2hfbmFtZSA/IHJlc3VsdCA6IE5VTEw7Cit9CitJTlRERUYoZHdhcmZfYXR0cikKZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2F0dHJfaW50ZWdyYXRlLmMgYi9saWJkdy9kd2FyZl9hdHRyX2ludGVncmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMjcyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9hdHRyX2ludGVncmF0ZS5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIFJldHVybiBzcGVjaWZpYyBEV0FSRiBhdHRyaWJ1dGUgb2YgYSBESUUsIGludGVncmF0aW5nIERXX0FUX2Fic3RyYWN0X29yaWdpbi4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworRHdhcmZfQXR0cmlidXRlICoKK2R3YXJmX2F0dHJfaW50ZWdyYXRlIChEd2FyZl9EaWUgKmRpZSwgdW5zaWduZWQgaW50IHNlYXJjaF9uYW1lLAorCQkgICAgICBEd2FyZl9BdHRyaWJ1dGUgKnJlc3VsdCkKK3sKKyAgRHdhcmZfRGllIGRpZV9tZW07CisKKyAgZG8KKyAgICB7CisgICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHIgPSBJTlRVU0UoZHdhcmZfYXR0cikgKGRpZSwgc2VhcmNoX25hbWUsIHJlc3VsdCk7CisgICAgICBpZiAoYXR0ciAhPSBOVUxMKQorCXJldHVybiBhdHRyOworCisgICAgICBhdHRyID0gSU5UVVNFKGR3YXJmX2F0dHIpIChkaWUsIERXX0FUX2Fic3RyYWN0X29yaWdpbiwgcmVzdWx0KTsKKyAgICAgIGlmIChhdHRyID09IE5VTEwpCisJYnJlYWs7CisKKyAgICAgIGRpZSA9IElOVFVTRShkd2FyZl9mb3JtcmVmX2RpZSkgKGF0dHIsICZkaWVfbWVtKTsKKyAgICB9CisgIHdoaWxlIChkaWUgIT0gTlVMTCk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CitJTlRERUYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfYmVnaW4uYyBiL2xpYmR3L2R3YXJmX2JlZ2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhMWIwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2JlZ2luLmMKQEAgLTAsMCArMSw4NSBAQAorLyogQ3JlYXRlIGRlc2NyaXB0b3IgZnJvbSBmaWxlIGRlc2NyaXB0b3IgZm9yIHByb2Nlc3NpbmcgZmlsZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGxpYmR3UC5oPgorCisKK0R3YXJmICoKK2R3YXJmX2JlZ2luIChmZCwgY21kKQorICAgICBpbnQgZmQ7CisgICAgIER3YXJmX0NtZCBjbWQ7Cit7CisgIEVsZiAqZWxmOworICBFbGZfQ21kIGVsZmNtZDsKKyAgRHdhcmYgKnJlc3VsdCA9IE5VTEw7CisKKyAgc3dpdGNoIChjbWQpCisgICAgeworICAgIGNhc2UgRFdBUkZfQ19SRUFEOgorICAgICAgZWxmY21kID0gRUxGX0NfUkVBRF9NTUFQOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV0FSRl9DX1dSSVRFOgorICAgICAgZWxmY21kID0gRUxGX0NfV1JJVEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXQVJGX0NfUkRXUjoKKyAgICAgIGVsZmNtZCA9IEVMRl9DX1JEV1I7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogTm8gdmFsaWQgbW9kZS4gICovCisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfQ01EKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBXZSBoYXZlIHRvIGNhbGwgYGVsZl92ZXJzaW9uJyBoZXJlIHNpbmNlIHRoZSB1c2VyIG1pZ2h0IGhhdmUgbm90CisgICAgIGRvbmUgaXQgb3IgaW5pdGlhbGl6ZWQgbGliZWxmIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbi4gIFRoaXMKKyAgICAgd291bGQgYnJlYWsgbGliZHdhcmYgc2luY2Ugd2UgYXJlIHVzaW5nIHRoZSBFTEYgZGF0YSBzdHJ1Y3R1cmVzCisgICAgIGluIGEgY2VydGFpbiB3YXkuICAqLworICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7CisKKyAgLyogR2V0IGFuIEVMRiBkZXNjcmlwdG9yLiAgKi8KKyAgZWxmID0gZWxmX2JlZ2luIChmZCwgZWxmY21kLCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRlc3Qgd2h5IHRoZSBgZWxmX2JlZ2luIiBjYWxsIGZhaWxlZC4gICovCisgICAgICBzdHJ1Y3Qgc3RhdDY0IHN0OworCisgICAgICBpZiAoZnN0YXQ2NCAoZmQsICZzdCkgPT0gMCAmJiAhIFNfSVNSRUcgKHN0LnN0X21vZGUpKQorCV9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fUkVHRklMRSk7CisgICAgICBlbHNlIGlmIChlcnJubyA9PSBFQkFERikKKwlfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRklMRSk7CisgICAgICBlbHNlCisJX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JT19FUlJPUik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRG8gdGhlIHJlYWwgd29yayBub3cgdGhhdCB3ZSBoYXZlIGFuIEVMRiBkZXNjcmlwdG9yLiAgKi8KKyAgICAgIHJlc3VsdCA9IElOVFVTRShkd2FyZl9iZWdpbl9lbGYpIChlbGYsIGNtZCwgTlVMTCk7CisKKyAgICAgIC8qIElmIHRoaXMgZmFpbGVkLCBmcmVlIHRoZSByZXNvdXJjZXMuICAqLworICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorCWVsZl9lbmQgKGVsZik7CisgICAgICBlbHNlCisJcmVzdWx0LT5mcmVlX2VsZiA9IHRydWU7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9iZWdpbl9lbGYuYyBiL2xpYmR3L2R3YXJmX2JlZ2luX2VsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2ZmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9iZWdpbl9lbGYuYwpAQCAtMCwwICsxLDI1MiBAQAorLyogQ3JlYXRlIGRlc2NyaXB0b3IgZnJvbSBFTEYgZGVzY3JpcHRvciBmb3IgcHJvY2Vzc2luZyBmaWxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCisvKiBTZWN0aW9uIG5hbWVzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGR3YXJmX3Njbm5hbWVzW0lEWF9sYXN0XVsxN10gPQoreworICBbSURYX2RlYnVnX2luZm9dID0gIi5kZWJ1Z19pbmZvIiwKKyAgW0lEWF9kZWJ1Z19hYmJyZXZdID0gIi5kZWJ1Z19hYmJyZXYiLAorICBbSURYX2RlYnVnX2FyYW5nZXNdID0gIi5kZWJ1Z19hcmFuZ2VzIiwKKyAgW0lEWF9kZWJ1Z19saW5lXSA9ICIuZGVidWdfbGluZSIsCisgIFtJRFhfZGVidWdfZnJhbWVdID0gIi5kZWJ1Z19mcmFtZSIsCisgIFtJRFhfZWhfZnJhbWVdID0gIi5laF9mcmFtZSIsCisgIFtJRFhfZGVidWdfbG9jXSA9ICIuZGVidWdfbG9jIiwKKyAgW0lEWF9kZWJ1Z19wdWJuYW1lc10gPSAiLmRlYnVnX3B1Ym5hbWVzIiwKKyAgW0lEWF9kZWJ1Z19zdHJdID0gIi5kZWJ1Z19zdHIiLAorICBbSURYX2RlYnVnX2Z1bmNuYW1lc10gPSAiLmRlYnVnX2Z1bmNuYW1lcyIsCisgIFtJRFhfZGVidWdfdHlwZW5hbWVzXSA9ICIuZGVidWdfdHlwZW5hbWVzIiwKKyAgW0lEWF9kZWJ1Z192YXJuYW1lc10gPSAiLmRlYnVnX3Zhcm5hbWVzIiwKKyAgW0lEWF9kZWJ1Z193ZWFrbmFtZXNdID0gIi5kZWJ1Z193ZWFrbmFtZXMiLAorICBbSURYX2RlYnVnX21hY2luZm9dID0gIi5kZWJ1Z19tYWNpbmZvIiwKKyAgW0lEWF9kZWJ1Z19yYW5nZXNdID0gIi5kZWJ1Z19yYW5nZXMiCit9OworI2RlZmluZSBuZHdhcmZfc2NubmFtZXMgKHNpemVvZiAoZHdhcmZfc2NubmFtZXMpIC8gc2l6ZW9mIChkd2FyZl9zY25uYW1lc1swXSkpCisKKworc3RhdGljIHZvaWQKK2NoZWNrX3NlY3Rpb24gKER3YXJmICpyZXN1bHQsIEdFbGZfRWhkciAqZWhkciwgRWxmX1NjbiAqc2NuLCBib29sIGluc2NuZ3JwKQoreworICBHRWxmX1NoZHIgc2hkcl9tZW07CisgIEdFbGZfU2hkciAqc2hkcjsKKworICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIGRhdGEuICAqLworICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisgIGlmIChzaGRyID09IE5VTEwpCisgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSWYgaXQgZG9lcyBzb21ldGhpbmcgaXMKKyAgICAgICB3cm9uZyBpbiB0aGUgbGliZWxmIGxpYnJhcnkuICAqLworICAgIGFib3J0ICgpOworCisKKyAgLyogTWFrZSBzdXJlIHRoZSBzZWN0aW9uIGlzIHBhcnQgb2YgYSBzZWN0aW9uIGdyb3VwIG9ubHkgaWZmIHdlCisgICAgIHJlYWxseSBuZWVkIGl0LiAgSWYgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBnbG9iYWwgKD0gbm9uLXNlY3Rpb24KKyAgICAgZ3JvdXAgZGVidWcgaW5mbykgd2UgaGF2ZSB0byBpZ25vcmUgYWxsIHRoZSBpbmZvIGluIHNlY3Rpb24KKyAgICAgZ3JvdXBzLiAgSWYgd2UgYXJlIGxvb2tpbmcgaW50byBhIHNlY3Rpb24gZ3JvdXAgd2UgY2Fubm90IGxvb2sgYXQKKyAgICAgYSBzZWN0aW9uIHdoaWNoIGlzbid0IHBhcnQgb2YgdGhlIHNlY3Rpb24gZ3JvdXAuICAqLworICBpZiAoISBpbnNjbmdycCAmJiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfR1JPVVApICE9IDApCisgICAgLyogSWdub3JlIHRoZSBzZWN0aW9uLiAgKi8KKyAgICByZXR1cm47CisKKworICAvKiBXZSByZWNvZ25pemUgdGhlIERXQVJGIHNlY3Rpb24gYnkgdGhlaXIgbmFtZXMuICBUaGlzIGlzIG5vdCB2ZXJ5CisgICAgIHNhZmUgYW5kIHN0YWJsZSBidXQgdGhlIGJlc3Qgd2UgY2FuIGRvLiAgKi8KKyAgY29uc3QgY2hhciAqc2NubmFtZSA9IGVsZl9zdHJwdHIgKHJlc3VsdC0+ZWxmLCBlaGRyLT5lX3Noc3RybmR4LAorCQkJCSAgICBzaGRyLT5zaF9uYW1lKTsKKyAgaWYgKHNjbm5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUaGUgc2VjdGlvbiBuYW1lIG11c3QgYmUgdmFsaWQuICBPdGhlcndpc2UgaXMgdGhlIEVMRiBmaWxlCisJIGludmFsaWQuICAqLworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0VMRik7CisgICAgICBmcmVlIChyZXN1bHQpOworICAgICAgcmV0dXJuOworICAgIH0KKworCisgIC8qIFJlY29nbml6ZSB0aGUgdmFyaW91cyBzZWN0aW9ucy4gIE1vc3QgbmFtZXMgc3RhcnQgd2l0aCAuZGVidWdfLiAgKi8KKyAgc2l6ZV90IGNudDsKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBuZHdhcmZfc2NubmFtZXM7ICsrY250KQorICAgIGlmIChzdHJjbXAgKHNjbm5hbWUsIGR3YXJmX3Njbm5hbWVzW2NudF0pID09IDApCisgICAgICB7CisJLyogRm91bmQgaXQuICBSZW1lbWJlciB3aGVyZSB0aGUgZGF0YSBpcy4gICovCisJaWYgKHVubGlrZWx5IChyZXN1bHQtPnNlY3Rpb25kYXRhW2NudF0gIT0gTlVMTCkpCisJICAvKiBBIHNlY3Rpb24gYXBwZWFycyB0d2ljZS4gIFRoYXQncyBiYWQuICBXZSBpZ25vcmUgdGhlIHNlY3Rpb24uICAqLworCSAgYnJlYWs7CisKKwkvKiBHZXQgdGhlIHNlY3Rpb24gZGF0YS4gICovCisJRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKwlpZiAoZGF0YSAhPSBOVUxMICYmIGRhdGEtPmRfc2l6ZSAhPSAwKQorCSAgLyogWWVwLCB0aGVyZSBpcyBhY3R1YWxseSBkYXRhIGF2YWlsYWJsZS4gICovCisJICByZXN1bHQtPnNlY3Rpb25kYXRhW2NudF0gPSBkYXRhOworCisJYnJlYWs7CisgICAgICB9Cit9CisKKworLyogQ2hlY2sgd2hldGhlciBhbGwgdGhlIG5lY2Vzc2FyeSBEV0FSRiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuICAqLworc3RhdGljIER3YXJmICoKK3ZhbGlkX3AgKER3YXJmICpyZXN1bHQpCit7CisgIC8qIFdlIGxvb2tlZCBhdCBhbGwgdGhlIHNlY3Rpb25zLiAgTm93IGRldGVybWluZSB3aGV0aGVyIGFsbCB0aGUKKyAgICAgc2VjdGlvbnMgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2UgbmVlZCBhcmUgdGhlcmUuCisKKyAgICAgWFhYIFdoaWNoIHNlY3Rpb25zIGFyZSBhYnNvbHV0ZWx5IG5lY2Vzc2FyeT8gIEFkZCB0ZXN0cyBpZgorICAgICBuZWNlc3NhcnkuICBGb3Igbm93IHdlIHJlcXVpcmUgb25seSAuZGVidWdfaW5mby4gIEhvcGVmdWxseSB0aGlzCisgICAgIGlzIGNvcnJlY3QuICAqLworICBpZiAodW5saWtlbHkgKHJlc3VsdC0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dID09IE5VTEwpKQorICAgIHsKKyAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fRFdBUkYpOworICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgRHdhcmYgKgorZ2xvYmFsX3JlYWQgKER3YXJmICpyZXN1bHQsIEVsZiAqZWxmLCBHRWxmX0VoZHIgKmVoZHIpCit7CisgIEVsZl9TY24gKnNjbiA9IE5VTEw7CisKKyAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWxmLCBzY24pKSAhPSBOVUxMKQorICAgIGNoZWNrX3NlY3Rpb24gKHJlc3VsdCwgZWhkciwgc2NuLCBmYWxzZSk7CisKKyAgcmV0dXJuIHZhbGlkX3AgKHJlc3VsdCk7Cit9CisKKworc3RhdGljIER3YXJmICoKK3NjbmdycF9yZWFkIChEd2FyZiAqcmVzdWx0LCBFbGYgKmVsZiwgR0VsZl9FaGRyICplaGRyLCBFbGZfU2NuICpzY25ncnApCit7CisgIC8qIFNDTkdSUCBpcyB0aGUgc2VjdGlvbiBkZXNjcmlwdG9yIGZvciBhIHNlY3Rpb24gZ3JvdXAgd2hpY2ggbWlnaHQKKyAgICAgY29udGFpbiBkZWJ1ZyBzZWN0aW9ucy4gICovCisgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbmdycCwgTlVMTCk7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgeworICAgICAgLyogV2UgY2Fubm90IHJlYWQgdGhlIHNlY3Rpb24gY29udGVudC4gIEZhaWwhICAqLworICAgICAgZnJlZSAocmVzdWx0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGUgY29udGVudCBvZiB0aGUgc2VjdGlvbiBpcyBhIG51bWJlciBvZiAzMi1iaXQgd29yZHMgd2hpY2gKKyAgICAgcmVwcmVzZW50IHNlY3Rpb24gaW5kaWNlcy4gIFRoZSBmaXJzdCB3b3JkIGlzIGEgZmxhZyB3b3JkLiAgKi8KKyAgRWxmMzJfV29yZCAqc2NuaWR4ID0gKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWY7CisgIHNpemVfdCBjbnQ7CisgIGZvciAoY250ID0gMTsgY250ICogc2l6ZW9mIChFbGYzMl9Xb3JkKSA8PSBkYXRhLT5kX3NpemU7ICsrY250KQorICAgIHsKKyAgICAgIEVsZl9TY24gKnNjbiA9IGVsZl9nZXRzY24gKGVsZiwgc2NuaWR4W2NudF0pOworICAgICAgaWYgKHNjbiA9PSBOVUxMKQorCXsKKwkgIC8qIEEgc2VjdGlvbiBncm91cCByZWZlcnMgdG8gYSBub24tZXhpc3Rpbmcgc2VjdGlvbi4gIFNob3VsZAorCSAgICAgbmV2ZXIgaGFwcGVuLiAgKi8KKwkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9FTEYpOworCSAgZnJlZSAocmVzdWx0KTsKKwkgIHJldHVybiBOVUxMOworCX0KKworICAgICAgY2hlY2tfc2VjdGlvbiAocmVzdWx0LCBlaGRyLCBzY24sIHRydWUpOworICAgIH0KKworICByZXR1cm4gdmFsaWRfcCAocmVzdWx0KTsKK30KKworCitEd2FyZiAqCitkd2FyZl9iZWdpbl9lbGYgKGVsZiwgY21kLCBzY25ncnApCisgICAgIEVsZiAqZWxmOworICAgICBEd2FyZl9DbWQgY21kOworICAgICBFbGZfU2NuICpzY25ncnA7Cit7CisgIEdFbGZfRWhkciAqZWhkcjsKKyAgR0VsZl9FaGRyIGVoZHJfbWVtOworCisgIC8qIEdldCB0aGUgRUxGIGhlYWRlciBvZiB0aGUgZmlsZS4gIFdlIG5lZWQgdmFyaW91cyBwaWVjZXMgb2YKKyAgICAgaW5mb3JtYXRpb24gZnJvbSBpdC4gICovCisgIGVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfRUxGKQorCV9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9FTEYpOworICAgICAgZWxzZQorCV9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfR0VURUhEUl9FUlJPUik7CisKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworCisgIC8qIERlZmF1bHQgbWVtb3J5IGFsbG9jYXRpb24gc2l6ZS4gICovCisgIHNpemVfdCBtZW1fZGVmYXVsdF9zaXplID0gc3lzY29uZiAoX1NDX1BBR0VTSVpFKSAtIDQgKiBzaXplb2YgKHZvaWQgKik7CisKKyAgLyogQWxsb2NhdGUgdGhlIGRhdGEgc3RydWN0dXJlLiAgKi8KKyAgRHdhcmYgKnJlc3VsdCA9IChEd2FyZiAqKSBjYWxsb2MgKDEsIHNpemVvZiAoRHdhcmYpICsgbWVtX2RlZmF1bHRfc2l6ZSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PTUVNKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBGaWxsIGluIHNvbWUgdmFsdWVzLiAgKi8KKyAgaWYgKChCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4gJiYgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMk1TQikKKyAgICAgIHx8IChCWVRFX09SREVSID09IEJJR19FTkRJQU4gJiYgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQikpCisgICAgcmVzdWx0LT5vdGhlcl9ieXRlX29yZGVyID0gdHJ1ZTsKKworICByZXN1bHQtPmVsZiA9IGVsZjsKKworICAvKiBJbml0aWFsaXplIHRoZSBtZW1vcnkgaGFuZGxpbmcuICAqLworICByZXN1bHQtPm1lbV9kZWZhdWx0X3NpemUgPSBtZW1fZGVmYXVsdF9zaXplOworICByZXN1bHQtPm9vbV9oYW5kbGVyID0gX19saWJkd19vb207CisgIHJlc3VsdC0+bWVtX3RhaWwgPSAoc3RydWN0IGxpYmR3X21lbWJsb2NrICopIChyZXN1bHQgKyAxKTsKKyAgcmVzdWx0LT5tZW1fdGFpbC0+c2l6ZSA9IChyZXN1bHQtPm1lbV9kZWZhdWx0X3NpemUKKwkJCSAgICAtIG9mZnNldG9mIChzdHJ1Y3QgbGliZHdfbWVtYmxvY2ssIG1lbSkpOworICByZXN1bHQtPm1lbV90YWlsLT5yZW1haW5pbmcgPSByZXN1bHQtPm1lbV90YWlsLT5zaXplOworICByZXN1bHQtPm1lbV90YWlsLT5wcmV2ID0gTlVMTDsKKworCisgIGlmIChjbWQgPT0gRFdBUkZfQ19SRUFEIHx8IGNtZCA9PSBEV0FSRl9DX1JEV1IpCisgICAgeworICAgICAgLyogSWYgdGhlIGNhbGxlciBwcm92aWRlcyBhIHNlY3Rpb24gZ3JvdXAgd2UgZ2V0IHRoZSBEV0FSRgorCSBzZWN0aW9ucyBvbmx5IGZyb20gdGhpcyBzZXRpb24gZ3JvdXAuICBPdGhlcndpc2Ugd2Ugc2VhcmNoCisJIGZvciB0aGUgZmlyc3Qgc2VjdGlvbiB3aXRoIHRoZSByZXF1aXJlZCBuYW1lLiAgRnVydGhlcgorCSBzZWN0aW9ucyB3aXRoIHRoZSBuYW1lIGFyZSBpZ25vcmVkLiAgVGhlIERXQVJGIHNwZWNpZmljYXRpb24KKwkgZG9lcyBub3QgcmVhbGx5IHNheSB0aGlzIGlzIGFsbG93ZWQuICAqLworICAgICAgaWYgKHNjbmdycCA9PSBOVUxMKQorCXJldHVybiBnbG9iYWxfcmVhZCAocmVzdWx0LCBlbGYsIGVoZHIpOworICAgICAgZWxzZQorCXJldHVybiBzY25ncnBfcmVhZCAocmVzdWx0LCBlbGYsIGVoZHIsIHNjbmdycCk7CisgICAgfQorICBlbHNlIGlmIChjbWQgPT0gRFdBUkZfQ19XUklURSkKKyAgICB7CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX1VOSU1QTCk7CisgICAgICBmcmVlIChyZXN1bHQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9DTUQpOworICBmcmVlIChyZXN1bHQpOworICByZXR1cm4gTlVMTDsKK30KK0lOVERFRihkd2FyZl9iZWdpbl9lbGYpCmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9iaXRvZmZzZXQuYyBiL2xpYmR3L2R3YXJmX2JpdG9mZnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYWIxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9iaXRvZmZzZXQuYwpAQCAtMCwwICsxLDMzIEBACisvKiBSZXR1cm4gYml0IG9mZnNldCBhdHRyaWJ1dGUgb2YgRElFLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2JpdG9mZnNldCAoZGllKQorICAgICBEd2FyZl9EaWUgKmRpZTsKK3sKKyAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOworICBEd2FyZl9Xb3JkIHZhbHVlOworCisgIHJldHVybiBJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoSU5UVVNFKGR3YXJmX2F0dHIpIChkaWUsIERXX0FUX2JpdF9vZmZzZXQsCisJCQkJCQkgICAgICAmYXR0cl9tZW0pLAorCQkJCSAgJnZhbHVlKSA9PSAwID8gKGludCkgdmFsdWUgOiAtMTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2JpdHNpemUuYyBiL2xpYmR3L2R3YXJmX2JpdHNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjdiNGNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfYml0c2l6ZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIFJldHVybiBiaXQgc2l6ZSBhdHRyaWJ1dGUgb2YgRElFLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2JpdHNpemUgKGRpZSkKKyAgICAgRHdhcmZfRGllICpkaWU7Cit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgRHdhcmZfV29yZCB2YWx1ZTsKKworICByZXR1cm4gSU5UVVNFKGR3YXJmX2Zvcm11ZGF0YSkgKElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9iaXRfc2l6ZSwKKwkJCQkJCSAgICAgICZhdHRyX21lbSksCisJCQkJICAmdmFsdWUpID09IDAgPyAoaW50KSB2YWx1ZSA6IC0xOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfYnl0ZXNpemUuYyBiL2xpYmR3L2R3YXJmX2J5dGVzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwYjA1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2J5dGVzaXplLmMKQEAgLTAsMCArMSwzMyBAQAorLyogUmV0dXJuIGJ5dGUgc2l6ZSBhdHRyaWJ1dGUgb2YgRElFLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2J5dGVzaXplIChkaWUpCisgICAgIER3YXJmX0RpZSAqZGllOworeworICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07CisgIER3YXJmX1dvcmQgdmFsdWU7CisKKyAgcmV0dXJuIElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChJTlRVU0UoZHdhcmZfYXR0cikgKGRpZSwgRFdfQVRfYnl0ZV9zaXplLAorCQkJCQkJICAgICAgJmF0dHJfbWVtKSwKKwkJCQkgICZ2YWx1ZSkgPT0gMCA/IChpbnQpIHZhbHVlIDogLTE7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9jaGlsZC5jIGIvbGliZHcvZHdhcmZfY2hpbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGJlOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfY2hpbGQuYwpAQCAtMCwwICsxLDE1OSBAQAorLyogUmV0dXJuIHZoaWxkIG9mIGN1cnJlbnQgRElFLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHdQLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIFNvbWUgYXJiaXRyYXJ5IHZhbHVlIG5vdCBjb25mbGljdGluZyB3aXRoIGFueSBleGlzdGluZyBjb2RlLiAgKi8KKyNkZWZpbmUgSU5WQUxJRCAweGZmZmZlNDQ0CisKKwordW5zaWduZWQgY2hhciAqCitpbnRlcm5hbF9mdW5jdGlvbl9kZWYKK19fbGliZHdfZmluZF9hdHRyIChEd2FyZl9EaWUgKmRpZSwgdW5zaWduZWQgaW50IHNlYXJjaF9uYW1lLAorCQkgICB1bnNpZ25lZCBpbnQgKmNvZGVwLCB1bnNpZ25lZCBpbnQgKmZvcm1wKQoreworICBEd2FyZiAqZGJnID0gZGllLT5jdS0+ZGJnOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWFkcCA9ICh1bnNpZ25lZCBjaGFyICopIGRpZS0+YWRkcjsKKworICAvKiBGaXJzdCB3ZSBoYXZlIHRvIGdldCB0aGUgYWJicmV2aWF0aW9uIGNvZGUgc28gdGhhdCB3ZSBjYW4gZGVjb2RlCisgICAgIHRoZSBkYXRhIGluIHRoZSBESUUuICAqLworICB1bnNpZ25lZCBpbnQgYWJicmV2X2NvZGU7CisgIGdldF91bGViMTI4IChhYmJyZXZfY29kZSwgcmVhZHApOworCisgIC8qIEZpbmQgdGhlIGFiYnJldmlhdGlvbiBlbnRyeS4gICovCisgIER3YXJmX0FiYnJldiAqYWJicmV2cCA9IGRpZS0+YWJicmV2OworICBpZiAoYWJicmV2cCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFiYnJldnAgPSBfX2xpYmR3X2ZpbmRhYmJyZXYgKGRpZS0+Y3UsIGFiYnJldl9jb2RlKTsKKyAgICAgIGRpZS0+YWJicmV2ID0gYWJicmV2cCA/OiAoRHdhcmZfQWJicmV2ICopIC0xbDsKKyAgICB9CisgIGlmICh1bmxpa2VseSAoZGllLT5hYmJyZXYgPT0gKER3YXJmX0FiYnJldiAqKSAtMWwpKQorICAgIHsKKyAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogU2VhcmNoIHRoZSBuYW1lIGF0dHJpYnV0ZS4gICovCisgIHVuc2lnbmVkIGNoYXIgKmNvbnN0IGVuZHAKKyAgICA9ICgodW5zaWduZWQgY2hhciAqKSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19hYmJyZXZdLT5kX2J1ZgorICAgICAgICsgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfYWJicmV2XS0+ZF9zaXplKTsKKworICBjb25zdCB1bnNpZ25lZCBjaGFyICphdHRycCA9IGRpZS0+YWJicmV2LT5hdHRycDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyogQXJlIHdlIHN0aWxsIGluIGJvdW5kcz8gIFRoaXMgdGVzdCBuZWVkcyB0byBiZSByZWZpbmVkLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoYXR0cnAgKyAxID49IGVuZHApKQorCXsKKwkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7CisJICByZXR1cm4gTlVMTDsKKwl9CisKKyAgICAgIC8qIEdldCBhdHRyaWJ1dGUgbmFtZSBhbmQgZm9ybS4KKworCSBYWFggV2UgZG9uJ3QgY2hlY2sgd2hldGhlciB0aGlzIHJlYWRzIGJleW9uZCB0aGUgZW5kIG9mIHRoZQorCSBzZWN0aW9uLiAgKi8KKyAgICAgIHVuc2lnbmVkIGludCBhdHRyX25hbWU7CisgICAgICBnZXRfdWxlYjEyOCAoYXR0cl9uYW1lLCBhdHRycCk7CisgICAgICB1bnNpZ25lZCBpbnQgYXR0cl9mb3JtOworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfZm9ybSwgYXR0cnApOworCisgICAgICAvKiBXZSBjYW4gc3RvcCBpZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIHdpdGggdmFsdWUgemVyby4gICovCisgICAgICBpZiAoYXR0cl9uYW1lID09IDAgJiYgYXR0cl9mb3JtID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIElzIHRoaXMgdGhlIG5hbWUgYXR0cmlidXRlPyAgKi8KKyAgICAgIGlmIChhdHRyX25hbWUgPT0gc2VhcmNoX25hbWUgJiYgc2VhcmNoX25hbWUgIT0gSU5WQUxJRCkKKwl7CisJICBpZiAoY29kZXAgIT0gTlVMTCkKKwkgICAgKmNvZGVwID0gYXR0cl9uYW1lOworCSAgaWYgKGZvcm1wICE9IE5VTEwpCisJICAgICpmb3JtcCA9IGF0dHJfZm9ybTsKKworCSAgcmV0dXJuICh1bnNpZ25lZCBjaGFyICopIHJlYWRwOworCX0KKworICAgICAgLyogU2tpcCBvdmVyIHRoZSByZXN0IG9mIHRoaXMgYXR0cmlidXRlIChpZiB0aGVyZSBpcyBhbnkpLiAgKi8KKyAgICAgIGlmIChhdHRyX2Zvcm0gIT0gMCkKKwl7CisJICBzaXplX3QgbGVuID0gX19saWJkd19mb3JtX3ZhbF9sZW4gKGRiZywgZGllLT5jdSwgYXR0cl9mb3JtLCByZWFkcCk7CisKKwkgIGlmICh1bmxpa2VseSAobGVuID09IChzaXplX3QpIC0xbCkpCisJICAgIHsKKwkgICAgICByZWFkcCA9IE5VTEw7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLy8gWFhYIFdlIG5lZWQgYmV0dGVyIGJvdW5kYXJ5IGNoZWNrcy4KKwkgIHJlYWRwICs9IGxlbjsKKwl9CisgICAgfQorCisgIC8vIFhYWCBEbyB3ZSBuZWVkIG90aGVyIHZhbHVlcz8KKyAgaWYgKGNvZGVwICE9IE5VTEwpCisgICAgKmNvZGVwID0gSU5WQUxJRDsKKyAgaWYgKGZvcm1wICE9IE5VTEwpCisgICAgKmZvcm1wID0gSU5WQUxJRDsKKworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIgKikgcmVhZHA7Cit9CisKKworaW50Citkd2FyZl9jaGlsZCAoZGllLCByZXN1bHQpCisgICAgIER3YXJmX0RpZSAqZGllOworICAgICBEd2FyZl9EaWUgKnJlc3VsdDsKK3sKKyAgLyogSWdub3JlIHByZXZpb3VzIGVycm9ycy4gICovCisgIGlmIChkaWUgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogU2tpcCBwYXN0IHRoZSBsYXN0IGF0dHJpYnV0ZS4gICovCisgIHZvaWQgKmFkZHIgPSBOVUxMOworCisgIC8qIElmIHdlIGFscmVhZHkga25vdyB0aGVyZSBhcmUgbm8gY2hpbGRyZW4gZG8gbm90IHNlYXJjaC4gICovCisgIGlmIChkaWUtPmFiYnJldiAhPSAoRHdhcmZfQWJicmV2ICopIC0xCisgICAgICAmJiAoZGllLT5hYmJyZXYgPT0gTlVMTCB8fCBkaWUtPmFiYnJldi0+aGFzX2NoaWxkcmVuKSkKKyAgICBhZGRyID0gX19saWJkd19maW5kX2F0dHIgKGRpZSwgSU5WQUxJRCwgTlVMTCwgTlVMTCk7CisgIGlmIChkaWUtPmFiYnJldiA9PSAoRHdhcmZfQWJicmV2ICopIC0xbCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBESUUgcmVhbGx5IGhhcyBjaGlsZHJlbi4gICovCisgIGlmICghIGRpZS0+YWJicmV2LT5oYXNfY2hpbGRyZW4pCisgICAgLyogVGhlcmUgY2Fubm90IGJlIGFueSBjaGlsZHJlbi4gICovCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKGFkZHIgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogUkVTVUxUIGNhbiBiZSB0aGUgc2FtZSBhcyBESUUuICBTbyBwcmVzZXJ2ZSB3aGF0IHdlIG5lZWQuICAqLworICBzdHJ1Y3QgRHdhcmZfQ1UgKmN1ID0gZGllLT5jdTsKKworICAvKiBDbGVhciB0aGUgZW50aXJlIERJRSBzdHJ1Y3R1cmUuICBUaGlzIHNpZ25hbHMgd2UgaGF2ZSBub3QgeWV0CisgICAgIGRldGVybWluZWQgYW55IG9mIHRoZSBpbmZvcm1hdGlvbi4gICovCisgIG1lbXNldCAocmVzdWx0LCAnXDAnLCBzaXplb2YgKER3YXJmX0RpZSkpOworCisgIC8qIFdlIGhhdmUgdGhlIGFkZHJlc3MuICAqLworICByZXN1bHQtPmFkZHIgPSBhZGRyOworCisgIC8qIFNhbWUgQ1UgYXMgdGhlIHBhcmVudC4gICovCisgIHJlc3VsdC0+Y3UgPSBjdTsKKworICByZXR1cm4gMDsKK30KK0lOVERFRihkd2FyZl9jaGlsZCkKZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2N1b2Zmc2V0LmMgYi9saWJkdy9kd2FyZl9jdW9mZnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYWRmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9jdW9mZnNldC5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qIFJldHVybiBvZmZzZXQgb2YgRElFIGluIENVLgorICAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitEd2FyZl9PZmYKK2R3YXJmX2N1b2Zmc2V0IChkaWUpCisgICAgIER3YXJmX0RpZSAqZGllOworeworICByZXR1cm4gKGRpZSA9PSBOVUxMCisJICA/IChEd2FyZl9PZmYpIC0xbAorCSAgOiAoZGllLT5hZGRyCisJICAgICAtIGRpZS0+Y3UtPmRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX2J1ZgorCSAgICAgLSBkaWUtPmN1LT5zdGFydCkpOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZGllbmFtZS5jIGIvbGliZHcvZHdhcmZfZGllbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDc2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9kaWVuYW1lLmMKQEAgLTAsMCArMSwzMSBAQAorLyogUmV0dXJuIHN0cmluZyBpbiBuYW1lIGF0dHJpYnV0ZSBvZiBESUUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK2NvbnN0IGNoYXIgKgorZHdhcmZfZGllbmFtZSAoZGllKQorICAgICBEd2FyZl9EaWUgKmRpZTsKK3sKKyAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOworCisgIHJldHVybiBJTlRVU0UoZHdhcmZfZm9ybXN0cmluZykgKElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9uYW1lLAorCQkJCQkJICAgICAgICZhdHRyX21lbSkpOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZGllb2Zmc2V0LmMgYi9saWJkdy9kd2FyZl9kaWVvZmZzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjc4YTQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZGllb2Zmc2V0LmMKQEAgLTAsMCArMSwzMiBAQAorLyogUmV0dXJuIG9mZnNldCBvZiBESUUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK0R3YXJmX09mZgorZHdhcmZfZGllb2Zmc2V0IChkaWUpCisgICAgIER3YXJmX0RpZSAqZGllOworeworICByZXR1cm4gKGRpZSA9PSBOVUxMCisJICA/IH4wdWwKKwkgIDogKER3YXJmX09mZikgKGRpZS0+YWRkcgorCQkJIC0gZGllLT5jdS0+ZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfaW5mb10tPmRfYnVmKSk7Cit9CitJTlRERUYoZHdhcmZfZGllb2Zmc2V0KQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZW5kLmMgYi9saWJkdy9kd2FyZl9lbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzViZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZW5kLmMKQEAgLTAsMCArMSw3NSBAQAorLyogUmVsZWFzZSBkZWJ1Z2dpbmcgaGFuZGxpbmcgY29udGV4dC4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNlYXJjaC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGliZHdQLmgiCisKKworCitzdGF0aWMgdm9pZAorbm9vcF9mcmVlICh2b2lkICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworfQorCisKK3N0YXRpYyB2b2lkCitjdV9mcmVlICh2b2lkICphcmcpCit7CisgIHN0cnVjdCBEd2FyZl9DVSAqcCA9IChzdHJ1Y3QgRHdhcmZfQ1UgKikgYXJnOworCisgIER3YXJmX0FiYnJldl9IYXNoX2ZyZWUgKCZwLT5hYmJyZXZfaGFzaCk7CisKKyAgdGRlc3Ryb3kgKHAtPmxvY3MsIG5vb3BfZnJlZSk7Cit9CisKKworaW50Citkd2FyZl9lbmQgKGR3YXJmKQorICAgICBEd2FyZiAqZHdhcmY7Cit7CisgIGlmIChkd2FyZiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoZSBzZWFyY2ggdHJlZSBmb3IgdGhlIENVcy4gIE5COiB0aGUgQ1UgZGF0YSBpdHNlbGYgaXMKKwkgYWxsb2NhdGVkIHNlcGFyYXRlbHksIGJ1dCB0aGUgYWJicmV2aWF0aW9uIGhhc2ggdGFibGVzIG5lZWQKKwkgdG8gYmUgaGFuZGxlZC4gICovCisgICAgICB0ZGVzdHJveSAoZHdhcmYtPmN1X3RyZWUsIGN1X2ZyZWUpOworCisgICAgICBzdHJ1Y3QgbGliZHdfbWVtYmxvY2sgKm1lbXAgPSBkd2FyZi0+bWVtX3RhaWw7CisgICAgICAvKiBUaGUgZmlyc3QgYmxvY2sgaXMgYWxsb2NhdGVkIHRvZ2V0aGVyIHdpdGggdGhlIER3YXJmIG9iamVjdC4gICovCisgICAgICB3aGlsZSAobWVtcC0+cHJldiAhPSBOVUxMKQorCXsKKwkgIHN0cnVjdCBsaWJkd19tZW1ibG9jayAqcHJldnAgPSBtZW1wLT5wcmV2OworCSAgZnJlZSAobWVtcCk7CisJICBtZW1wID0gcHJldnA7CisJfQorCisgICAgICAvKiBGcmVlIHRoZSBwdWJuYW1lcyBoZWxwZXIgc3RydWN0dXJlLiAgKi8KKyAgICAgIGZyZWUgKGR3YXJmLT5wdWJuYW1lc19zZXRzKTsKKworICAgICAgLyogRnJlZSB0aGUgRUxGIGRlc2NyaXB0b3IgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIGlmIChkd2FyZi0+ZnJlZV9lbGYpCisJZWxmX2VuZCAoZHdhcmYtPmVsZik7CisKKyAgICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgZGVzY3JpcHRvci4gICovCisgICAgICBmcmVlIChkd2FyZik7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZXJyb3IuYyBiL2xpYmR3L2R3YXJmX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkOTI4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2Vycm9yLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qIFJldHJpZXZlIEVMRiBkZXNjcmlwdG9yIHVzZWQgZm9yIERXQVJGIGFjY2Vzcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZHdQLmgiCisKKworI2lmZGVmIFVTRV9UTFMKKy8qIFRoZSBlcnJvciBudW1iZXIuICAqLworc3RhdGljIF9fdGhyZWFkIGludCBnbG9iYWxfZXJyb3I7CisjZWxzZQorLyogVGhpcyBpcyB0aGUga2V5IGZvciB0aGUgdGhyZWFkIHNwZWNpZmljIG1lbW9yeS4gICovCitzdGF0aWMgdGxzX2tleV90IGtleTsKKworLyogVGhlIGVycm9yIG51bWJlci4gIFVzZWQgaW4gbm9uLXRocmVhZGVkIHByb2dyYW1zLiAgKi8KK3N0YXRpYyBpbnQgZ2xvYmFsX2Vycm9yOworc3RhdGljIGJvb2wgdGhyZWFkZWQ7CisvKiBXZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KK29uY2VfZGVmaW5lIChzdGF0aWMsIG9uY2UpOworCisvKiBUaGUgaW5pdGlhbGl6YXRpb24gYW5kIGRlc3RydWN0aW9uIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgdm9pZCBpbml0ICh2b2lkKTsKK3N0YXRpYyB2b2lkIGZyZWVfa2V5X21lbSAodm9pZCAqbWVtKTsKKyNlbmRpZgkvKiBUTFMgKi8KKworCitpbnQKK2R3YXJmX2Vycm5vICh2b2lkKQoreworICBpbnQgcmVzdWx0OworCisjaWZuZGVmIFVTRV9UTFMKKyAgLyogSWYgd2UgaGF2ZSBub3QgeWV0IGluaXRpYWxpemVkIHRoZSBidWZmZXIgZG8gaXQgbm93LiAgKi8KKyAgb25jZV9leGVjdXRlIChvbmNlLCBpbml0KTsKKworICBpZiAodGhyZWFkZWQpCisgICAgeworICAgIC8qIFdlIGRvIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBkYXRhLiAgSXQgaXMgb25seSBhIHdvcmQuCisgICAgICAgV2UgY2FuIHN0b3JlIGl0IGluIHBsYWNlIG9mIHRoZSBwb2ludGVyLiAgKi8KKyAgICAgIHJlc3VsdCA9IChpbnRwdHJfdCkgZ2V0c3BlY2lmaWMgKGtleSk7CisKKyAgICAgIHNldHNwZWNpZmljIChrZXksICh2b2lkICopIChpbnRwdHJfdCkgRFdBUkZfRV9OT0VSUk9SKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorI2VuZGlmCS8qIFRMUyAqLworCisgIHJlc3VsdCA9IGdsb2JhbF9lcnJvcjsKKyAgZ2xvYmFsX2Vycm9yID0gRFdBUkZfRV9OT0VSUk9SOworICByZXR1cm4gcmVzdWx0OworfQorSU5UREVGKGR3YXJmX2Vycm5vKQorCisKKy8qIFhYWCBGb3Igbm93IHdlIHVzZSBzdHJpbmcgcG9pbnRlcnMuICBPbmNlIHRoZSB0YWJsZSBzdGFibGVsaXplcworICAgbWFrZSBpdCBtb3JlIERTTy1mcmllbmRseS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqZXJybXNnc1tdID0KKyAgeworICAgIFtEV0FSRl9FX05PRVJST1JdID0gTl8oIm5vIGVycm9yIiksCisgICAgW0RXQVJGX0VfVU5LTk9XTl9FUlJPUl0gPSBOXygidW5rbm93biBlcnJvciIpLAorICAgIFtEV0FSRl9FX0lOVkFMSURfQUNDRVNTXSA9IE5fKCJpbnZhbGlkIGFjY2VzcyIpLAorICAgIFtEV0FSRl9FX05PX1JFR0ZJTEVdID0gTl8oIm5vIHJlZ3VsYXIgZmlsZSIpLAorICAgIFtEV0FSRl9FX0lPX0VSUk9SXSA9IE5fKCJJL08gZXJyb3IiKSwKKyAgICBbRFdBUkZfRV9JTlZBTElEX0VMRl0gPSBOXygiaW52YWxpZCBFTEYgZmlsZSIpLAorICAgIFtEV0FSRl9FX05PX0RXQVJGXSA9IE5fKCJubyBEV0FSRiBpbmZvcm1hdGlvbiIpLAorICAgIFtEV0FSRl9FX05PRUxGXSA9IE5fKCJubyBFTEYgZmlsZSIpLAorICAgIFtEV0FSRl9FX0dFVEVIRFJfRVJST1JdID0gTl8oImNhbm5vdCBnZXQgRUxGIGhlYWRlciIpLAorICAgIFtEV0FSRl9FX05PTUVNXSA9IE5fKCJvdXQgb2YgbWVtb3J5IiksCisgICAgW0RXQVJGX0VfVU5JTVBMXSA9IE5fKCJub3QgaW1wbGVtZW50ZWQiKSwKKyAgICBbRFdBUkZfRV9JTlZBTElEX0NNRF0gPSBOXygiaW52YWxpZCBjb21tYW5kIiksCisgICAgW0RXQVJGX0VfSU5WQUxJRF9WRVJTSU9OXSA9IE5fKCJpbnZhbGlkIHZlcnNpb24iKSwKKyAgICBbRFdBUkZfRV9JTlZBTElEX0ZJTEVdID0gTl8oImludmFsaWQgZmlsZSIpLAorICAgIFtEV0FSRl9FX05PX0VOVFJZXSA9IE5fKCJubyBlbnRyaWVzIGZvdW5kIiksCisgICAgW0RXQVJGX0VfSU5WQUxJRF9EV0FSRl0gPSBOXygiaW52YWxpZCBEV0FSRiIpLAorICAgIFtEV0FSRl9FX05PX1NUUklOR10gPSBOXygibm8gc3RyaW5nIGRhdGEiKSwKKyAgICBbRFdBUkZfRV9OT19BRERSXSA9IE5fKCJubyBhZGRyZXNzIHZhbHVlIiksCisgICAgW0RXQVJGX0VfTk9fQ09OU1RBTlRdID0gTl8oIm5vIGNvbnN0YW50IHZhbHVlIiksCisgICAgW0RXQVJGX0VfTk9fUkVGRVJFTkNFXSA9IE5fKCJubyByZWZlcmVuY2UgdmFsdWUiKSwKKyAgICBbRFdBUkZfRV9JTlZBTElEX1JFRkVSRU5DRV0gPSBOXygiaW52YWxpZCByZWZlcmVuY2UgdmFsdWUiKSwKKyAgICBbRFdBUkZfRV9OT19ERUJVR19MSU5FXSA9IE5fKCIuZGVidWdfbGluZSBzZWN0aW9uIG1pc3NpbmciKSwKKyAgICBbRFdBUkZfRV9JTlZBTElEX0RFQlVHX0xJTkVdID0gTl8oImludmFsaWQgLmRlYnVnX2xpbmUgc2VjdGlvbiIpLAorICAgIFtEV0FSRl9FX1RPT19CSUddID0gTl8oImRlYnVnIGluZm9ybWF0aW9uIHRvbyBiaWciKSwKKyAgICBbRFdBUkZfRV9WRVJTSU9OXSA9IE5fKCJpbnZhbGlkIERXQVJGIHZlcnNpb24iKSwKKyAgICBbRFdBUkZfRV9JTlZBTElEX0RJUl9JRFhdID0gTl8oImludmFsaWQgZGlyZWN0b3J5IGluZGV4IiksCisgICAgW0RXQVJGX0VfQUREUl9PVVRPRlJBTkdFXSA9IE5fKCJhZGRyZXNzIG91dCBvZiByYW5nZSIpLAorICAgIFtEV0FSRl9FX05PX0xPQ0xJU1RdID0gTl8oIm5vIGxvY2F0aW9uIGxpc3QgdmFsdWUiKSwKKyAgICBbRFdBUkZfRV9OT19CTE9DS10gPSBOXygibm8gYmxvY2sgZGF0YSIpLAorICAgIFtEV0FSRl9FX0lOVkFMSURfTElORV9JRFhdID0gTl8oImludmFsaWQgbGluZSBpbmRleCIpLAorICAgIFtEV0FSRl9FX0lOVkFMSURfQVJBTkdFX0lEWF0gPSBOXygiaW52YWxpZCBhZGRyZXNzIHJhbmdlIGluZGV4IiksCisgICAgW0RXQVJGX0VfTk9fTUFUQ0hdID0gTl8oIm5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UiKSwKKyAgICBbRFdBUkZfRV9OT19GTEFHXSA9IE5fKCJubyBmbGFnIHZhbHVlIiksCisgICAgW0RXQVJGX0VfSU5WQUxJRF9PRkZTRVRdID0gTl8oImludmFsaWQgb2Zmc2V0IiksCisgICAgW0RXQVJGX0VfTk9fREVCVUdfUkFOR0VTXSA9IE5fKCIuZGVidWdfcmFuZ2VzIHNlY3Rpb24gbWlzc2luZyIpLAorICB9OworI2RlZmluZSBuZXJybXNncyAoc2l6ZW9mIChlcnJtc2dzKSAvIHNpemVvZiAoZXJybXNnc1swXSkpCisKKwordm9pZAorX19saWJkd19zZXRlcnJubyAodmFsdWUpCisgICAgIGludCB2YWx1ZTsKK3sKKyNpZm5kZWYgVVNFX1RMUworICAvKiBJZiB3ZSBoYXZlIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgdGhlIGJ1ZmZlciBkbyBpdCBub3cuICAqLworICBvbmNlX2V4ZWN1dGUgKG9uY2UsIGluaXQpOworCisgIGlmICh0aHJlYWRlZCkKKyAgICAvKiBXZSBkbyBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGF0YS4gIEl0IGlzIG9ubHkgYSB3b3JkLgorICAgICAgIFdlIGNhbiBzdG9yZSBpdCBpbiBwbGFjZSBvZiB0aGUgcG9pbnRlci4gICovCisgICAgc2V0c3BlY2lmaWMgKGtleSwgKHZvaWQgKikgKGludHB0cl90KSB2YWx1ZSk7CisjZW5kaWYJLyogVExTICovCisKKyAgZ2xvYmFsX2Vycm9yID0gKHZhbHVlID49IDAgJiYgdmFsdWUgPCAoaW50KSBuZXJybXNncworCQkgID8gdmFsdWUgOiBEV0FSRl9FX1VOS05PV05fRVJST1IpOworfQorCisKK2NvbnN0IGNoYXIgKgorZHdhcmZfZXJybXNnIChlcnJvcikKKyAgICAgaW50IGVycm9yOworeworICBpbnQgbGFzdF9lcnJvcjsKKworI2lmbmRlZiBVU0VfVExTCisgIC8qIElmIHdlIGhhdmUgbm90IHlldCBpbml0aWFsaXplZCB0aGUgYnVmZmVyIGRvIGl0IG5vdy4gICovCisgIG9uY2VfZXhlY3V0ZSAob25jZSwgaW5pdCk7CisKKyAgaWYgKChlcnJvciA9PSAwIHx8IGVycm9yID09IC0xKSAmJiB0aHJlYWRlZCkKKyAgICAvKiBXZSBkbyBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGF0YS4gIEl0IGlzIG9ubHkgYSB3b3JkLgorICAgICAgIFdlIGNhbiBzdG9yZSBpdCBpbiBwbGFjZSBvZiB0aGUgcG9pbnRlci4gICovCisgICAgbGFzdF9lcnJvciA9IChpbnRwdHJfdCkgZ2V0c3BlY2lmaWMgKGtleSk7CisgIGVsc2UKKyNlbmRpZgkvKiBUTFMgKi8KKyAgICBsYXN0X2Vycm9yID0gZ2xvYmFsX2Vycm9yOworCisgIGlmIChlcnJvciA9PSAwKQorICAgIHJldHVybiBsYXN0X2Vycm9yICE9IDAgPyBfKGVycm1zZ3NbbGFzdF9lcnJvcl0pIDogTlVMTDsKKyAgZWxzZSBpZiAoZXJyb3IgPCAtMSB8fCBlcnJvciA+PSAoaW50KSBuZXJybXNncykKKyAgICByZXR1cm4gXyhlcnJtc2dzW0RXQVJGX0VfVU5LTk9XTl9FUlJPUl0pOworCisgIHJldHVybiBfKGVycm1zZ3NbZXJyb3IgPT0gLTEgPyBsYXN0X2Vycm9yIDogZXJyb3JdKTsKK30KKworCisjaWZuZGVmIFVTRV9UTFMKKy8qIEZyZWUgdGhlIHRocmVhZCBzcGVjaWZpYyBkYXRhLCB0aGlzIGlzIGRvbmUgaWYgYSB0aHJlYWQgdGVybWluYXRlcy4gICovCitzdGF0aWMgdm9pZAorZnJlZV9rZXlfbWVtICh2b2lkICptZW0gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBzZXRzcGVjaWZpYyAoa2V5LCBOVUxMKTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBrZXkgZm9yIHRoZSBnbG9iYWwgdmFyaWFibGUuICAqLworc3RhdGljIHZvaWQKK2luaXQgKHZvaWQpCit7CisgIC8vIFhYWCBTY3JldyB5b3UsIGdjYzQsIHRoZSB1bnVzZWQgZnVuY3Rpb24gYXR0cmlidXRlIGRvZXMgbm90IHdvcmsuCisgIF9fYXNtICgiIiA6OiAiciIgKGZyZWVfa2V5X21lbSkpOworCisgIGlmIChrZXlfY3JlYXRlICgma2V5LCBmcmVlX2tleV9tZW0pID09IDApCisgICAgLyogQ3JlYXRpbmcgdGhlIGtleSBzdWNjZWVkZWQuICAqLworICAgIHRocmVhZGVkID0gdHJ1ZTsKK30KKyNlbmRpZgkvKiBUTFMgKi8KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2ZpbGVzcmMuYyBiL2xpYmR3L2R3YXJmX2ZpbGVzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzBjMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZmlsZXNyYy5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIEZpbmQgc291cmNlIGZpbGUgaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitjb25zdCBjaGFyICoKK2R3YXJmX2ZpbGVzcmMgKER3YXJmX0ZpbGVzICpmaWxlLCBzaXplX3QgaWR4LCBEd2FyZl9Xb3JkICptdGltZSwKKwkgICAgICAgRHdhcmZfV29yZCAqbGVuZ3RoKQoreworICBpZiAoZmlsZSA9PSBOVUxMIHx8IGlkeCA+PSBmaWxlLT5uZmlsZXMpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKG10aW1lICE9IE5VTEwpCisgICAgKm10aW1lID0gZmlsZS0+aW5mb1tpZHhdLm10aW1lOworCisgIGlmIChsZW5ndGggIT0gTlVMTCkKKyAgICAqbGVuZ3RoID0gZmlsZS0+aW5mb1tpZHhdLmxlbmd0aDsKKworICByZXR1cm4gZmlsZS0+aW5mb1tpZHhdLm5hbWU7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9mb3JtYWRkci5jIGIvbGliZHcvZHdhcmZfZm9ybWFkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjhlYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZm9ybWFkZHIuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBSZXR1cm4gYWRkcmVzcyByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK2ludAorZHdhcmZfZm9ybWFkZHIgKGF0dHIsIHJldHVybl9hZGRyKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHI7CisgICAgIER3YXJmX0FkZHIgKnJldHVybl9hZGRyOworeworICBpZiAoYXR0ciA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBpZiAodW5saWtlbHkgKGF0dHItPmZvcm0gIT0gRFdfRk9STV9hZGRyKSkKKyAgICB7CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX0FERFIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoYXR0ci0+Y3UtPmFkZHJlc3Nfc2l6ZSA9PSA4KQorICAgICpyZXR1cm5fYWRkciA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCk7CisgIGVsc2UKKyAgICAqcmV0dXJuX2FkZHIgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworCisgIHJldHVybiAwOworfQorSU5UREVGKGR3YXJmX2Zvcm1hZGRyKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZm9ybWJsb2NrLmMgYi9saWJkdy9kd2FyZl9mb3JtYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMyYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZm9ybWJsb2NrLmMKQEAgLTAsMCArMSw3MiBAQAorLyogUmV0dXJuIGJsb2NrIHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9mb3JtYmxvY2sgKGF0dHIsIHJldHVybl9ibG9jaykKKyAgICAgRHdhcmZfQXR0cmlidXRlICphdHRyOworICAgICBEd2FyZl9CbG9jayAqcmV0dXJuX2Jsb2NrOworeworICBpZiAoYXR0ciA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhcDsKKworICBzd2l0Y2ggKGF0dHItPmZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9ibG9jazE6CisgICAgICByZXR1cm5fYmxvY2stPmxlbmd0aCA9ICoodWludDhfdCAqKSBhdHRyLT52YWxwOworICAgICAgcmV0dXJuX2Jsb2NrLT5kYXRhID0gYXR0ci0+dmFscCArIDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9ibG9jazI6CisgICAgICByZXR1cm5fYmxvY2stPmxlbmd0aCA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCk7CisgICAgICByZXR1cm5fYmxvY2stPmRhdGEgPSBhdHRyLT52YWxwICsgMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKKyAgICAgIHJldHVybl9ibG9jay0+bGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKKyAgICAgIHJldHVybl9ibG9jay0+ZGF0YSA9IGF0dHItPnZhbHAgKyA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2s6CisgICAgICBkYXRhcCA9IGF0dHItPnZhbHA7CisgICAgICBnZXRfdWxlYjEyOCAocmV0dXJuX2Jsb2NrLT5sZW5ndGgsIGRhdGFwKTsKKyAgICAgIHJldHVybl9ibG9jay0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGFwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19CTE9DSyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChyZXR1cm5fYmxvY2stPmRhdGEgKyByZXR1cm5fYmxvY2stPmxlbmd0aAorICAgICAgPiAoKHVuc2lnbmVkIGNoYXIgKikgYXR0ci0+Y3UtPmRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX2J1ZgorCSArIGF0dHItPmN1LT5kYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19pbmZvXS0+ZF9zaXplKSkKKyAgICB7CisgICAgICAvKiBCbG9jayBkb2VzIG5vdCBmaXQuICAqLworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CitJTlRERUYoZHdhcmZfZm9ybWJsb2NrKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZm9ybWZsYWcuYyBiL2xpYmR3L2R3YXJmX2Zvcm1mbGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzNDQwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2Zvcm1mbGFnLmMKQEAgLTAsMCArMSw0MCBAQAorLyogUmV0dXJuIGZsYWcgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2Zvcm1mbGFnIChhdHRyLCByZXR1cm5fYm9vbCkKKyAgICAgRHdhcmZfQXR0cmlidXRlICphdHRyOworICAgICBib29sICpyZXR1cm5fYm9vbDsKK3sKKyAgaWYgKGF0dHIgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKHVubGlrZWx5IChhdHRyLT5mb3JtICE9IERXX0ZPUk1fZmxhZykpCisgICAgeworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19GTEFHKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgKnJldHVybl9ib29sID0gKmF0dHItPnZhbHAgIT0gMDsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2Zvcm1yZWYuYyBiL2xpYmR3L2R3YXJmX2Zvcm1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTU2OTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZm9ybXJlZi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIFJldHVybiByZWZlcmVuY2Ugb2Zmc2V0IHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9mb3JtcmVmIChhdHRyLCByZXR1cm5fb2Zmc2V0KQorICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHI7CisgICAgIER3YXJmX09mZiAqcmV0dXJuX29mZnNldDsKK3sKKyAgaWYgKGF0dHIgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YXA7CisKKyAgc3dpdGNoIChhdHRyLT5mb3JtKQorICAgIHsKKyAgICBjYXNlIERXX0ZPUk1fcmVmMToKKyAgICAgICpyZXR1cm5fb2Zmc2V0ID0gKmF0dHItPnZhbHA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWYyOgorICAgICAgKnJldHVybl9vZmZzZXQgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fcmVmNDoKKyAgICAgICpyZXR1cm5fb2Zmc2V0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3JlZjg6CisgICAgICAqcmV0dXJuX29mZnNldCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6CisgICAgICBkYXRhcCA9IGF0dHItPnZhbHA7CisgICAgICBnZXRfdWxlYjEyOCAoKnJldHVybl9vZmZzZXQsIGRhdGFwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgorICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX1JFRkVSRU5DRSk7CisgICAgICByZXR1cm4gLTE7CisKKyAgICBkZWZhdWx0OgorICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19SRUZFUkVOQ0UpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KK0lOVERFRihkd2FyZl9mb3JtcmVmKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZm9ybXJlZl9kaWUuYyBiL2xpYmR3L2R3YXJmX2Zvcm1yZWZfZGllLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1YjRmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2Zvcm1yZWZfZGllLmMKQEAgLTAsMCArMSwyOCBAQAorLyogTG9vayB1cCB0aGUgRElFIGluIGEgcmVmZXJlbmNlLWZvcm0gYXR0cmlidXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworRHdhcmZfRGllICoKK2R3YXJmX2Zvcm1yZWZfZGllIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX0RpZSAqZGllX21lbSkKK3sKKyAgRHdhcmZfT2ZmIG9mZnNldDsKKyAgcmV0dXJuICh1bmxpa2VseSAoSU5UVVNFKGR3YXJmX2Zvcm1yZWYpIChhdHRyLCAmb2Zmc2V0KSAhPSAwKSA/IE5VTEwKKwkgIDogSU5UVVNFKGR3YXJmX29mZmRpZSkgKGF0dHItPmN1LT5kYmcsIGF0dHItPmN1LT5zdGFydCArIG9mZnNldCwKKwkJCQkgIGRpZV9tZW0pKTsKK30KK0lOVERFRiAoZHdhcmZfZm9ybXJlZl9kaWUpCmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9mb3Jtc2RhdGEuYyBiL2xpYmR3L2R3YXJmX2Zvcm1zZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YjZiODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9mb3Jtc2RhdGEuYwpAQCAtMCwwICsxLDY4IEBACisvKiBSZXR1cm4gc2lnbmVkIGNvbnN0YW50IHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9mb3Jtc2RhdGEgKGF0dHIsIHJldHVybl9zdmFsKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHI7CisgICAgIER3YXJmX1N3b3JkICpyZXR1cm5fc3ZhbDsKK3sKKyAgaWYgKGF0dHIgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YXA7CisKKyAgc3dpdGNoIChhdHRyLT5mb3JtKQorICAgIHsKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTE6CisgICAgICAqcmV0dXJuX3N2YWwgPSAqYXR0ci0+dmFscDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2RhdGEyOgorICAgICAgKnJldHVybl9zdmFsID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2RhdGE0OgorICAgICAgKnJldHVybl9zdmFsID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2RhdGE4OgorICAgICAgKnJldHVybl9zdmFsID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3NkYXRhOgorICAgICAgZGF0YXAgPSBhdHRyLT52YWxwOworICAgICAgZ2V0X3NsZWIxMjggKCpyZXR1cm5fc3ZhbCwgZGF0YXApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fdWRhdGE6CisgICAgICBkYXRhcCA9IGF0dHItPnZhbHA7CisgICAgICBnZXRfdWxlYjEyOCAoKnJldHVybl9zdmFsLCBkYXRhcCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX0NPTlNUQU5UKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CitJTlRERUYoZHdhcmZfZm9ybXNkYXRhKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZm9ybXN0cmluZy5jIGIvbGliZHcvZHdhcmZfZm9ybXN0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYzFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9mb3Jtc3RyaW5nLmMKQEAgLTAsMCArMSw1OCBAQAorLyogUmV0dXJuIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gYXR0cmlidXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitjb25zdCBjaGFyICoKK2R3YXJmX2Zvcm1zdHJpbmcgKGF0dHJwKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHJwOworeworICAvKiBJZ25vcmUgZWFybGllciBlcnJvcnMuICAqLworICBpZiAoYXR0cnAgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBXZSBmb3VuZCBpdC4gIE5vdyBkZXRlcm1pbmUgd2hlcmUgdGhlIHN0cmluZyBpcyBzdG9yZWQuICAqLworICBpZiAoYXR0cnAtPmZvcm0gPT0gRFdfRk9STV9zdHJpbmcpCisgICAgLyogQSBzaW1wbGUgaW5saW5lZCBzdHJpbmcuICAqLworICAgIHJldHVybiAoY29uc3QgY2hhciAqKSBhdHRycC0+dmFscDsKKworICBEd2FyZiAqZGJnID0gYXR0cnAtPmN1LT5kYmc7CisKKyAgaWYgKHVubGlrZWx5IChhdHRycC0+Zm9ybSAhPSBEV19GT1JNX3N0cnApCisgICAgICB8fCBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19zdHJdID09IE5VTEwpCisgICAgeworICAgIGludmFsaWRfZXJyb3I6CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX1NUUklORyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgdWludDY0X3Qgb2ZmOworICAvLyBYWFggV2UgbmVlZCBiZXR0ZXIgYm91bmRhcnkgY2hlY2tzLgorICBpZiAoYXR0cnAtPmN1LT5vZmZzZXRfc2l6ZSA9PSA4KQorICAgIG9mZiA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCBhdHRycC0+dmFscCk7CisgIGVsc2UKKyAgICBvZmYgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgYXR0cnAtPnZhbHApOworCisgIGlmIChvZmYgID49IGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3N0cl0tPmRfc2l6ZSkKKyAgICBnb3RvIGludmFsaWRfZXJyb3I7CisKKyAgcmV0dXJuIChjb25zdCBjaGFyICopIGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3N0cl0tPmRfYnVmICsgb2ZmOworfQorSU5UREVGKGR3YXJmX2Zvcm1zdHJpbmcpCmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9mb3JtdWRhdGEuYyBiL2xpYmR3L2R3YXJmX2Zvcm11ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTg1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9mb3JtdWRhdGEuYwpAQCAtMCwwICsxLDY4IEBACisvKiBSZXR1cm4gdW5zaWduZWQgY29uc3RhbnQgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2Zvcm11ZGF0YSAoYXR0ciwgcmV0dXJuX3V2YWwpCisgICAgIER3YXJmX0F0dHJpYnV0ZSAqYXR0cjsKKyAgICAgRHdhcmZfV29yZCAqcmV0dXJuX3V2YWw7Cit7CisgIGlmIChhdHRyID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGFwOworCisgIHN3aXRjaCAoYXR0ci0+Zm9ybSkKKyAgICB7CisgICAgY2FzZSBEV19GT1JNX2RhdGExOgorICAgICAgKnJldHVybl91dmFsID0gKmF0dHItPnZhbHA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9kYXRhMjoKKyAgICAgICpyZXR1cm5fdXZhbCA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9kYXRhNDoKKyAgICAgICpyZXR1cm5fdXZhbCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9kYXRhODoKKyAgICAgICpyZXR1cm5fdXZhbCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9zZGF0YToKKyAgICAgIGRhdGFwID0gYXR0ci0+dmFscDsKKyAgICAgIGdldF9zbGViMTI4ICgqcmV0dXJuX3V2YWwsIGRhdGFwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3VkYXRhOgorICAgICAgZGF0YXAgPSBhdHRyLT52YWxwOworICAgICAgZ2V0X3VsZWIxMjggKCpyZXR1cm5fdXZhbCwgZGF0YXApOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19DT05TVEFOVCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorSU5UREVGKGR3YXJmX2Zvcm11ZGF0YSkKZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2Z1bmNfY29sLmMgYi9saWJkdy9kd2FyZl9mdW5jX2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGExNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9mdW5jX2NvbC5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIEdldCBsaW5lIG51bWJlciBvZiBiZWdpbm5pbmcgb2YgZ2l2ZW4gZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK2ludAorZHdhcmZfZnVuY19jb2wgKER3YXJmX0Z1bmMgKmZ1bmMsIGludCAqY29scCkKK3sKKyAgcmV0dXJuIF9fbGliZHdfZnVuY19pbnR2YWwgKGZ1bmMsIGNvbHAsIERXX0FUX2RlY2xfY29sdW1uKTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2Z1bmNfZW50cnlwYy5jIGIvbGliZHcvZHdhcmZfZnVuY19lbnRyeXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1MTAzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2Z1bmNfZW50cnlwYy5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIEdldCBlbnRyeSBhZGRyZXNzIG9mIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2Z1bmNfZW50cnlwYyAoRHdhcmZfRnVuYyAqZnVuYywgRHdhcmZfQWRkciAqcmV0dXJuX2FkZHIpCit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgRHdhcmZfQXR0cmlidXRlICphdHRyID0gSU5UVVNFKGR3YXJmX2F0dHIpIChmdW5jLT5kaWUsIERXX0FUX2VudHJ5X3BjLAorCQkJCQkgICAgICAmYXR0cl9tZW0pOworICBpZiAoYXR0ciAhPSBOVUxMKQorICAgIHJldHVybiBJTlRVU0UoZHdhcmZfZm9ybWFkZHIpIChhdHRyLCByZXR1cm5fYWRkcik7CisKKyAgcmV0dXJuIElOVFVTRShkd2FyZl9sb3dwYykgKGZ1bmMtPmRpZSwgcmV0dXJuX2FkZHIpOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZnVuY19maWxlLmMgYi9saWJkdy9kd2FyZl9mdW5jX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTMwMmRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZnVuY19maWxlLmMKQEAgLTAsMCArMSw3MiBAQAorLyogUmV0dXJuIGZpbGUgbmFtZSBjb250YWluaW5nIGRlZmluaXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitjb25zdCBjaGFyICoKK2R3YXJmX2Z1bmNfZmlsZSAoRHdhcmZfRnVuYyAqZnVuYykKK3sKKyAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOworICBEd2FyZl9Td29yZCBpZHggPSAwOworICBEd2FyZl9EaWUgKmRpZSA9IGZ1bmMtPmRpZTsKKworICBpZiAoSU5UVVNFKGR3YXJmX2Zvcm1zZGF0YSkgKElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9kZWNsX2ZpbGUsCisJCQkJCQkgICAmYXR0cl9tZW0pLCAmaWR4KSAhPSAwKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFplcm8gbWVhbnMgbm8gc291cmNlIGZpbGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlLiAgKi8KKyAgaWYgKGlkeCA9PSAwKQorICAgIHsKKyAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fRU5UUlkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIEdldCB0aGUgYXJyYXkgb2Ygc291cmNlIGZpbGVzIGZvciB0aGUgQ1UuICAqLworICBzdHJ1Y3QgRHdhcmZfQ1UgICpjdSA9IGRpZS0+Y3U7CisgIGlmIChjdS0+bGluZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBEd2FyZl9MaW5lcyAqbGluZXM7CisgICAgICBzaXplX3QgbmxpbmVzOworCisgICAgICAvKiBMZXQgdGhlIG1vcmUgZ2VuZXJpYyBmdW5jdGlvbiBkbyB0aGUgd29yay4gIEl0J2xsIGNyZWF0ZSBtb3JlCisJIGRhdGEgYnV0IHRoYXQgd2lsbCBiZSBuZWVkZWQgaW4gYW4gcmVhbCBwcm9ncmFtIGFueXdheS4gICovCisgICAgICAodm9pZCkgSU5UVVNFKGR3YXJmX2dldHNyY2xpbmVzKSAoZnVuYy0+Y3VkaWUsICZsaW5lcywgJm5saW5lcyk7CisgICAgICBhc3NlcnQgKGN1LT5saW5lcyAhPSBOVUxMKTsKKyAgICB9CisKKyAgaWYgKGN1LT5saW5lcyA9PSAodm9pZCAqKSAtMWwpCisgICAgeworICAgICAgLyogSWYgdGhlIGZpbGUgaW5kZXggaXMgbm90IHplcm8sIHRoZXJlIG11c3QgYmUgZmlsZSBpbmZvcm1hdGlvbgorCSBhdmFpbGFibGUuICAqLworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBhc3NlcnQgKGN1LT5maWxlcyAhPSBOVUxMICYmIGN1LT5maWxlcyAhPSAodm9pZCAqKSAtMWwpOworCisgIGlmIChpZHggPj0gY3UtPmZpbGVzLT5uZmlsZXMpCisgICAgeworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gY3UtPmZpbGVzLT5pbmZvW2lkeF0ubmFtZTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2Z1bmNfaGlnaHBjLmMgYi9saWJkdy9kd2FyZl9mdW5jX2hpZ2hwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZDJlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9mdW5jX2hpZ2hwYy5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qIEdldCBlbmQgYWRkcmVzcyBvZiBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK2ludAorZHdhcmZfZnVuY19oaWdocGMgKER3YXJmX0Z1bmMgKmZ1bmMsIER3YXJmX0FkZHIgKnJldHVybl9hZGRyKQoreworICByZXR1cm4gSU5UVVNFKGR3YXJmX2hpZ2hwYykgKGZ1bmMtPmRpZSwgcmV0dXJuX2FkZHIpOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZnVuY19saW5lLmMgYi9saWJkdy9kd2FyZl9mdW5jX2xpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjU5YjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZnVuY19saW5lLmMKQEAgLTAsMCArMSw0NyBAQAorLyogR2V0IGxpbmUgbnVtYmVyIG9mIGJlZ2lubmluZyBvZiBnaXZlbiBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9mdW5jX2xpbmUgKER3YXJmX0Z1bmMgKmZ1bmMsIGludCAqbGluZXApCit7CisgIHJldHVybiBfX2xpYmR3X2Z1bmNfaW50dmFsIChmdW5jLCBsaW5lcCwgRFdfQVRfZGVjbF9saW5lKTsKK30KKworCitpbnQgaW50ZXJuYWxfZnVuY3Rpb24KK19fbGliZHdfZnVuY19pbnR2YWwgKER3YXJmX0Z1bmMgKmZ1bmMsIGludCAqbGluZXAsIGludCBhdHR2YWwpCit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgRHdhcmZfU3dvcmQgbGluZTsKKworICBpbnQgcmVzID0gSU5UVVNFKGR3YXJmX2Zvcm1zZGF0YSkgKElOVFVTRShkd2FyZl9hdHRyKSAoZnVuYy0+ZGllLCBhdHR2YWwsCisJCQkJCQkJICZhdHRyX21lbSksICZsaW5lKTsKKyAgaWYgKHJlcyA9PSAwKQorICAgIHsKKyAgICAgIGFzc2VydCAobGluZSA+PSAwICYmIGxpbmUgPD0gSU5UX01BWCk7CisgICAgICAqbGluZXAgPSBsaW5lOworICAgIH0KKworICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZnVuY19sb3dwYy5jIGIvbGliZHcvZHdhcmZfZnVuY19sb3dwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjRlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9mdW5jX2xvd3BjLmMKQEAgLTAsMCArMSwyNiBAQAorLyogR2V0IHN0YXJ0IGFkZHJlc3Mgb2YgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2Z1bmNfbG93cGMgKER3YXJmX0Z1bmMgKmZ1bmMsIER3YXJmX0FkZHIgKnJldHVybl9hZGRyKQoreworICByZXR1cm4gSU5UVVNFKGR3YXJmX2xvd3BjKSAoZnVuYy0+ZGllLCByZXR1cm5fYWRkcik7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9mdW5jX25hbWUuYyBiL2xpYmR3L2R3YXJmX2Z1bmNfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTFjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9mdW5jX25hbWUuYwpAQCAtMCwwICsxLDMwIEBACisvKiBHZXQgZnVuY3Rpb24gbmFtZS4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworY29uc3QgY2hhciAqCitkd2FyZl9mdW5jX25hbWUgKER3YXJmX0Z1bmMgKmZ1bmMpCit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKworICByZXR1cm4gSU5UVVNFKGR3YXJmX2Zvcm1zdHJpbmcpIChJTlRVU0UoZHdhcmZfYXR0cikgKGZ1bmMtPmRpZSwgRFdfQVRfbmFtZSwKKwkJCQkJCSAgICAgICAmYXR0cl9tZW0pKTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2dldGFiYnJldi5jIGIvbGliZHcvZHdhcmZfZ2V0YWJicmV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5NjhhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldGFiYnJldi5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiBHZXQgYWJicmV2aWF0aW9uIGF0IGdpdmVuIG9mZnNldC4KKyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworRHdhcmZfQWJicmV2ICoKK2ludGVybmFsX2Z1bmN0aW9uX2RlZgorX19saWJkd19nZXRhYmJyZXYgKGRiZywgY3UsIG9mZnNldCwgbGVuZ3RocCwgcmVzdWx0KQorICAgICBEd2FyZiAqZGJnOworICAgICBzdHJ1Y3QgRHdhcmZfQ1UgKmN1OworICAgICBEd2FyZl9PZmYgb2Zmc2V0OworICAgICBzaXplX3QgKmxlbmd0aHA7CisgICAgIER3YXJmX0FiYnJldiAqcmVzdWx0OworeworICAvKiBEb24ndCBmYWlsIGlmIHRoZXJlIGlzIG5vdCAuZGVidWdfYWJicmV2IHNlY3Rpb24uICAqLworICBpZiAoZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfYWJicmV2XSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFiYnJldnAKKyAgICA9ICh1bnNpZ25lZCBjaGFyICopIGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2FiYnJldl0tPmRfYnVmICsgb2Zmc2V0OworICBpZiAoKmFiYnJldnAgPT0gJ1wwJykKKyAgICAvKiBXZSBhcmUgcGFzdCB0aGUgbGFzdCBlbnRyeS4gICovCisgICAgcmV0dXJuIERXQVJGX0VORF9BQkJSRVY7CisKKyAgLyogNy41LjMgQWJicmV2aWF0aW9ucyBUYWJsZXMKKworICAgICBbLi4uXSBFYWNoIGRlY2xhcmF0aW9uIGJlZ2lucyB3aXRoIGFuIHVuc2lnbmVkIExFQjEyOCBudW1iZXIKKyAgICAgcmVwcmVzZW50aW5nIHRoZSBhYmJyZXZpYXRpb24gY29kZSBpdHNlbGYuICBbLi4uXSAgVGhlCisgICAgIGFiYnJldmlhdGlvbiBjb2RlIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgdW5zaWduZWQgTEVCMTI4CisgICAgIG51bWJlciB0aGF0IGVuY29kZXMgdGhlIGVudHJ5J3MgdGFnLiAgWy4uLl0KKworICAgICBbLi4uXSBGb2xsb3dpbmcgdGhlIHRhZyBlbmNvZGluZyBpcyBhIDEtYnl0ZSB2YWx1ZSB0aGF0CisgICAgIGRldGVybWluZXMgd2hldGhlciBhIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSB1c2luZyB0aGlzCisgICAgIGFiYnJldmlhdGlvbiBoYXMgY2hpbGQgZW50cmllcyBvciBub3QuIFsuLi5dCisKKyAgICAgWy4uLl0gRmluYWxseSwgdGhlIGNoaWxkIGVuY29kaW5nIGlzIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mCisgICAgIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9ucy4gRWFjaCBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbgorICAgICBjb25zaXN0cyBvZiB0d28gcGFydHMuIFRoZSBmaXJzdCBwYXJ0IGlzIGFuIHVuc2lnbmVkIExFQjEyOAorICAgICBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUncyBuYW1lLiBUaGUgc2Vjb25kIHBhcnQgaXMKKyAgICAgYW4gdW5zaWduZWQgTEVCMTI4IG51bWJlciByZXByZXNlbnRpbmcgdGhlIGF0dHJpYnV0ZSdzIGZvcm0uICAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdGFydF9hYmJyZXZwID0gYWJicmV2cDsKKyAgdW5zaWduZWQgaW50IGNvZGU7CisgIGdldF91bGViMTI4IChjb2RlLCBhYmJyZXZwKTsKKworICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgY29kZSBpcyBhbHJlYWR5IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KKyAgYm9vbCBmb3VuZGl0ID0gZmFsc2U7CisgIER3YXJmX0FiYnJldiAqYWJiID0gTlVMTDsKKyAgaWYgKGN1ID09IE5VTEwKKyAgICAgIHx8IChhYmIgPSBEd2FyZl9BYmJyZXZfSGFzaF9maW5kICgmY3UtPmFiYnJldl9oYXNoLCBjb2RlLCBOVUxMKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisJYWJiID0gbGliZHdfdHlwZWRfYWxsb2MgKGRiZywgRHdhcmZfQWJicmV2KTsKKyAgICAgIGVsc2UKKwlhYmIgPSByZXN1bHQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm91bmRpdCA9IHRydWU7CisKKyAgICAgIGFzc2VydCAoYWJiLT5vZmZzZXQgPT0gb2Zmc2V0KTsKKworICAgICAgLyogSWYgdGhlIGNhbGxlciBkb2Vzbid0IG5lZWQgdGhlIGxlbmd0aCB3ZSBhcmUgZG9uZS4gICovCisgICAgICBpZiAobGVuZ3RocCA9PSBOVUxMKQorCWdvdG8gb3V0OworICAgIH0KKworICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgdmFsdWUgaW4gdGhlIGhhc2ggdGFibGUgd2UgYXJlIGdvaW5nIHRvCisgICAgIG92ZXJ3cml0ZSBpdHMgY29udGVudC4gIFRoaXMgbXVzdCBub3QgYmUgYSBwcm9ibGVtLCBzaW5jZSB0aGUKKyAgICAgY29udGVudCBiZXR0ZXIgYmUgdGhlIHNhbWUuICAqLworICBhYmItPmNvZGUgPSBjb2RlOworICBnZXRfdWxlYjEyOCAoYWJiLT50YWcsIGFiYnJldnApOworICBhYmItPmhhc19jaGlsZHJlbiA9ICphYmJyZXZwKysgPT0gRFdfQ0hJTERSRU5feWVzOworICBhYmItPmF0dHJwID0gKHVuc2lnbmVkIGNoYXIgKikgYWJicmV2cDsKKyAgYWJiLT5vZmZzZXQgPSBvZmZzZXQ7CisKKyAgLyogU2tpcCBvdmVyIGFsbCB0aGUgYXR0cmlidXRlcyBhbmQgY291bnQgdGhlbSB3aGlsZSBkb2luZyBzby4gICovCisgIGFiYi0+YXR0cmNudCA9IDA7CisgIHVuc2lnbmVkIGludCBhdHRybmFtZTsKKyAgdW5zaWduZWQgaW50IGF0dHJmb3JtOworICBkbworICAgIHsKKyAgICAgIGdldF91bGViMTI4IChhdHRybmFtZSwgYWJicmV2cCk7CisgICAgICBnZXRfdWxlYjEyOCAoYXR0cmZvcm0sIGFiYnJldnApOworICAgIH0KKyAgd2hpbGUgKGF0dHJuYW1lICE9IDAgJiYgYXR0cmZvcm0gIT0gMCAmJiArK2FiYi0+YXR0cmNudCk7CisKKyAgLyogUmV0dXJuIHRoZSBsZW5ndGggdG8gdGhlIGNhbGxlciBpZiBzaGUgYXNrZWQgZm9yIGl0LiAgKi8KKyAgaWYgKGxlbmd0aHAgIT0gTlVMTCkKKyAgICAqbGVuZ3RocCA9IGFiYnJldnAgLSBzdGFydF9hYmJyZXZwOworCisgIC8qIEFkZCB0aGUgZW50cnkgdG8gdGhlIGhhc2ggdGFibGUuICAqLworICBpZiAoY3UgIT0gTlVMTCAmJiAhIGZvdW5kaXQpCisgICAgKHZvaWQpIER3YXJmX0FiYnJldl9IYXNoX2luc2VydCAoJmN1LT5hYmJyZXZfaGFzaCwgYWJiLT5jb2RlLCBhYmIpOworCisgb3V0OgorICByZXR1cm4gYWJiOworfQorCisKK0R3YXJmX0FiYnJldiAqCitkd2FyZl9nZXRhYmJyZXYgKGRpZSwgb2Zmc2V0LCBsZW5ndGhwKQorICAgICBEd2FyZl9EaWUgKmRpZTsKKyAgICAgRHdhcmZfT2ZmIG9mZnNldDsKKyAgICAgc2l6ZV90ICpsZW5ndGhwOworeworICByZXR1cm4gX19saWJkd19nZXRhYmJyZXYgKGRpZS0+Y3UtPmRiZywgZGllLT5jdSwKKwkJCSAgICBkaWUtPmN1LT5vcmlnX2FiYnJldl9vZmZzZXQgKyBvZmZzZXQsIGxlbmd0aHAsCisJCQkgICAgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9nZXRhYmJyZXZhdHRyLmMgYi9saWJkdy9kd2FyZl9nZXRhYmJyZXZhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkZjZhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldGFiYnJldmF0dHIuYwpAQCAtMCwwICsxLDY0IEBACisvKiBHZXQgc3BlY2lmaWMgYXR0cmlidXRlIG9mIGFiYnJldmlhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9nZXRhYmJyZXZhdHRyIChhYmJyZXYsIGlkeCwgbmFtZXAsIGZvcm1wLCBvZmZzZXRwKQorICAgICBEd2FyZl9BYmJyZXYgKmFiYnJldjsKKyAgICAgc2l6ZV90IGlkeDsKKyAgICAgdW5zaWduZWQgaW50ICpuYW1lcDsKKyAgICAgdW5zaWduZWQgaW50ICpmb3JtcDsKKyAgICAgRHdhcmZfT2ZmICpvZmZzZXRwOworeworICBpZiAoYWJicmV2ID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIHNpemVfdCBjbnQgPSAwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphdHRycCA9IGFiYnJldi0+YXR0cnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0X2F0dHJwOworICB1bnNpZ25lZCBpbnQgbmFtZTsKKyAgdW5zaWduZWQgaW50IGZvcm07CisKKyAgZG8KKyAgICB7CisgICAgICBzdGFydF9hdHRycCA9IGF0dHJwOworCisgICAgICAvKiBBdHRyaWJ1dGUgY29kZSBhbmQgZm9ybSBhcmUgZW5jb2RlZCBhcyBVTEVCMTI4IHZhbHVlcy4gICovCisgICAgICBnZXRfdWxlYjEyOCAobmFtZSwgYXR0cnApOworICAgICAgZ2V0X3VsZWIxMjggKGZvcm0sIGF0dHJwKTsKKworICAgICAgLyogSWYgYm90aCB2YWx1ZXMgYXJlIHplcm8gdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZS4gICovCisgICAgICBpZiAobmFtZSA9PSAwICYmIGZvcm0gPT0gMCkKKwlyZXR1cm4gLTE7CisgICAgfQorICB3aGlsZSAoY250KysgPCBpZHgpOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgaWYgcmVxdWVzdGVkLiAgKi8KKyAgaWYgKG5hbWVwICE9IE5VTEwpCisgICAgKm5hbWVwID0gbmFtZTsKKyAgaWYgKGZvcm1wICE9IE5VTEwpCisgICAgKmZvcm1wID0gZm9ybTsKKyAgaWYgKG9mZnNldHAgIT0gTlVMTCkKKyAgICAqb2Zmc2V0cCA9IChzdGFydF9hdHRycCAtIGFiYnJldi0+YXR0cnApICsgYWJicmV2LT5vZmZzZXQ7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9nZXRhYmJyZXZjb2RlLmMgYi9saWJkdy9kd2FyZl9nZXRhYmJyZXZjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzZGFjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldGFiYnJldmNvZGUuYwpAQCAtMCwwICsxLDI5IEBACisvKiBHZXQgYWJicmV2aWF0aW9uIGNvZGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK3Vuc2lnbmVkIGludAorZHdhcmZfZ2V0YWJicmV2Y29kZSAoYWJicmV2KQorICAgICBEd2FyZl9BYmJyZXYgKmFiYnJldjsKK3sKKyAgcmV0dXJuIGFiYnJldiA9PSBOVUxMID8gMCA6IGFiYnJldi0+Y29kZTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2dldGFiYnJldnRhZy5jIGIvbGliZHcvZHdhcmZfZ2V0YWJicmV2dGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwN2ZkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldGFiYnJldnRhZy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIEdldCBhYmJyZXZpYXRpb24gdGFnLgorICAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCit1bnNpZ25lZCBpbnQKK2R3YXJmX2dldGFiYnJldnRhZyAoYWJicmV2KQorICAgICBEd2FyZl9BYmJyZXYgKmFiYnJldjsKK3sKKyAgcmV0dXJuIGFiYnJldiA9PSBOVUxMID8gMCA6IGFiYnJldi0+dGFnOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZ2V0YXJhbmdlX2FkZHIuYyBiL2xpYmR3L2R3YXJmX2dldGFyYW5nZV9hZGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwNDA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldGFyYW5nZV9hZGRyLmMKQEAgLTAsMCArMSw0NyBAQAorLyogR2V0IGFkZHJlc3MgcmFuZ2Ugd2hpY2ggaW5jbHVkZXMgZ2l2ZW4gYWRkcmVzcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3UC5oPgorCisKK0R3YXJmX0FyYW5nZSAqCitkd2FyZl9nZXRhcmFuZ2VfYWRkciAoYXJhbmdlcywgYWRkcikKKyAgICAgRHdhcmZfQXJhbmdlcyAqYXJhbmdlczsKKyAgICAgRHdhcmZfQWRkciBhZGRyOworeworICBpZiAoYXJhbmdlcyA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFRoZSByYW5nZXMgYXJlIHNvcnRlZCBieSBhZGRyZXNzLCBzbyB3ZSBjYW4gdXNlIGJpbmFyeSBzZWFyY2guICAqLworICBzaXplX3QgbCA9IDAsIHUgPSBhcmFuZ2VzLT5uYXJhbmdlczsKKyAgd2hpbGUgKGwgPCB1KQorICAgIHsKKyAgICAgIHNpemVfdCBpZHggPSAobCArIHUpIC8gMjsKKyAgICAgIGlmIChhZGRyIDwgYXJhbmdlcy0+aW5mb1tpZHhdLmFkZHIpCisJdSA9IGlkeDsKKyAgICAgIGVsc2UgaWYgKGFkZHIgPiBhcmFuZ2VzLT5pbmZvW2lkeF0uYWRkcgorCSAgICAgICAmJiBhZGRyIC0gYXJhbmdlcy0+aW5mb1tpZHhdLmFkZHIgPj0gYXJhbmdlcy0+aW5mb1tpZHhdLmxlbmd0aCkKKwlsID0gaWR4ICsgMTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gJmFyYW5nZXMtPmluZm9baWR4XTsKKyAgICB9CisKKyAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19NQVRDSCk7CisgIHJldHVybiBOVUxMOworfQorSU5UREVGKGR3YXJmX2dldGFyYW5nZV9hZGRyKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZ2V0YXJhbmdlaW5mby5jIGIvbGliZHcvZHdhcmZfZ2V0YXJhbmdlaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWY1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9nZXRhcmFuZ2VpbmZvLmMKQEAgLTAsMCArMSwzOCBAQAorLyogUmV0dXJuIGxpc3QgYWRkcmVzcyByYW5nZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd1AuaD4KKworCitpbnQKK2R3YXJmX2dldGFyYW5nZWluZm8gKER3YXJmX0FyYW5nZSAqYXJhbmdlLCBEd2FyZl9BZGRyICphZGRycCwKKwkJICAgICBEd2FyZl9Xb3JkICpsZW5ndGhwLCBEd2FyZl9PZmYgKm9mZnNldHApCit7CisgIGlmIChhcmFuZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGFkZHJwICE9IE5VTEwpCisgICAgKmFkZHJwID0gYXJhbmdlLT5hZGRyOworICBpZiAobGVuZ3RocCAhPSBOVUxMKQorICAgICpsZW5ndGhwID0gYXJhbmdlLT5sZW5ndGg7CisgIGlmIChvZmZzZXRwICE9IE5VTEwpCisgICAgKm9mZnNldHAgPSBhcmFuZ2UtPm9mZnNldDsKKworICByZXR1cm4gMDsKK30KK0lOVERFRihkd2FyZl9nZXRhcmFuZ2VpbmZvKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZ2V0YXJhbmdlcy5jIGIvbGliZHcvZHdhcmZfZ2V0YXJhbmdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Y2YwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9nZXRhcmFuZ2VzLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qIFJldHVybiBsaXN0IGFkZHJlc3MgcmFuZ2VzLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworc3RydWN0IGFyYW5nZWxpc3QKK3sKKyAgRHdhcmZfQXJhbmdlIGFyYW5nZTsKKyAgc3RydWN0IGFyYW5nZWxpc3QgKm5leHQ7Cit9OworCisvKiBDb21wYXJlIGJ5IER3YXJmX0FyYW5nZS5hZGRyLCBnaXZlbiBwb2ludGVycyBpbnRvIGFuIGFycmF5IG9mIHBvaW50ZWVycy4gICovCitzdGF0aWMgaW50Citjb21wYXJlX2FyYW5nZXMgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgIER3YXJmX0FyYW5nZSAqY29uc3QgKnAxID0gYSwgKmNvbnN0ICpwMiA9IGI7CisgIER3YXJmX0FyYW5nZSAqbDEgPSAqcDEsICpsMiA9ICpwMjsKKyAgcmV0dXJuIGwxLT5hZGRyIC0gbDItPmFkZHI7Cit9CisKK2ludAorZHdhcmZfZ2V0YXJhbmdlcyAoZGJnLCBhcmFuZ2VzLCBuYXJhbmdlcykKKyAgICAgRHdhcmYgKmRiZzsKKyAgICAgRHdhcmZfQXJhbmdlcyAqKmFyYW5nZXM7CisgICAgIHNpemVfdCAqbmFyYW5nZXM7Cit7CisgIGlmIChkYmcgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGRiZy0+YXJhbmdlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgICphcmFuZ2VzID0gZGJnLT5hcmFuZ2VzOworICAgICAgaWYgKG5hcmFuZ2VzICE9IE5VTEwpCisJKm5hcmFuZ2VzID0gZGJnLT5hcmFuZ2VzLT5uYXJhbmdlczsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfYXJhbmdlc10tPmRfYnVmID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIHN0cnVjdCBhcmFuZ2VsaXN0ICphcmFuZ2VsaXN0ID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IG5hcmFuZ2VsaXN0ID0gMDsKKworICBjb25zdCBjaGFyICpyZWFkcAorICAgID0gKGNvbnN0IGNoYXIgKikgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfYXJhbmdlc10tPmRfYnVmOworICBjb25zdCBjaGFyICpyZWFkZW5kcCA9IHJlYWRwICsgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfYXJhbmdlc10tPmRfc2l6ZTsKKworICB3aGlsZSAocmVhZHAgPCByZWFkZW5kcCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpoZHJzdGFydCA9IHJlYWRwOworCisgICAgICAvKiBFYWNoIGVudHJ5IHN0YXJ0cyB3aXRoIGEgaGVhZGVyOgorCisJIDEuIEEgNC1ieXRlIG9yIDEyLWJ5dGUgbGVuZ3RoIGNvbnRhaW5pbmcgdGhlIGxlbmd0aCBvZiB0aGUKKwkgc2V0IG9mIGVudHJpZXMgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdCwgbm90IGluY2x1ZGluZyB0aGUKKwkgbGVuZ3RoIGZpZWxkIGl0c2VsZi4gWy4uLl0KKworCSAyLiBBIDItYnl0ZSB2ZXJzaW9uIGlkZW50aWZpZXIgY29udGFpbmluZyB0aGUgdmFsdWUgMiBmb3IKKwkgRFdBUkYgVmVyc2lvbiAyLjEuCisKKwkgMy4gQSA0LWJ5dGUgb3IgOC1ieXRlIG9mZnNldCBpbnRvIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLiBbLi4uXQorCisJIDQuIEEgMS1ieXRlIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBpbiBieXRlcyBvZgorCSBhbiBhZGRyZXNzIChvciB0aGUgb2Zmc2V0IHBvcnRpb24gb2YgYW4gYWRkcmVzcyBmb3Igc2VnbWVudGVkCisJIGFkZHJlc3NpbmcpIG9uIHRoZSB0YXJnZXQgc3lzdGVtLgorCisJIDUuIEEgMS1ieXRlIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBpbiBieXRlcyBvZgorCSBhIHNlZ21lbnQgZGVzY3JpcHRvciBvbiB0aGUgdGFyZ2V0IHN5c3RlbS4gICovCisgICAgICBEd2FyZl9Xb3JkIGxlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOworICAgICAgdW5zaWduZWQgaW50IGxlbmd0aF9ieXRlcyA9IDQ7CisgICAgICBpZiAobGVuZ3RoID09IDB4ZmZmZmZmZmYpCisJeworCSAgbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7CisJICBsZW5ndGhfYnl0ZXMgPSA4OworCX0KKworICAgICAgdW5zaWduZWQgaW50IHZlcnNpb24gPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKKyAgICAgIGlmICh2ZXJzaW9uICE9IDIpCisJeworCWludmFsaWQ6CisJICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOworCSAgcmV0dXJuIC0xOworCX0KKworICAgICAgRHdhcmZfV29yZCBvZmZzZXQ7CisgICAgICBpZiAobGVuZ3RoX2J5dGVzID09IDQpCisJb2Zmc2V0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7CisgICAgICBlbHNlCisJb2Zmc2V0ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7CisKKyAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzX3NpemUgPSAqcmVhZHArKzsKKyAgICAgIGlmIChhZGRyZXNzX3NpemUgIT0gNCAmJiBhZGRyZXNzX3NpemUgIT0gOCkKKwlnb3RvIGludmFsaWQ7CisKKyAgICAgIC8qIElnbm9yZSB0aGUgc2VnbWVudCBzaXplIHZhbHVlLiAgKi8KKyAgICAgIC8vIFhYWCBSZWFsbHk/CisgICAgICAodm9pZCkgKnJlYWRwKys7CisKKyAgICAgIC8qIFJvdW5kIHRoZSBhZGRyZXNzIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDIqYWRkcmVzc19zaXplLiAgKi8KKyAgICAgIHJlYWRwICs9ICgoMiAqIGFkZHJlc3Nfc2l6ZSAtICgocmVhZHAgLSBoZHJzdGFydCkgJSAoMiAqIGFkZHJlc3Nfc2l6ZSkpKQorCQklICgyICogYWRkcmVzc19zaXplKSk7CisKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIER3YXJmX1dvcmQgcmFuZ2VfYWRkcmVzczsKKwkgIER3YXJmX1dvcmQgcmFuZ2VfbGVuZ3RoOworCisJICBpZiAoYWRkcmVzc19zaXplID09IDQpCisJICAgIHsKKwkgICAgICByYW5nZV9hZGRyZXNzID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7CisJICAgICAgcmFuZ2VfbGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJhbmdlX2FkZHJlc3MgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKKwkgICAgICByYW5nZV9sZW5ndGggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKKwkgICAgfQorCisJICAvKiBUd28gemVybyB2YWx1ZXMgbWFyayB0aGUgZW5kLiAgKi8KKwkgIGlmIChyYW5nZV9hZGRyZXNzID09IDAgJiYgcmFuZ2VfbGVuZ3RoID09IDApCisJICAgIGJyZWFrOworCisJICBzdHJ1Y3QgYXJhbmdlbGlzdCAqbmV3X2FyYW5nZSA9CisJICAgIChzdHJ1Y3QgYXJhbmdlbGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IGFyYW5nZWxpc3QpKTsKKworCSAgbmV3X2FyYW5nZS0+YXJhbmdlLmFkZHIgPSByYW5nZV9hZGRyZXNzOworCSAgbmV3X2FyYW5nZS0+YXJhbmdlLmxlbmd0aCA9IHJhbmdlX2xlbmd0aDsKKworCSAgLyogV2Ugc3RvcmUgdGhlIGFjdHVhbCBDVSBESUUgb2Zmc2V0LCBub3QgdGhlIENVIGhlYWRlciBvZmZzZXQuICAqLworCSAgY29uc3QgY2hhciAqY3VfaGVhZGVyID0gKGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX2J1ZgorCQkJCSAgICsgb2Zmc2V0KTsKKwkgIHVuc2lnbmVkIGludCBvZmZzZXRfc2l6ZTsKKwkgIGlmIChyZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IChjdV9oZWFkZXIpID09IDB4ZmZmZmZmZmYpCisJICAgIG9mZnNldF9zaXplID0gODsKKwkgIGVsc2UKKwkgICAgb2Zmc2V0X3NpemUgPSA0OworCSAgbmV3X2FyYW5nZS0+YXJhbmdlLm9mZnNldCA9IG9mZnNldCArIDMgKiBvZmZzZXRfc2l6ZSAtIDQgKyAzOworCisJICBuZXdfYXJhbmdlLT5uZXh0ID0gYXJhbmdlbGlzdDsKKwkgIGFyYW5nZWxpc3QgPSBuZXdfYXJhbmdlOworCSAgKytuYXJhbmdlbGlzdDsKKwl9CisgICAgfQorCisgIGlmIChuYXJhbmdlbGlzdCA9PSAwKQorICAgIHsKKyAgICAgIGlmIChuYXJhbmdlcyAhPSBOVUxMKQorCSpuYXJhbmdlcyA9IDA7CisgICAgICAqYXJhbmdlcyA9IE5VTEw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUgdGhlIGFycmF5IGZvciB0aGUgcmVzdWx0LiAgKi8KKyAgdm9pZCAqYnVmID0gbGliZHdfYWxsb2MgKGRiZywgRHdhcmZfQXJhbmdlcywKKwkJCSAgIHNpemVvZiAoRHdhcmZfQXJhbmdlcykKKwkJCSAgICsgbmFyYW5nZWxpc3QgKiBzaXplb2YgKER3YXJmX0FyYW5nZSksIDEpOworCisgIC8qIEZpcnN0IHVzZSB0aGUgYnVmZmVyIGZvciB0aGUgcG9pbnRlcnMsIGFuZCBzb3J0IHRoZSBlbnRyaWVzLgorICAgICBXZSdsbCB3cml0ZSB0aGUgcG9pbnRlcnMgaW4gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBhbmQgdGhlbgorICAgICBjb3B5IGludG8gdGhlIGJ1ZmZlciBmcm9tIHRoZSBiZWdpbm5pbmcgc28gdGhlIG92ZXJsYXAgd29ya3MuICAqLworICBhc3NlcnQgKHNpemVvZiAoRHdhcmZfQXJhbmdlKSA+PSBzaXplb2YgKER3YXJmX0FyYW5nZSAqKSk7CisgIER3YXJmX0FyYW5nZSAqKnNvcnRhcmFuZ2VzID0gKGJ1ZiArIHNpemVvZiAoRHdhcmZfQXJhbmdlcykKKwkJCQkrICgoc2l6ZW9mIChEd2FyZl9BcmFuZ2UpCisJCQkJICAgIC0gc2l6ZW9mIChEd2FyZl9BcmFuZ2UgKikpICogbmFyYW5nZWxpc3QpKTsKKworICAvKiBUaGUgbGlzdCBpcyBpbiBMSUZPIG9yZGVyIGFuZCB1c3VhbGx5IHRoZXkgY29tZSBpbiBjbHVtcHMgd2l0aAorICAgICBhc2NlbmRpbmcgYWRkcmVzc2VzLiAgU28gZmlsbCBmcm9tIHRoZSBiYWNrIHRvIHByb2JhYmx5IHN0YXJ0IHdpdGgKKyAgICAgcnVucyBhbHJlYWR5IGluIG9yZGVyIGJlZm9yZSB3ZSBzb3J0LiAgKi8KKyAgdW5zaWduZWQgaW50IGkgPSBuYXJhbmdlbGlzdDsKKyAgd2hpbGUgKGktLSA+IDApCisgICAgeworICAgICAgc29ydGFyYW5nZXNbaV0gPSAmYXJhbmdlbGlzdC0+YXJhbmdlOworICAgICAgYXJhbmdlbGlzdCA9IGFyYW5nZWxpc3QtPm5leHQ7CisgICAgfQorICBhc3NlcnQgKGFyYW5nZWxpc3QgPT0gTlVMTCk7CisKKyAgLyogU29ydCBieSBhc2NlbmRpbmcgYWRkcmVzcy4gICovCisgIHFzb3J0IChzb3J0YXJhbmdlcywgbmFyYW5nZWxpc3QsIHNpemVvZiBzb3J0YXJhbmdlc1swXSwgJmNvbXBhcmVfYXJhbmdlcyk7CisKKyAgLyogTm93IHRoYXQgdGhleSBhcmUgc29ydGVkLCBwdXQgdGhlbSBpbiB0aGUgZmluYWwgYXJyYXkuCisgICAgIFRoZSBidWZmZXJzIG92ZXJsYXAsIHNvIHdlJ3ZlIGNsb2JiZXJlZCB0aGUgZWFybHkgZWxlbWVudHMKKyAgICAgb2YgU09SVEFSQU5HRVMgYnkgdGhlIHRpbWUgd2UncmUgcmVhZGluZyB0aGUgbGF0ZXIgb25lcy4gICovCisgICphcmFuZ2VzID0gYnVmOworICAoKmFyYW5nZXMpLT5kYmcgPSBkYmc7CisgICgqYXJhbmdlcyktPm5hcmFuZ2VzID0gbmFyYW5nZWxpc3Q7CisgIGRiZy0+YXJhbmdlcyA9ICphcmFuZ2VzOworICBpZiAobmFyYW5nZXMgIT0gTlVMTCkKKyAgICAqbmFyYW5nZXMgPSBuYXJhbmdlbGlzdDsKKyAgZm9yIChpID0gMDsgaSA8IG5hcmFuZ2VsaXN0OyArK2kpCisgICAgKCphcmFuZ2VzKS0+aW5mb1tpXSA9ICpzb3J0YXJhbmdlc1tpXTsKKworICByZXR1cm4gMDsKK30KK0lOVERFRihkd2FyZl9nZXRhcmFuZ2VzKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZ2V0YXR0cmNudC5jIGIvbGliZHcvZHdhcmZfZ2V0YXR0cmNudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NThlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9nZXRhdHRyY250LmMKQEAgLTAsMCArMSwzMyBAQAorLyogR2V0IG51bWJlciBvZiBhdHRyaWJ1dGVzIG9mIGFiYnJldmlhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK2ludAorZHdhcmZfZ2V0YXR0cmNudCAoYWJicmV2LCBhdHRyY250cCkKKyAgICAgRHdhcmZfQWJicmV2ICphYmJyZXY7CisgICAgIHNpemVfdCAqYXR0cmNudHA7Cit7CisgIGlmIChhYmJyZXYgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgKmF0dHJjbnRwID0gYWJicmV2LT5hdHRyY250OworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZ2V0YXR0cnMuYyBiL2xpYmR3L2R3YXJmX2dldGF0dHJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2MzI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldGF0dHJzLmMKQEAgLTAsMCArMSw5NCBAQAorLyogR2V0IGF0dHJpYnV0ZXMgb2YgdGhlIERJRS4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK3B0cmRpZmZfdAorZHdhcmZfZ2V0YXR0cnMgKER3YXJmX0RpZSAqZGllLCBpbnQgKCpjYWxsYmFjaykgKER3YXJmX0F0dHJpYnV0ZSAqLCB2b2lkICopLAorCQl2b2lkICphcmcsIHB0cmRpZmZfdCBvZmZzZXQpCit7CisgIGlmIChkaWUgPT0gTlVMTCkKKyAgICByZXR1cm4gLTFsOworCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRpZV9hZGRyID0gZGllLT5hZGRyOworCisgIC8qIEdldCB0aGUgYWJicmV2aWF0aW9uIGNvZGUuICAqLworICB1bnNpZ25lZCBpbnQgdTEyODsKKyAgZ2V0X3VsZWIxMjggKHUxMjgsIGRpZV9hZGRyKTsKKworICBpZiAoZGllLT5hYmJyZXYgPT0gTlVMTCkKKyAgICAvKiBGaW5kIHRoZSBhYmJyZXZpYXRpb24uICAqLworICAgIGRpZS0+YWJicmV2ID0gX19saWJkd19maW5kYWJicmV2IChkaWUtPmN1LCB1MTI4KTsKKworICBpZiAoZGllLT5hYmJyZXYgPT0gKER3YXJmX0FiYnJldiAqKSAtMWwpCisgICAgeworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiAtMWw7CisgICAgfQorCisgIC8qIFRoaXMgaXMgd2hlcmUgdGhlIGF0dHJpYnV0ZXMgc3RhcnQuICAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICphdHRycCA9IGRpZS0+YWJicmV2LT5hdHRycCArIG9mZnNldDsKKworICAvKiBHbyBvdmVyIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuICAqLworICBEd2FyZiAqZGJnID0gZGllLT5jdS0+ZGJnOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAvKiBBcmUgd2Ugc3RpbGwgaW4gYm91bmRzPyAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoYXR0cnAKKwkJICAgID49ICgodW5zaWduZWQgY2hhciAqKSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19hYmJyZXZdLT5kX2J1ZgorCQkJKyBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19hYmJyZXZdLT5kX3NpemUpKSkKKwl7CisJICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOworCSAgcmV0dXJuIC0xOworCX0KKworICAgICAgLyogR2V0IGF0dHJpYnV0ZSBuYW1lIGFuZCBmb3JtLiAgKi8KKyAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOworICAgICAgLy8gWFhYIEZpeCBib3VuZCBjaGVja3MKKyAgICAgIGdldF91bGViMTI4IChhdHRyLmNvZGUsIGF0dHJwKTsKKyAgICAgIGdldF91bGViMTI4IChhdHRyLmZvcm0sIGF0dHJwKTsKKworICAgICAgLyogV2UgY2FuIHN0b3AgaWYgd2UgZm91bmQgdGhlIGF0dHJpYnV0ZSB3aXRoIHZhbHVlIHplcm8uICAqLworICAgICAgaWYgKGF0dHIuY29kZSA9PSAwICYmIGF0dHIuZm9ybSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgLyogRmlsbCBpbiB0aGUgcmVzdC4gICovCisgICAgICBhdHRyLnZhbHAgPSAodW5zaWduZWQgY2hhciAqKSBkaWVfYWRkcjsKKyAgICAgIGF0dHIuY3UgPSBkaWUtPmN1OworCisgICAgICAvKiBOb3cgY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uICAqLworICAgICAgaWYgKGNhbGxiYWNrICgmYXR0ciwgYXJnKSAhPSBEV0FSRl9DQl9PSykKKwlyZXR1cm4gYXR0cnAgLSBkaWUtPmFiYnJldi0+YXR0cnA7CisKKyAgICAgIC8qIFNraXAgb3ZlciB0aGUgcmVzdCBvZiB0aGlzIGF0dHJpYnV0ZSAoaWYgdGhlcmUgaXMgYW55KS4gICovCisgICAgICBpZiAoYXR0ci5mb3JtICE9IDApCisJeworCSAgc2l6ZV90IGxlbiA9IF9fbGliZHdfZm9ybV92YWxfbGVuIChkYmcsIGRpZS0+Y3UsIGF0dHIuZm9ybSwKKwkJCQkJICAgICBkaWVfYWRkcik7CisKKwkgIGlmICh1bmxpa2VseSAobGVuID09IChzaXplX3QpIC0xbCkpCisJICAgIC8qIFNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBmaWxlLiAgKi8KKwkgICAgcmV0dXJuIC0xbDsKKworCSAgLy8gWFhYIFdlIG5lZWQgYmV0dGVyIGJvdW5kYXJ5IGNoZWNrcy4KKwkgIGRpZV9hZGRyICs9IGxlbjsKKwl9CisgICAgfQorICAvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9nZXRlbGYuYyBiL2xpYmR3L2R3YXJmX2dldGVsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmEwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9nZXRlbGYuYwpAQCAtMCwwICsxLDMzIEBACisvKiBSZXRyaWV2ZSBFTEYgZGVzY3JpcHRvciB1c2VkIGZvciBEV0FSRiBhY2Nlc3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK0VsZiAqCitkd2FyZl9nZXRfZWxmIChkd2FyZikKKyAgICAgRHdhcmYgKmR3YXJmOworeworICBpZiAoZHdhcmYgPT0gTlVMTCkKKyAgICAvKiBTb21lIGVycm9yIG9jY3VycmVkIGJlZm9yZS4gICovCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIGR3YXJmLT5lbGY7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9nZXRmdW5jcy5jIGIvbGliZHcvZHdhcmZfZ2V0ZnVuY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDlmMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZ2V0ZnVuY3MuYwpAQCAtMCwwICsxLDYzIEBACisvKiBHZXQgZnVuY3Rpb24gaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK3B0cmRpZmZfdAorZHdhcmZfZ2V0ZnVuY3MgKER3YXJmX0RpZSAqY3VkaWUsIGludCAoKmNhbGxiYWNrKSAoRHdhcmZfRnVuYyAqLCB2b2lkICopLAorCQl2b2lkICphcmcsIHB0cmRpZmZfdCBvZmZzZXQpCit7CisgIGlmICh1bmxpa2VseSAoY3VkaWUgPT0gTlVMTAorCQl8fCBJTlRVU0UoZHdhcmZfdGFnKSAoY3VkaWUpICE9IERXX1RBR19jb21waWxlX3VuaXQpKQorICAgIHJldHVybiAtMTsKKworICBEd2FyZl9EaWUgZGllX21lbTsKKyAgRHdhcmZfRGllICpkaWU7CisKKyAgaW50IHJlczsKKyAgaWYgKG9mZnNldCA9PSAwKQorICAgIHJlcyA9IElOVFVTRShkd2FyZl9jaGlsZCkgKGN1ZGllLCAmZGllX21lbSk7CisgIGVsc2UKKyAgICB7CisgICAgICBkaWUgPSBJTlRVU0UoZHdhcmZfb2ZmZGllKSAoY3VkaWUtPmN1LT5kYmcsIG9mZnNldCwgJmRpZV9tZW0pOworICAgICAgcmVzID0gSU5UVVNFKGR3YXJmX3NpYmxpbmdvZikgKGRpZSwgJmRpZV9tZW0pOworICAgIH0KKyAgZGllID0gcmVzICE9IDAgPyBOVUxMIDogJmRpZV9tZW07CisKKyAgd2hpbGUgKGRpZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChJTlRVU0UoZHdhcmZfdGFnKSAoZGllKSA9PSBEV19UQUdfc3VicHJvZ3JhbSkKKwl7CisJICBEd2FyZl9GdW5jIGZjdDsKKworCSAgZmN0LmRpZSA9IGRpZTsKKwkgIGZjdC5jdWRpZSA9IGN1ZGllOworCisJICBpZiAoY2FsbGJhY2sgKCZmY3QsIGFyZykgIT0gRFdBUkZfQ0JfT0spCisJICAgIHJldHVybiBJTlRVU0UoZHdhcmZfZGllb2Zmc2V0KSAoZGllKTsKKwl9CisKKyAgICAgIGlmIChJTlRVU0UoZHdhcmZfc2libGluZ29mKSAoZGllLCAmZGllX21lbSkgIT0gMCkKKwlicmVhazsKKyAgICB9CisKKyAgLyogVGhhdCdzIGFsbC4gICovCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZ2V0bG9jbGlzdC5jIGIvbGliZHcvZHdhcmZfZ2V0bG9jbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiN2MzODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9nZXRsb2NsaXN0LmMKQEAgLTAsMCArMSw0NTQgQEAKKy8qIFJldHVybiBsb2NhdGlvbiBleHByZXNzaW9uIGxpc3QuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgPHNlYXJjaC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGliZHdQLmg+CisKKworc3RhdGljIGJvb2wKK2F0dHJfb2sgKER3YXJmX0F0dHJpYnV0ZSAqYXR0cikKK3sKKyAgaWYgKGF0dHIgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTXVzdCBiZSBvbmUgb2YgdGhlIGF0dHJpYnV0ZXMgbGlzdGVkIGJlbG93LiAgKi8KKyAgc3dpdGNoIChhdHRyLT5jb2RlKQorICAgIHsKKyAgICBjYXNlIERXX0FUX2xvY2F0aW9uOgorICAgIGNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246CisgICAgY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjoKKyAgICBjYXNlIERXX0FUX3N0cmluZ19sZW5ndGg6CisgICAgY2FzZSBEV19BVF91c2VfbG9jYXRpb246CisgICAgY2FzZSBEV19BVF9mcmFtZV9iYXNlOgorICAgIGNhc2UgRFdfQVRfcmV0dXJuX2FkZHI6CisgICAgY2FzZSBEV19BVF9zdGF0aWNfbGluazoKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fTE9DTElTVCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKK3N0cnVjdCBsb2NsaXN0Cit7CisgIHVpbnQ4X3QgYXRvbTsKKyAgRHdhcmZfV29yZCBudW1iZXI7CisgIER3YXJmX1dvcmQgbnVtYmVyMjsKKyAgRHdhcmZfV29yZCBvZmZzZXQ7CisgIHN0cnVjdCBsb2NsaXN0ICpuZXh0OworfTsKKworCitzdGF0aWMgaW50Citsb2NfY29tcGFyZSAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQoreworICBjb25zdCBzdHJ1Y3QgbG9jX3MgKmwxID0gKGNvbnN0IHN0cnVjdCBsb2NfcyAqKSBwMTsKKyAgY29uc3Qgc3RydWN0IGxvY19zICpsMiA9IChjb25zdCBzdHJ1Y3QgbG9jX3MgKikgcDI7CisKKyAgaWYgKCh1aW50cHRyX3QpIGwxLT5hZGRyIDwgKHVpbnRwdHJfdCkgbDItPmFkZHIpCisgICAgcmV0dXJuIC0xOworICBpZiAoKHVpbnRwdHJfdCkgbDEtPmFkZHIgPiAodWludHB0cl90KSBsMi0+YWRkcikKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZ2V0bG9jbGlzdCAoc3RydWN0IER3YXJmX0NVICpjdSwgY29uc3QgRHdhcmZfQmxvY2sgKmJsb2NrLAorCSAgICBEd2FyZl9Mb2MgKipsbGJ1Ziwgc2l6ZV90ICpsaXN0bGVuKQoreworICBEd2FyZiAqZGJnID0gY3UtPmRiZzsKKworICAvKiBDaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgbG9va2VkIGF0IHRoaXMgbGlzdC4gICovCisgIHN0cnVjdCBsb2NfcyBmYWtlID0geyAuYWRkciA9IGJsb2NrLT5kYXRhIH07CisgIHN0cnVjdCBsb2NfcyAqKmZvdW5kID0gdGZpbmQgKCZmYWtlLCAmY3UtPmxvY3MsIGxvY19jb21wYXJlKTsKKyAgaWYgKGZvdW5kICE9IE5VTEwpCisgICAgeworICAgICAgLyogV2UgYWxyZWFkeSBzYXcgaXQuICAqLworICAgICAgKmxsYnVmID0gKCpmb3VuZCktPmxvYzsKKyAgICAgICpsaXN0bGVuID0gKCpmb3VuZCktPm5sb2M7CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhID0gYmxvY2stPmRhdGE7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IGVuZF9kYXRhID0gZGF0YSArIGJsb2NrLT5sZW5ndGg7CisKKyAgc3RydWN0IGxvY2xpc3QgKmxvY2xpc3QgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgbiA9IDA7CisgIC8qIERlY29kZSB0aGUgb3Bjb2Rlcy4gIEl0IGlzIHBvc3NpYmxlIGluIHNvbWUgc2l0dWF0aW9ucyB0byBoYXZlIGEKKyAgICAgYmxvY2sgb2Ygc2l6ZSB6ZXJvLiAgKi8KKyAgd2hpbGUgKGRhdGEgPCBlbmRfZGF0YSkKKyAgICB7CisgICAgICBzdHJ1Y3QgbG9jbGlzdCAqbmV3bG9jOworICAgICAgbmV3bG9jID0gKHN0cnVjdCBsb2NsaXN0ICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgbG9jbGlzdCkpOworICAgICAgbmV3bG9jLT5udW1iZXIgPSAwOworICAgICAgbmV3bG9jLT5udW1iZXIyID0gMDsKKyAgICAgIG5ld2xvYy0+b2Zmc2V0ID0gZGF0YSAtIGJsb2NrLT5kYXRhOworICAgICAgbmV3bG9jLT5uZXh0ID0gbG9jbGlzdDsKKyAgICAgIGxvY2xpc3QgPSBuZXdsb2M7CisgICAgICArK247CisKKyAgICAgIHN3aXRjaCAoKG5ld2xvYy0+YXRvbSA9ICpkYXRhKyspKQorCXsKKwljYXNlIERXX09QX2FkZHI6CisJICAvKiBBZGRyZXNzLCBkZXBlbmRzIG9uIGFkZHJlc3Mgc2l6ZSBvZiBDVS4gICovCisJICBpZiAoY3UtPmFkZHJlc3Nfc2l6ZSA9PSA0KQorCSAgICB7CisJICAgICAgaWYgKHVubGlrZWx5IChkYXRhICsgNCA+IGVuZF9kYXRhKSkKKwkJeworCQlpbnZhbGlkOgorCQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7CisJCSAgcmV0dXJuIC0xOworCQl9CisKKwkgICAgICBuZXdsb2MtPm51bWJlciA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgZGF0YSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICh1bmxpa2VseSAoZGF0YSArIDggPiBlbmRfZGF0YSkpCisJCWdvdG8gaW52YWxpZDsKKworCSAgICAgIG5ld2xvYy0+bnVtYmVyID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBkYXRhKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2RlcmVmOgorCWNhc2UgRFdfT1BfZHVwOgorCWNhc2UgRFdfT1BfZHJvcDoKKwljYXNlIERXX09QX292ZXI6CisJY2FzZSBEV19PUF9zd2FwOgorCWNhc2UgRFdfT1Bfcm90OgorCWNhc2UgRFdfT1BfeGRlcmVmOgorCWNhc2UgRFdfT1BfYWJzOgorCWNhc2UgRFdfT1BfYW5kOgorCWNhc2UgRFdfT1BfZGl2OgorCWNhc2UgRFdfT1BfbWludXM6CisJY2FzZSBEV19PUF9tb2Q6CisJY2FzZSBEV19PUF9tdWw6CisJY2FzZSBEV19PUF9uZWc6CisJY2FzZSBEV19PUF9ub3Q6CisJY2FzZSBEV19PUF9vcjoKKwljYXNlIERXX09QX3BsdXM6CisJY2FzZSBEV19PUF9zaGw6CisJY2FzZSBEV19PUF9zaHI6CisJY2FzZSBEV19PUF9zaHJhOgorCWNhc2UgRFdfT1BfeG9yOgorCWNhc2UgRFdfT1BfZXE6CisJY2FzZSBEV19PUF9nZToKKwljYXNlIERXX09QX2d0OgorCWNhc2UgRFdfT1BfbGU6CisJY2FzZSBEV19PUF9sdDoKKwljYXNlIERXX09QX25lOgorCWNhc2UgRFdfT1BfbGl0MCAuLi4gRFdfT1BfbGl0MzE6CisJY2FzZSBEV19PUF9yZWcwIC4uLiBEV19PUF9yZWczMToKKwljYXNlIERXX09QX25vcDoKKwljYXNlIERXX09QX3B1c2hfb2JqZWN0X2FkZHJlc3M6CisJY2FzZSBEV19PUF9jYWxsX3JlZjoKKwkgIC8qIE5vIG9wZXJhbmQuICAqLworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2NvbnN0MXU6CisJY2FzZSBEV19PUF9waWNrOgorCWNhc2UgRFdfT1BfZGVyZWZfc2l6ZToKKwljYXNlIERXX09QX3hkZXJlZl9zaXplOgorCSAgaWYgKHVubGlrZWx5IChkYXRhID49IGVuZF9kYXRhKSkKKwkgICAgZ290byBpbnZhbGlkOworCisJICBuZXdsb2MtPm51bWJlciA9ICpkYXRhKys7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3QxczoKKwkgIGlmICh1bmxpa2VseSAoZGF0YSA+PSBlbmRfZGF0YSkpCisJICAgIGdvdG8gaW52YWxpZDsKKworCSAgbmV3bG9jLT5udW1iZXIgPSAqKChpbnQ4X3QgKikgZGF0YSk7CisJICArK2RhdGE7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3QydToKKwkgIGlmICh1bmxpa2VseSAoZGF0YSArIDIgPiBlbmRfZGF0YSkpCisJICAgIGdvdG8gaW52YWxpZDsKKworCSAgbmV3bG9jLT5udW1iZXIgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGRhdGEpOworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2NvbnN0MnM6CisJY2FzZSBEV19PUF9za2lwOgorCWNhc2UgRFdfT1BfYnJhOgorCWNhc2UgRFdfT1BfY2FsbDI6CisJICBpZiAodW5saWtlbHkgKGRhdGEgKyAyID4gZW5kX2RhdGEpKQorCSAgICBnb3RvIGludmFsaWQ7CisKKwkgIG5ld2xvYy0+bnVtYmVyID0gcmVhZF8yc2J5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBkYXRhKTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9jb25zdDR1OgorCSAgaWYgKHVubGlrZWx5IChkYXRhICsgNCA+IGVuZF9kYXRhKSkKKwkgICAgZ290byBpbnZhbGlkOworCisJICBuZXdsb2MtPm51bWJlciA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgZGF0YSk7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3Q0czoKKwljYXNlIERXX09QX2NhbGw0OgorCSAgaWYgKHVubGlrZWx5IChkYXRhICsgNCA+IGVuZF9kYXRhKSkKKwkgICAgZ290byBpbnZhbGlkOworCisJICBuZXdsb2MtPm51bWJlciA9IHJlYWRfNHNieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgZGF0YSk7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3Q4dToKKwkgIGlmICh1bmxpa2VseSAoZGF0YSArIDggPiBlbmRfZGF0YSkpCisJICAgIGdvdG8gaW52YWxpZDsKKworCSAgbmV3bG9jLT5udW1iZXIgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGRhdGEpOworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2NvbnN0OHM6CisJICBpZiAodW5saWtlbHkgKGRhdGEgKyA4ID4gZW5kX2RhdGEpKQorCSAgICBnb3RvIGludmFsaWQ7CisKKwkgIG5ld2xvYy0+bnVtYmVyID0gcmVhZF84c2J5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBkYXRhKTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9jb25zdHU6CisJY2FzZSBEV19PUF9wbHVzX3Vjb25zdDoKKwljYXNlIERXX09QX3JlZ3g6CisJY2FzZSBEV19PUF9waWVjZToKKwkgIC8qIFhYWCBDaGVjayBzaXplLiAgKi8KKwkgIGdldF91bGViMTI4IChuZXdsb2MtPm51bWJlciwgZGF0YSk7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3RzOgorCWNhc2UgRFdfT1BfYnJlZzAgLi4uIERXX09QX2JyZWczMToKKwljYXNlIERXX09QX2ZicmVnOgorCSAgLyogWFhYIENoZWNrIHNpemUuICAqLworCSAgZ2V0X3NsZWIxMjggKG5ld2xvYy0+bnVtYmVyLCBkYXRhKTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9icmVneDoKKwkgIC8qIFhYWCBDaGVjayBzaXplLiAgKi8KKwkgIGdldF91bGViMTI4IChuZXdsb2MtPm51bWJlciwgZGF0YSk7CisJICBnZXRfc2xlYjEyOCAobmV3bG9jLT5udW1iZXIyLCBkYXRhKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGdvdG8gaW52YWxpZDsKKwl9CisgICAgfQorCisgIGlmICh1bmxpa2VseSAobiA9PSAwKSkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIG5vdCBhbGxvd2VkLgorCisJIFhYWCBJcyBpdD8gICovCisgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorCisgIC8qIEFsbG9jYXRlIHRoZSBhcnJheS4gICovCisgIER3YXJmX0xvYyAqcmVzdWx0ID0gbGliZHdfYWxsb2MgKGRiZywgRHdhcmZfTG9jLCBzaXplb2YgKER3YXJmX0xvYyksIG4pOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQuICAqLworICAqbGxidWYgPSByZXN1bHQ7CisgICpsaXN0bGVuID0gbjsKKworICBkbworICAgIHsKKyAgICAgIC8qIFdlIHBvcHVsYXRlIHRoZSBhcnJheSBmcm9tIHRoZSBiYWNrIHNpbmNlIHRoZSBsaXN0IGlzCisgICAgICAgICBiYWNrd2FyZHMuICAqLworICAgICAgLS1uOworICAgICAgcmVzdWx0W25dLmF0b20gPSBsb2NsaXN0LT5hdG9tOworICAgICAgcmVzdWx0W25dLm51bWJlciA9IGxvY2xpc3QtPm51bWJlcjsKKyAgICAgIHJlc3VsdFtuXS5udW1iZXIyID0gbG9jbGlzdC0+bnVtYmVyMjsKKyAgICAgIHJlc3VsdFtuXS5vZmZzZXQgPSBsb2NsaXN0LT5vZmZzZXQ7CisKKyAgICAgIGxvY2xpc3QgPSBsb2NsaXN0LT5uZXh0OworICAgIH0KKyAgd2hpbGUgKG4gPiAwKTsKKworICAvKiBJbnNlcnQgYSByZWNvcmQgaW4gdGhlIHNlYXJjaCB0cmVlIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQgYWdhaW4KKyAgICAgbGF0ZXIuICAqLworICBzdHJ1Y3QgbG9jX3MgKm5ld3AgPSBsaWJkd19hbGxvYyAoZGJnLCBzdHJ1Y3QgbG9jX3MsIHNpemVvZiAoc3RydWN0IGxvY19zKSwKKwkJCQkgICAgMSk7CisgIG5ld3AtPmFkZHIgPSBibG9jay0+ZGF0YTsKKyAgbmV3cC0+bG9jID0gcmVzdWx0OworICBuZXdwLT5ubG9jID0gKmxpc3RsZW47CisgICh2b2lkKSB0c2VhcmNoIChuZXdwLCAmY3UtPmxvY3MsIGxvY19jb21wYXJlKTsKKworICAvKiBXZSBkaWQgaXQuICAqLworICByZXR1cm4gMDsKK30KKworaW50Citkd2FyZl9nZXRsb2NsaXN0IChhdHRyLCBsbGJ1ZiwgbGlzdGxlbikKKyAgICAgRHdhcmZfQXR0cmlidXRlICphdHRyOworICAgICBEd2FyZl9Mb2MgKipsbGJ1ZjsKKyAgICAgc2l6ZV90ICpsaXN0bGVuOworeworICBpZiAoISBhdHRyX29rIChhdHRyKSkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogSWYgaXQgaGFzIGEgYmxvY2sgZm9ybSwgaXQncyBhIHNpbmdsZSBsb2NhdGlvbiBleHByZXNzaW9uLiAgKi8KKyAgRHdhcmZfQmxvY2sgYmxvY2s7CisgIGlmIChJTlRVU0UoZHdhcmZfZm9ybWJsb2NrKSAoYXR0ciwgJmJsb2NrKSAhPSAwKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gZ2V0bG9jbGlzdCAoYXR0ci0+Y3UsICZibG9jaywgbGxidWYsIGxpc3RsZW4pOworfQorCitpbnQKK2R3YXJmX2FkZHJsb2NsaXN0cyAoYXR0ciwgYWRkcmVzcywgbGxidWZzLCBsaXN0bGVucywgbWF4bG9jcykKKyAgICAgRHdhcmZfQXR0cmlidXRlICphdHRyOworICAgICBEd2FyZl9BZGRyIGFkZHJlc3M7CisgICAgIER3YXJmX0xvYyAqKmxsYnVmczsKKyAgICAgc2l6ZV90ICpsaXN0bGVuczsKKyAgICAgc2l6ZV90IG1heGxvY3M7Cit7CisgIGlmICghIGF0dHJfb2sgKGF0dHIpKQorICAgIHJldHVybiAtMTsKKworICBpZiAobGxidWZzID09IE5VTEwpCisgICAgbWF4bG9jcyA9IFNJWkVfTUFYOworCisgIC8qIElmIGl0IGhhcyBhIGJsb2NrIGZvcm0sIGl0J3MgYSBzaW5nbGUgbG9jYXRpb24gZXhwcmVzc2lvbi4gICovCisgIER3YXJmX0Jsb2NrIGJsb2NrOworICBpZiAoSU5UVVNFKGR3YXJmX2Zvcm1ibG9jaykgKGF0dHIsICZibG9jaykgPT0gMCkKKyAgICB7CisgICAgICBpZiAobWF4bG9jcyA9PSAwKQorCXJldHVybiAwOworICAgICAgaWYgKGxsYnVmcyAhPSBOVUxMICYmCisJICBnZXRsb2NsaXN0IChhdHRyLT5jdSwgJmJsb2NrLCAmbGxidWZzWzBdLCAmbGlzdGxlbnNbMF0pICE9IDApCisJcmV0dXJuIC0xOworICAgICAgcmV0dXJuIGxpc3RsZW5zWzBdID09IDAgPyAwIDogMTsKKyAgICB9CisKKyAgaW50IGVycm9yID0gSU5UVVNFKGR3YXJmX2Vycm5vKSAoKTsKKyAgaWYgKGVycm9yICE9IERXQVJGX0VfTk9fQkxPQ0spCisgICAgeworICAgICAgX19saWJkd19zZXRlcnJubyAoZXJyb3IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAvKiBNdXN0IGhhdmUgdGhlIGZvcm0gZGF0YTQgb3IgZGF0YTggd2hpY2ggYWN0IGFzIGFuIG9mZnNldC4gICovCisgIER3YXJmX1dvcmQgb2Zmc2V0OworICBpZiAoSU5UVVNFKGR3YXJmX2Zvcm11ZGF0YSkgKGF0dHIsICZvZmZzZXQpICE9IDApCisgICAgcmV0dXJuIC0xOworCisgIGNvbnN0IEVsZl9EYXRhICpkID0gYXR0ci0+Y3UtPmRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2xvY107CisgIGlmIChkID09IE5VTEwpCisgICAgeworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19MT0NMSVNUKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgLyogRmV0Y2ggdGhlIENVJ3MgYmFzZSBhZGRyZXNzLiAgKi8KKyAgRHdhcmZfQWRkciBiYXNlOworICBEd2FyZl9EaWUgY3VkaWUgPQorICAgIHsKKyAgICAgIC5jdSA9IGF0dHItPmN1LAorICAgICAgLmFkZHIgPSAoKGNoYXIgKikgYXR0ci0+Y3UtPmRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX2J1ZgorCSAgICAgICArIGF0dHItPmN1LT5zdGFydCArIDMgKiBhdHRyLT5jdS0+b2Zmc2V0X3NpemUgLSA0ICsgMyksCisgICAgfTsKKworCisgIC8qIEZpbmQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24gdW5pdC4gIEl0IHdpbGwKKyAgICAgbm9ybWFsbHkgYmUgc3BlY2lmaWVkIGJ5IERXX0FUX2xvd19wYy4gIEluIERXQVJGLTMgZHJhZnQgNCwKKyAgICAgdGhlIGJhc2UgYWRkcmVzcyBjb3VsZCBiZSBvdmVycmlkZGVuIGJ5IERXX0FUX2VudHJ5X3BjLiAgSXQncworICAgICBiZWVuIHJlbW92ZWQsIGJ1dCBHQ0MgZW1pdHMgRFdfQVRfZW50cnlfcGMgYW5kIG5vdCBEV19BVF9sb3dwYworICAgICBmb3IgY29tcGlsYXRpb24gdW5pdHMgd2l0aCBkaXNjb250aW51b3VzIHJhbmdlcy4gICovCisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgaWYgKElOVFVTRShkd2FyZl9sb3dwYykgKCZjdWRpZSwgJmJhc2UpICE9IDAKKyAgICAgICYmIElOVFVTRShkd2FyZl9mb3JtYWRkcikgKElOVFVTRShkd2FyZl9hdHRyKSAoJmN1ZGllLCBEV19BVF9lbnRyeV9wYywKKwkJCQkJCSAgICAgJmF0dHJfbWVtKSwKKwkJCQkgJmJhc2UpICE9IDApCisgICAgcmV0dXJuIC0xOworCisgIHVuc2lnbmVkIGNoYXIgKnJlYWRwID0gZC0+ZF9idWYgKyBvZmZzZXQ7CisgIHNpemVfdCBnb3QgPSAwOworICB3aGlsZSAoZ290IDwgbWF4bG9jcykKKyAgICB7CisgICAgICBpZiAoKHVuc2lnbmVkIGNoYXIgKikgZC0+ZF9idWYgKyBkLT5kX3NpemUgLSByZWFkcAorCSAgPCBhdHRyLT5jdS0+YWRkcmVzc19zaXplICogMikKKwl7CisJaW52YWxpZDoKKwkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7CisJICByZXR1cm4gLTE7CisJfQorCisgICAgICBEd2FyZl9BZGRyIGJlZ2luOworICAgICAgRHdhcmZfQWRkciBlbmQ7CisgICAgICBpZiAoYXR0ci0+Y3UtPmFkZHJlc3Nfc2l6ZSA9PSA4KQorCXsKKwkgIGJlZ2luID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoYXR0ci0+Y3UtPmRiZywgcmVhZHApOworCSAgZW5kID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoYXR0ci0+Y3UtPmRiZywgcmVhZHApOworCisJICBpZiAoYmVnaW4gPT0gKEVsZjY0X0FkZHIpIC0xbCkgLyogQmFzZSBhZGRyZXNzIGVudHJ5LiAgKi8KKwkgICAgeworCSAgICAgIGJhc2UgPSBlbmQ7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgYmVnaW4gPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChhdHRyLT5jdS0+ZGJnLCByZWFkcCk7CisJICBlbmQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChhdHRyLT5jdS0+ZGJnLCByZWFkcCk7CisKKwkgIGlmIChiZWdpbiA9PSAoRWxmMzJfQWRkcikgLTEpIC8qIEJhc2UgYWRkcmVzcyBlbnRyeS4gICovCisJICAgIHsKKwkgICAgICBiYXNlID0gZW5kOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJfQorCisgICAgICBpZiAoYmVnaW4gPT0gMCAmJiBlbmQgPT0gMCkgLyogRW5kIG9mIGxpc3QgZW50cnkuICAqLworCWJyZWFrOworCisgICAgICBpZiAoKHVuc2lnbmVkIGNoYXIgKikgZC0+ZF9idWYgKyBkLT5kX3NpemUgLSByZWFkcCA8IDIpCisJeworCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKKwkgIHJldHVybiAtMTsKKwl9CisKKyAgICAgIC8qIFdlIGhhdmUgYSBsb2NhdGlvbiBleHByZXNzaW9uLiAgKi8KKyAgICAgIGJsb2NrLmxlbmd0aCA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZF9pbmMgKGF0dHItPmN1LT5kYmcsIHJlYWRwKTsKKyAgICAgIGJsb2NrLmRhdGEgPSByZWFkcDsKKyAgICAgIGlmICgodW5zaWduZWQgY2hhciAqKSBkLT5kX2J1ZiArIGQtPmRfc2l6ZSAtIHJlYWRwCisJICA8IChwdHJkaWZmX3QpIGJsb2NrLmxlbmd0aCkKKwlnb3RvIGludmFsaWQ7CisgICAgICByZWFkcCArPSBibG9jay5sZW5ndGg7CisKKyAgICAgIGlmIChhZGRyZXNzID49IGJhc2UgKyBiZWdpbiAmJiBhZGRyZXNzIDwgYmFzZSArIGVuZCkKKwl7CisJICAvKiBUaGlzIG9uZSBtYXRjaGVzIHRoZSBhZGRyZXNzLiAgKi8KKwkgIGlmIChsbGJ1ZnMgIT0gTlVMTCAmJiBnZXRsb2NsaXN0IChhdHRyLT5jdSwgJmJsb2NrLAorCQkJCQkgICAgJmxsYnVmc1tnb3RdLCAmbGlzdGxlbnNbZ290XSkgIT0gMCkKKwkgICAgcmV0dXJuIC0xOworCSAgKytnb3Q7CisJfQorICAgIH0KKworICByZXR1cm4gZ290OworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZ2V0bWFjcm9zLmMgYi9saWJkdy9kd2FyZl9nZXRtYWNyb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzY3OGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZ2V0bWFjcm9zLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qIEdldCBtYWNybyBpbmZvcm1hdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJkd1AuaD4KKworCitwdHJkaWZmX3QKK2R3YXJmX2dldG1hY3JvcyAoZGllLCBjYWxsYmFjaywgYXJnLCBvZmZzZXQpCisgICAgIER3YXJmX0RpZSAqZGllOworICAgICBpbnQgKCpjYWxsYmFjaykgKER3YXJmX01hY3JvICosIHZvaWQgKik7CisgICAgIHZvaWQgKmFyZzsKKyAgICAgcHRyZGlmZl90IG9mZnNldDsKK3sKKyAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGUuICAqLworICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKyAgaWYgKElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9tYWNyb19pbmZvLCAmYXR0cikgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogT2Zmc2V0IGludG8gdGhlIC5kZWJ1Z19tYWNpbmZvIHNlY3Rpb24uICAqLworICBEd2FyZl9Xb3JkIG1hY29mZjsKKyAgaWYgKElOVFVTRShkd2FyZl9mb3JtdWRhdGEpICgmYXR0ciwgJm1hY29mZikgIT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZHAKKyAgICA9IGRpZS0+Y3UtPmRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX21hY2luZm9dLT5kX2J1ZiArIG9mZnNldDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZGVuZHAKKyAgICA9IHJlYWRwICsgZGllLT5jdS0+ZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfbWFjaW5mb10tPmRfc2l6ZTsKKworICBpZiAocmVhZHAgPT0gcmVhZGVuZHApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCpyZWFkcCAhPSBEV19NQUNJTkZPX3N0YXJ0X2ZpbGUpCisgICAgZ290byBpbnZhbGlkOworCisgIHdoaWxlIChyZWFkcCA8IHJlYWRlbmRwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBvcGNvZGUgPSAqcmVhZHArKzsKKyAgICAgIHVuc2lnbmVkIGludCB1MTI4OworICAgICAgdW5zaWduZWQgaW50IHUxMjhfMiA9IDA7CisgICAgICBjb25zdCBjaGFyICpzdHIgPSBOVUxMOworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kcDsKKworICAgICAgc3dpdGNoIChvcGNvZGUpCisJeworCWNhc2UgRFdfTUFDSU5GT19kZWZpbmU6CisJY2FzZSBEV19NQUNJTkZPX3VuZGVmOgorCWNhc2UgRFdfTUFDSU5GT192ZW5kb3JfZXh0OgorCSAgLyogIEZvciB0aGUgZmlyc3QgdHdvIG9wY29kZXMgdGhlIHBhcmFtZXRlcnMgYXJlCisJICAgICAgICBsaW5lLCBzdHJpbmcKKwkgICAgICBGb3IgdGhlIGxhdHRlcgorCSAgICAgICAgbnVtYmVyLCBzdHJpbmcuCisJICAgICAgV2UgY2FuIHRyZWF0IHRoZXNlIGNhc2VzIHRvZ2V0aGVyLiAgKi8KKwkgIGdldF91bGViMTI4ICh1MTI4LCByZWFkcCk7CisKKwkgIGVuZHAgPSBtZW1jaHIgKHJlYWRwLCAnXDAnLCByZWFkZW5kcCAtIHJlYWRwKTsKKwkgIGlmIChlbmRwID09IE5VTEwpCisJICAgIGdvdG8gaW52YWxpZDsKKworCSAgc3RyID0gKGNoYXIgKikgcmVhZHA7CisJICByZWFkcCA9IGVuZHAgKyAxOworCSAgYnJlYWs7CisKKwljYXNlIERXX01BQ0lORk9fc3RhcnRfZmlsZToKKwkgIC8qIFRoZSB0d28gcGFyYW1ldGVycyBhcmUgbGluZSBhbmQgZmlsZSBpbmRleC4gICovCisJICBnZXRfdWxlYjEyOCAodTEyOCwgcmVhZHApOworCSAgZ2V0X3VsZWIxMjggKHUxMjhfMiwgcmVhZHApOworCSAgYnJlYWs7CisKKwljYXNlIERXX01BQ0lORk9fZW5kX2ZpbGU6CisJICAvKiBObyBwYXJhbWV0ZXJzIGZvciB0aGlzIG9uZS4gICovCisJICB1MTI4ID0gMDsKKwkgIGJyZWFrOworCisJY2FzZSAwOgorCSAgLyogTm90aGluZyBtb3JlIHRvIGRvLiAgKi8KKwkgIHJldHVybiAwOworCisJZGVmYXVsdDoKKwkgIGdvdG8gaW52YWxpZDsKKwl9CisKKyAgICAgIER3YXJmX01hY3JvIG1hYzsKKyAgICAgIG1hYy5vcGNvZGUgPSBvcGNvZGU7CisgICAgICBtYWMucGFyYW0xID0gdTEyODsKKyAgICAgIGlmIChzdHIgPT0gTlVMTCkKKwltYWMucGFyYW0yLnUgPSB1MTI4XzI7CisgICAgICBlbHNlCisJbWFjLnBhcmFtMi5zID0gc3RyOworCisgICAgICBpZiAoY2FsbGJhY2sgKCZtYWMsIGFyZykgIT0gRFdBUkZfQ0JfT0spCisJcmV0dXJuIChyZWFkcAorCQktICgodW5zaWduZWQgY2hhciAqKSBkaWUtPmN1LT5kYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19tYWNpbmZvXS0+ZF9idWYKKwkJICAgKyBvZmZzZXQpKTsKKyAgICB9CisKKyAgLyogSWYgd2UgY29tZSBoZXJlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGUgZGF0YSBmb3IgdGhlIENVIGlzIG5vdAorICAgICBwcmVzZW50LiAgKi8KKyBpbnZhbGlkOgorICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOworICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9nZXRwdWJuYW1lcy5jIGIvbGliZHcvZHdhcmZfZ2V0cHVibmFtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzAwY2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfZ2V0cHVibmFtZXMuYwpAQCAtMCwwICsxLDIxMyBAQAorLyogR2V0IHB1YmxpYyBzeW1ib2wgaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPGxpYmR3UC5oPgorCisKK3N0YXRpYyBpbnQKK2dldF9vZmZzZXRzIChEd2FyZiAqZGJnKQoreworICBzaXplX3QgYWxsb2NhdGVkID0gMDsKKyAgc2l6ZV90IGNudCA9IDA7CisgIHN0cnVjdCBwdWJuYW1lc19zICptZW0gPSBOVUxMOworICBjb25zdCBzaXplX3QgZW50c2l6ZSA9IHNpemVvZiAoc3RydWN0IHB1Ym5hbWVzX3MpOworICB1bnNpZ25lZCBjaGFyICpjb25zdCBzdGFydHAgPSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19wdWJuYW1lc10tPmRfYnVmOworICB1bnNpZ25lZCBjaGFyICpyZWFkcCA9IHN0YXJ0cDsKKyAgdW5zaWduZWQgY2hhciAqZW5kcCA9IHJlYWRwICsgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcHVibmFtZXNdLT5kX3NpemU7CisKKyAgd2hpbGUgKHJlYWRwICsgMTQgPCBlbmRwKQorICAgIHsKKyAgICAgIC8qIElmIG5lY2Vzc2FyeSwgYWxsb2NhdGUgbW9yZSBlbnRyaWVzLiAgKi8KKyAgICAgIGlmIChjbnQgPj0gYWxsb2NhdGVkKQorCXsKKwkgIGFsbG9jYXRlZCA9IE1BWCAoMTAsIDIgKiBhbGxvY2F0ZWQpOworCSAgc3RydWN0IHB1Ym5hbWVzX3MgKm5ld21lbQorCSAgICA9IChzdHJ1Y3QgcHVibmFtZXNfcyAqKSByZWFsbG9jIChtZW0sIGFsbG9jYXRlZCAqIGVudHNpemUpOworCSAgaWYgKG5ld21lbSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT01FTSk7CisJICAgIGVycl9yZXR1cm46CisJICAgICAgZnJlZSAobWVtKTsKKwkgICAgICByZXR1cm4gLTE7CisJICAgIH0KKworCSAgbWVtID0gbmV3bWVtOworCX0KKworICAgICAgLyogUmVhZCB0aGUgc2V0IGhlYWRlci4gICovCisgICAgICBpbnQgbGVuX2J5dGVzID0gNDsKKyAgICAgIER3YXJmX09mZiBsZW4gPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKKyAgICAgIGlmIChsZW4gPT0gMHhmZmZmZmZmZikKKwl7CisJICBsZW4gPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKKwkgIGxlbl9ieXRlcyA9IDg7CisJfQorCisgICAgICAvKiBOb3cgd2Uga25vdyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBvZmZzZXQvbmFtZSBwYWlyLiAgKi8KKyAgICAgIG1lbVtjbnRdLnNldF9zdGFydCA9IHJlYWRwICsgMiArIDIgKiBsZW5fYnl0ZXMgLSBzdGFydHA7CisgICAgICBtZW1bY250XS5hZGRyZXNzX2xlbiA9IGxlbl9ieXRlczsKKyAgICAgIGlmIChtZW1bY250XS5zZXRfc3RhcnQgPj0gZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcHVibmFtZXNdLT5kX3NpemUpCisJLyogU29tZXRoaW5nIHdyb25nLCB0aGUgZmlyc3QgZW50cnkgaXMgYmV5b25kIHRoZSBlbmQgb2YKKwkgICB0aGUgc2VjdGlvbi4gICovCisJYnJlYWs7CisKKyAgICAgIC8qIFJlYWQgdGhlIHZlcnNpb24uICBJdCBiZXR0ZXIgYmUgdHdvIGZvciBub3cuICAqLworICAgICAgdWludDE2X3QgdmVyc2lvbiA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7CisgICAgICBpZiAodmVyc2lvbiAhPSAyKQorCXsKKwkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9WRVJTSU9OKTsKKwkgIGdvdG8gZXJyX3JldHVybjsKKwl9CisKKyAgICAgIC8qIEdldCB0aGUgQ1Ugb2Zmc2V0LiAgKi8KKyAgICAgIGlmIChsZW5fYnl0ZXMgPT0gNCkKKwltZW1bY250XS5jdV9vZmZzZXQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHAgKyAyKTsKKyAgICAgIGVsc2UKKwltZW1bY250XS5jdV9vZmZzZXQgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHAgKyAyKTsKKworICAgICAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBDVSBoZWFkZXIuICAqLworICAgICAgYXNzZXJ0IChkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19pbmZvXSAhPSBOVUxMKTsKKyAgICAgIGFzc2VydCAoZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfaW5mb10tPmRfYnVmICE9IE5VTEwpOworICAgICAgYXNzZXJ0IChtZW1bY250XS5jdV9vZmZzZXQgKyAzCisJICAgICAgPCBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19pbmZvXS0+ZF9zaXplKTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmluZm9wCisJPSAoKHVuc2lnbmVkIGNoYXIgKikgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfaW5mb10tPmRfYnVmCisJICAgKyBtZW1bY250XS5jdV9vZmZzZXQpOworICAgICAgaWYgKHJlYWRfNHVieXRlX3VuYWxpZ25lZF9ub25jdnQgKGluZm9wKSA9PSAweGZmZmZmZmZmKQorCW1lbVtjbnRdLmN1X2hlYWRlcl9zaXplID0gMjM7CisgICAgICBlbHNlCisJbWVtW2NudF0uY3VfaGVhZGVyX3NpemUgPSAxMTsKKworICAgICAgKytjbnQ7CisKKyAgICAgIC8qIEFkdmFuY2UgdG8gdGhlIG5leHQgc2V0LiAgKi8KKyAgICAgIHJlYWRwICs9IGxlbjsKKyAgICB9CisKKyAgaWYgKG1lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fRU5UUlkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYmctPnB1Ym5hbWVzX3NldHMgPSAoc3RydWN0IHB1Ym5hbWVzX3MgKikgcmVhbGxvYyAobWVtLCBjbnQgKiBlbnRzaXplKTsKKyAgZGJnLT5wdWJuYW1lc19uc2V0cyA9IGNudDsKKworICByZXR1cm4gMDsKK30KKworCitwdHJkaWZmX3QKK2R3YXJmX2dldHB1Ym5hbWVzIChkYmcsIGNhbGxiYWNrLCBhcmcsIG9mZnNldCkKKyAgICAgRHdhcmYgKmRiZzsKKyAgICAgaW50ICgqY2FsbGJhY2spIChEd2FyZiAqLCBEd2FyZl9HbG9iYWwgKiwgdm9pZCAqKTsKKyAgICAgdm9pZCAqYXJnOworICAgICBwdHJkaWZmX3Qgb2Zmc2V0OworeworICBpZiAoZGJnID09IE5VTEwpCisgICAgcmV0dXJuIC0xbDsKKworICBpZiAob2Zmc2V0IDwgMCkKKyAgICB7CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfT0ZGU0VUKTsKKyAgICAgIHJldHVybiAtMWw7CisgICAgfQorCisgIC8qIE1ha2Ugc3VyZSBpdCBpcyBhIHZhbGlkIG9mZnNldC4gICovCisgIGlmICh1bmxpa2VseSAoZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcHVibmFtZXNdID09IE5VTEwKKwkJfHwgKChzaXplX3QpIG9mZnNldAorCQkgICAgPj0gZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcHVibmFtZXNdLT5kX3NpemUpKSkKKyAgICAvKiBObyAobW9yZSkgZW50cnkuICAqLworICAgIHJldHVybiAwOworCisgIC8qIElmIG5lY2Vzc2FyeSByZWFkIHRoZSBzZXQgaW5mb3JtYXRpb24uICAqLworICBpZiAoZGJnLT5wdWJuYW1lc19uc2V0cyA9PSAwICYmIGdldF9vZmZzZXRzIChkYmcpICE9IDApCisgICAgcmV0dXJuIC0xbDsKKworICAvKiBGaW5kIHRoZSBwbGFjZSB3aGVyZSB0byBzdGFydC4gICovCisgIHNpemVfdCBjbnQ7CisgIGlmIChvZmZzZXQgPT0gMCkKKyAgICB7CisgICAgICBjbnQgPSAwOworICAgICAgb2Zmc2V0ID0gZGJnLT5wdWJuYW1lc19zZXRzWzBdLnNldF9zdGFydDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGNudCA9IDA7IGNudCArIDEgPCBkYmctPnB1Ym5hbWVzX25zZXRzOyArK2NudCkKKwlpZiAoKER3YXJmX09mZikgb2Zmc2V0ID49IGRiZy0+cHVibmFtZXNfc2V0c1tjbnRdLnNldF9zdGFydCkKKwkgIHsKKwkgICAgYXNzZXJ0ICgoRHdhcmZfT2ZmKSBvZmZzZXQKKwkJICAgIDwgZGJnLT5wdWJuYW1lc19zZXRzW2NudCArIDFdLnNldF9zdGFydCk7CisJICAgIGJyZWFrOworCSAgfQorICAgICAgYXNzZXJ0IChjbnQgKyAxIDwgZGJnLT5wdWJuYW1lc19uc2V0cyk7CisgICAgfQorCisgIHVuc2lnbmVkIGNoYXIgKnN0YXJ0cAorICAgID0gKHVuc2lnbmVkIGNoYXIgKikgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcHVibmFtZXNdLT5kX2J1ZjsKKyAgdW5zaWduZWQgY2hhciAqcmVhZHAgPSBzdGFydHAgKyBvZmZzZXQ7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIER3YXJmX0dsb2JhbCBnbDsKKworICAgICAgZ2wuY3Vfb2Zmc2V0ID0gKGRiZy0+cHVibmFtZXNfc2V0c1tjbnRdLmN1X29mZnNldAorCQkgICAgICArIGRiZy0+cHVibmFtZXNfc2V0c1tjbnRdLmN1X2hlYWRlcl9zaXplKTsKKworICAgICAgd2hpbGUgKDEpCisJeworCSAgLyogUkVBRFAgcG9pbnRzIHRvIHRoZSBuZXh0IG9mZnNldC9uYW1lIHBhaXIuICAqLworCSAgaWYgKGRiZy0+cHVibmFtZXNfc2V0c1tjbnRdLmFkZHJlc3NfbGVuID09IDQpCisJICAgIGdsLmRpZV9vZmZzZXQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKKwkgIGVsc2UKKwkgICAgZ2wuZGllX29mZnNldCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOworCisJICAvKiBJZiB0aGUgb2Zmc2V0IGlzIHplcm8gd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQuICAqLworCSAgaWYgKGdsLmRpZV9vZmZzZXQgPT0gMCkKKwkgICAgYnJlYWs7CisKKwkgIC8qIEFkZCB0aGUgQ1Ugb2Zmc2V0LiAgKi8KKwkgIGdsLmRpZV9vZmZzZXQgKz0gZGJnLT5wdWJuYW1lc19zZXRzW2NudF0uY3Vfb2Zmc2V0OworCisJICBnbC5uYW1lID0gKGNoYXIgKikgcmVhZHA7CisJICByZWFkcCA9ICh1bnNpZ25lZCBjaGFyICopIHJhd21lbWNociAoZ2wubmFtZSwgJ1wwJykgKyAxOworCisJICAvKiBXZSBmb3VuZCBuYW1lIGFuZCBESUUgb2Zmc2V0LiAgUmVwb3J0IGl0LiAgKi8KKwkgIGlmIChjYWxsYmFjayAoZGJnLCAmZ2wsIGFyZykgIT0gRFdBUkZfQ0JfT0spCisJICAgIHsKKwkgICAgICAvKiBUaGUgdXNlciB3YW50cyB1cyB0byBzdG9wLiAgUmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlCisJCSBuZXh0IGVudHJ5LiAgKi8KKwkgICAgICByZXR1cm4gcmVhZHAgLSBzdGFydHA7CisJICAgIH0KKwl9CisKKyAgICAgIGlmICgrK2NudCA9PSBkYmctPnB1Ym5hbWVzX25zZXRzKQorCS8qIFRoaXMgd2FzIHRoZSBsYXN0IHNldC4gICovCisJYnJlYWs7CisKKyAgICAgIHN0YXJ0cCA9ICh1bnNpZ25lZCBjaGFyICopIGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3B1Ym5hbWVzXS0+ZF9idWY7CisgICAgICByZWFkcCA9IHN0YXJ0cCArIGRiZy0+cHVibmFtZXNfc2V0c1tjbnRdLnNldF9zdGFydDsKKyAgICB9CisKKyAgLyogV2UgYXJlIGRvbmUuICBObyBtb3JlIGVudHJpZXMuICAqLworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2dldHNjb3Blcy5jIGIvbGliZHcvZHdhcmZfZ2V0c2NvcGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNmYyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldHNjb3Blcy5jCkBAIC0wLDAgKzEsMzM0IEBACisvKiBSZXR1cm4gc2NvcGUgRElFcyBjb250YWluaW5nIFBDIGFkZHJlc3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorI2luY2x1ZGUgPGR3YXJmLmg+CisKKworZW51bSBkaWVfY2xhc3MgeyBpZ25vcmUsIG1hdGNoLCBtYXRjaF9pbmxpbmUsIHdhbGssIGltcG9ydGVkIH07CisKK3N0YXRpYyBlbnVtIGRpZV9jbGFzcworY2xhc3NpZnlfZGllIChEd2FyZl9EaWUgKmRpZSkKK3sKKyAgc3dpdGNoIChJTlRVU0UoZHdhcmZfdGFnKSAoZGllKSkKKyAgICB7CisgICAgICAvKiBESUVzIHdpdGggYWRkcmVzc2VzIHdlIGNhbiB0cnkgdG8gbWF0Y2guICAqLworICAgIGNhc2UgRFdfVEFHX2NvbXBpbGVfdW5pdDoKKyAgICBjYXNlIERXX1RBR19tb2R1bGU6CisgICAgY2FzZSBEV19UQUdfbGV4aWNhbF9ibG9jazoKKyAgICBjYXNlIERXX1RBR193aXRoX3N0bXQ6CisgICAgY2FzZSBEV19UQUdfY2F0Y2hfYmxvY2s6CisgICAgY2FzZSBEV19UQUdfdHJ5X2Jsb2NrOgorICAgIGNhc2UgRFdfVEFHX2VudHJ5X3BvaW50OgorICAgICAgcmV0dXJuIG1hdGNoOworICAgIGNhc2UgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZToKKyAgICAgIHJldHVybiBtYXRjaF9pbmxpbmU7CisgICAgY2FzZSBEV19UQUdfc3VicHJvZ3JhbToKKyAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBjb25jcmV0ZSBvdXQtb2YtbGluZSBpbnN0YW5jZSBvZiBhbiBpbmxpbmUsIGluCisJIHdoaWNoIGNhc2UgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgb3duZWQgYnkgdGhlIHJpZ2h0IHNjb3BlIGFuZAorCSB3ZSB3aWxsIHNlYXJjaCBmb3IgaXRzIG9yaWdpbiBhcyBmb3IgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZS4gICovCisgICAgICByZXR1cm4gKElOVFVTRShkd2FyZl9oYXNhdHRyKSAoZGllLCBEV19BVF9hYnN0cmFjdF9vcmlnaW4pCisJICAgICAgPyBtYXRjaF9pbmxpbmUgOiBtYXRjaCk7CisKKyAgICAgIC8qIERJRXMgd2l0aG91dCBhZGRyZXNzZXMgdGhhdCBjYW4gb3duIERJRXMgd2l0aCBhZGRyZXNzZXMuICAqLworICAgIGNhc2UgRFdfVEFHX25hbWVzcGFjZToKKyAgICAgIHJldHVybiB3YWxrOworCisgICAgICAvKiBTcGVjaWFsIGluZGlyZWN0aW9uIHJlcXVpcmVkLiAgKi8KKyAgICBjYXNlIERXX1RBR19pbXBvcnRlZF91bml0OgorICAgICAgcmV0dXJuIGltcG9ydGVkOworCisgICAgICAvKiBPdGhlciBESUVzIHdlIGhhdmUgbm8gcmVhc29uIHRvIGRlc2NlbmQuICAqLworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBpZ25vcmU7Cit9CisKKy8qIERJRSBjb250YWlucyBQQy4gIEZpbmQgaXRzIGNoaWxkIHRoYXQgY29udGFpbnMgUEMuICBSZXR1cm5zIC0xIGZvcgorICAgZXJyb3JzLCAwIGZvciBubyBtYXRjaGVzLiAgT24gc3VjY2VzcywgKlNDT1BFUyBnZXRzIHRoZSBtYWxsb2MnZCBhcnJheQorICAgb2YgY29udGFpbmluZyBzY29wZXMuICBBIHBvc2l0aXZlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHRob3NlCisgICBzY29wZXMuICBBIHJldHVybiB2YWx1ZSA8IC0xIGlzIC0xIC0gbnVtYmVyIG9mIHRob3NlIHNjb3Blcywgd2hlbiB0aGUKKyAgIG91dGVybW9zdCBzY29wZSBpcyBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIGFuIGlubGluZSBzdWJyb3V0aW5lLiAgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfcGMgKHVuc2lnbmVkIGludCBkZXB0aCwgRHdhcmZfRGllICpkaWUsIER3YXJmX0FkZHIgcGMsIER3YXJmX0RpZSAqKnNjb3BlcykKK3sKKyAgRHdhcmZfRGllIGNoaWxkOworICBpZiAoSU5UVVNFKGR3YXJmX2NoaWxkKSAoZGllLCAmY2hpbGQpICE9IDApCisgICAgcmV0dXJuIC0xOworCisgIC8qIFJlY3Vyc2Ugb24gdGhpcyBESUUgdG8gc2VhcmNoIHdpdGhpbiBpdHMgY2hpbGRyZW4uCisgICAgIFJldHVybiBub256ZXJvIGlmIHRoaXMgZ2V0cyBhbiBlcnJvciBvciBhIGZpbmFsIHJlc3VsdC4gICovCisgIGlubGluZSBpbnQgc2VhcmNoX2NoaWxkICh2b2lkKQorICAgIHsKKyAgICAgIGludCBuID0gZmluZF9wYyAoZGVwdGggKyAxLCAmY2hpbGQsIHBjLCBzY29wZXMpOworICAgICAgaWYgKG4gPiAwKQorCS8qIFRoYXQgc3RvcmVkIHRoZSBOIGlubmVybW9zdCBzY29wZXMuICBOb3cgc3RvcmUgb3Vycy4gICovCisJKCpzY29wZXMpW24rK10gPSBjaGlsZDsKKyAgICAgIHJldHVybiBuOworICAgIH0KKworICAvKiBDaGVjayBlYWNoIG9mIG91ciBjaGlsZCBESUVzLiAgKi8KKyAgZW51bSBkaWVfY2xhc3MgZ290ID0gaWdub3JlOworICBkbworICAgIHsKKyAgICAgIGVudW0gZGllX2NsYXNzIGNoaWxkX2NsYXNzID0gY2xhc3NpZnlfZGllICgmY2hpbGQpOworICAgICAgc3dpdGNoIChjaGlsZF9jbGFzcykKKwl7CisJY2FzZSBtYXRjaDoKKwljYXNlIG1hdGNoX2lubGluZToKKwkgIGlmIChJTlRVU0UoZHdhcmZfaGFzcGMpICgmY2hpbGQsIHBjKSA+IDApCisJICAgIGJyZWFrOworCSAgY29udGludWU7CisKKwljYXNlIHdhbGs6CisJICBpZiAoSU5UVVNFKGR3YXJmX2hhc2NoaWxkcmVuKSAoJmNoaWxkKSkKKwkgICAgZ290ID0gd2FsazsKKwkgIGNvbnRpbnVlOworCisJY2FzZSBpbXBvcnRlZDoKKwkgIGdvdCA9IHdhbGs7CisJICBjb250aW51ZTsKKworCWRlZmF1bHQ6CisJY2FzZSBpZ25vcmU6CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFdlIGdldCBoZXJlIG9ubHkgd2hlbiB0aGUgUEMgaGFzIG1hdGNoZWQuICAqLworICAgICAgZ290ID0gY2hpbGRfY2xhc3M7CisgICAgICBicmVhazsKKyAgICB9CisgIHdoaWxlIChJTlRVU0UoZHdhcmZfc2libGluZ29mKSAoJmNoaWxkLCAmY2hpbGQpID09IDApOworCisgIHN3aXRjaCAoZ290KQorICAgIHsKKyAgICBjYXNlIG1hdGNoOgorICAgIGNhc2UgbWF0Y2hfaW5saW5lOgorICAgICAgLyogV2UgaGF2ZSBhIERJRSB0aGF0IG1hdGNoZWQgdGhlIFBDLiAgKi8KKyAgICAgIGlmIChJTlRVU0UoZHdhcmZfaGFzY2hpbGRyZW4pICgmY2hpbGQpKQorCXsKKwkgIC8qIFJlY3Vyc2Ugb24gdGhpcyBESUUgdG8gbmFycm93IHdpdGhpbiBpdHMgY2hpbGRyZW4uCisJICAgICBSZXR1cm4gbm93IGlmIHRoaXMgZ2V0cyBhbiBlcnJvciBvciBhIGZpbmFsIHJlc3VsdC4gICovCisJICBpbnQgcmVzdWx0ID0gc2VhcmNoX2NoaWxkICgpOworCSAgaWYgKHJlc3VsdCA8IDAgfHwgKGdvdCA9PSBtYXRjaCAmJiByZXN1bHQgPiAwKSkKKwkgICAgcmV0dXJuIHJlc3VsdDsKKwkgIGlmIChyZXN1bHQgPiAwKQkvKiBnb3QgPT0gbWF0Y2hfaW5saW5lICovCisJICAgIC8qIFdlIGhhdmUgYSB3aW5uZXIsIGJ1dCBDSElMRCBpcyBhIGNvbmNyZXRlIGlubGluZSBpbnN0YW5jZQorCSAgICAgICBzbyBESUUgYW5kIGl0cyBjb250YWluaW5nIHNjb3BlcyBkbyBub3QgYWN0dWFsbHkgYXBwbHkuCisJICAgICAgIERJRSBpcyB0aGUgc2NvcGUgdGhhdCBpbmxpbmVkIHRoZSBmdW5jdGlvbi4gIE91ciByb290CisJICAgICAgIGNhbGxlciBtdXN0IGZpbmQgdGhlIGFic3RyYWN0IHNjb3BlIHRoYXQgZGVmaW5lcyB1cy4gICovCisJICAgIHJldHVybiAtMSAtIHJlc3VsdDsKKwl9CisKKyAgICAgIC8qIFRoaXMgRElFIGhhcyBubyBjaGlsZHJlbiBjb250YWluaW5nIHRoZSBQQywgc28gdGhpcyBpcyBpdC4gICovCisgICAgICAqc2NvcGVzID0gbWFsbG9jIChkZXB0aCAqIHNpemVvZiAoKnNjb3BlcylbMF0pOworICAgICAgaWYgKCpzY29wZXMgPT0gTlVMTCkKKwl7CisJICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PTUVNKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICAoKnNjb3BlcylbMF0gPSBjaGlsZDsKKyAgICAgIHJldHVybiBnb3QgPT0gbWF0Y2ggPyAxIDogLTI7CisKKyAgICBjYXNlIHdhbGs6CisgICAgICAvKiBXZSBkb24ndCBoYXZlIGFueXRoaW5nIG1hdGNoaW5nIHRoZSBQQywgYnV0IHdlIGhhdmUgc29tZSB0aGluZ3MKKwkgd2UgbWlnaHQgZGVzY2VuZCB0byBmaW5kIG9uZS4gIFJlY3Vyc2Ugb24gZWFjaCBvZiB0aG9zZS4gICovCisgICAgICBpZiAoSU5UVVNFKGR3YXJmX2NoaWxkKSAoZGllLCAmY2hpbGQpICE9IDApCisJcmV0dXJuIC0xOworICAgICAgZG8KKwlzd2l0Y2ggKGNsYXNzaWZ5X2RpZSAoJmNoaWxkKSkKKwkgIHsKKwkgIGNhc2Ugd2FsazoKKwkgICAgaWYgKElOVFVTRShkd2FyZl9oYXNjaGlsZHJlbikgKCZjaGlsZCkpCisJICAgICAgeworCQkvKiBSZWN1cnNlIG9uIHRoaXMgRElFIHRvIGxvb2sgZm9yIHRoZSBQQyB3aXRoaW4gaXRzIGNoaWxkcmVuLgorCQkgICBSZXR1cm4gbm93IGlmIHRoaXMgZ2V0cyBhbiBlcnJvciBvciBhIGZpbmFsIHJlc3VsdC4gICovCisJCWludCByZXN1bHQgPSBzZWFyY2hfY2hpbGQgKCk7CisJCWlmIChyZXN1bHQgIT0gMCkKKwkJICByZXR1cm4gcmVzdWx0OworCSAgICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgaW1wb3J0ZWQ6CisJICAgIHsKKwkgICAgICAvKiBUaGlzIGltcG9ydHMgYW5vdGhlciBjb21waWxhdGlvbiB1bml0IHRvIGFwcGVhcgorCQkgYXMgcGFydCBvZiB0aGlzIG9uZSwgaW5zaWRlIHRoZSBjdXJyZW50IHNjb3BlLgorCQkgUmVjdXJzZSB0byBzZWFyY2ggdGhlIHJlZmVyZW5jZWQgdW5pdCwgYnV0IHdpdGhvdXQKKwkJIHJlY29yZGluZyBpdCBhcyBhbiBpbm5lciBzY29waW5nIGxldmVsLiAgKi8KKworCSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKwkgICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHIgPSBJTlRVU0UoZHdhcmZfYXR0cikgKCZjaGlsZCwgRFdfQVRfaW1wb3J0LAorCQkJCQkJCSAgJmF0dHJfbWVtKTsKKwkgICAgICBpZiAoSU5UVVNFKGR3YXJmX2Zvcm1yZWZfZGllKSAoYXR0ciwgJmNoaWxkKSAhPSBOVUxMKQorCQl7CisJCSAgaW50IHJlc3VsdCA9IGZpbmRfcGMgKGRlcHRoLCAmY2hpbGQsIHBjLCBzY29wZXMpOworCQkgIGlmIChyZXN1bHQgIT0gMCkKKwkJICAgIHJldHVybiByZXN1bHQ7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB3aGlsZSAoSU5UVVNFKGR3YXJmX3NpYmxpbmdvZikgKCZjaGlsZCwgJmNoaWxkKSA9PSAwKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICBjYXNlIGlnbm9yZToKKyAgICAgIC8qIE5vdGhpbmcgdG8gc2VlIGhlcmUuICAqLworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIE5vIG1hdGNoZXMuICAqLworICByZXR1cm4gMDsKK30KKworCisvKiBPV05FUiBvd25zIE9XTkVELiAgRmluZCBpbnRlcm1lZGlhdGUgc2NvcGVzLiAgKlNDT1BFUyB3YXMgYWxsb2NhdGVkIGJ5CisgICBmaW5kX3BjIGFuZCBoYXMgU0tJUCBlbGVtZW50cy4gIFdlIHJlYWxsb2MgaXQsIGFwcGVuZCBtb3JlIGNvbnRhaW5pbmcKKyAgIHNjb3BlcywgYW5kIHJldHVybiAxICsgdGhlIG51bWJlciBhcHBlbmRlZC4gIFJldHVybnMgLTEgb24gZXJyb3JzLAorICAgb3IgMCB3aGVuIE9XTkVEIHdhcyBub3QgZm91bmQgd2l0aGluIE9XTkVSLiAgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfZGllICh1bnNpZ25lZCBpbnQgZGVwdGgsIER3YXJmX0RpZSAqb3duZXIsIER3YXJmX0RpZSAqb3duZWQsCisJICBEd2FyZl9EaWUgKipzY29wZXMsIHVuc2lnbmVkIGludCBza2lwKQoreworICBEd2FyZl9EaWUgY2hpbGQ7CisgIGlmIChJTlRVU0UoZHdhcmZfY2hpbGQpIChvd25lciwgJmNoaWxkKSAhPSAwKQorICAgIHJldHVybiAtMTsKKworICBkbworICAgIHsKKyAgICAgIGlmIChjaGlsZC5hZGRyID09IG93bmVkLT5hZGRyKQorCS8qIFRoaXMgaXMgdGhlIG9uZS4gIE9XTkVSIGlzIHRoZSBpbm5lcm1vc3Qgb3duZXIuICAqLworCXJldHVybiAxOworCisgICAgICAvKiBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCBzaG9ydC1jaXJjdWl0IHRoZSBkZWFkLWVuZCBwYXRocyBqdXN0IGJ5CisJIGNoZWNraW5nIHRoZSBwaHlzaWNhbCBsYXlvdXQgdG8gc2VlIGlmIE9XTkVEIGZhbGxzIHdpdGhpbiBDSElMRC4KKwkgSWYgaXQgZG9lc24ndCwgdGhlcmUgbWF5IHN0aWxsIGJlIGEgRFdfVEFHX2ltcG9ydGVkX3VuaXQgdGhhdAorCSByZWZlcnMgdG8gaXRzIHRydWUgb3duZXIgaW5kaXJlY3RseS4gICovCisKKyAgICAgIHN3aXRjaCAoY2xhc3NpZnlfZGllICgmY2hpbGQpKQorCXsKKwljYXNlIG1hdGNoOgorCWNhc2UgbWF0Y2hfaW5saW5lOgorCWNhc2Ugd2FsazoKKwkgIGlmIChJTlRVU0UoZHdhcmZfaGFzY2hpbGRyZW4pICgmY2hpbGQpKQorCSAgICB7CisJICAgICAgLyogUmVjdXJzZSBvbiB0aGlzIERJRSB0byBsb29rIGZvciBPV05FRCB3aXRoaW4gaXRzIGNoaWxkcmVuLgorCQkgUmV0dXJuIG5vdyBpZiB0aGlzIGdldHMgYW4gZXJyb3Igb3IgYSBmaW5hbCByZXN1bHQuICAqLworCSAgICAgIGludCBuID0gZmluZF9kaWUgKGRlcHRoICsgMSwgJmNoaWxkLCBvd25lZCwgc2NvcGVzLCBza2lwKTsKKwkgICAgICBpZiAobiA8IDApCisJCXJldHVybiBuOworCSAgICAgIGlmIChuID4gMSkKKwkJeworCQkgIC8qIFdlIGhhdmUgYSB3aW5uZXIuICBDSElMRCBvd25zIHRoZSBvd25lciBvZiBPV05FRC4gICovCisJCSAgKCpzY29wZXMpW3NraXAgKyBuIC0gMV0gPSBjaGlsZDsKKwkJICByZXR1cm4gbiArIDE7CisJCX0KKwkgICAgICBpZiAobiA+IDApCS8qIG4gPT0gMSAqLworCQl7CisJCSAgLyogQ0hJTEQgaXMgdGhlIGRpcmVjdCBvd25lciBvZiBPV05FRC4gICovCisJCSAgRHdhcmZfRGllICpuc2NvcGVzID0gcmVhbGxvYyAoKnNjb3BlcywKKwkJCQkJCShza2lwICsgZGVwdGgpCisJCQkJCQkqIHNpemVvZiBuc2NvcGVzWzBdKTsKKwkJICBpZiAobnNjb3BlcyA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBmcmVlICgqc2NvcGVzKTsKKwkJICAgICAgKnNjb3BlcyA9IE5VTEw7CisJCSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9NRU0pOworCQkgICAgICByZXR1cm4gLTE7CisJCSAgICB9CisJCSAgbnNjb3Blc1tza2lwXSA9IGNoaWxkOworCQkgICpzY29wZXMgPSBuc2NvcGVzOworCQkgIHJldHVybiAyOworCQl9CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBpbXBvcnRlZDoKKwkgIHsKKwkgICAgLyogVGhpcyBpcyBpbXBvcnRzIGFub3RoZXIgY29tcGlsYXRpb24gdW5pdCB0byBhcHBlYXIKKwkgICAgICAgYXMgcGFydCBvZiB0aGlzIG9uZSwgaW5zaWRlIHRoZSBjdXJyZW50IHNjb3BlLgorCSAgICAgICBSZWN1cnNlIHRvIHNlYXJjaCB0aGUgcmVmZXJlbmNlZCB1bml0LCBidXQgd2l0aG91dAorCSAgICAgICByZWNvcmRpbmcgaXQgYXMgYW4gaW5uZXIgc2NvcGluZyBsZXZlbC4gICovCisKKwkgICAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOworCSAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHIgPSBJTlRVU0UoZHdhcmZfYXR0cikgKCZjaGlsZCwgRFdfQVRfaW1wb3J0LAorCQkJCQkJCSZhdHRyX21lbSk7CisJICAgIGlmIChJTlRVU0UoZHdhcmZfZm9ybXJlZl9kaWUpIChhdHRyLCAmY2hpbGQpICE9IE5VTEwpCisJICAgICAgeworCQlpbnQgcmVzdWx0ID0gZmluZF9kaWUgKGRlcHRoLCAmY2hpbGQsIG93bmVyLCBzY29wZXMsIHNraXApOworCQlpZiAocmVzdWx0ICE9IDApCisJCSAgcmV0dXJuIHJlc3VsdDsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorICB3aGlsZSAoSU5UVVNFKGR3YXJmX3NpYmxpbmdvZikgKCZjaGlsZCwgJmNoaWxkKSA9PSAwKTsKKworICByZXR1cm4gMDsKK30KKworCitpbnQKK2R3YXJmX2dldHNjb3BlcyAoRHdhcmZfRGllICpjdWRpZSwgRHdhcmZfQWRkciBwYywgRHdhcmZfRGllICoqc2NvcGVzKQoreworICBpZiAoY3VkaWUgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaW50IG4gPSBmaW5kX3BjICgxLCBjdWRpZSwgcGMsIHNjb3Blcyk7CisgIGlmIChsaWtlbHkgKG4gPj0gLTEpKQorICAgIC8qIFdlIGhhdmUgYW4gZXJyb3Igb3IgYSBmaW5hbCByZXN1bHQuICAqLworICAgIHJldHVybiBuOworCisgIC8qIFdlIGhhdmUgdGhlIHNjb3BlcyBvdXQgdG8gb25lIHRoYXQgaXMgYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiBhbgorICAgICBpbmxpbmVkIHN1YnJvdXRpbmUgKHVzdWFsbHkgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSwgYnV0IGNhbgorICAgICBiZSBEV19UQUdfc3VicHJvZ3JhbSBmb3IgYSBjb25jcmV0ZSBvdXQtb2YtbGluZSBpbnN0YW5jZSkuCisgICAgIE5vdyB3ZSBtdXN0IGZpbmQgdGhlIGxleGljYWwgc2NvcGVzIHRoYXQgY29udGFpbiB0aGUKKyAgICAgY29ycmVzcG9uZGluZyBhYnN0cmFjdCBpbmxpbmUgc3Vicm91dGluZSBkZWZpbml0aW9uLiAgKi8KKworICBuID0gLW4gLSAxOworCisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgRHdhcmZfRGllIGRpZV9tZW07CisgIER3YXJmX0RpZSAqb3JpZ2luID0gSU5UVVNFKGR3YXJmX2Zvcm1yZWZfZGllKQorICAgIChJTlRVU0UoZHdhcmZfYXR0cikgKCYoKnNjb3BlcylbbiAtIDFdLCBEV19BVF9hYnN0cmFjdF9vcmlnaW4sICZhdHRyX21lbSksCisgICAgICZkaWVfbWVtKTsKKyAgaWYgKHVubGlrZWx5IChvcmlnaW4gPT0gTlVMTCkpCisgICAgZ290byBpbnZhbGlkOworCisgIGludCByZXN1bHQgPSBmaW5kX2RpZSAoMCwgY3VkaWUsIG9yaWdpbiwgc2NvcGVzLCBuKTsKKyAgaWYgKGxpa2VseSAocmVzdWx0ID4gMCkpCisgICAgcmV0dXJuIG4gKyByZXN1bHQgLSAxOworCisgIGlmIChyZXN1bHQgPT0gMCkJCS8qIE5vIG1hdGNoLCBzaG91bGRuJ3QgaGFwcGVuLiAgKi8KKyAgICB7CisgICAgaW52YWxpZDoKKyAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7CisgICAgfQorCisgIGZyZWUgKCpzY29wZXMpOworICAqc2NvcGVzID0gTlVMTDsKKyAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZ2V0c2NvcGV2YXIuYyBiL2xpYmR3L2R3YXJmX2dldHNjb3BldmFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlYjI5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldHNjb3BldmFyLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qIEZpbmQgYSBuYW1lZCB2YXJpYWJsZSBvciBwYXJhbWV0ZXIgd2l0aGluIGdpdmVuIHNjb3Blcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorI2luY2x1ZGUgPGR3YXJmLmg+CisKKworLyogRmluZCB0aGUgY29udGFpbmluZyBDVSdzIGZpbGVzLiAgKi8KK3N0YXRpYyBpbnQKK2dldGZpbGVzIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfRmlsZXMgKipmaWxlcykKK3sKKyAgRHdhcmZfRGllIGN1ZGllID0KKyAgICB7CisgICAgICAuY3UgPSBkaWUtPmN1LAorICAgICAgLmFkZHIgPSAoKGNoYXIgKikgZGllLT5jdS0+ZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfaW5mb10tPmRfYnVmCisJICAgICAgICsgMyAqIGRpZS0+Y3UtPm9mZnNldF9zaXplIC0gNCArIDMpLAorICAgIH07CisgIHJldHVybiBJTlRVU0UoZHdhcmZfZ2V0c3JjZmlsZXMpICgmY3VkaWUsIGZpbGVzLCBOVUxMKTsKK30KKworLyogRmV0Y2ggYW4gYXR0cmlidXRlIHRoYXQgc2hvdWxkIGhhdmUgYSBjb25zdGFudCBpbnRlZ2VyIGZvcm0uICAqLworc3RhdGljIGludAorZ2V0YXR0ciAoRHdhcmZfRGllICpkaWUsIGludCBzZWFyY2hfbmFtZSwgRHdhcmZfV29yZCAqdmFsdWUpCit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgcmV0dXJuIElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChJTlRVU0UoZHdhcmZfYXR0cikgKGRpZSwgc2VhcmNoX25hbWUsCisJCQkJCQkgICAgICAmYXR0cl9tZW0pLCB2YWx1ZSk7Cit9CisKKy8qIFNlYXJjaCBTQ09QRVNbMC4uTlNDT1BFUy0xXSBmb3IgYSB2YXJpYWJsZSBjYWxsZWQgTkFNRS4KKyAgIElnbm9yZSB0aGUgZmlyc3QgU0tJUF9TSEFET1dTIHNjb3BlcyB0aGF0IG1hdGNoIHRoZSBuYW1lLgorICAgSWYgTUFUQ0hfRklMRSBpcyBub3QgbnVsbCwgYWNjZXB0IG9ubHkgZGVjbGFyYXRpb24gaW4gdGhhdCBzb3VyY2UgZmlsZTsKKyAgIGlmIE1BVENIX0xJTkVOTyBvciBNQVRDSF9MSU5FQ09MIGFyZSBhbHNvIG5vbnplcm8sIGFjY2VwdCBvbmx5IGRlY2xhcmF0aW9uCisgICBhdCB0aGF0IGxpbmUgYW5kIGNvbHVtbi4KKworICAgSWYgc3VjY2Vzc2Z1bCwgZmlsbCBpbiAqUkVTVUxUIHdpdGggdGhlIERJRSBvZiB0aGUgdmFyaWFibGUgZm91bmQsCisgICBhbmQgcmV0dXJuIE4gd2hlcmUgU0NPUEVTW05dIGlzIHRoZSBzY29wZSBkZWZpbmluZyB0aGUgdmFyaWFibGUuCisgICBSZXR1cm4gLTEgZm9yIGVycm9ycyBvciAtMiBmb3Igbm8gbWF0Y2hpbmcgdmFyaWFibGUgZm91bmQuICAqLworCitpbnQKK2R3YXJmX2dldHNjb3BldmFyIChEd2FyZl9EaWUgKnNjb3BlcywgaW50IG5zY29wZXMsCisJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBza2lwX3NoYWRvd3MsCisJCSAgIGNvbnN0IGNoYXIgKm1hdGNoX2ZpbGUsIGludCBtYXRjaF9saW5lbm8sIGludCBtYXRjaF9saW5lY29sLAorCQkgICBEd2FyZl9EaWUgKnJlc3VsdCkKK3sKKyAgLyogTWF0Y2ggYWdhaW5zdCB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiAgKi8KKyAgc2l6ZV90IG1hdGNoX2ZpbGVfbGVuID0gbWF0Y2hfZmlsZSA9PSBOVUxMID8gMCA6IHN0cmxlbiAobWF0Y2hfZmlsZSk7CisgIGJvb2wgbGFzdGZpbGVfbWF0Y2hlcyA9IGZhbHNlOworICBjb25zdCBjaGFyICpsYXN0ZmlsZSA9IE5VTEw7CisgIGlubGluZSBib29sIGZpbGVfbWF0Y2hlcyAoRHdhcmZfRmlsZXMgKmZpbGVzLCBzaXplX3QgaWR4KQorICAgIHsKKyAgICAgIGlmIChpZHggPj0gZmlsZXMtPm5maWxlcykKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBmaWxlcy0+aW5mb1tpZHhdLm5hbWU7CisgICAgICBpZiAoZmlsZSAhPSBsYXN0ZmlsZSkKKwl7CisJICBzaXplX3QgbGVuID0gc3RybGVuIChmaWxlKTsKKwkgIGxhc3RmaWxlX21hdGNoZXMgPSAobGVuID49IG1hdGNoX2ZpbGVfbGVuCisJCQkgICAgICAmJiAhbWVtY21wIChtYXRjaF9maWxlLCBmaWxlLCBtYXRjaF9maWxlX2xlbikKKwkJCSAgICAgICYmIChsZW4gPT0gbWF0Y2hfZmlsZV9sZW4KKwkJCQkgIHx8IGZpbGVbbGVuIC0gbWF0Y2hfZmlsZV9sZW4gLSAxXSA9PSAnLycpKTsKKwl9CisgICAgICByZXR1cm4gbGFzdGZpbGVfbWF0Y2hlczsKKyAgICB9CisKKyAgLyogU3RhcnQgd2l0aCB0aGUgaW5uZXJtb3N0IHNjb3BlIGFuZCBtb3ZlIG91dC4gICovCisgIGZvciAoaW50IG91dCA9IDA7IG91dCA8IG5zY29wZXM7ICsrb3V0KQorICAgIGlmIChJTlRVU0UoZHdhcmZfaGFzY2hpbGRyZW4pICgmc2NvcGVzW291dF0pKQorICAgICAgeworCWlmIChJTlRVU0UoZHdhcmZfY2hpbGQpICgmc2NvcGVzW291dF0sIHJlc3VsdCkgIT0gMCkKKwkgIHJldHVybiAtMTsKKwlkbworCSAgeworCSAgICBzd2l0Y2ggKElOVFVTRShkd2FyZl90YWcpIChyZXN1bHQpKQorCSAgICAgIHsKKwkgICAgICBjYXNlIERXX1RBR192YXJpYWJsZToKKwkgICAgICBjYXNlIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyOgorCQlicmVhazsKKworCSAgICAgIGRlZmF1bHQ6CisJCWNvbnRpbnVlOworCSAgICAgIH0KKworCSAgICAvKiBPbmx5IGdldCBoZXJlIGZvciBhIHZhcmlhYmxlIG9yIHBhcmFtZXRlci4gIENoZWNrIHRoZSBuYW1lLiAgKi8KKwkgICAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOworCSAgICBjb25zdCBjaGFyICpkaWVuYW1lID0gSU5UVVNFKGR3YXJmX2Zvcm1zdHJpbmcpCisJICAgICAgKElOVFVTRShkd2FyZl9hdHRyX2ludGVncmF0ZSkgKHJlc3VsdCwgRFdfQVRfbmFtZSwgJmF0dHJfbWVtKSk7CisJICAgIGlmIChkaWVuYW1lICE9IE5VTEwgJiYgIXN0cmNtcCAobmFtZSwgZGllbmFtZSkpCisJICAgICAgeworCQkvKiBXZSBoYXZlIGEgbWF0Y2hpbmcgbmFtZS4gICovCisKKwkJaWYgKHNraXBfc2hhZG93cyA+IDApCisJCSAgeworCQkgICAgLyogUHVudCB0aGlzIHNjb3BlIGZvciB0aGUgb25lIGl0IHNoYWRvd3MuICAqLworCQkgICAgLS1za2lwX3NoYWRvd3M7CisJCSAgICBicmVhazsKKwkJICB9CisKKwkJaWYgKG1hdGNoX2ZpbGUgIT0gTlVMTCkKKwkJICB7CisJCSAgICAvKiBDaGVjayBpdHMgZGVjbF9maWxlLiAgKi8KKworCQkgICAgRHdhcmZfV29yZCBpOworCQkgICAgRHdhcmZfRmlsZXMgKmZpbGVzOworCQkgICAgaWYgKGdldGF0dHIgKHJlc3VsdCwgRFdfQVRfZGVjbF9maWxlLCAmaSkgIT0gMAorCQkJfHwgZ2V0ZmlsZXMgKCZzY29wZXNbb3V0XSwgJmZpbGVzKSAhPSAwKQorCQkgICAgICBicmVhazsKKworCQkgICAgaWYgKCFmaWxlX21hdGNoZXMgKGZpbGVzLCBpKSkKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGlmIChtYXRjaF9saW5lbm8gPiAwCisJCQkmJiAoZ2V0YXR0ciAocmVzdWx0LCBEV19BVF9kZWNsX2xpbmUsICZpKSAhPSAwCisJCQkgICAgfHwgKGludCkgaSAhPSBtYXRjaF9saW5lbm8pKQorCQkgICAgICBicmVhazsKKwkJICAgIGlmIChtYXRjaF9saW5lY29sID4gMAorCQkJJiYgKGdldGF0dHIgKHJlc3VsdCwgRFdfQVRfZGVjbF9jb2x1bW4sICZpKSAhPSAwCisJCQkgICAgfHwgKGludCkgaSAhPSBtYXRjaF9saW5lY29sKSkKKwkJICAgICAgYnJlYWs7CisJCSAgfQorCisJCS8qIFdlIGhhdmUgYSB3aW5uZXIhICAqLworCQlyZXR1cm4gb3V0OworCSAgICAgIH0KKwkgIH0KKwl3aGlsZSAoSU5UVVNFKGR3YXJmX3NpYmxpbmdvZikgKHJlc3VsdCwgcmVzdWx0KSA9PSAwKTsKKyAgICAgIH0KKworICByZXR1cm4gLTI7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9nZXRzcmNfZGllLmMgYi9saWJkdy9kd2FyZl9nZXRzcmNfZGllLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjZTRmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldHNyY19kaWUuYwpAQCAtMCwwICsxLDU4IEBACisvKiBGaW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIGFkZHJlc3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworCitEd2FyZl9MaW5lICoKK2R3YXJmX2dldHNyY19kaWUgKER3YXJmX0RpZSAqY3VkaWUsIER3YXJmX0FkZHIgYWRkcikKK3sKKyAgRHdhcmZfTGluZXMgKmxpbmVzOworICBzaXplX3QgbmxpbmVzOworCisgIGlmIChJTlRVU0UoZHdhcmZfZ2V0c3JjbGluZXMpIChjdWRpZSwgJmxpbmVzLCAmbmxpbmVzKSAhPSAwKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFRoZSBsaW5lcyBhcmUgc29ydGVkIGJ5IGFkZHJlc3MsIHNvIHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaC4gICovCisgIHNpemVfdCBsID0gMCwgdSA9IG5saW5lczsKKyAgd2hpbGUgKGwgPCB1KQorICAgIHsKKyAgICAgIHNpemVfdCBpZHggPSAobCArIHUpIC8gMjsKKyAgICAgIGlmIChhZGRyIDwgbGluZXMtPmluZm9baWR4XS5hZGRyKQorCXUgPSBpZHg7CisgICAgICBlbHNlIGlmIChhZGRyID4gbGluZXMtPmluZm9baWR4XS5hZGRyKQorCWwgPSBpZHggKyAxOworICAgICAgZWxzZQorCXJldHVybiAmbGluZXMtPmluZm9baWR4XTsKKyAgICB9CisKKyAgaWYgKG5saW5lcyA+IDApCisgICAgYXNzZXJ0IChsaW5lcy0+aW5mb1tubGluZXMgLSAxXS5lbmRfc2VxdWVuY2UpOworCisgIC8qIElmIG5vbmUgd2VyZSBlcXVhbCwgdGhlIGNsb3Nlc3Qgb25lIGJlbG93IGlzIHdoYXQgd2Ugd2FudC4gIFdlCisgICAgIG5ldmVyIHdhbnQgdGhlIGxhc3Qgb25lLCBiZWNhdXNlIGl0J3MgdGhlIGVuZC1zZXF1ZW5jZSBtYXJrZXIKKyAgICAgd2l0aCBhbiBhZGRyZXNzIGF0IHRoZSBoaWdoIGJvdW5kIG9mIHRoZSBDVSdzIGNvZGUuICBJZiB0aGUgZGVidWcKKyAgICAgaW5mb3JtYXRpb24gaXMgZmF1bHR5IGFuZCBubyBlbmQtc2VxdWVuY2UgbWFya2VyIGlzIHByZXNlbnQsIHdlCisgICAgIHN0aWxsIGlnbm9yZSBpdC4gICovCisgIGlmICh1ID4gMCAmJiB1IDwgbmxpbmVzICYmIGFkZHIgPiBsaW5lcy0+aW5mb1t1IC0gMV0uYWRkcikKKyAgICByZXR1cm4gJmxpbmVzLT5pbmZvW3UgLSAxXTsKKworICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0FERFJfT1VUT0ZSQU5HRSk7CisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfZ2V0c3JjX2ZpbGUuYyBiL2xpYmR3L2R3YXJmX2dldHNyY19maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwNTgxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldHNyY19maWxlLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qIEZpbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgZ2l2ZW4gZmlsZS9saW5lL2NvbHVtbiB0cmlwbGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK2ludAorZHdhcmZfZ2V0c3JjX2ZpbGUgKER3YXJmICpkYmcsIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbGluZW5vLCBpbnQgY29sdW1uLAorCQkgICBEd2FyZl9MaW5lICoqKnNyY3NwLCBzaXplX3QgKm5zcmNzKQoreworICBpZiAoZGJnID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGJvb2wgaXNfYmFzZW5hbWUgPSBzdHJjaHIgKGZuYW1lLCAnLycpID09IE5VTEw7CisKKyAgc2l6ZV90IG1heF9tYXRjaCA9ICpuc3JjcyA/OiB+MHU7CisgIHNpemVfdCBhY3RfbWF0Y2ggPSAqbnNyY3M7CisgIHNpemVfdCBjdXJfbWF0Y2ggPSAwOworICBEd2FyZl9MaW5lICoqbWF0Y2ggPSAqbnNyY3MgPT0gMCA/IE5VTEwgOiAqc3Jjc3A7CisKKyAgRHdhcmZfT2ZmIG9mZiA9IDA7CisgIHNpemVfdCBjdWhsOworICBEd2FyZl9PZmYgbm9mZjsKKworICB3aGlsZSAoSU5UVVNFKGR3YXJmX25leHRjdSkgKGRiZywgb2ZmLCAmbm9mZiwgJmN1aGwsIE5VTEwsIE5VTEwsIE5VTEwpID09IDApCisgICAgeworICAgICAgRHdhcmZfRGllIGN1ZGllX21lbTsKKyAgICAgIER3YXJmX0RpZSAqY3VkaWUgPSBJTlRVU0UoZHdhcmZfb2ZmZGllKSAoZGJnLCBvZmYgKyBjdWhsLCAmY3VkaWVfbWVtKTsKKyAgICAgIGlmIChjdWRpZSA9PSBOVUxMKQorCWNvbnRpbnVlOworCisgICAgICAvKiBHZXQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGZpbGUuICAqLworICAgICAgRHdhcmZfTGluZXMgKmxpbmVzOworICAgICAgc2l6ZV90IG5saW5lczsKKyAgICAgIGlmIChJTlRVU0UoZHdhcmZfZ2V0c3JjbGluZXMpIChjdWRpZSwgJmxpbmVzLCAmbmxpbmVzKSAhPSAwKQorCXJldHVybiAtMTsKKworICAgICAgLyogU2VhcmNoIHRocm91Z2ggYWxsIHRoZSBsaW5lIG51bWJlciByZWNvcmRzIGZvciBhIG1hdGNoaW5nCisJIGZpbGUgYW5kIGxpbmUvY29sdW1uIG51bWJlci4gIElmIGFueSBvZiB0aGUgbnVtYmVycyBpcyB6ZXJvLAorCSBubyBtYXRjaCBpcyBwZXJmb3JtZWQuICAqLworICAgICAgdW5zaWduZWQgaW50IGxhc3RmaWxlID0gVUlOVF9NQVg7CisgICAgICBib29sIGxhc3RtYXRjaCA9IGZhbHNlOworICAgICAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbmxpbmVzOyArK2NudCkKKwl7CisJICBEd2FyZl9MaW5lICpsaW5lID0gJmxpbmVzLT5pbmZvW2NudF07CisKKwkgIGlmIChsYXN0ZmlsZSAhPSBsaW5lLT5maWxlKQorCSAgICB7CisJICAgICAgbGFzdGZpbGUgPSBsaW5lLT5maWxlOworCSAgICAgIGlmIChsYXN0ZmlsZSA+PSBsaW5lLT5maWxlcy0+bmZpbGVzKQorCQl7CisJCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKKwkJICByZXR1cm4gLTE7CisJCX0KKworCSAgICAgIC8qIE1hdGNoIHRoZSBuYW1lIHdpdGggdGhlIG5hbWUgdGhlIHVzZXIgcHJvdmlkZWQuICAqLworCSAgICAgIGNvbnN0IGNoYXIgKmZuYW1lMiA9IGxpbmUtPmZpbGVzLT5pbmZvW2xhc3RmaWxlXS5uYW1lOworCSAgICAgIGlmIChpc19iYXNlbmFtZSkKKwkJbGFzdG1hdGNoID0gc3RyY21wIChiYXNlbmFtZSAoZm5hbWUyKSwgZm5hbWUpID09IDA7CisJICAgICAgZWxzZQorCQlsYXN0bWF0Y2ggPSBzdHJjbXAgKGZuYW1lMiwgZm5hbWUpID09IDA7CisJICAgIH0KKwkgIGlmICghbGFzdG1hdGNoKQorCSAgICBjb250aW51ZTsKKworCSAgLyogU2VlIHdoZXRoZXIgbGluZSBhbmQgcG9zc2libHkgY29sdW1uIG1hdGNoLiAgKi8KKwkgIGlmIChsaW5lbm8gIT0gMAorCSAgICAgICYmIChsaW5lbm8gPiBsaW5lLT5saW5lCisJCSAgfHwgKGNvbHVtbiAhPSAwICYmIGNvbHVtbiA+IGxpbmUtPmNvbHVtbikpKQorCSAgICAvKiBDYW5ub3QgbWF0Y2guICAqLworCSAgICBjb250aW51ZTsKKworCSAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyB0aGUgYmVzdCBtYXRjaCBzbyBmYXIuICAqLworCSAgc2l6ZV90IGlubmVyOworCSAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgY3VyX21hdGNoOyArK2lubmVyKQorCSAgICBpZiAobWF0Y2hbaW5uZXJdLT5maWxlcyA9PSBsaW5lLT5maWxlcworCQkmJiBtYXRjaFtpbm5lcl0tPmZpbGUgPT0gbGluZS0+ZmlsZSkKKwkgICAgICBicmVhazsKKwkgIGlmIChpbm5lciA8IGN1cl9tYXRjaAorCSAgICAgICYmIChtYXRjaFtpbm5lcl0tPmxpbmUgIT0gbGluZS0+bGluZQorCQkgIHx8IG1hdGNoW2lubmVyXS0+bGluZSAhPSBsaW5lbm8KKwkJICB8fCAoY29sdW1uICE9IDAKKwkJICAgICAgJiYgKG1hdGNoW2lubmVyXS0+Y29sdW1uICE9IGxpbmUtPmNvbHVtbgorCQkJICB8fCBtYXRjaFtpbm5lcl0tPmNvbHVtbiAhPSBjb2x1bW4pKSkpCisJICAgIHsKKwkgICAgICAvKiBXZSBrbm93IGFib3V0IHRoaXMgZmlsZSBhbHJlYWR5LiAgSWYgdGhpcyBpcyBhIGJldHRlcgorCQkgbWF0Y2ggZm9yIHRoZSBsaW5lIG51bWJlciwgdXNlIGl0LiAgKi8KKwkgICAgICBpZiAobWF0Y2hbaW5uZXJdLT5saW5lID49IGxpbmUtPmxpbmUKKwkJICAmJiAobWF0Y2hbaW5uZXJdLT5saW5lICE9IGxpbmUtPmxpbmUKKwkJICAgICAgfHwgbWF0Y2hbaW5uZXJdLT5jb2x1bW4gPj0gbGluZS0+Y29sdW1uKSkKKwkJLyogIFVzZSB0aGUgbmV3IGxpbmUuICBPdGhlcndpc2UgdGhlIG9sZCBvbmUuICAqLworCQltYXRjaFtpbm5lcl0gPSBsaW5lOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGlmIChjdXJfbWF0Y2ggPCBtYXhfbWF0Y2gpCisJICAgIHsKKwkgICAgICBpZiAoY3VyX21hdGNoID09IGFjdF9tYXRjaCkKKwkJeworCQkgIC8qIEVubGFyZ2UgdGhlIGFycmF5IGZvciB0aGUgcmVzdWx0cy4gICovCisJCSAgYWN0X21hdGNoICs9IDEwOworCQkgIER3YXJmX0xpbmUgKipuZXdwID0gcmVhbGxvYyAobWF0Y2gsCisJCQkJCSAgICAgICBhY3RfbWF0Y2gKKwkJCQkJICAgICAgICogc2l6ZW9mIChEd2FyZl9MaW5lICopKTsKKwkJICBpZiAobmV3cCA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBmcmVlIChtYXRjaCk7CisJCSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9NRU0pOworCQkgICAgICByZXR1cm4gLTE7CisJCSAgICB9CisJCSAgbWF0Y2ggPSBuZXdwOworCQl9CisKKwkgICAgICBtYXRjaFtjdXJfbWF0Y2grK10gPSBsaW5lOworCSAgICB9CisJfQorCisgICAgICAvKiBJZiB3ZSBtYW5hZ2VkIHRvIGZpbmQgYXMgbWFueSBtYXRjaGVzIGFzIHRoZSB1c2VyIHJlcXVlc3RlZAorCSBhbHJlYWR5LCB0aGVyZSBpcyBubyBuZWVkIHRvIGdvIG9uIHRvIHRoZSBuZXh0IENVLiAgKi8KKyAgICAgIGlmIChjdXJfbWF0Y2ggPT0gbWF4X21hdGNoKQorCWJyZWFrOworCisgICAgICBvZmYgPSBub2ZmOworICAgIH0KKworICBpZiAoY3VyX21hdGNoID4gMCkKKyAgICB7CisgICAgICBhc3NlcnQgKCpuc3JjcyA9PSAwIHx8ICpzcmNzcCA9PSBtYXRjaCk7CisKKyAgICAgICpuc3JjcyA9IGN1cl9tYXRjaDsKKyAgICAgICpzcmNzcCA9IG1hdGNoOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19NQVRDSCk7CisgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2dldHNyY2ZpbGVzLmMgYi9saWJkdy9kd2FyZl9nZXRzcmNmaWxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzJiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9nZXRzcmNmaWxlcy5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIFJldHVybiBzb3VyY2UgZmlsZSBpbmZvcm1hdGlvbiBvZiBDVS4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9nZXRzcmNmaWxlcyAoRHdhcmZfRGllICpjdWRpZSwgRHdhcmZfRmlsZXMgKipmaWxlcywgc2l6ZV90ICpuZmlsZXMpCit7CisgIGlmICh1bmxpa2VseSAoY3VkaWUgPT0gTlVMTAorCQl8fCBJTlRVU0UoZHdhcmZfdGFnKSAoY3VkaWUpICE9IERXX1RBR19jb21waWxlX3VuaXQpKQorICAgIHJldHVybiAtMTsKKworICBpbnQgcmVzID0gLTE7CisKKyAgLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBpZiBpdCBpcyBub3QgYWxyZWFkeSBrbm93bi4gICovCisgIHN0cnVjdCBEd2FyZl9DVSAqY29uc3QgY3UgPSBjdWRpZS0+Y3U7CisgIGlmIChjdS0+bGluZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBEd2FyZl9MaW5lcyAqbGluZXM7CisgICAgICBzaXplX3QgbmxpbmVzOworCisgICAgICAvKiBMZXQgdGhlIG1vcmUgZ2VuZXJpYyBmdW5jdGlvbiBkbyB0aGUgd29yay4gIEl0J2xsIGNyZWF0ZSBtb3JlCisJIGRhdGEgYnV0IHRoYXQgd2lsbCBiZSBuZWVkZWQgaW4gYW4gcmVhbCBwcm9ncmFtIGFueXdheS4gICovCisgICAgICByZXMgPSBJTlRVU0UoZHdhcmZfZ2V0c3JjbGluZXMpIChjdWRpZSwgJmxpbmVzLCAmbmxpbmVzKTsKKyAgICB9CisgIGVsc2UgaWYgKGN1LT5maWxlcyAhPSAodm9pZCAqKSAtMWwpCisgICAgLyogV2UgYWxyZWFkeSBoYXZlIHRoZSBpbmZvcm1hdGlvbi4gICovCisgICAgcmVzID0gMDsKKworICBpZiAobGlrZWx5IChyZXMgPT0gMCkpCisgICAgeworICAgICAgYXNzZXJ0IChjdS0+ZmlsZXMgIT0gTlVMTCAmJiBjdS0+ZmlsZXMgIT0gKHZvaWQgKikgLTFsKTsKKyAgICAgICpmaWxlcyA9IGN1LT5maWxlczsKKyAgICAgIGlmIChuZmlsZXMgIT0gTlVMTCkKKwkqbmZpbGVzID0gY3UtPmZpbGVzLT5uZmlsZXM7CisgICAgfQorCisgIC8vIFhYWCBFdmVudHVhbGx5OiB1bmxvY2tpbmcgaGVyZS4KKworICByZXR1cm4gcmVzOworfQorSU5UREVGIChkd2FyZl9nZXRzcmNmaWxlcykKZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2dldHNyY2xpbmVzLmMgYi9saWJkdy9kd2FyZl9nZXRzcmNsaW5lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTE0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9nZXRzcmNsaW5lcy5jCkBAIC0wLDAgKzEsNjUyIEBACisvKiBSZXR1cm4gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gb2YgQ1UuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkd2FyZi5oIgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK3N0cnVjdCBmaWxlbGlzdAoreworICBEd2FyZl9GaWxlaW5mbyBpbmZvOworICBzdHJ1Y3QgZmlsZWxpc3QgKm5leHQ7Cit9OworCitzdHJ1Y3QgbGluZWxpc3QKK3sKKyAgRHdhcmZfTGluZSBsaW5lOworICBzdHJ1Y3QgbGluZWxpc3QgKm5leHQ7Cit9OworCisKKy8qIENvbXBhcmUgYnkgRHdhcmZfTGluZS5hZGRyLCBnaXZlbiBwb2ludGVycyBpbnRvIGFuIGFycmF5IG9mIHBvaW50ZXJzLiAgKi8KK3N0YXRpYyBpbnQKK2NvbXBhcmVfbGluZXMgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgIER3YXJmX0xpbmUgKmNvbnN0ICpwMSA9IGE7CisgIER3YXJmX0xpbmUgKmNvbnN0ICpwMiA9IGI7CisKKyAgcmV0dXJuICgqcDEpLT5hZGRyIC0gKCpwMiktPmFkZHI7Cit9CisKKworLyogQWRkcyBhIG5ldyBsaW5lIHRvIHRoZSBtYXRyaXguICBXZSBjYW5ub3QgZGVmaW5lIGEgZnVuY3Rpb24gYmVjYXVzZQorICAgd2Ugd2FudCB0byB1c2UgYWxsb2NhLiAgKi8KKyNkZWZpbmUgTkVXX0xJTkUoZW5kX3NlcSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIC8qIEFkZCB0aGUgbmV3IGxpbmUuICAqLwkJCQkJCSAgICAgIFwKKyAgICBuZXdfbGluZSA9IChzdHJ1Y3QgbGluZWxpc3QgKikgYWxsb2NhIChzaXplb2YgKHN0cnVjdCBsaW5lbGlzdCkpOwkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgLyogU2V0IHRoZSBsaW5lIGluZm9ybWF0aW9uLiAgKi8JCQkJCSAgICAgIFwKKyAgICBuZXdfbGluZS0+bGluZS5hZGRyID0gYWRkcmVzczsJCQkJCSAgICAgIFwKKyAgICBuZXdfbGluZS0+bGluZS5maWxlID0gZmlsZTsJCQkJCQkgICAgICBcCisgICAgbmV3X2xpbmUtPmxpbmUubGluZSA9IGxpbmU7CQkJCQkJICAgICAgXAorICAgIG5ld19saW5lLT5saW5lLmNvbHVtbiA9IGNvbHVtbjsJCQkJCSAgICAgIFwKKyAgICBuZXdfbGluZS0+bGluZS5pc19zdG10ID0gaXNfc3RtdDsJCQkJCSAgICAgIFwKKyAgICBuZXdfbGluZS0+bGluZS5iYXNpY19ibG9jayA9IGJhc2ljX2Jsb2NrOwkJCQkgICAgICBcCisgICAgbmV3X2xpbmUtPmxpbmUuZW5kX3NlcXVlbmNlID0gZW5kX3NlcTsJCQkJICAgICAgXAorICAgIG5ld19saW5lLT5saW5lLnByb2xvZ3VlX2VuZCA9IHByb2xvZ3VlX2VuZDsJCQkJICAgICAgXAorICAgIG5ld19saW5lLT5saW5lLmVwaWxvZ3VlX2JlZ2luID0gZXBpbG9ndWVfYmVnaW47CQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICAgIG5ld19saW5lLT5uZXh0ID0gbGluZWxpc3Q7CQkJCQkJICAgICAgXAorICAgIGxpbmVsaXN0ID0gbmV3X2xpbmU7CQkJCQkJICAgICAgXAorICAgICsrbmxpbmVsaXN0OwkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworaW50Citkd2FyZl9nZXRzcmNsaW5lcyAoRHdhcmZfRGllICpjdWRpZSwgRHdhcmZfTGluZXMgKipsaW5lcywgc2l6ZV90ICpubGluZXMpCit7CisgIGlmICh1bmxpa2VseSAoY3VkaWUgPT0gTlVMTAorCQl8fCBJTlRVU0UoZHdhcmZfdGFnKSAoY3VkaWUpICE9IERXX1RBR19jb21waWxlX3VuaXQpKQorICAgIHJldHVybiAtMTsKKworICBpbnQgcmVzID0gLTE7CisKKyAgLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBpZiBpdCBpcyBub3QgYWxyZWFkeSBrbm93bi4gICovCisgIHN0cnVjdCBEd2FyZl9DVSAqY29uc3QgY3UgPSBjdWRpZS0+Y3U7CisgIGlmIChjdS0+bGluZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBGYWlsc2FmZSBtb2RlOiBubyBkYXRhIGZvdW5kLiAgKi8KKyAgICAgIGN1LT5saW5lcyA9ICh2b2lkICopIC0xbDsKKyAgICAgIGN1LT5maWxlcyA9ICh2b2lkICopIC0xbDsKKworICAgICAgLyogVGhlIGRpZSBtdXN0IGhhdmUgYSBzdGF0ZW1lbnQgbGlzdCBhc3NvY2lhdGVkLiAgKi8KKyAgICAgIER3YXJmX0F0dHJpYnV0ZSBzdG10X2xpc3RfbWVtOworICAgICAgRHdhcmZfQXR0cmlidXRlICpzdG10X2xpc3QgPSBJTlRVU0UoZHdhcmZfYXR0cikgKGN1ZGllLCBEV19BVF9zdG10X2xpc3QsCisJCQkJCQkgICAgICAgJnN0bXRfbGlzdF9tZW0pOworCisgICAgICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZGVidWdfbGluZSBzZWN0aW9uLiAgTkI6IHRoaXMgY2FsbAorCSBhbHNvIGNoZWNrcyB3aGV0aGVyIHRoZSBwcmV2aW91cyBkd2FyZl9hdHRyIGNhbGwgZmFpbGVkLiAgKi8KKyAgICAgIER3YXJmX1dvcmQgb2Zmc2V0OworICAgICAgaWYgKElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChzdG10X2xpc3QsICZvZmZzZXQpICE9IDApCisJZ290byBvdXQ7CisKKyAgICAgIER3YXJmICpkYmcgPSBjdS0+ZGJnOworICAgICAgaWYgKGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2xpbmVdID09IE5VTEwpCisJeworCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19ERUJVR19MSU5FKTsKKwkgIGdvdG8gb3V0OworCX0KKyAgICAgIGNvbnN0IHVpbnQ4X3QgKmxpbmVwID0gZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfbGluZV0tPmRfYnVmICsgb2Zmc2V0OworICAgICAgY29uc3QgdWludDhfdCAqbGluZWVuZHAgPSAoZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfbGluZV0tPmRfYnVmCisJCQkJICsgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfbGluZV0tPmRfc2l6ZSk7CisKKyAgICAgIC8qIEdldCB0aGUgY29tcGlsYXRpb24gZGlyZWN0b3J5LiAgKi8KKyAgICAgIER3YXJmX0F0dHJpYnV0ZSBjb21wZGlyX2F0dHJfbWVtOworICAgICAgRHdhcmZfQXR0cmlidXRlICpjb21wZGlyX2F0dHIgPSBJTlRVU0UoZHdhcmZfYXR0cikgKGN1ZGllLAorCQkJCQkJCSAgRFdfQVRfY29tcF9kaXIsCisJCQkJCQkJICAmY29tcGRpcl9hdHRyX21lbSk7CisgICAgICBjb25zdCBjaGFyICpjb21wX2RpciA9IElOVFVTRShkd2FyZl9mb3Jtc3RyaW5nKSAoY29tcGRpcl9hdHRyKTsKKworICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCArIDQgPiBsaW5lZW5kcCkpCisJeworCWludmFsaWRfZGF0YToKKwkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9ERUJVR19MSU5FKTsKKwkgIGdvdG8gb3V0OworCX0KKyAgICAgIER3YXJmX1dvcmQgdW5pdF9sZW5ndGggPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKKyAgICAgIHVuc2lnbmVkIGludCBsZW5ndGggPSA0OworICAgICAgaWYgKHVubGlrZWx5ICh1bml0X2xlbmd0aCA9PSAweGZmZmZmZmZmKSkKKwl7CisJICBpZiAodW5saWtlbHkgKGxpbmVwICsgOCA+IGxpbmVlbmRwKSkKKwkgICAgZ290byBpbnZhbGlkX2RhdGE7CisJICB1bml0X2xlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgbGluZXApOworCSAgbGVuZ3RoID0gODsKKwl9CisKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBlbm91Z2ggcm9vbSBpbiB0aGUgc2VjdGlvbi4gICovCisgICAgICBpZiAodW5pdF9sZW5ndGggPCAyICsgbGVuZ3RoICsgNSAqIDEKKwkgIHx8IHVubGlrZWx5IChsaW5lcCArIHVuaXRfbGVuZ3RoID4gbGluZWVuZHApKQorCWdvdG8gaW52YWxpZF9kYXRhOworICAgICAgbGluZWVuZHAgPSBsaW5lcCArIHVuaXRfbGVuZ3RoOworCisgICAgICAvKiBUaGUgbmV4dCBlbGVtZW50IG9mIHRoZSBoZWFkZXIgaXMgdGhlIHZlcnNpb24gaWRlbnRpZmllci4gICovCisgICAgICB1aW50X2Zhc3QxNl90IHZlcnNpb24gPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKKyAgICAgIGlmICh1bmxpa2VseSAodmVyc2lvbiAhPSBEV0FSRl9WRVJTSU9OKSkKKwl7CisJICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX1ZFUlNJT04pOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAvKiBOZXh0IGNvbWVzIHRoZSBoZWFkZXIgbGVuZ3RoLiAgKi8KKyAgICAgIER3YXJmX1dvcmQgaGVhZGVyX2xlbmd0aDsKKyAgICAgIGlmIChsZW5ndGggPT0gNCkKKwloZWFkZXJfbGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7CisgICAgICBlbHNlCisJaGVhZGVyX2xlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgbGluZXApOworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZGVyX3N0YXJ0ID0gbGluZXA7CisKKyAgICAgIC8qIE5leHQgdGhlIG1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoLiAgKi8KKyAgICAgIHVpbnRfZmFzdDhfdCBtaW5pbXVtX2luc3RyX2xlbiA9ICpsaW5lcCsrOworCisgICAgICAgIC8qIFRoZW4gdGhlIGZsYWcgZGV0ZXJtaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGlzX3N0bXQKKwkgICByZWdpc3Rlci4gICovCisgICAgICB1aW50X2Zhc3Q4X3QgZGVmYXVsdF9pc19zdG10ID0gKmxpbmVwKys7CisKKyAgICAgIC8qIE5vdyB0aGUgbGluZSBiYXNlLiAgKi8KKyAgICAgIGludF9mYXN0OF90IGxpbmVfYmFzZSA9ICooKGludF9mYXN0OF90ICopIGxpbmVwKTsKKyAgICAgICsrbGluZXA7CisKKyAgICAgIC8qIEFuZCB0aGUgbGluZSByYW5nZS4gICovCisgICAgICB1aW50X2Zhc3Q4X3QgbGluZV9yYW5nZSA9ICpsaW5lcCsrOworCisgICAgICAvKiBUaGUgb3Bjb2RlIGJhc2UuICAqLworICAgICAgdWludF9mYXN0OF90IG9wY29kZV9iYXNlID0gKmxpbmVwKys7CisKKyAgICAgIC8qIFJlbWVtYmVyIGFycmF5IHdpdGggdGhlIHN0YW5kYXJkIG9wY29kZSBsZW5ndGggKC0xIHRvIGFjY291bnQgZm9yCisJIHRoZSBvcGNvZGUgd2l0aCB2YWx1ZSB6ZXJvIG5vdCBiZWluZyBtZW50aW9uZWQpLiAgKi8KKyAgICAgIGNvbnN0IHVpbnQ4X3QgKnN0YW5kYXJkX29wY29kZV9sZW5ndGhzID0gbGluZXAgLSAxOworICAgICAgbGluZXAgKz0gb3Bjb2RlX2Jhc2UgLSAxOworICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCA+PSBsaW5lZW5kcCkpCisJZ290byBpbnZhbGlkX2RhdGE7CisKKyAgICAgIC8qIEZpcnN0IGNvbWVzIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzLiAgQWRkIHRoZSBjb21waWxhdGlvbgorCSBkaXJlY3RvcnkgZmlyc3Qgc2luY2UgdGhlIGluZGV4IHplcm8gaXMgdXNlZCBmb3IgaXQuICAqLworICAgICAgc3RydWN0IGRpcmxpc3QKKyAgICAgIHsKKwljb25zdCBjaGFyICpkaXI7CisJc2l6ZV90IGxlbjsKKwlzdHJ1Y3QgZGlybGlzdCAqbmV4dDsKKyAgICAgIH0gY29tcF9kaXJfZWxlbSA9CisJeworCSAgLmRpciA9IGNvbXBfZGlyLAorCSAgLmxlbiA9IGNvbXBfZGlyID8gc3RybGVuIChjb21wX2RpcikgOiAwLAorCSAgLm5leHQgPSBOVUxMCisJfTsKKyAgICAgIHN0cnVjdCBkaXJsaXN0ICpkaXJsaXN0ID0gJmNvbXBfZGlyX2VsZW07CisgICAgICB1bnNpZ25lZCBpbnQgbmRpcmxpc3QgPSAxOworCisgICAgICAvLyBYWFggRGlyZWN0bHkgY29uc3RydWN0IGFycmF5IHRvIGNvbnNlcnZlIG1lbW9yeT8KKyAgICAgIHdoaWxlICgqbGluZXAgIT0gMCkKKwl7CisJICBzdHJ1Y3QgZGlybGlzdCAqbmV3X2RpciA9CisJICAgIChzdHJ1Y3QgZGlybGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoKm5ld19kaXIpKTsKKworCSAgbmV3X2Rpci0+ZGlyID0gKGNoYXIgKikgbGluZXA7CisJICB1aW50OF90ICplbmRwID0gbWVtY2hyIChsaW5lcCwgJ1wwJywgbGluZWVuZHAgLSBsaW5lcCk7CisJICBpZiAoZW5kcCA9PSBOVUxMKQorCSAgICBnb3RvIGludmFsaWRfZGF0YTsKKwkgIG5ld19kaXItPmxlbiA9IGVuZHAgLSBsaW5lcDsKKwkgIG5ld19kaXItPm5leHQgPSBkaXJsaXN0OworCSAgZGlybGlzdCA9IG5ld19kaXI7CisJICArK25kaXJsaXN0OworCSAgbGluZXAgPSBlbmRwICsgMTsKKwl9CisgICAgICAvKiBTa2lwIHRoZSBmaW5hbCBOVUwgYnl0ZS4gICovCisgICAgICArK2xpbmVwOworCisgICAgICAvKiBSZWFycmFuZ2UgdGhlIGxpc3QgaW4gYXJyYXkgZm9ybS4gICovCisgICAgICBzdHJ1Y3QgZGlybGlzdCAqKmRpcmFycmF5CisJPSAoc3RydWN0IGRpcmxpc3QgKiopIGFsbG9jYSAobmRpcmxpc3QgKiBzaXplb2YgKCpkaXJhcnJheSkpOworICAgICAgd2hpbGUgKG5kaXJsaXN0LS0gPiAwKQorCXsKKwkgIGRpcmFycmF5W25kaXJsaXN0XSA9IGRpcmxpc3Q7CisJICBkaXJsaXN0ID0gZGlybGlzdC0+bmV4dDsKKwl9CisKKyAgICAgICAgLyogTm93IHJlYWQgdGhlIGZpbGVzLiAgKi8KKyAgICAgIHN0cnVjdCBmaWxlbGlzdCBudWxsX2ZpbGUgPQorCXsKKwkgIC5pbmZvID0KKwkgIHsKKwkgICAgLm5hbWUgPSAiPz8/IiwKKwkgICAgLm10aW1lID0gMCwKKwkgICAgLmxlbmd0aCA9IDAKKwkgIH0sCisJICAubmV4dCA9IE5VTEwKKwl9OworICAgICAgc3RydWN0IGZpbGVsaXN0ICpmaWxlbGlzdCA9ICZudWxsX2ZpbGU7CisgICAgICB1bnNpZ25lZCBpbnQgbmZpbGVsaXN0ID0gMTsKKworICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCA+PSBsaW5lZW5kcCkpCisJZ290byBpbnZhbGlkX2RhdGE7CisgICAgICB3aGlsZSAoKmxpbmVwICE9IDApCisJeworCSAgc3RydWN0IGZpbGVsaXN0ICpuZXdfZmlsZSA9CisJICAgIChzdHJ1Y3QgZmlsZWxpc3QgKikgYWxsb2NhIChzaXplb2YgKCpuZXdfZmlsZSkpOworCisJICAvKiBGaXJzdCBjb21lcyB0aGUgZmlsZSBuYW1lLiAgKi8KKwkgIGNoYXIgKmZuYW1lID0gKGNoYXIgKikgbGluZXA7CisJICB1aW50OF90ICplbmRwID0gbWVtY2hyIChmbmFtZSwgJ1wwJywgbGluZWVuZHAgLSBsaW5lcCk7CisJICBpZiAoZW5kcCA9PSBOVUxMKQorCSAgICBnb3RvIGludmFsaWRfZGF0YTsKKwkgIHNpemVfdCBmbmFtZWxlbiA9IGVuZHAgLSAodWludDhfdCAqKSBmbmFtZTsKKwkgIGxpbmVwID0gZW5kcCArIDE7CisKKwkgIC8qIFRoZW4gdGhlIGluZGV4LiAgKi8KKwkgIER3YXJmX1dvcmQgZGlyaWR4OworCSAgZ2V0X3VsZWIxMjggKGRpcmlkeCwgbGluZXApOworCSAgaWYgKHVubGlrZWx5IChkaXJpZHggPj0gbmRpcmxpc3QpKQorCSAgICB7CisJICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RJUl9JRFgpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisKKwkgIGlmICgqZm5hbWUgPT0gJy8nKQorCSAgICAvKiBJdCdzIGFuIGFic29sdXRlIHBhdGguICAqLworCSAgICBuZXdfZmlsZS0+aW5mby5uYW1lID0gZm5hbWU7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBuZXdfZmlsZS0+aW5mby5uYW1lID0gbGliZHdfYWxsb2MgKGRiZywgY2hhciwgMSwKKwkJCQkJCSBkaXJhcnJheVtkaXJpZHhdLT5sZW4gKyAxCisJCQkJCQkgKyBmbmFtZWxlbiArIDEpOworICAgICAgICAgICAgICBjaGFyICpjcCA9IG5ld19maWxlLT5pbmZvLm5hbWU7CisKKyAgICAgICAgICAgICAgaWYgKGRpcmFycmF5W2RpcmlkeF0tPmRpciAhPSBOVUxMKQorCQl7CisJCSAgLyogVGhpcyB2YWx1ZSBjb3VsZCBiZSBOVUxMIGluIGNhc2UgdGhlIERXX0FUX2NvbXBfZGlyCisJCSAgICAgd2FzIG5vdCBwcmVzZW50LiAgV2UgY2Fubm90IGRvIG11Y2ggaW4gdGhpcyBjYXNlLgorCQkgICAgIFRoZSBlYXNpZXN0IHRoaW5nIGlzIHRvIGNvbnZlcnQgdGhlIHBhdGggaW4gYW4KKyAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSBwYXRoLiAgKi8KKwkJICBjcCA9IHN0cGNweSAoY3AsIGRpcmFycmF5W2RpcmlkeF0tPmRpcik7CisJCX0KKyAgICAgICAgICAgICAgKmNwKysgPSAnLyc7CisgICAgICAgICAgICAgIHN0cmNweSAoY3AsIGZuYW1lKTsKKwkgICAgICBhc3NlcnQgKHN0cmxlbiAobmV3X2ZpbGUtPmluZm8ubmFtZSkKKwkJICAgICAgPCBkaXJhcnJheVtkaXJpZHhdLT5sZW4gKyAxICsgZm5hbWVsZW4gKyAxKTsKKyAgICAgICAgICAgIH0KKworCSAgLyogTmV4dCBjb21lcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUuICAqLworCSAgZ2V0X3VsZWIxMjggKG5ld19maWxlLT5pbmZvLm10aW1lLCBsaW5lcCk7CisKKwkgIC8qIEZpbmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4gICovCisJICBnZXRfdWxlYjEyOCAobmV3X2ZpbGUtPmluZm8ubGVuZ3RoLCBsaW5lcCk7CisKKwkgIG5ld19maWxlLT5uZXh0ID0gZmlsZWxpc3Q7CisJICBmaWxlbGlzdCA9IG5ld19maWxlOworCSAgKytuZmlsZWxpc3Q7CisJfQorICAgICAgLyogU2tpcCB0aGUgZmluYWwgTlVMIGJ5dGUuICAqLworICAgICAgKytsaW5lcDsKKworICAgICAgLyogQ29uc2lzdGVuY3kgY2hlY2suICAqLworICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCAhPSBoZWFkZXJfc3RhcnQgKyBoZWFkZXJfbGVuZ3RoKSkKKwl7CisJICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAgIC8qIFdlIGFyZSBhYm91dCB0byBwcm9jZXNzIHRoZSBzdGF0ZW1lbnQgcHJvZ3JhbS4gIEluaXRpYWxpemUgdGhlCisJICAgc3RhdGUgbWFjaGluZSByZWdpc3RlcnMgKHNlZSA2LjIuMiBpbiB0aGUgdjIuMSBzcGVjaWZpY2F0aW9uKS4gICovCisgICAgICBEd2FyZl9Xb3JkIGFkZHJlc3MgPSAwOworICAgICAgc2l6ZV90IGZpbGUgPSAxOworICAgICAgc2l6ZV90IGxpbmUgPSAxOworICAgICAgc2l6ZV90IGNvbHVtbiA9IDA7CisgICAgICB1aW50X2Zhc3Q4X3QgaXNfc3RtdCA9IGRlZmF1bHRfaXNfc3RtdDsKKyAgICAgIGludCBiYXNpY19ibG9jayA9IDA7CisgICAgICBpbnQgcHJvbG9ndWVfZW5kID0gMDsKKyAgICAgIGludCBlcGlsb2d1ZV9iZWdpbiA9IDA7CisKKyAgICAgICAgLyogUHJvY2VzcyB0aGUgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgICAgIHN0cnVjdCBsaW5lbGlzdCAqbGluZWxpc3QgPSBOVUxMOworICAgICAgdW5zaWduZWQgaW50IG5saW5lbGlzdCA9IDA7CisgICAgICB3aGlsZSAobGluZXAgPCBsaW5lZW5kcCkKKwl7CisJICBzdHJ1Y3QgbGluZWxpc3QgKm5ld19saW5lOworCSAgdW5zaWduZWQgaW50IG9wY29kZTsKKwkgIHVuc2lnbmVkIGludCB1MTI4OworCSAgaW50IHMxMjg7CisKKwkgIC8qIFJlYWQgdGhlIG9wY29kZS4gICovCisJICBvcGNvZGUgPSAqbGluZXArKzsKKworCSAgLyogSXMgdGhpcyBhIHNwZWNpYWwgb3Bjb2RlPyAgKi8KKwkgIGlmIChsaWtlbHkgKG9wY29kZSA+PSBvcGNvZGVfYmFzZSkpCisJICAgIHsKKwkgICAgICAvKiBZZXMuICBIYW5kbGluZyB0aGlzIGlzIHF1aXRlIGVhc3kgc2luY2UgdGhlIG9wY29kZSB2YWx1ZQorCQkgaXMgY29tcHV0ZWQgd2l0aAorCisJCSBvcGNvZGUgPSAoZGVzaXJlZCBsaW5lIGluY3JlbWVudCAtIGxpbmVfYmFzZSkKKwkJICAgICAgICAgICArIChsaW5lX3JhbmdlICogYWRkcmVzcyBhZHZhbmNlKSArIG9wY29kZV9iYXNlCisJICAgICAgKi8KKwkgICAgICBpbnQgbGluZV9pbmNyZW1lbnQgPSAobGluZV9iYXNlCisJCQkJICAgICsgKG9wY29kZSAtIG9wY29kZV9iYXNlKSAlIGxpbmVfcmFuZ2UpOworCSAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzX2luY3JlbWVudCA9IChtaW5pbXVtX2luc3RyX2xlbgorCQkJCQkJKiAoKG9wY29kZSAtIG9wY29kZV9iYXNlKQorCQkJCQkJICAgLyBsaW5lX3JhbmdlKSk7CisKKwkgICAgICAvKiBQZXJmb3JtIHRoZSBpbmNyZW1lbnRzLiAgKi8KKwkgICAgICBsaW5lICs9IGxpbmVfaW5jcmVtZW50OworCSAgICAgIGFkZHJlc3MgKz0gYWRkcmVzc19pbmNyZW1lbnQ7CisKKwkgICAgICAvKiBBZGQgYSBuZXcgbGluZSB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG1hY2hpbmUgdmFsdWVzLiAgKi8KKwkgICAgICBORVdfTElORSAoMCk7CisKKwkgICAgICAvKiBSZXNldCB0aGUgZmxhZ3MuICAqLworCSAgICAgIGJhc2ljX2Jsb2NrID0gMDsKKwkgICAgICBwcm9sb2d1ZV9lbmQgPSAwOworCSAgICAgIGVwaWxvZ3VlX2JlZ2luID0gMDsKKwkgICAgfQorCSAgZWxzZSBpZiAob3Bjb2RlID09IDApCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGFuIGV4dGVuZGVkIG9wY29kZS4gICovCisJICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCArIDIgPiBsaW5lZW5kcCkpCisJCWdvdG8gaW52YWxpZF9kYXRhOworCisJICAgICAgLyogVGhlIGxlbmd0aC4gICovCisJICAgICAgdW5zaWduZWQgaW50IGxlbiA9ICpsaW5lcCsrOworCisJICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCArIGxlbiA+IGxpbmVlbmRwKSkKKwkJZ290byBpbnZhbGlkX2RhdGE7CisKKwkgICAgICAvKiBUaGUgc3ViLW9wY29kZS4gICovCisJICAgICAgb3Bjb2RlID0gKmxpbmVwKys7CisKKwkgICAgICBzd2l0Y2ggKG9wY29kZSkKKwkJeworCQljYXNlIERXX0xORV9lbmRfc2VxdWVuY2U6CisJCSAgLyogQWRkIGEgbmV3IGxpbmUgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBtYWNoaW5lIHZhbHVlcy4KKwkJICAgICBUaGUgaXMgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuICAqLworCQkgIE5FV19MSU5FICgxKTsKKworCQkgIC8qIFJlc2V0IHRoZSByZWdpc3RlcnMuICAqLworCQkgIGFkZHJlc3MgPSAwOworCQkgIGZpbGUgPSAxOworCQkgIGxpbmUgPSAxOworCQkgIGNvbHVtbiA9IDA7CisJCSAgaXNfc3RtdCA9IGRlZmF1bHRfaXNfc3RtdDsKKwkJICBiYXNpY19ibG9jayA9IDA7CisJCSAgcHJvbG9ndWVfZW5kID0gMDsKKwkJICBlcGlsb2d1ZV9iZWdpbiA9IDA7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTkVfc2V0X2FkZHJlc3M6CisJCSAgLyogVGhlIHZhbHVlIGlzIGFuIGFkZHJlc3MuICBUaGUgc2l6ZSBpcyBkZWZpbmVkIGFzCisJCSAgICAgYXBwb3JpYXRlIGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuICBXZSB1c2UgdGhlCisJCSAgICAgYWRkcmVzcyBzaXplIGZpZWxkIGZyb20gdGhlIENVIGhlYWRlci4gICovCisJCSAgaWYgKGN1LT5hZGRyZXNzX3NpemUgPT0gNCkKKwkJICAgIGFkZHJlc3MgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKKwkJICBlbHNlCisJCSAgICBhZGRyZXNzID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTkVfZGVmaW5lX2ZpbGU6CisJCSAgeworCQkgICAgY2hhciAqZm5hbWUgPSAoY2hhciAqKSBsaW5lcDsKKwkJICAgIHVpbnQ4X3QgKmVuZHAgPSBtZW1jaHIgKGxpbmVwLCAnXDAnLCBsaW5lZW5kcCAtIGxpbmVwKTsKKwkJICAgIGlmIChlbmRwID09IE5VTEwpCisJCSAgICAgIGdvdG8gaW52YWxpZF9kYXRhOworCQkgICAgc2l6ZV90IGZuYW1lbGVuID0gZW5kcCAtIGxpbmVwOworCQkgICAgbGluZXAgPSBlbmRwICsgMTsKKworCQkgICAgdW5zaWduZWQgaW50IGRpcmlkeDsKKwkJICAgIGdldF91bGViMTI4IChkaXJpZHgsIGxpbmVwKTsKKwkJICAgIER3YXJmX1dvcmQgbXRpbWU7CisJCSAgICBnZXRfdWxlYjEyOCAobXRpbWUsIGxpbmVwKTsKKwkJICAgIER3YXJmX1dvcmQgZmlsZWxlbmd0aDsKKwkJICAgIGdldF91bGViMTI4IChmaWxlbGVuZ3RoLCBsaW5lcCk7CisKKwkJICAgIHN0cnVjdCBmaWxlbGlzdCAqbmV3X2ZpbGUgPQorCQkgICAgICAoc3RydWN0IGZpbGVsaXN0ICopIGFsbG9jYSAoc2l6ZW9mICgqbmV3X2ZpbGUpKTsKKwkJICAgIGlmIChmbmFtZVswXSA9PSAnLycpCisJCSAgICAgIG5ld19maWxlLT5pbmZvLm5hbWUgPSBmbmFtZTsKKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJbmV3X2ZpbGUtPmluZm8ubmFtZSA9CisJCQkgIGxpYmR3X2FsbG9jIChkYmcsIGNoYXIsIDEsIChkaXJhcnJheVtkaXJpZHhdLT5sZW4gKyAxCisJCQkJCQkgICAgICArIGZuYW1lbGVuICsgMSkpOworCQkJY2hhciAqY3AgPSBuZXdfZmlsZS0+aW5mby5uYW1lOworCisJCQlpZiAoZGlyYXJyYXlbZGlyaWR4XS0+ZGlyICE9IE5VTEwpCisJCQkgIC8qIFRoaXMgdmFsdWUgY291bGQgYmUgTlVMTCBpbiBjYXNlIHRoZQorCQkJICAgICBEV19BVF9jb21wX2RpciB3YXMgbm90IHByZXNlbnQuICBXZQorCQkJICAgICBjYW5ub3QgZG8gbXVjaCBpbiB0aGlzIGNhc2UuICBUaGUgZWFzaWVzdAorCQkJICAgICB0aGluZyBpcyB0byBjb252ZXJ0IHRoZSBwYXRoIGluIGFuCisJCQkgICAgIGFic29sdXRlIHBhdGguICAqLworCQkJICBjcCA9IHN0cGNweSAoY3AsIGRpcmFycmF5W2RpcmlkeF0tPmRpcik7CisJCQkqY3ArKyA9ICcvJzsKKwkJCXN0cmNweSAoY3AsIGZuYW1lKTsKKwkJICAgICAgfQorCisJCSAgICBuZXdfZmlsZS0+aW5mby5tdGltZSA9IG10aW1lOworCQkgICAgbmV3X2ZpbGUtPmluZm8ubGVuZ3RoID0gZmlsZWxlbmd0aDsKKwkJICAgIG5ld19maWxlLT5uZXh0ID0gZmlsZWxpc3Q7CisJCSAgICBmaWxlbGlzdCA9IG5ld19maWxlOworCQkgICAgKytuZmlsZWxpc3Q7CisJCSAgfQorCQkgIGJyZWFrOworCisJCWRlZmF1bHQ6CisJCSAgLyogVW5rbm93biwgaWdub3JlIGl0LiAgKi8KKwkJICBsaW5lcCArPSBsZW4gLSAxOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKG9wY29kZSA8PSBEV19MTlNfc2V0X2VwaWxvZ19iZWdpbikKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSBrbm93biBzdGFuZGFyZCBvcGNvZGUuICAqLworCSAgICAgIHN3aXRjaCAob3Bjb2RlKQorCQl7CisJCWNhc2UgRFdfTE5TX2NvcHk6CisJCSAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLworCQkgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAwKSkKKwkJICAgIGdvdG8gaW52YWxpZF9kYXRhOworCisJCSAgLyogQWRkIGEgbmV3IGxpbmUgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBtYWNoaW5lIHZhbHVlcy4gICovCisJCSAgTkVXX0xJTkUgKDApOworCisJCSAgLyogUmVzZXQgdGhlIGZsYWdzLiAgKi8KKwkJICBiYXNpY19ibG9jayA9IDA7CisJCSAgLyogWFhYIFdoZXRoZXIgdGhlIGZvbGxvd2luZyB0d28gbGluZXMgYXJlIG5lY2Vzc2FyeSBpcworCQkgICAgIHVuY2xlYXIuICBJIGd1ZXNzIHRoZSBjdXJyZW50IHYyLjEgc3BlY2lmaWNhdGlvbiBoYXMKKwkJICAgICBhIGJ1ZyBpbiB0aGF0IGl0IHNheXMgY2xlYXJpbmcgdGhlc2UgdHdvIHJlZ2lzdGVycyBpcworCQkgICAgIG5vdCBuZWNlc3NhcnkuICAqLworCQkgIHByb2xvZ3VlX2VuZCA9IDA7CisJCSAgZXBpbG9ndWVfYmVnaW4gPSAwOworCQkgIGJyZWFrOworCisJCWNhc2UgRFdfTE5TX2FkdmFuY2VfcGM6CisJCSAgLyogVGFrZXMgb25lIHVsZWIxMjggcGFyYW1ldGVyIHdoaWNoIGlzIGFkZGVkIHRvIHRoZQorCQkgICAgIGFkZHJlc3MuICAqLworCQkgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKSkKKwkJICAgIGdvdG8gaW52YWxpZF9kYXRhOworCisJCSAgZ2V0X3VsZWIxMjggKHUxMjgsIGxpbmVwKTsKKwkJICBhZGRyZXNzICs9IG1pbmltdW1faW5zdHJfbGVuICogdTEyODsKKwkJICBicmVhazsKKworCQljYXNlIERXX0xOU19hZHZhbmNlX2xpbmU6CisJCSAgLyogVGFrZXMgb25lIHNsZWIxMjggcGFyYW1ldGVyIHdoaWNoIGlzIGFkZGVkIHRvIHRoZQorCQkgICAgIGxpbmUuICAqLworCQkgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKSkKKwkJICAgIGdvdG8gaW52YWxpZF9kYXRhOworCisJCSAgZ2V0X3NsZWIxMjggKHMxMjgsIGxpbmVwKTsKKwkJICBsaW5lICs9IHMxMjg7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTlNfc2V0X2ZpbGU6CisJCSAgLyogVGFrZXMgb25lIHVsZWIxMjggcGFyYW1ldGVyIHdoaWNoIGlzIHN0b3JlZCBpbiBmaWxlLiAgKi8KKwkJICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMSkpCisJCSAgICBnb3RvIGludmFsaWRfZGF0YTsKKworCQkgIGdldF91bGViMTI4ICh1MTI4LCBsaW5lcCk7CisJCSAgZmlsZSA9IHUxMjg7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTlNfc2V0X2NvbHVtbjoKKwkJICAvKiBUYWtlcyBvbmUgdWxlYjEyOCBwYXJhbWV0ZXIgd2hpY2ggaXMgc3RvcmVkIGluIGNvbHVtbi4gICovCisJCSAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDEpKQorCQkgICAgZ290byBpbnZhbGlkX2RhdGE7CisKKwkJICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXApOworCQkgIGNvbHVtbiA9IHUxMjg7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6CisJCSAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLworCQkgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAwKSkKKwkJICAgIGdvdG8gaW52YWxpZF9kYXRhOworCisJCSAgaXNfc3RtdCA9IDEgLSBpc19zdG10OworCQkgIGJyZWFrOworCisJCWNhc2UgRFdfTE5TX3NldF9iYXNpY19ibG9jazoKKwkJICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCisJCSAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDApKQorCQkgICAgZ290byBpbnZhbGlkX2RhdGE7CisKKwkJICBiYXNpY19ibG9jayA9IDE7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTlNfY29uc3RfYWRkX3BjOgorCQkgIC8qIFRha2VzIG5vIGFyZ3VtZW50LiAgKi8KKwkJICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMCkpCisJCSAgICBnb3RvIGludmFsaWRfZGF0YTsKKworCQkgIGFkZHJlc3MgKz0gKG1pbmltdW1faW5zdHJfbGVuCisJCQkgICAgICAqICgoMjU1IC0gb3Bjb2RlX2Jhc2UpIC8gbGluZV9yYW5nZSkpOworCQkgIGJyZWFrOworCisJCWNhc2UgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGM6CisJCSAgLyogVGFrZXMgb25lIDE2IGJpdCBwYXJhbWV0ZXIgd2hpY2ggaXMgYWRkZWQgdG8gdGhlCisJCSAgICAgYWRkcmVzcy4gICovCisJCSAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDEpKQorCQkgICAgZ290byBpbnZhbGlkX2RhdGE7CisKKwkJICBhZGRyZXNzICs9IHJlYWRfMnVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgbGluZXApOworCQkgIGJyZWFrOworCisJCWNhc2UgRFdfTE5TX3NldF9wcm9sb2d1ZV9lbmQ6CisJCSAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLworCQkgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAwKSkKKwkJICAgIGdvdG8gaW52YWxpZF9kYXRhOworCisJCSAgcHJvbG9ndWVfZW5kID0gMTsKKwkJICBicmVhazsKKworCQljYXNlIERXX0xOU19zZXRfZXBpbG9nX2JlZ2luOgorCQkgIC8qIFRha2VzIG5vIGFyZ3VtZW50LiAgKi8KKwkJICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMCkpCisJCSAgICBnb3RvIGludmFsaWRfZGF0YTsKKworCQkgIGVwaWxvZ3VlX2JlZ2luID0gMTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIGEgbmV3IG9wY29kZSB0aGUgZ2VuZXJhdG9yIGJ1dCBub3Qgd2Uga25vdyBhYm91dC4KKwkJIFJlYWQgdGhlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIGl0IGJ1dCB0aGVuIGRpc2NhcmQKKwkJIGV2ZXJ5dGhpbmcuICBSZWFkIGFsbCB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBvcGNvZGUuICAqLworCSAgICAgIGZvciAoaW50IG4gPSBzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdOyBuID4gMDsgLS1uKQorCQlnZXRfdWxlYjEyOCAodTEyOCwgbGluZXApOworCisJICAgICAgLyogTmV4dCByb3VuZCwgaWdub3JlIHRoaXMgb3Bjb2RlLiAgKi8KKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCX0KKworICAgICAgLyogUHV0IGFsbCB0aGUgZmlsZXMgaW4gYW4gYXJyYXkuICAqLworICAgICAgRHdhcmZfRmlsZXMgKmZpbGVzID0gbGliZHdfYWxsb2MgKGRiZywgRHdhcmZfRmlsZXMsCisJCQkJCXNpemVvZiAoRHdhcmZfRmlsZXMpCisJCQkJCSsgbmZpbGVsaXN0ICogc2l6ZW9mIChEd2FyZl9GaWxlaW5mbyksCisJCQkJICAgICAgIDEpOworICAgICAgZmlsZXMtPm5maWxlcyA9IG5maWxlbGlzdDsKKyAgICAgIHdoaWxlIChuZmlsZWxpc3QtLSA+IDApCisJeworCSAgZmlsZXMtPmluZm9bbmZpbGVsaXN0XSA9IGZpbGVsaXN0LT5pbmZvOworCSAgZmlsZWxpc3QgPSBmaWxlbGlzdC0+bmV4dDsKKwl9CisgICAgICBhc3NlcnQgKGZpbGVsaXN0ID09IE5VTEwpOworCisgICAgICAvKiBSZW1lbWJlciB0aGUgZGVidWdnaW5nIGRlc2NyaXB0b3IuICAqLworICAgICAgZmlsZXMtPmRiZyA9IGRiZzsKKworICAgICAgLyogTWFrZSB0aGUgZmlsZSBkYXRhIHN0cnVjdHVyZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgQ1UuICAqLworICAgICAgY3UtPmZpbGVzID0gZmlsZXM7CisKKyAgICAgIHZvaWQgKmJ1ZiA9IGxpYmR3X2FsbG9jIChkYmcsIER3YXJmX0xpbmVzLCAoc2l6ZW9mIChEd2FyZl9MaW5lcykKKwkJCQkJCSAgKyAoc2l6ZW9mIChEd2FyZl9MaW5lKQorCQkJCQkJICAgICAqIG5saW5lbGlzdCkpLCAxKTsKKworICAgICAgLyogRmlyc3QgdXNlIHRoZSBidWZmZXIgZm9yIHRoZSBwb2ludGVycywgYW5kIHNvcnQgdGhlIGVudHJpZXMuCisJIFdlJ2xsIHdyaXRlIHRoZSBwb2ludGVycyBpbiB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIGFuZCB0aGVuCisJIGNvcHkgaW50byB0aGUgYnVmZmVyIGZyb20gdGhlIGJlZ2lubmluZyBzbyB0aGUgb3ZlcmxhcCB3b3Jrcy4gICovCisgICAgICBhc3NlcnQgKHNpemVvZiAoRHdhcmZfTGluZSkgPj0gc2l6ZW9mIChEd2FyZl9MaW5lICopKTsKKyAgICAgIER3YXJmX0xpbmUgKipzb3J0bGluZXMgPSAoYnVmICsgc2l6ZW9mIChEd2FyZl9MaW5lcykKKwkJCQkrICgoc2l6ZW9mIChEd2FyZl9MaW5lKQorCQkJCSAgICAtIHNpemVvZiAoRHdhcmZfTGluZSAqKSkgKiBubGluZWxpc3QpKTsKKworICAgICAgLyogVGhlIGxpc3QgaXMgaW4gTElGTyBvcmRlciBhbmQgdXN1YWxseSB0aGV5IGNvbWUgaW4gY2x1bXBzIHdpdGgKKwkgYXNjZW5kaW5nIGFkZHJlc3Nlcy4gIFNvIGZpbGwgZnJvbSB0aGUgYmFjayB0byBwcm9iYWJseSBzdGFydCB3aXRoCisJIHJ1bnMgYWxyZWFkeSBpbiBvcmRlciBiZWZvcmUgd2Ugc29ydC4gICovCisgICAgICB1bnNpZ25lZCBpbnQgaSA9IG5saW5lbGlzdDsKKyAgICAgIHdoaWxlIChpLS0gPiAwKQorCXsKKwkgIHNvcnRsaW5lc1tpXSA9ICZsaW5lbGlzdC0+bGluZTsKKwkgIGxpbmVsaXN0ID0gbGluZWxpc3QtPm5leHQ7CisJfQorICAgICAgYXNzZXJ0IChsaW5lbGlzdCA9PSBOVUxMKTsKKworICAgICAgLyogU29ydCBieSBhc2NlbmRpbmcgYWRkcmVzcy4gICovCisgICAgICBxc29ydCAoc29ydGxpbmVzLCBubGluZWxpc3QsIHNpemVvZiBzb3J0bGluZXNbMF0sICZjb21wYXJlX2xpbmVzKTsKKworICAgICAgLyogTm93IHRoYXQgdGhleSBhcmUgc29ydGVkLCBwdXQgdGhlbSBpbiB0aGUgZmluYWwgYXJyYXkuCisJIFRoZSBidWZmZXJzIG92ZXJsYXAsIHNvIHdlJ3ZlIGNsb2JiZXJlZCB0aGUgZWFybHkgZWxlbWVudHMKKwkgb2YgU09SVExJTkVTIGJ5IHRoZSB0aW1lIHdlJ3JlIHJlYWRpbmcgdGhlIGxhdGVyIG9uZXMuICAqLworICAgICAgY3UtPmxpbmVzID0gYnVmOworICAgICAgY3UtPmxpbmVzLT5ubGluZXMgPSBubGluZWxpc3Q7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbmxpbmVsaXN0OyArK2kpCisJeworCSAgY3UtPmxpbmVzLT5pbmZvW2ldID0gKnNvcnRsaW5lc1tpXTsKKwkgIGN1LT5saW5lcy0+aW5mb1tpXS5maWxlcyA9IGZpbGVzOworCX0KKworICAgICAgLyogU3VjY2Vzcy4gICovCisgICAgICByZXMgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoY3UtPmxpbmVzICE9ICh2b2lkICopIC0xbCkKKyAgICAvKiBXZSBhbHJlYWR5IGhhdmUgdGhlIGluZm9ybWF0aW9uLiAgKi8KKyAgICByZXMgPSAwOworCisgIGlmIChsaWtlbHkgKHJlcyA9PSAwKSkKKyAgICB7CisgICAgICAqbGluZXMgPSBjdS0+bGluZXM7CisgICAgICAqbmxpbmVzID0gY3UtPmxpbmVzLT5ubGluZXM7CisgICAgfQorIG91dDoKKworICAvLyBYWFggRXZlbnR1YWxseTogdW5sb2NraW5nIGhlcmUuCisKKyAgcmV0dXJuIHJlczsKK30KK0lOVERFRihkd2FyZl9nZXRzcmNsaW5lcykKZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2dldHN0cmluZy5jIGIvbGliZHcvZHdhcmZfZ2V0c3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhYmU4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2dldHN0cmluZy5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIEdldCBzdHJpbmcuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitjb25zdCBjaGFyICoKK2R3YXJmX2dldHN0cmluZyAoZGJnLCBvZmZzZXQsIGxlbnApCisgICAgIER3YXJmICpkYmc7CisgICAgIER3YXJmX09mZiBvZmZzZXQ7CisgICAgIHNpemVfdCAqbGVucDsKK3sKKyAgaWYgKGRiZyA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19zdHJdID09IE5VTEwKKyAgICAgIHx8IG9mZnNldCA+PSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19zdHJdLT5kX3NpemUpCisgICAgeworICAgIG5vX3N0cmluZzoKKyAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fU1RSSU5HKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBjb25zdCBjaGFyICpyZXN1bHQgPSAoKGNvbnN0IGNoYXIgKikgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfc3RyXS0+ZF9idWYKKwkJCSsgb2Zmc2V0KTsKKyAgY29uc3QgY2hhciAqZW5kcCA9IG1lbWNociAocmVzdWx0LCAnXDAnLAorCQkJICAgICBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19zdHJdLT5kX3NpemUgLSBvZmZzZXQpOworICBpZiAoZW5kcCA9PSBOVUxMKQorICAgIGdvdG8gbm9fc3RyaW5nOworCisgIGlmIChsZW5wICE9IE5VTEwpCisgICAgKmxlbnAgPSBlbmRwIC0gcmVzdWx0OworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9oYXNhdHRyLmMgYi9saWJkdy9kd2FyZl9oYXNhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkYmVlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2hhc2F0dHIuYwpAQCAtMCwwICsxLDM3IEBACisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIERJRSBoYXMgc3BlY2lmaWMgYXR0cmlidXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2hhc2F0dHIgKGRpZSwgc2VhcmNoX25hbWUpCisgICAgIER3YXJmX0RpZSAqZGllOworICAgICB1bnNpZ25lZCBpbnQgc2VhcmNoX25hbWU7Cit7CisgIGlmIChkaWUgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICAvKiBTZWFyY2ggZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gICovCisgIHVuc2lnbmVkIGludCBjb2RlOworICAodm9pZCkgX19saWJkd19maW5kX2F0dHIgKGRpZSwgc2VhcmNoX25hbWUsICZjb2RlLCBOVUxMKTsKKworICByZXR1cm4gY29kZSA9PSBzZWFyY2hfbmFtZTsKK30KK0lOVERFRiAoZHdhcmZfaGFzYXR0cikKZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2hhc2F0dHJfaW50ZWdyYXRlLmMgYi9saWJkdy9kd2FyZl9oYXNhdHRyX2ludGVncmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyM2FhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9oYXNhdHRyX2ludGVncmF0ZS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIENoZWNrIHdoZXRoZXIgRElFIGhhcyBzcGVjaWZpYyBhdHRyaWJ1dGUsIGludGVncmF0aW5nIERXX0FUX2Fic3RyYWN0X29yaWdpbi4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworaW50Citkd2FyZl9oYXNhdHRyX2ludGVncmF0ZSAoRHdhcmZfRGllICpkaWUsIHVuc2lnbmVkIGludCBzZWFyY2hfbmFtZSkKK3sKKyAgRHdhcmZfRGllIGRpZV9tZW07CisKKyAgZG8KKyAgICB7CisgICAgICBpZiAoSU5UVVNFKGR3YXJmX2hhc2F0dHIpIChkaWUsIHNlYXJjaF9uYW1lKSkKKwlyZXR1cm4gMTsKKworICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOworICAgICAgRHdhcmZfQXR0cmlidXRlICphdHRyID0gSU5UVVNFKGR3YXJmX2F0dHIpIChkaWUsIERXX0FUX2Fic3RyYWN0X29yaWdpbiwKKwkJCQkJCSAgJmF0dHJfbWVtKTsKKyAgICAgIGlmIChhdHRyID09IE5VTEwpCisJYnJlYWs7CisKKyAgICAgIGRpZSA9IElOVFVTRShkd2FyZl9mb3JtcmVmX2RpZSkgKGF0dHIsICZkaWVfbWVtKTsKKyAgICB9CisgIHdoaWxlIChkaWUgIT0gTlVMTCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9oYXNjaGlsZHJlbi5jIGIvbGliZHcvZHdhcmZfaGFzY2hpbGRyZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWE1YjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfaGFzY2hpbGRyZW4uYwpAQCAtMCwwICsxLDQ5IEBACisvKiBSZXR1cm4gc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBhdHRyaWJ1dGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCitpbnQKK2R3YXJmX2hhc2NoaWxkcmVuIChkaWUpCisgICAgIER3YXJmX0RpZSAqZGllOworeworICAvKiBGaW5kIHRoZSBhYmJyZXZpYXRpb24gZW50cnkuICAqLworICBEd2FyZl9BYmJyZXYgKmFiYnJldnAgPSBkaWUtPmFiYnJldjsKKyAgaWYgKGFiYnJldnAgIT0gKER3YXJmX0FiYnJldiAqKSAtMWwpCisgICAgeworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZHAgPSAodW5zaWduZWQgY2hhciAqKSBkaWUtPmFkZHI7CisKKyAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gZ2V0IHRoZSBhYmJyZXZpYXRpb24gY29kZSBzbyB0aGF0IHdlIGNhbiBkZWNvZGUKKwkgdGhlIGRhdGEgaW4gdGhlIERJRS4gICovCisgICAgICB1bnNpZ25lZCBpbnQgYWJicmV2X2NvZGU7CisgICAgICBnZXRfdWxlYjEyOCAoYWJicmV2X2NvZGUsIHJlYWRwKTsKKworICAgICAgYWJicmV2cCA9IF9fbGliZHdfZmluZGFiYnJldiAoZGllLT5jdSwgYWJicmV2X2NvZGUpOworICAgICAgZGllLT5hYmJyZXYgPSBhYmJyZXZwID86IChEd2FyZl9BYmJyZXYgKikgLTFsOworICAgIH0KKyAgaWYgKHVubGlrZWx5IChkaWUtPmFiYnJldiA9PSAoRHdhcmZfQWJicmV2ICopIC0xbCkpCisgICAgeworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gZGllLT5hYmJyZXYtPmhhc19jaGlsZHJlbjsKK30KK0lOVERFRiAoZHdhcmZfaGFzY2hpbGRyZW4pCmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9oYXNmb3JtLmMgYi9saWJkdy9kd2FyZl9oYXNmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyYjFmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2hhc2Zvcm0uYwpAQCAtMCwwICsxLDMyIEBACisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIGF0dHJpYnV0ZSBoYXMgc3BlY2lmaWMgZm9ybS4KKyAgIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9oYXNmb3JtIChhdHRyLCBzZWFyY2hfZm9ybSkKKyAgICAgRHdhcmZfQXR0cmlidXRlICphdHRyOworICAgICB1bnNpZ25lZCBpbnQgc2VhcmNoX2Zvcm07Cit7CisgIGlmIChhdHRyID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIGF0dHItPmZvcm0gPT0gc2VhcmNoX2Zvcm07Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9oYXNwYy5jIGIvbGliZHcvZHdhcmZfaGFzcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI5Mjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfaGFzcGMuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogRGV0ZXJtaW5lIHdoZXRoZXIgYSBESUUgY292ZXJzIGEgUEMgYWRkcmVzcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHdQLmgiCisjaW5jbHVkZSA8ZHdhcmYuaD4KKworCitpbnQKK2R3YXJmX2hhc3BjIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfQWRkciBwYykKK3sKKyAgaWYgKGRpZSA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICAvKiBVc3VhbGx5IHRoZXJlIGlzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgcmFuZ2UuICAqLworICBEd2FyZl9BZGRyIGxvd3BjLCBoaWdocGM7CisgIGlmIChJTlRVU0UoZHdhcmZfaGlnaHBjKSAoZGllLCAmaGlnaHBjKSA9PSAwCisgICAgICAmJiBJTlRVU0UoZHdhcmZfbG93cGMpIChkaWUsICZsb3dwYykgPT0gMCkKKyAgICByZXR1cm4gcGMgPj0gbG93cGMgJiYgcGMgPCBoaWdocGM7CisKKyAgLyogV2UgaGF2ZSB0byBsb29rIGZvciBhIG5vbmNvbnRpZ3VvdXMgcmFuZ2UuICAqLworICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07CisgIER3YXJmX0F0dHJpYnV0ZSAqYXR0ciA9IElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9yYW5nZXMsICZhdHRyX21lbSk7CisgIGlmIChhdHRyID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIC8qIE11c3QgaGF2ZSB0aGUgZm9ybSBkYXRhNCBvciBkYXRhOCB3aGljaCBhY3QgYXMgYW4gb2Zmc2V0LiAgKi8KKyAgRHdhcmZfV29yZCBvZmZzZXQ7CisgIGlmIChJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoYXR0ciwgJm9mZnNldCkgIT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgY29uc3QgRWxmX0RhdGEgKmQgPSBhdHRyLT5jdS0+ZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcmFuZ2VzXTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX0RFQlVHX1JBTkdFUyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qIEZldGNoIHRoZSBDVSdzIGJhc2UgYWRkcmVzcy4gICovCisgIER3YXJmX0FkZHIgYmFzZTsKKyAgRHdhcmZfRGllIGN1ZGllID0KKyAgICB7CisgICAgICAuY3UgPSBhdHRyLT5jdSwKKyAgICAgIC5hZGRyID0gKChjaGFyICopIGF0dHItPmN1LT5kYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19pbmZvXS0+ZF9idWYKKwkgICAgICAgKyBhdHRyLT5jdS0+c3RhcnQgKyAzICogYXR0ci0+Y3UtPm9mZnNldF9zaXplIC0gNCArIDMpLAorICAgIH07CisgIGlmIChJTlRVU0UoZHdhcmZfbG93cGMpICgmY3VkaWUsICZiYXNlKSAhPSAwKQorICAgIHJldHVybiAtMTsKKworICB1bnNpZ25lZCBjaGFyICpyZWFkcCA9IGQtPmRfYnVmICsgb2Zmc2V0OworICBEd2FyZl9BZGRyIGJlZ2luOworICBEd2FyZl9BZGRyIGVuZDsKKyAgZG8KKyAgICB7CisgICAgbmV4dDoKKyAgICAgIGlmICgodW5zaWduZWQgY2hhciAqKSBkLT5kX2J1ZiArIGQtPmRfc2l6ZSAtIHJlYWRwCisJICA8IGF0dHItPmN1LT5hZGRyZXNzX3NpemUgKiAyKQorCXsKKwkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7CisJICByZXR1cm4gLTE7CisJfQorCisgICAgICBpZiAoYXR0ci0+Y3UtPmFkZHJlc3Nfc2l6ZSA9PSA4KQorCXsKKwkgIGJlZ2luID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoYXR0ci0+Y3UtPmRiZywgcmVhZHApOworCSAgZW5kID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoYXR0ci0+Y3UtPmRiZywgcmVhZHApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiZWdpbiA9IChEd2FyZl9Td29yZCkgcmVhZF80c2J5dGVfdW5hbGlnbmVkX2luYyAoYXR0ci0+Y3UtPmRiZywKKwkJCQkJCQkgICByZWFkcCk7CisJICBlbmQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChhdHRyLT5jdS0+ZGJnLCByZWFkcCk7CisJfQorCisgICAgICBpZiAoYmVnaW4gPT0gKER3YXJmX0FkZHIpIC0xbCkgLyogQmFzZSBhZGRyZXNzIGVudHJ5LiAgKi8KKwl7CisJICBiYXNlID0gZW5kOworCSAgZ290byBuZXh0OworCX0KKworICAgICAgaWYgKGJlZ2luID09IDAgJiYgZW5kID09IDApIC8qIEVuZCBvZiBsaXN0IGVudHJ5LiAgKi8KKwkvKiBUaGlzIGlzIG5vdCB0aGUgZHJvaWQgeW91IGFyZSBsb29raW5nIGZvci4gICovCisJcmV0dXJuIDA7CisKKyAgICAgIC8qIFdlIGhhdmUgYW4gYWRkcmVzcyByYW5nZSBlbnRyeS4gICovCisgICAgfQorICB3aGlsZSAocGMgPCBiYXNlICsgYmVnaW4gfHwgcGMgPj0gYmFzZSArIGVuZCk7CisKKyAgLyogVGhpcyBvbmUgbWF0Y2hlcyB0aGUgYWRkcmVzcy4gICovCisgIHJldHVybiAxOworfQorSU5UREVGIChkd2FyZl9oYXNwYykKZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2hpZ2hwYy5jIGIvbGliZHcvZHdhcmZfaGlnaHBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0MjU2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2hpZ2hwYy5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIFJldHVybiBoaWdoIFBDIGF0dHJpYnV0ZSBvZiBESUUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK2ludAorZHdhcmZfaGlnaHBjIChkaWUsIHJldHVybl9hZGRyKQorICAgICBEd2FyZl9EaWUgKmRpZTsKKyAgICAgRHdhcmZfQWRkciAqcmV0dXJuX2FkZHI7Cit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKworICByZXR1cm4gSU5UVVNFKGR3YXJmX2Zvcm1hZGRyKSAoSU5UVVNFKGR3YXJmX2F0dHIpIChkaWUsIERXX0FUX2hpZ2hfcGMsCisJCQkJCQkgICAgICZhdHRyX21lbSksCisJCQkJIHJldHVybl9hZGRyKTsKK30KK0lOVERFRihkd2FyZl9oaWdocGMpCmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9saW5lYWRkci5jIGIvbGliZHcvZHdhcmZfbGluZWFkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZjMDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfbGluZWFkZHIuYwpAQCAtMCwwICsxLDMxIEBACisvKiBSZXR1cm4gbGluZSBhZGRyZXNzLgorICAgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9saW5lYWRkciAoRHdhcmZfTGluZSAqbGluZSwgRHdhcmZfQWRkciAqYWRkcnApCit7CisgIGlmIChsaW5lID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgICphZGRycCA9ICBsaW5lLT5hZGRyOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50LmMgYi9saWJkdy9kd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTc0ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50LmMKQEAgLTAsMCArMSwzMSBAQAorLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBiZWdpbm5pbmcgb2YgYSBzdGF0ZW1lbnQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2xpbmViZWdpbnN0YXRlbWVudCAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCit7CisgIGlmIChsaW5lID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgICpmbGFncCA9ICBsaW5lLT5pc19zdG10OworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfbGluZWJsb2NrLmMgYi9saWJkdy9kd2FyZl9saW5lYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI4ZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfbGluZWJsb2NrLmMKQEAgLTAsMCArMSwzMSBAQAorLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBiZWdpbm5pbmcgb2YgYSBiYXNpYyBibG9jay4KKyAgIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK2ludAorZHdhcmZfbGluZWJsb2NrIChEd2FyZl9MaW5lICpsaW5lLCBib29sICpmbGFncCkKK3sKKyAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgKmZsYWdwID0gIGxpbmUtPmJhc2ljX2Jsb2NrOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfbGluZWNvbC5jIGIvbGliZHcvZHdhcmZfbGluZWNvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzBkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9saW5lY29sLmMKQEAgLTAsMCArMSwzMSBAQAorLyogUmV0dXJuIGNvbHVtbiBpbiBsaW5lLgorICAgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9saW5lY29sIChEd2FyZl9MaW5lICpsaW5lLCBpbnQgKmNvbHApCit7CisgIGlmIChsaW5lID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgICpjb2xwID0gIGxpbmUtPmNvbHVtbjsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX2xpbmVlbmRzZXF1ZW5jZS5jIGIvbGliZHcvZHdhcmZfbGluZWVuZHNlcXVlbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5ZmFiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2xpbmVlbmRzZXF1ZW5jZS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIFJldHVybiB0cnVlIGlmIHJlY29yZCBpcyBmb3IgZW5kIG9mIHNlcXVlbmNlLgorICAgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9saW5lZW5kc2VxdWVuY2UgKER3YXJmX0xpbmUgKmxpbmUsIGJvb2wgKmZsYWdwKQoreworICBpZiAobGluZSA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICAqZmxhZ3AgPSAgbGluZS0+ZW5kX3NlcXVlbmNlOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfbGluZWVwaWxvZ3VlYmVnaW4uYyBiL2xpYmR3L2R3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0ZjViYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luLmMKQEAgLTAsMCArMSwzMSBAQAorLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBiZWdpbm5pbmcgb2YgZXBpbG9ndWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luIChEd2FyZl9MaW5lICpsaW5lLCBib29sICpmbGFncCkKK3sKKyAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgKmZsYWdwID0gIGxpbmUtPmVwaWxvZ3VlX2JlZ2luOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfbGluZW5vLmMgYi9saWJkdy9kd2FyZl9saW5lbm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWQyNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfbGluZW5vLmMKQEAgLTAsMCArMSwzMSBAQAorLyogUmV0dXJuIGxpbmUgbnVtYmVyLgorICAgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9saW5lbm8gKER3YXJmX0xpbmUgKmxpbmUsIGludCAqbGluZXApCit7CisgIGlmIChsaW5lID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgICpsaW5lcCA9ICBsaW5lLT5saW5lOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfbGluZXByb2xvZ3VlZW5kLmMgYi9saWJkdy9kd2FyZl9saW5lcHJvbG9ndWVlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODY5MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfbGluZXByb2xvZ3VlZW5kLmMKQEAgLTAsMCArMSwzMSBAQAorLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBlbmQgb2YgcHJvbG9ndWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2xpbmVwcm9sb2d1ZWVuZCAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCit7CisgIGlmIChsaW5lID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgICpmbGFncCA9ICBsaW5lLT5wcm9sb2d1ZV9lbmQ7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9saW5lc3JjLmMgYi9saWJkdy9kd2FyZl9saW5lc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjYTFkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2xpbmVzcmMuYwpAQCAtMCwwICsxLDQxIEBACisvKiBGaW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIGFkZHJlc3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitjb25zdCBjaGFyICoKK2R3YXJmX2xpbmVzcmMgKER3YXJmX0xpbmUgKmxpbmUsIER3YXJmX1dvcmQgKm10aW1lLCBEd2FyZl9Xb3JkICpsZW5ndGgpCit7CisgIGlmIChsaW5lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGxpbmUtPmZpbGUgPj0gbGluZS0+ZmlsZXMtPm5maWxlcykKKyAgICB7CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChtdGltZSAhPSBOVUxMKQorICAgICptdGltZSA9IGxpbmUtPmZpbGVzLT5pbmZvW2xpbmUtPmZpbGVdLm10aW1lOworCisgIGlmIChsZW5ndGggIT0gTlVMTCkKKyAgICAqbGVuZ3RoID0gbGluZS0+ZmlsZXMtPmluZm9bbGluZS0+ZmlsZV0ubGVuZ3RoOworCisgIHJldHVybiBsaW5lLT5maWxlcy0+aW5mb1tsaW5lLT5maWxlXS5uYW1lOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfbG93cGMuYyBiL2xpYmR3L2R3YXJmX2xvd3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjZWMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX2xvd3BjLmMKQEAgLTAsMCArMSwzNCBAQAorLyogUmV0dXJuIGxvdyBQQyBhdHRyaWJ1dGUgb2YgRElFLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX2xvd3BjIChkaWUsIHJldHVybl9hZGRyKQorICAgICBEd2FyZl9EaWUgKmRpZTsKKyAgICAgRHdhcmZfQWRkciAqcmV0dXJuX2FkZHI7Cit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKworICByZXR1cm4gSU5UVVNFKGR3YXJmX2Zvcm1hZGRyKSAoSU5UVVNFKGR3YXJmX2F0dHIpIChkaWUsIERXX0FUX2xvd19wYywKKwkJCQkJCSAgICAgJmF0dHJfbWVtKSwKKwkJCQkgcmV0dXJuX2FkZHIpOworfQorSU5UREVGKGR3YXJmX2xvd3BjKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfbWFjcm9fb3Bjb2RlLmMgYi9saWJkdy9kd2FyZl9tYWNyb19vcGNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDAxZGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfbWFjcm9fb3Bjb2RlLmMKQEAgLTAsMCArMSwzMSBAQAorLyogUmV0dXJuIG1hY3JvIG9wY29kZS4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK2ludAorZHdhcmZfbWFjcm9fb3Bjb2RlIChEd2FyZl9NYWNybyAqbWFjcm8sIHVuc2lnbmVkIGludCAqb3Bjb2RlcCkKK3sKKyAgaWYgKG1hY3JvID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgICpvcGNvZGVwID0gbWFjcm8tPm9wY29kZTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX21hY3JvX3BhcmFtMS5jIGIvbGliZHcvZHdhcmZfbWFjcm9fcGFyYW0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhYzc2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX21hY3JvX3BhcmFtMS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIFJldHVybiBmaXJzdCBtYWNybyBwYXJhbWV0ZXIuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX21hY3JvX3BhcmFtMSAoRHdhcmZfTWFjcm8gKm1hY3JvLCBEd2FyZl9Xb3JkICpwYXJhbXApCit7CisgIGlmIChtYWNybyA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICAqcGFyYW1wID0gbWFjcm8tPnBhcmFtMTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX21hY3JvX3BhcmFtMi5jIGIvbGliZHcvZHdhcmZfbWFjcm9fcGFyYW0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0OWFhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX21hY3JvX3BhcmFtMi5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIFJldHVybiBzZWNvbmQgbWFjcm8gcGFyYW1ldGVyLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHdQLmgiCisKKworaW50Citkd2FyZl9tYWNyb19wYXJhbTIgKER3YXJmX01hY3JvICptYWNybywgRHdhcmZfV29yZCAqcGFyYW1wLCBjb25zdCBjaGFyICoqc3RycCkKK3sKKyAgaWYgKG1hY3JvID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChwYXJhbXAgIT0gTlVMTCkKKyAgICAqcGFyYW1wID0gbWFjcm8tPnBhcmFtMi51OworICBpZiAoc3RycCAhPSBOVUxMKQorICAgICpzdHJwID0gbWFjcm8tPnBhcmFtMi5zOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfbmV4dGN1LmMgYi9saWJkdy9kd2FyZl9uZXh0Y3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGM3NjMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfbmV4dGN1LmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIEFkdmFuY2UgdG8gbmV4dCBDVSBoZWFkZXIuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd1AuaD4KKworCitpbnQKK2R3YXJmX25leHRjdSAoZHdhcmYsIG9mZiwgbmV4dF9vZmYsIGhlYWRlcl9zaXplcCwgYWJicmV2X29mZnNldHAsCisJICAgICAgYWRkcmVzc19zaXplcCwgb2Zmc2V0X3NpemVwKQorICAgICBEd2FyZiAqZHdhcmY7CisgICAgIER3YXJmX09mZiBvZmY7CisgICAgIER3YXJmX09mZiAqbmV4dF9vZmY7CisgICAgIHNpemVfdCAqaGVhZGVyX3NpemVwOworICAgICBEd2FyZl9PZmYgKmFiYnJldl9vZmZzZXRwOworICAgICB1aW50OF90ICphZGRyZXNzX3NpemVwOworICAgICB1aW50OF90ICpvZmZzZXRfc2l6ZXA7Cit7CisgIC8qIE1heWJlIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGJlZm9yZS4gICovCisgIGlmIChkd2FyZiA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICAvKiBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgYmVmb3JlIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KKyAgaWYgKG9mZiA9PSAoRHdhcmZfT2ZmKSAtMWwKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24KKwkgZm9yIGF0IGxlYXN0IHRoZSBpbml0aWFsIHdvcmQuICBXZSBjYW5ub3QgdGVzdCB0aGUgcmVzdCBzaW5jZQorCSB3ZSBkb24ndCBrbm93IHlldCB3aGV0aGVyIHRoaXMgaXMgYSA2NC1iaXQgb2JqZWN0IG9yIG5vdC4gICovCisgICAgICB8fCB1bmxpa2VseSAob2ZmICsgNCA+PSBkd2FyZi0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX3NpemUpKQorICAgIHsKKyAgICAgICpuZXh0X29mZiA9IChEd2FyZl9PZmYpIC0xbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBUaGlzIHBvaW50cyBpbnRvIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgIENVIGVudHJ5LiAgKi8KKyAgY2hhciAqYnl0ZXMgPSAoY2hhciAqKSBkd2FyZi0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX2J1ZiArIG9mZjsKKworICAvKiBUaGUgZm9ybWF0IG9mIHRoZSBDVSBoZWFkZXIgaXMgZGVzY3JpYmVkIGluIGR3YXJmMnAxIDcuNS4xOgorCisgICAgIDEuICBBIDQtYnl0ZSBvciAxMi1ieXRlIHVuc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBsZW5ndGgKKwkgb2YgdGhlIC5kZWJ1Z19pbmZvIGNvbnRyaWJ1dGlvbiBmb3IgdGhhdCBjb21waWxhdGlvbiB1bml0LCBub3QKKwkgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmLiBJbiB0aGUgMzItYml0IERXQVJGIGZvcm1hdCwKKwkgdGhpcyBpcyBhIDQtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyICh3aGljaCBtdXN0IGJlIGxlc3MgdGhhbgorCSAweGZmZmZmZjAwKTsgaW4gdGhlIDY0LWJpdCBEV0FSRiBmb3JtYXQsIHRoaXMgY29uc2lzdHMgb2YgdGhlCisJIDQtYnl0ZSB2YWx1ZSAweGZmZmZmZmZmIGZvbGxvd2VkIGJ5IGFuIDgtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyCisJIHRoYXQgZ2l2ZXMgdGhlIGFjdHVhbCBsZW5ndGggKHNlZSBTZWN0aW9uIDcuNCkuCisKKyAgICAgIDIuIEEgMi1ieXRlIHVuc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZQorCSBEV0FSRiBpbmZvcm1hdGlvbiBmb3IgdGhhdCBjb21waWxhdGlvbiB1bml0LiBGb3IgRFdBUkYgVmVyc2lvbgorCSAyLjEsIHRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlzIDIuCisKKyAgICAgIDMuIEEgNC1ieXRlIG9yIDgtYnl0ZSB1bnNpZ25lZCBvZmZzZXQgaW50byB0aGUgLmRlYnVnX2FiYnJldgorCSBzZWN0aW9uLiBUaGlzIG9mZnNldCBhc3NvY2lhdGVzIHRoZSBjb21waWxhdGlvbiB1bml0IHdpdGggYQorCSBwYXJ0aWN1bGFyIHNldCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgYWJicmV2aWF0aW9ucy4gSW4KKwkgdGhlIDMyLWJpdCBEV0FSRiBmb3JtYXQsIHRoaXMgaXMgYSA0LWJ5dGUgdW5zaWduZWQgbGVuZ3RoOyBpbgorCSB0aGUgNjQtYml0IERXQVJGIGZvcm1hdCwgdGhpcyBpcyBhbiA4LWJ5dGUgdW5zaWduZWQgbGVuZ3RoIChzZWUKKwkgU2VjdGlvbiA3LjQpLgorCisgICAgICA0LiBBIDEtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgc2l6ZSBpbiBieXRlcyBvZgorCSBhbiBhZGRyZXNzIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiBJZiB0aGUgc3lzdGVtIHVzZXMKKwkgc2VnbWVudGVkIGFkZHJlc3NpbmcsIHRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUKKwkgb2Zmc2V0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gICovCisgIHVpbnQ2NF90IGxlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGR3YXJmLCBieXRlcyk7CisgIHNpemVfdCBvZmZzZXRfc2l6ZSA9IDQ7CisgIGlmIChsZW5ndGggPT0gMHhmZmZmZmZmZnUpCisgICAgb2Zmc2V0X3NpemUgPSA4OworCisgIC8qIE5vdyB3ZSBrbm93IGhvdyBsYXJnZSB0aGUgaGVhZGVyIGlzLiAgTm90ZSB0aGUgdHJpY2sgaW4gdGhlCisgICAgIGNvbXB1dGF0aW9uLiAgSWYgdGhlIG9mZnNldF9zaXplIGlzIDQgdGhlICctIDQnIHRlcm0gdW5kb2VzIHRoZQorICAgICAnMiAqJy4gIElmIG9mZnNldF9zaXplIGlzIDggdGhpcyB0ZXJtIGNvbXB1dGVzIHRoZSBzaXplIG9mIHRoZQorICAgICBlc2NhcGUgdmFsdWUgcGx1cyB0aGUgOCBieXRlIG9mZnNldC4gICovCisgIGlmICh1bmxpa2VseSAob2ZmICsgMiAqIG9mZnNldF9zaXplIC0gNCArIHNpemVvZiAodWludDE2X3QpCisJCSsgb2Zmc2V0X3NpemUgKyBzaXplb2YgKHVpbnQ4X3QpCisJCT49IGR3YXJmLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfaW5mb10tPmRfc2l6ZSkpCisgICAgeworICAgICAgKm5leHRfb2ZmID0gLTE7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgaWYgKGxlbmd0aCA9PSAweGZmZmZmZmZmdSkKKyAgICAvKiBUaGlzIGlzIGEgNjQtYml0IERXQVJGIGZvcm1hdC4gICovCisgICAgbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZHdhcmYsIGJ5dGVzKTsKKworICAvKiBSZWFkIHRoZSB2ZXJzaW9uIHN0YW1wLiAgQWx3YXlzIGEgMTYtYml0IHZhbHVlLgorICAgICBYWFggRG8gd2UgbmVlZCB0aGUgdmFsdWU/ICAqLworICByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkd2FyZiwgYnl0ZXMpOworCisgIC8qIEdldCBvZmZzZXQgaW4gLmRlYnVnX2FiYnJldi4gIE5vdGUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgZW50cnkKKyAgICAgZGVwZW5kcyBvbiB3aGV0aGVyIHRoaXMgaXMgYSAzMi1iaXQgb3IgNjQtYml0IERXQVJGIGRlZmluaXRpb24uICAqLworICB1aW50NjRfdCBhYmJyZXZfb2Zmc2V0OworICBpZiAob2Zmc2V0X3NpemUgPT0gNCkKKyAgICBhYmJyZXZfb2Zmc2V0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZHdhcmYsIGJ5dGVzKTsKKyAgZWxzZQorICAgIGFiYnJldl9vZmZzZXQgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkd2FyZiwgYnl0ZXMpOworICBpZiAoYWJicmV2X29mZnNldHAgIT0gTlVMTCkKKyAgICAqYWJicmV2X29mZnNldHAgPSBhYmJyZXZfb2Zmc2V0OworCisgIC8qIFRoZSBhZGRyZXNzIHNpemUuICBBbHdheXMgYW4gOC1iaXQgdmFsdWUuICAqLworICB1aW50OF90IGFkZHJlc3Nfc2l6ZSA9ICpieXRlcysrOworICBpZiAoYWRkcmVzc19zaXplcCAhPSBOVUxMKQorICAgICphZGRyZXNzX3NpemVwID0gYWRkcmVzc19zaXplOworCisgIC8qIFN0b3JlIHRoZSBvZmZzZXQgc2l6ZS4gICovCisgIGlmIChvZmZzZXRfc2l6ZXAgIT0gTlVMTCkKKyAgICAqb2Zmc2V0X3NpemVwID0gb2Zmc2V0X3NpemU7CisKKyAgLyogU3RvcmUgdGhlIGhlYWRlciBsZW5ndGguICAqLworICBpZiAoaGVhZGVyX3NpemVwICE9IE5VTEwpCisgICAgKmhlYWRlcl9zaXplcCA9IChieXRlcworCQkgICAgIC0gKChjaGFyICopIGR3YXJmLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfaW5mb10tPmRfYnVmCisJCQkrIG9mZikpOworCisgIC8qIFNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIHRyaWNrIGluIHRoaXMgZm9ybXVsYS4gICovCisgICpuZXh0X29mZiA9IG9mZiArIDIgKiBvZmZzZXRfc2l6ZSAtIDQgKyBsZW5ndGg7CisKKyAgcmV0dXJuIDA7Cit9CitJTlRERUYoZHdhcmZfbmV4dGN1KQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfb2ZmYWJicmV2LmMgYi9saWJkdy9kd2FyZl9vZmZhYmJyZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzM3MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfb2ZmYWJicmV2LmMKQEAgLTAsMCArMSwzNiBAQAorLyogR2V0IGFiYnJldmlhdGlvbiBhdCBnaXZlbiBvZmZzZXQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX29mZmFiYnJldiAoRHdhcmYgKmRiZywgRHdhcmZfT2ZmIG9mZnNldCwgc2l6ZV90ICpsZW5ndGhwLAorCQkgRHdhcmZfQWJicmV2ICphYmJyZXZwKQoreworICBpZiAoZGJnID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIER3YXJmX0FiYnJldiAqYWJicmV2ID0gX19saWJkd19nZXRhYmJyZXYgKGRiZywgTlVMTCwgb2Zmc2V0LCBsZW5ndGhwLAorCQkJCQkgICAgYWJicmV2cCk7CisKKyAgaWYgKGFiYnJldiA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gYWJicmV2ID09IERXQVJGX0VORF9BQkJSRVYgPyAxIDogMDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX29mZmRpZS5jIGIvbGliZHcvZHdhcmZfb2ZmZGllLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzMDBlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX29mZmRpZS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIFJldHVybiBESUUgYXQgZ2l2ZW4gb2Zmc2V0LgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworRHdhcmZfRGllICoKK2R3YXJmX29mZmRpZSAoZGJnLCBvZmZzZXQsIHJlc3VsdCkKKyAgICAgRHdhcmYgKmRiZzsKKyAgICAgRHdhcmZfT2ZmIG9mZnNldDsKKyAgICAgRHdhcmZfRGllICpyZXN1bHQ7Cit7CisgIGlmIChkYmcgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAob2Zmc2V0ID49IGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX3NpemUpCisgICAgeworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBDbGVhciB0aGUgZW50aXJlIERJRSBzdHJ1Y3R1cmUuICBUaGlzIHNpZ25hbHMgd2UgaGF2ZSBub3QgeWV0CisgICAgIGRldGVybWluZWQgYW55IG9mIHRoZSBpbmZvcm1hdGlvbi4gICovCisgIG1lbXNldCAocmVzdWx0LCAnXDAnLCBzaXplb2YgKER3YXJmX0RpZSkpOworCisgIHJlc3VsdC0+YWRkciA9IChjaGFyICopIGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX2J1ZiArIG9mZnNldDsKKworICAvKiBHZXQgdGhlIENVLiAgKi8KKyAgcmVzdWx0LT5jdSA9IF9fbGliZHdfZmluZGN1IChkYmcsIG9mZnNldCk7CisgIGlmIChyZXN1bHQtPmN1ID09IE5VTEwpCisgICAgeworICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgVGhlIGlucHV0IGZpbGUgaXMgbWFsZm9ybWVkLiAgKi8KKyAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXN1bHQgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorSU5UREVGKGR3YXJmX29mZmRpZSkKZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX29uZWFyYW5nZS5jIGIvbGliZHcvZHdhcmZfb25lYXJhbmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzNzI1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX29uZWFyYW5nZS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIFJldHVybiBvbmUgb2YgdGhlIGFkZHJlc3MgcmFuZ2UgZW50cmllcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK0R3YXJmX0FyYW5nZSAqCitkd2FyZl9vbmVhcmFuZ2UgKER3YXJmX0FyYW5nZXMgKmFyYW5nZXMsIHNpemVfdCBpZHgpCit7CisgIGlmIChhcmFuZ2VzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGlkeCA+PSBhcmFuZ2VzLT5uYXJhbmdlcykKKyAgICB7CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfQVJBTkdFX0lEWCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuICZhcmFuZ2VzLT5pbmZvW2lkeF07Cit9CmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl9vbmVzcmNsaW5lLmMgYi9saWJkdy9kd2FyZl9vbmVzcmNsaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzNGVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2R3YXJmX29uZXNyY2xpbmUuYwpAQCAtMCwwICsxLDM1IEBACisvKiBSZXR1cm4gb25lIG9mIHRoZSBzb3VyY2VzIGxpbmVzIG9mIGEgQ1UuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitEd2FyZl9MaW5lICoKK2R3YXJmX29uZXNyY2xpbmUgKER3YXJmX0xpbmVzICpsaW5lcywgc2l6ZV90IGlkeCkKK3sKKyAgaWYgKGxpbmVzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGlkeCA+PSBsaW5lcy0+bmxpbmVzKQorICAgIHsKKyAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9MSU5FX0lEWCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuICZsaW5lcy0+aW5mb1tpZHhdOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfc2libGluZ29mLmMgYi9saWJkdy9kd2FyZl9zaWJsaW5nb2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDk2NWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfc2libGluZ29mLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qIFJldHVybiBzaWJsaW5nIG9mIGdpdmVuIERJRS4KKyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmR3UC5oIgorI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKworaW50Citkd2FyZl9zaWJsaW5nb2YgKGRpZSwgcmVzdWx0KQorICAgICBEd2FyZl9EaWUgKmRpZTsKKyAgICAgRHdhcmZfRGllICpyZXN1bHQ7Cit7CisgIC8qIElnbm9yZSBwcmV2aW91cyBlcnJvcnMuICAqLworICBpZiAoZGllID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIHVuc2lnbmVkIGludCBsZXZlbCA9IDA7CisKKyAgLyogQ29weSBvZiB0aGUgY3VycmVudCBESUUuICAqLworICBEd2FyZl9EaWUgdGhpc19kaWUgPSAqZGllOworICAvKiBUZW1wb3JhcnkgYXR0cmlidXRlcyB3ZSBjcmVhdGUuICAqLworICBEd2FyZl9BdHRyaWJ1dGUgc2liYXR0cjsKKyAgLyogQ29weSBvZiB0aGUgQ1UgaW4gdGhlIHJlcXVlc3QuICAqLworICBzaWJhdHRyLmN1ID0gdGhpc19kaWUuY3U7CisgIC8qIFRoYXQncyB0aGUgYWRkcmVzcyB3ZSBzdGFydCBsb29raW5nLiAgKi8KKyAgdW5zaWduZWQgY2hhciAqYWRkciA9IHRoaXNfZGllLmFkZHI7CisgIC8qIEVuZCBvZiB0aGUgYnVmZmVyLiAgKi8KKyAgdW5zaWduZWQgY2hhciAqZW5kcAorICAgID0gKCh1bnNpZ25lZCBjaGFyICopIHNpYmF0dHIuY3UtPmRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX2J1ZgorICAgICAgICsgc2liYXR0ci5jdS0+ZW5kKTsKKworICAvKiBTZWFyY2ggZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZGllIG9uIHRoaXMgbGV2ZWwuICBXZQorICAgICBtdXN0IG5vdCByZXR1cm4gdGhlIGRpZXMgZm9yIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBkaWUuICAqLworICBkbworICAgIHsKKyAgICAgIC8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgRElFIG9yIHRoZSBzaWJsaW5nIGF0dHJpYnV0ZS4gICovCisgICAgICBhZGRyID0gX19saWJkd19maW5kX2F0dHIgKCZ0aGlzX2RpZSwgRFdfQVRfc2libGluZywgJnNpYmF0dHIuY29kZSwKKwkJCQkmc2liYXR0ci5mb3JtKTsKKyAgICAgIGlmIChzaWJhdHRyLmNvZGUgPT0gRFdfQVRfc2libGluZykKKwl7CisJICBEd2FyZl9PZmYgb2Zmc2V0OworCSAgc2liYXR0ci52YWxwID0gYWRkcjsKKwkgIGlmIChJTlRVU0UoZHdhcmZfZm9ybXJlZikgKCZzaWJhdHRyLCAmb2Zmc2V0KSAhPSAwKQorCSAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCisJICAgIHJldHVybiAtMTsKKworCSAgLyogQ29tcHV0ZSB0aGUgbmV4dCBhZGRyZXNzLiAgKi8KKwkgIGFkZHIgPSAoKHVuc2lnbmVkIGNoYXIgKikKKwkJICBzaWJhdHRyLmN1LT5kYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19pbmZvXS0+ZF9idWYKKwkJICArIHNpYmF0dHIuY3UtPnN0YXJ0ICsgb2Zmc2V0KTsKKwl9CisgICAgICBlbHNlIGlmICh1bmxpa2VseSAoYWRkciA9PSBOVUxMKQorCSAgICAgICB8fCB1bmxpa2VseSAodGhpc19kaWUuYWJicmV2ID09IChEd2FyZl9BYmJyZXYgKikgLTFsKSkKKwlyZXR1cm4gLTE7CisgICAgICBlbHNlIGlmICh0aGlzX2RpZS5hYmJyZXYtPmhhc19jaGlsZHJlbikKKwkvKiBUaGlzIGFiYnJldmlhdGlvbiBoYXMgY2hpbGRyZW4uICAqLworCSsrbGV2ZWw7CisKKworICAgICAgd2hpbGUgKDEpCisJeworCSAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBpbiByYW5nZS4gIFNvbWUgcHJvZHVjZXJzIG1pZ2h0IHNraXAKKwkgICAgIHRoZSB0cmFpbGluZyBOVUwgYnl0ZXMuICAqLworCSAgaWYgKGFkZHIgPj0gZW5kcCkKKwkgICAgcmV0dXJuIDE7CisKKwkgIGlmICgqYWRkciAhPSAnXDAnKQorCSAgICBicmVhazsKKworCSAgaWYgKGxldmVsLS0gPT0gMCkKKwkgICAgLyogTm8gbW9yZSBzaWJsaW5nIGF0IGFsbC4gICovCisJICAgIHJldHVybiAxOworCisJICArK2FkZHI7CisJfQorCisgICAgICAvKiBJbml0aWFsaXplIHRoZSAnY3VycmVudCBESUUnLiAgKi8KKyAgICAgIHRoaXNfZGllLmFkZHIgPSBhZGRyOworICAgICAgdGhpc19kaWUuYWJicmV2ID0gTlVMTDsKKyAgICB9CisgIHdoaWxlIChsZXZlbCA+IDApOworCisgIC8qIE1heWJlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgQ1UuICAqLworICBpZiAoYWRkciA+PSBlbmRwKQorICAgIHJldHVybiAxOworCisgIC8qIENsZWFyIHRoZSBlbnRpcmUgRElFIHN0cnVjdHVyZS4gIFRoaXMgc2lnbmFscyB3ZSBoYXZlIG5vdCB5ZXQKKyAgICAgZGV0ZXJtaW5lZCBhbnkgb2YgdGhlIGluZm9ybWF0aW9uLiAgKi8KKyAgbWVtc2V0IChyZXN1bHQsICdcMCcsIHNpemVvZiAoRHdhcmZfRGllKSk7CisKKyAgLyogV2UgaGF2ZSB0aGUgYWRkcmVzcy4gICovCisgIHJlc3VsdC0+YWRkciA9IGFkZHI7CisKKyAgLyogU2FtZSBDVSBhcyB0aGUgcGFyZW50LiAgKi8KKyAgcmVzdWx0LT5jdSA9IHNpYmF0dHIuY3U7CisKKyAgcmV0dXJuIDA7Cit9CitJTlRERUYoZHdhcmZfc2libGluZ29mKQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfc3JjbGFuZy5jIGIvbGliZHcvZHdhcmZfc3JjbGFuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjA2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl9zcmNsYW5nLmMKQEAgLTAsMCArMSwzMyBAQAorLyogUmV0dXJuIHNvdXJjZSBsYW5ndWFnZSBhdHRyaWJ1dGUgb2YgRElFLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitpbnQKK2R3YXJmX3NyY2xhbmcgKGRpZSkKKyAgICAgRHdhcmZfRGllICpkaWU7Cit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgRHdhcmZfV29yZCB2YWx1ZTsKKworICByZXR1cm4gSU5UVVNFKGR3YXJmX2Zvcm11ZGF0YSkgKElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9sYW5ndWFnZSwKKwkJCQkJCSAgICAgICZhdHRyX21lbSksCisJCQkJICAmdmFsdWUpID09IDAgPyAoaW50KSB2YWx1ZSA6IC0xOworfQpkaWZmIC0tZ2l0IGEvbGliZHcvZHdhcmZfdGFnLmMgYi9saWJkdy9kd2FyZl90YWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzliNjgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfdGFnLmMKQEAgLTAsMCArMSw4MiBAQAorLyogUmV0dXJuIHRhZyBvZiBnaXZlbiBESUUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitEd2FyZl9BYmJyZXYgKgoraW50ZXJuYWxfZnVuY3Rpb25fZGVmCitfX2xpYmR3X2ZpbmRhYmJyZXYgKHN0cnVjdCBEd2FyZl9DVSAqY3UsIHVuc2lnbmVkIGludCBjb2RlKQoreworICBEd2FyZl9BYmJyZXYgKmFiYjsKKworICAvKiBTZWUgd2hldGhlciB0aGUgZW50cnkgaXMgYWxyZWFkeSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCisgIGFiYiA9IER3YXJmX0FiYnJldl9IYXNoX2ZpbmQgKCZjdS0+YWJicmV2X2hhc2gsIGNvZGUsIE5VTEwpOworICBpZiAoYWJiID09IE5VTEwpCisgICAgd2hpbGUgKGN1LT5sYXN0X2FiYnJldl9vZmZzZXQgIT0gKHNpemVfdCkgLTFsKQorICAgICAgeworCXNpemVfdCBsZW5ndGg7CisKKwkvKiBGaW5kIHRoZSBuZXh0IGVudHJ5LiAgSXQgZ2V0cyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZQorCSAgIGhhc2ggdGFibGUuICAqLworCWFiYiA9IF9fbGliZHdfZ2V0YWJicmV2IChjdS0+ZGJnLCBjdSwgY3UtPmxhc3RfYWJicmV2X29mZnNldCwgJmxlbmd0aCwKKwkJCQkgTlVMTCk7CisJaWYgKGFiYiA9PSBOVUxMIHx8IGFiYiA9PSBEV0FSRl9FTkRfQUJCUkVWKQorCSAgeworCSAgICAvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHRyeSB0byBzZWFyY2ggZm9yIGl0IGFnYWluLiAgKi8KKwkgICAgY3UtPmxhc3RfYWJicmV2X29mZnNldCA9IChzaXplX3QpIC0xbDsKKwkgICAgYWJiID0gKHZvaWQgKikgLTFsOworCSAgICBicmVhazsKKwkgIH0KKworCWN1LT5sYXN0X2FiYnJldl9vZmZzZXQgKz0gbGVuZ3RoOworCisJLyogSXMgdGhpcyB0aGUgY29kZSB3ZSBhcmUgbG9va2luZyBmb3I/ICAqLworCWlmIChhYmItPmNvZGUgPT0gY29kZSkKKwkgIGJyZWFrOworICAgICAgfQorCisgIHJldHVybiBhYmI7Cit9CisKKworaW50Citkd2FyZl90YWcgKGRpZSkKKyAgICAgRHdhcmZfRGllICpkaWU7Cit7CisgIC8qIERvIHdlIGFscmVhZHkga25vdyB0aGUgYWJicmV2aWF0aW9uPyAgKi8KKyAgaWYgKGRpZS0+YWJicmV2ID09IE5VTEwpCisgICAgeworICAgICAgLyogR2V0IHRoZSBhYmJyZXZpYXRpb24gY29kZS4gICovCisgICAgICB1bnNpZ25lZCBpbnQgdTEyODsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIgPSBkaWUtPmFkZHI7CisgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgYWRkcik7CisKKyAgICAgIC8qIEZpbmQgdGhlIGFiYnJldmlhdGlvbi4gICovCisgICAgICBkaWUtPmFiYnJldiA9IF9fbGliZHdfZmluZGFiYnJldiAoZGllLT5jdSwgdTEyOCk7CisgICAgfQorCisgIGlmIChkaWUtPmFiYnJldiA9PSAoRHdhcmZfQWJicmV2ICopIC0xbCkKKyAgICB7CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOworICAgICAgcmV0dXJuIERXX1RBR19pbnZhbGlkOworICAgIH0KKworICByZXR1cm4gZGllLT5hYmJyZXYtPnRhZzsKK30KK0lOVERFRihkd2FyZl90YWcpCmRpZmYgLS1naXQgYS9saWJkdy9kd2FyZl93aGF0YXR0ci5jIGIvbGliZHcvZHdhcmZfd2hhdGF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDVkODY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvZHdhcmZfd2hhdGF0dHIuYwpAQCAtMCwwICsxLDI4IEBACisvKiBSZXR1cm4gYXR0cmlidXRlIGNvZGUgb2YgZ2l2ZW4gYXR0cmlidXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCit1bnNpZ25lZCBpbnQKK2R3YXJmX3doYXRhdHRyIChhdHRyKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHI7Cit7CisgIHJldHVybiBhdHRyID09IE5VTEwgPyAwIDogYXR0ci0+Y29kZTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2R3YXJmX3doYXRmb3JtLmMgYi9saWJkdy9kd2FyZl93aGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGExYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9kd2FyZl93aGF0Zm9ybS5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIFJldHVybiBmb3JtIGNvZGUgb2YgZ2l2ZW4gYXR0cmlidXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCit1bnNpZ25lZCBpbnQKK2R3YXJmX3doYXRmb3JtIChhdHRyKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHI7Cit7CisgIHJldHVybiBhdHRyID09IE5VTEwgPyAwIDogYXR0ci0+Zm9ybTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L2xpYmR3LmggYi9saWJkdy9saWJkdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmJlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9saWJkdy5oCkBAIC0wLDAgKzEsNTY0IEBACisvKiBJbnRlcmZhY2VzIGZvciBsaWJkdy4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZm5kZWYgX0xJQkRXX0gKKyNkZWZpbmUgX0xJQkRXX0gJMQorCisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworCisjaWYgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDMpCisjIGRlZmluZSBfX25vbm51bGxfYXR0cmlidXRlX18oLi4uKSBfX2F0dHJpYnV0ZV9fICgoX19ub25udWxsX18gKF9fVkFfQVJHU19fKSkpCisjZWxzZQorIyBkZWZpbmUgX19ub25udWxsX2F0dHJpYnV0ZV9fKGFyZ3MuLi4pCisjZW5kaWYKKworCisvKiBNb2RlIGZvciB0aGUgc2Vzc2lvbi4gICovCit0eXBlZGVmIGVudW0KKyAgeworICAgIERXQVJGX0NfUkVBRCwJCS8qIFJlYWQgLi4gKi8KKyAgICBEV0FSRl9DX1JEV1IsCQkvKiBSZWFkIGFuZCB3cml0ZSAuLiAqLworICAgIERXQVJGX0NfV1JJVEUsCQkvKiBXcml0ZSAuLiAqLworICB9CitEd2FyZl9DbWQ7CisKKworLyogQ2FsbGJhY2sgcmVzdWx0cy4gICovCitlbnVtCit7CisgIERXQVJGX0NCX09LID0gMCwKKyAgRFdBUkZfQ0JfQUJPUlQKK307CisKKworLyogRXJyb3IgdmFsdWVzLiAgKi8KK2VudW0KKyAgeworICAgIERXX1RBR19pbnZhbGlkID0gMAorI2RlZmluZSBEV19UQUdfaW52YWxpZAlEV19UQUdfaW52YWxpZAorICB9OworCisKKy8qIFR5cGUgZm9yIG9mZnNldCBpbiBEV0FSRiBmaWxlLiAgKi8KK3R5cGVkZWYgR0VsZl9PZmYgRHdhcmZfT2ZmOworCisvKiBUeXBlIGZvciBhZGRyZXNzIGluIERXQVJGIGZpbGUuICAqLwordHlwZWRlZiBHRWxmX0FkZHIgRHdhcmZfQWRkcjsKKworLyogSW50ZWdlciB0eXBlcy4gIEJpZyBlbm91Z2ggdG8gaG9sZCBhbnkgbnVtZXJpYyB2YWx1ZS4gICovCit0eXBlZGVmIEdFbGZfWHdvcmQgRHdhcmZfV29yZDsKK3R5cGVkZWYgR0VsZl9TeHdvcmQgRHdhcmZfU3dvcmQ7CisvKiBGb3IgdGhlIHRpbWVzIHdlIGtub3cgd2UgZG8gbm90IG5lZWQgdGhhdCBtdWNoLiAgKi8KK3R5cGVkZWYgR0VsZl9IYWxmIER3YXJmX0hhbGY7CisKKworLyogRFdBUkYgYWJicmV2aWF0aW9uIHJlY29yZC4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9BYmJyZXYgRHdhcmZfQWJicmV2OworCisvKiBSZXR1cm5lZCB0byBzaG93IHRoZSBsYXN0IERJRSBoYXMgYmUgcmV0dXJuZWQuICAqLworI2RlZmluZSBEV0FSRl9FTkRfQUJCUkVWICgoRHdhcmZfQWJicmV2ICopIC0xbCkKKworLyogU291cmNlIGNvZGUgbGluZSBpbmZvcm1hdGlvbiBmb3IgQ1UuICAqLwordHlwZWRlZiBzdHJ1Y3QgRHdhcmZfTGluZXNfcyBEd2FyZl9MaW5lczsKKworLyogT25lIHNvdXJjZSBjb2RlIGxpbmUgaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QgRHdhcmZfTGluZV9zIER3YXJmX0xpbmU7CisKKy8qIFNvdXJjZSBmaWxlIGluZm9ybWF0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0IER3YXJmX0ZpbGVzX3MgRHdhcmZfRmlsZXM7CisKKy8qIE9uZSBhZGRyZXNzIHJhbmdlIHJlY29yZC4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9BcmFuZ2VfcyBEd2FyZl9BcmFuZ2U7CisKKy8qIEFkZHJlc3MgcmFuZ2VzIG9mIGEgZmlsZS4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9BcmFuZ2VzX3MgRHdhcmZfQXJhbmdlczsKKworLyogQ1UgcmVwcmVzZW50YXRpb24uICAqLworc3RydWN0IER3YXJmX0NVOworCisvKiBGdW5jdGlvbiBpbmZvcm1hdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9GdW5jX3MgRHdhcmZfRnVuYzsKKworLyogTWFjcm8gaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QgRHdhcmZfTWFjcm9fcyBEd2FyZl9NYWNybzsKKworLyogQXR0cmlidXRlIHJlcHJlc2VudGF0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGludCBjb2RlOworICB1bnNpZ25lZCBpbnQgZm9ybTsKKyAgdW5zaWduZWQgY2hhciAqdmFscDsKKyAgc3RydWN0IER3YXJmX0NVICpjdTsKK30gRHdhcmZfQXR0cmlidXRlOworCisKKy8qIERhdGEgYmxvY2sgcmVwcmVzZW50YXRpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRHdhcmZfV29yZCBsZW5ndGg7CisgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Cit9IER3YXJmX0Jsb2NrOworCisKKy8qIERJRSBpbmZvcm1hdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBUaGUgb2Zmc2V0IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZSBhZGRyZXNzLiAgKi8KKyAgdm9pZCAqYWRkcjsKKyAgc3RydWN0IER3YXJmX0NVICpjdTsKKyAgRHdhcmZfQWJicmV2ICphYmJyZXY7CisgIC8vIFhYWCBXZSdsbCBzZWUgd2hhdCBvdGhlciBpbmZvcm1hdGlvbiB3aWxsIGJlIG5lZWRlZC4KKyAgbG9uZyBpbnQgcGFkZGluZ19fOworfSBEd2FyZl9EaWU7CisKKy8qIFJldHVybmVkIHRvIHNob3cgdGhlIGxhc3QgRElFIGhhcyBiZSByZXR1cm5lZC4gICovCisjZGVmaW5lIERXQVJGX0VORF9ESUUgKChEd2FyZl9EaWUgKikgLTFsKQorCisKKy8qIEdsb2JhbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRHdhcmZfT2ZmIGN1X29mZnNldDsKKyAgRHdhcmZfT2ZmIGRpZV9vZmZzZXQ7CisgIGNvbnN0IGNoYXIgKm5hbWU7Cit9IER3YXJmX0dsb2JhbDsKKworCisvLyBYWFggSXQgcmVtYWlucyB0byBiZSBzZWVuIHdoZXRoZXIgdGhlIG5leHQgdHdvIG5lZWQgdG8gYmUgZXhwb3J0ZWQuCisvKiBMb2NhdGlvbiByZWNvcmQuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCBhdG9tOwkJCS8qIE9wZXJhdGlvbiAqLworICBEd2FyZl9Xb3JkIG51bWJlcjsJCS8qIE9wZXJhbmQgKi8KKyAgRHdhcmZfV29yZCBudW1iZXIyOwkJLyogUG9zc2libGUgc2Vjb25kIG9wZXJhbmQgKi8KKyAgRHdhcmZfV29yZCBvZmZzZXQ7CQkvKiBPZmZzZXQgaW4gbG9jYXRpb24gZXhwcmVzc2lvbiAqLworfSBEd2FyZl9Mb2M7CisKKworLyogSGFuZGxlIGZvciBkZWJ1ZyBzZXNzaW9ucy4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZiBEd2FyZjsKKworCisvKiBPdXQtT2YtTWVtb3J5IGhhbmRsZXIuICAqLworI2lmIF9fR05VQ19fIDwgNAordHlwZWRlZiB2b2lkICgqRHdhcmZfT09NKSAodm9pZCk7CisjZWxzZQordHlwZWRlZiB2b2lkICgqX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkgRHdhcmZfT09NKSAodm9pZCk7CisjZW5kaWYKKworCisvKiBDcmVhdGUgYSBoYW5kbGUgZm9yIGEgbmV3IGRlYnVnIHNlc3Npb24uICAqLworZXh0ZXJuIER3YXJmICpkd2FyZl9iZWdpbiAoaW50IGZpbGRlcywgRHdhcmZfQ21kIGNtZCk7CisKKy8qIENyZWF0ZSBhIGhhbmRsZSBmb3IgYSBuZXcgZGVidWcgc2Vzc2lvbiBmb3IgYW4gRUxGIGZpbGUuICAqLworZXh0ZXJuIER3YXJmICpkd2FyZl9iZWdpbl9lbGYgKEVsZiAqZWxmLCBEd2FyZl9DbWQgY21kLCBFbGZfU2NuICpzY25ncnApOworCisvKiBSZXRyaWV2ZSBFTEYgZGVzY3JpcHRvciB1c2VkIGZvciBEV0FSRiBhY2Nlc3MuICAqLworZXh0ZXJuIEVsZiAqZHdhcmZfZ2V0ZWxmIChEd2FyZiAqZHdhcmYpOworCisvKiBSZWxlYXNlIGRlYnVnZ2luZyBoYW5kbGluZyBjb250ZXh0LiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZW5kIChEd2FyZiAqZHdhcmYpOworCisKKy8qIEdldCB0aGUgZGF0YSBibG9jayBmb3IgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICAqLworZXh0ZXJuIEVsZl9EYXRhICpkd2FyZl9nZXRzY25faW5mbyAoRHdhcmYgKmR3YXJmKTsKKworLyogUmVhZCB0aGUgaGVhZGVyIGZvciB0aGUgRFdBUkYgQ1UgaGVhZGVyLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfbmV4dGN1IChEd2FyZiAqZHdhcmYsIER3YXJmX09mZiBvZmYsIER3YXJmX09mZiAqbmV4dF9vZmYsCisJCQkgc2l6ZV90ICpoZWFkZXJfc2l6ZXAsIER3YXJmX09mZiAqYWJicmV2X29mZnNldHAsCisJCQkgdWludDhfdCAqYWRkcmVzc19zaXplcCwgdWludDhfdCAqb2Zmc2V0X3NpemVwKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDMpOworCisKKy8qIFJldHVybiBESUUgYXQgZ2l2ZW4gb2Zmc2V0LiAgKi8KK2V4dGVybiBEd2FyZl9EaWUgKmR3YXJmX29mZmRpZSAoRHdhcmYgKmRiZywgRHdhcmZfT2ZmIG9mZnNldCwKKwkJCQlEd2FyZl9EaWUgKnJlc3VsdCkgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKKworLyogUmV0dXJuIG9mZnNldCBvZiBESUUuICAqLworZXh0ZXJuIER3YXJmX09mZiBkd2FyZl9kaWVvZmZzZXQgKER3YXJmX0RpZSAqZGllKTsKKworLyogUmV0dXJuIG9mZnNldCBvZiBESUUgaW4gQ1UuICAqLworZXh0ZXJuIER3YXJmX09mZiBkd2FyZl9jdW9mZnNldCAoRHdhcmZfRGllICpkaWUpOworCisvKiBSZXR1cm4gQ1UgRElFIGNvbnRhaW5pbmcgZ2l2ZW4gYWRkcmVzcy4gICovCitleHRlcm4gRHdhcmZfRGllICpkd2FyZl9hZGRyZGllIChEd2FyZiAqZGJnLCBEd2FyZl9BZGRyIGFkZHIsCisJCQkJIER3YXJmX0RpZSAqcmVzdWx0KSBfX25vbm51bGxfYXR0cmlidXRlX18gKDMpOworCisvKiBSZXR1cm4gY2hpbGQgb2YgY3VycmVudCBESUUuICAqLworZXh0ZXJuIGludCBkd2FyZl9jaGlsZCAoRHdhcmZfRGllICpkaWUsIER3YXJmX0RpZSAqcmVzdWx0KQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisvKiBSZXR1cm4gc2libGluZyBvZiBnaXZlbiBESUUuICAqLworZXh0ZXJuIGludCBkd2FyZl9zaWJsaW5nb2YgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9EaWUgKnJlc3VsdCkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKKworLyogQ2hlY2sgd2hldGhlciB0aGUgRElFIGhhcyBjaGlsZHJlbi4gICovCitleHRlcm4gaW50IGR3YXJmX2hhc2NoaWxkcmVuIChEd2FyZl9EaWUgKmRpZSk7CisKKy8qIEdldCBhdHRyaWJ1dGVzIG9mIHRoZSBESUUuICAqLworZXh0ZXJuIHB0cmRpZmZfdCBkd2FyZl9nZXRhdHRycyAoRHdhcmZfRGllICpkaWUsCisJCQkJIGludCAoKmNhbGxiYWNrKSAoRHdhcmZfQXR0cmlidXRlICosIHZvaWQgKiksCisJCQkJIHZvaWQgKmFyZywgcHRyZGlmZl90IG9mZnNldCk7CisKKy8qIFJldHVybiB0YWcgb2YgZ2l2ZW4gRElFLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfdGFnIChEd2FyZl9EaWUgKmRpZSk7CisKKworLyogUmV0dXJuIHNwZWNpZmljIGF0dHJpYnV0ZSBvZiBESUUuICAqLworZXh0ZXJuIER3YXJmX0F0dHJpYnV0ZSAqZHdhcmZfYXR0ciAoRHdhcmZfRGllICpkaWUsIHVuc2lnbmVkIGludCBzZWFyY2hfbmFtZSwKKwkJCQkgICAgRHdhcmZfQXR0cmlidXRlICpyZXN1bHQpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7CisKKy8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gRElFIGhhcyBzcGVjaWZpYyBhdHRyaWJ1dGUuICAqLworZXh0ZXJuIGludCBkd2FyZl9oYXNhdHRyIChEd2FyZl9EaWUgKmRpZSwgdW5zaWduZWQgaW50IHNlYXJjaF9uYW1lKTsKKworLyogVGhlc2UgYXJlIHRoZSBzYW1lIGFzIGR3YXJmX2F0dHIgYW5kIGR3YXJmX2hhc2F0dHIsIHJlc3BlY3RpdmVseSwKKyAgIGJ1dCB0aGV5IHJlc29sdmUgYW4gaW5kaXJlY3QgYXR0cmlidXRlIHRocm91Z2ggRFdfQVRfYWJzdHJhY3Rfb3JpZ2luLiAgKi8KK2V4dGVybiBEd2FyZl9BdHRyaWJ1dGUgKmR3YXJmX2F0dHJfaW50ZWdyYXRlIChEd2FyZl9EaWUgKmRpZSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IHNlYXJjaF9uYW1lLAorCQkJCQkgICAgICBEd2FyZl9BdHRyaWJ1dGUgKnJlc3VsdCkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKK2V4dGVybiBpbnQgZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUgKER3YXJmX0RpZSAqZGllLCB1bnNpZ25lZCBpbnQgc2VhcmNoX25hbWUpOworCisKKworCisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIGF0dHJpYnV0ZSBoYXMgc3BlY2lmaWMgZm9ybS4gICovCitleHRlcm4gaW50IGR3YXJmX2hhc2Zvcm0gKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgdW5zaWduZWQgaW50IHNlYXJjaF9mb3JtKTsKKworLyogUmV0dXJuIGF0dHJpYnV0ZSBjb2RlIG9mIGdpdmVuIGF0dHJpYnV0ZS4gICovCitleHRlcm4gdW5zaWduZWQgaW50IGR3YXJmX3doYXRhdHRyIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIpOworCisvKiBSZXR1cm4gZm9ybSBjb2RlIG9mIGdpdmVuIGF0dHJpYnV0ZS4gICovCitleHRlcm4gdW5zaWduZWQgaW50IGR3YXJmX3doYXRmb3JtIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIpOworCisKKy8qIFJldHVybiBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIGF0dHJpYnV0ZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqZHdhcmZfZm9ybXN0cmluZyAoRHdhcmZfQXR0cmlidXRlICphdHRycCk7CisKKy8qIFJldHVybiB1bnNpZ25lZCBjb25zdGFudCByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuICAqLworZXh0ZXJuIGludCBkd2FyZl9mb3JtdWRhdGEgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgRHdhcmZfV29yZCAqcmV0dXJuX3V2YWwpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiBzaWduZWQgY29uc3RhbnQgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZm9ybXNkYXRhIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX1N3b3JkICpyZXR1cm5fdXZhbCkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKKworLyogUmV0dXJuIGFkZHJlc3MgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZm9ybWFkZHIgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgRHdhcmZfQWRkciAqcmV0dXJuX2FkZHIpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiByZWZlcmVuY2Ugb2Zmc2V0IHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4gICovCitleHRlcm4gaW50IGR3YXJmX2Zvcm1yZWYgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgRHdhcmZfT2ZmICpyZXR1cm5fb2Zmc2V0KQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisvKiBMb29rIHVwIHRoZSBESUUgaW4gYSByZWZlcmVuY2UtZm9ybSBhdHRyaWJ1dGUuICAqLworZXh0ZXJuIER3YXJmX0RpZSAqZHdhcmZfZm9ybXJlZl9kaWUgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgRHdhcmZfRGllICpkaWVfbWVtKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisvKiBSZXR1cm4gYmxvY2sgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZm9ybWJsb2NrIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX0Jsb2NrICpyZXR1cm5fYmxvY2spCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiBmbGFnIHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4gICovCitleHRlcm4gaW50IGR3YXJmX2Zvcm1mbGFnIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIGJvb2wgKnJldHVybl9ib29sKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisKKy8qIFNpbXBsaWZpZWQgYXR0cmlidXRlIHZhbHVlIGFjY2VzcyBmdW5jdGlvbnMuICAqLworCisvKiBSZXR1cm4gc3RyaW5nIGluIG5hbWUgYXR0cmlidXRlIG9mIERJRS4gICovCitleHRlcm4gY29uc3QgY2hhciAqZHdhcmZfZGllbmFtZSAoRHdhcmZfRGllICpkaWUpOworCisvKiBSZXR1cm4gaGlnaCBQQyBhdHRyaWJ1dGUgb2YgRElFLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfaGlnaHBjIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfQWRkciAqcmV0dXJuX2FkZHIpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiBsb3cgUEMgYXR0cmlidXRlIG9mIERJRS4gICovCitleHRlcm4gaW50IGR3YXJmX2xvd3BjIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfQWRkciAqcmV0dXJuX2FkZHIpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiAxIGlmIERJRSdzIGxvd3BjL2hpZ2hwYyBvciByYW5nZXMgYXR0cmlidXRlcyBtYXRjaCB0aGUgUEMgYWRkcmVzcywKKyAgIDAgaWYgbm90LCBvciAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfaGFzcGMgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9BZGRyIHBjKTsKKworLyogUmV0dXJuIGJ5dGUgc2l6ZSBhdHRyaWJ1dGUgb2YgRElFLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfYnl0ZXNpemUgKER3YXJmX0RpZSAqZGllKTsKKworLyogUmV0dXJuIGJpdCBzaXplIGF0dHJpYnV0ZSBvZiBESUUuICAqLworZXh0ZXJuIGludCBkd2FyZl9iaXRzaXplIChEd2FyZl9EaWUgKmRpZSk7CisKKy8qIFJldHVybiBiaXQgb2Zmc2V0IGF0dHJpYnV0ZSBvZiBESUUuICAqLworZXh0ZXJuIGludCBkd2FyZl9iaXRvZmZzZXQgKER3YXJmX0RpZSAqZGllKTsKKworLyogUmV0dXJuIGFycmF5IG9yZGVyIGF0dHJpYnV0ZSBvZiBESUUuICAqLworZXh0ZXJuIGludCBkd2FyZl9hcnJheW9yZGVyIChEd2FyZl9EaWUgKmRpZSk7CisKKy8qIFJldHVybiBzb3VyY2UgbGFuZ3VhZ2UgYXR0cmlidXRlIG9mIERJRS4gICovCitleHRlcm4gaW50IGR3YXJmX3NyY2xhbmcgKER3YXJmX0RpZSAqZGllKTsKKworCisvKiBHZXQgYWJicmV2aWF0aW9uIGF0IGdpdmVuIG9mZnNldCBmb3IgZ2l2ZW4gRElFLiAgKi8KK2V4dGVybiBEd2FyZl9BYmJyZXYgKmR3YXJmX2dldGFiYnJldiAoRHdhcmZfRGllICpkaWUsIER3YXJmX09mZiBvZmZzZXQsCisJCQkJICAgICAgc2l6ZV90ICpsZW5ndGhwKTsKKworLyogR2V0IGFiYnJldmlhdGlvbiBhdCBnaXZlbiBvZmZzZXQgaW4gLmRlYnVnX2FiYnJldiBzZWN0aW9uLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfb2ZmYWJicmV2IChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgb2Zmc2V0LCBzaXplX3QgKmxlbmd0aHAsCisJCQkgICAgRHdhcmZfQWJicmV2ICphYmJyZXZwKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDQpOworCisvKiBHZXQgYWJicmV2aWF0aW9uIGNvZGUuICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBkd2FyZl9nZXRhYmJyZXZjb2RlIChEd2FyZl9BYmJyZXYgKmFiYnJldik7CisKKy8qIEdldCBhYmJyZXZpYXRpb24gdGFnLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgZHdhcmZfZ2V0YWJicmV2dGFnIChEd2FyZl9BYmJyZXYgKmFiYnJldik7CisKKy8qIFJldHVybiB0cnVlIGlmIGFiYnJldmlhdGlvbiBpcyBjaGlsZHJlbiBmbGFnIHNldC4gICovCitleHRlcm4gaW50IGR3YXJmX2FiYnJldmhhc2NoaWxkcmVuIChEd2FyZl9BYmJyZXYgKmFiYnJldik7CisKKy8qIEdldCBudW1iZXIgb2YgYXR0cmlidXRlcyBvZiBhYmJyZXZpYXRpb24uICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRhdHRyY250IChEd2FyZl9BYmJyZXYgKmFiYnJldiwgc2l6ZV90ICphdHRyY250cCkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKKworLyogR2V0IHNwZWNpZmljIGF0dHJpYnV0ZSBvZiBhYmJyZXZpYXRpb24uICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRhYmJyZXZhdHRyIChEd2FyZl9BYmJyZXYgKmFiYnJldiwgc2l6ZV90IGlkeCwKKwkJCQl1bnNpZ25lZCBpbnQgKm5hbWVwLCB1bnNpZ25lZCBpbnQgKmZvcm1wLAorCQkJCUR3YXJmX09mZiAqb2Zmc2V0KTsKKworCisvKiBHZXQgc3RyaW5nIGZyb20tZGVidWdfc3RyIHNlY3Rpb24uICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmR3YXJmX2dldHN0cmluZyAoRHdhcmYgKmRiZywgRHdhcmZfT2ZmIG9mZnNldCwKKwkJCQkgICAgc2l6ZV90ICpsZW5wKTsKKworCisvKiBHZXQgcHVibGljIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCitleHRlcm4gcHRyZGlmZl90IGR3YXJmX2dldHB1Ym5hbWVzIChEd2FyZiAqZGJnLAorCQkJCSAgICBpbnQgKCpjYWxsYmFjaykgKER3YXJmICosIER3YXJmX0dsb2JhbCAqLAorCQkJCQkJICAgICB2b2lkICopLAorCQkJCSAgICB2b2lkICphcmcsIHB0cmRpZmZfdCBvZmZzZXQpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKworLyogR2V0IHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uIGZvciBDVS4gICovCitleHRlcm4gaW50IGR3YXJmX2dldHNyY2xpbmVzIChEd2FyZl9EaWUgKmN1ZGllLCBEd2FyZl9MaW5lcyAqKmxpbmVzLAorCQkJICAgICAgc2l6ZV90ICpubGluZXMpIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMiwgMyk7CisKKy8qIFJldHVybiBvbmUgb2YgdGhlIHNvdXJjZSBsaW5lcyBvZiB0aGUgQ1UuICAqLworZXh0ZXJuIER3YXJmX0xpbmUgKmR3YXJmX29uZXNyY2xpbmUgKER3YXJmX0xpbmVzICpsaW5lcywgc2l6ZV90IGlkeCk7CisKKy8qIEdldCB0aGUgZmlsZSBzb3VyY2UgZmlsZXMgdXNlZCBpbiB0aGUgQ1UuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRzcmNmaWxlcyAoRHdhcmZfRGllICpjdWRpZSwgRHdhcmZfRmlsZXMgKipmaWxlcywKKwkJCSAgICAgIHNpemVfdCAqbmZpbGVzKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisKKy8qIEdldCBzb3VyY2UgZm9yIGFkZHJlc3MgaW4gQ1UuICAqLworZXh0ZXJuIER3YXJmX0xpbmUgKmR3YXJmX2dldHNyY19kaWUgKER3YXJmX0RpZSAqY3VkaWUsIER3YXJmX0FkZHIgYWRkcik7CisKKy8qIEdldCBzb3VyY2UgZm9yIGZpbGUgYW5kIGxpbmUgbnVtYmVyLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2V0c3JjX2ZpbGUgKER3YXJmICpkYmcsIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbGluZSwgaW50IGNvbCwKKwkJCSAgICAgIER3YXJmX0xpbmUgKioqc3Jjc3AsIHNpemVfdCAqbnNyY3MpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMiwgNSwgNik7CisKKworLyogUmV0dXJuIGxpbmUgYWRkcmVzcy4gICovCitleHRlcm4gaW50IGR3YXJmX2xpbmVhZGRyIChEd2FyZl9MaW5lICpsaW5lLCBEd2FyZl9BZGRyICphZGRycCk7CisKKy8qIFJldHVybiBsaW5lIG51bWJlci4gICovCitleHRlcm4gaW50IGR3YXJmX2xpbmVubyAoRHdhcmZfTGluZSAqbGluZSwgaW50ICpsaW5lcCkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKKworLyogUmV0dXJuIGNvbHVtbiBpbiBsaW5lLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfbGluZWNvbCAoRHdhcmZfTGluZSAqbGluZSwgaW50ICpjb2xwKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisvKiBSZXR1cm4gdHJ1ZSBpZiByZWNvcmQgaXMgZm9yIGJlZ2lubmluZyBvZiBhIHN0YXRlbWVudC4gICovCitleHRlcm4gaW50IGR3YXJmX2xpbmViZWdpbnN0YXRlbWVudCAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiB0cnVlIGlmIHJlY29yZCBpcyBmb3IgZW5kIG9mIHNlcXVlbmNlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfbGluZWVuZHNlcXVlbmNlIChEd2FyZl9MaW5lICpsaW5lLCBib29sICpmbGFncCkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKKworLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBiZWdpbm5pbmcgb2YgYSBiYXNpYyBibG9jay4gICovCitleHRlcm4gaW50IGR3YXJmX2xpbmVibG9jayAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiB0cnVlIGlmIHJlY29yZCBpcyBmb3IgZW5kIG9mIHByb2xvZ3VlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfbGluZXByb2xvZ3VlZW5kIChEd2FyZl9MaW5lICpsaW5lLCBib29sICpmbGFncCkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKKworLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBiZWdpbm5pbmcgb2YgZXBpbG9ndWUuICAqLworZXh0ZXJuIGludCBkd2FyZl9saW5lZXBpbG9ndWViZWdpbiAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKworLyogRmluZCBsaW5lIGluZm9ybWF0aW9uIGZvciBhZGRyZXNzLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpkd2FyZl9saW5lc3JjIChEd2FyZl9MaW5lICpsaW5lLAorCQkJCSAgRHdhcmZfV29yZCAqbXRpbWUsIER3YXJmX1dvcmQgKmxlbmd0aCk7CisKKy8qIFJldHVybiBmaWxlIGluZm9ybWF0aW9uLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpkd2FyZl9maWxlc3JjIChEd2FyZl9GaWxlcyAqZmlsZSwgc2l6ZV90IGlkeCwKKwkJCQkgIER3YXJmX1dvcmQgKm10aW1lLCBEd2FyZl9Xb3JkICpsZW5ndGgpOworCisKKy8qIFJldHVybiBsb2NhdGlvbiBleHByZXNzaW9uIGxpc3QuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRsb2NsaXN0IChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX0xvYyAqKmxsYnVmLAorCQkJICAgICBzaXplX3QgKmxpc3RsZW4pIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMiwgMyk7CisKKy8qIFJldHVybiBsb2NhdGlvbiBleHByZXNzaW9uIGxpc3RzLiAgSWYgdGhlIGF0dHJpYnV0ZSB1c2VzIGEgbG9jYXRpb24KKyAgIGxpc3QsIEFERFJFU1Mgc2VsZWN0cyB0aGUgcmVsZXZhbnQgbG9jYXRpb24gZXhwcmVzc2lvbnMgZnJvbSB0aGUgbGlzdC4KKyAgIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBtYXRjaGVzLCByZXN1bHRpbmcgaW4gbXVsdGlwbGUgZXhwcmVzc2lvbnMgdG8KKyAgIHJldHVybi4gIExMQlVGUyBhbmQgTElTVExFTlMgYXJlIHBhcmFsbGVsIGFycmF5cyBvZiBOTE9DUyBzbG90cyB0byBmaWxsCisgICBpbi4gIFJldHVybnMgdGhlIG51bWJlciBvZiBsb2NhdGlvbnMgZmlsbGVkIGluLCBvciAtMSBmb3IgZXJyb3JzLiAgSWYKKyAgIExMQlVGUyBpcyBhIG51bGwgcG9pbnRlciwgc3RvcmVzIG5vdGhpbmcgYW5kIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZgorICAgbG9jYXRpb25zLiAgQSByZXR1cm4gdmFsdWUgb2YgemVybyBtZWFucyB0aGF0IHRoZSBsb2NhdGlvbiBsaXN0CisgICBpbmRpY2F0ZWQgbm8gdmFsdWUgaXMgYWNjZXNzaWJsZS4gICovCitleHRlcm4gaW50IGR3YXJmX2FkZHJsb2NsaXN0cyAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9BZGRyIGFkZHJlc3MsCisJCQkgICAgICAgRHdhcmZfTG9jICoqbGxidWZzLCBzaXplX3QgKmxpc3RsZW5zLAorCQkJICAgICAgIHNpemVfdCBubG9jcyk7CisKKworLyogUmV0dXJuIHNjb3BlIERJRXMgY29udGFpbmluZyBQQyBhZGRyZXNzLgorICAgU2V0cyAqU0NPUEVTIHRvIGEgbWFsbG9jJ2QgYXJyYXkgb2YgRHdhcmZfRGllIHN0cnVjdHVyZXMsCisgICBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAgICgqU0NPUEVTKVswXSBpcyB0aGUgRElFIGZvciB0aGUgaW5uZXJtb3N0IHNjb3BlIGNvbnRhaW5pbmcgUEMsCisgICAoKlNDT1BFUylbMV0gaXMgdGhlIERJRSBmb3IgdGhlIHNjb3BlIGNvbnRhaW5pbmcgdGhhdCBzY29wZSwgYW5kIHNvIG9uLgorICAgUmV0dXJucyAtMSBmb3IgZXJyb3JzIG9yIDAgaWYgbm8gc2NvcGVzIG1hdGNoIFBDLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2V0c2NvcGVzIChEd2FyZl9EaWUgKmN1ZGllLCBEd2FyZl9BZGRyIHBjLAorCQkJICAgIER3YXJmX0RpZSAqKnNjb3Blcyk7CisKKy8qIFNlYXJjaCBTQ09QRVNbMC4uTlNDT1BFUy0xXSBmb3IgYSB2YXJpYWJsZSBjYWxsZWQgTkFNRS4KKyAgIElnbm9yZSB0aGUgZmlyc3QgU0tJUF9TSEFET1dTIHNjb3BlcyB0aGF0IG1hdGNoIHRoZSBuYW1lLgorICAgSWYgTUFUQ0hfRklMRSBpcyBub3QgbnVsbCwgYWNjZXB0IG9ubHkgZGVjbGFyYXRpb24gaW4gdGhhdCBzb3VyY2UgZmlsZTsKKyAgIGlmIE1BVENIX0xJTkVOTyBvciBNQVRDSF9MSU5FQ09MIGFyZSBhbHNvIG5vbnplcm8sIGFjY2VwdCBvbmx5IGRlY2xhcmF0aW9uCisgICBhdCB0aGF0IGxpbmUgYW5kIGNvbHVtbi4KKworICAgSWYgc3VjY2Vzc2Z1bCwgZmlsbCBpbiAqUkVTVUxUIHdpdGggdGhlIERJRSBvZiB0aGUgdmFyaWFibGUgZm91bmQsCisgICBhbmQgcmV0dXJuIE4gd2hlcmUgU0NPUEVTW05dIGlzIHRoZSBzY29wZSBkZWZpbmluZyB0aGUgdmFyaWFibGUuCisgICBSZXR1cm4gLTEgZm9yIGVycm9ycyBvciAtMiBmb3Igbm8gbWF0Y2hpbmcgdmFyaWFibGUgZm91bmQuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRzY29wZXZhciAoRHdhcmZfRGllICpzY29wZXMsIGludCBuc2NvcGVzLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IHNraXBfc2hhZG93cywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm1hdGNoX2ZpbGUsCisJCQkgICAgICBpbnQgbWF0Y2hfbGluZW5vLCBpbnQgbWF0Y2hfbGluZWNvbCwKKwkJCSAgICAgIER3YXJmX0RpZSAqcmVzdWx0KTsKKworCisKKy8qIFJldHVybiBsaXN0IGFkZHJlc3MgcmFuZ2VzLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2V0YXJhbmdlcyAoRHdhcmYgKmRiZywgRHdhcmZfQXJhbmdlcyAqKmFyYW5nZXMsCisJCQkgICAgIHNpemVfdCAqbmFyYW5nZXMpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiBvbmUgb2YgdGhlIGFkZHJlc3MgcmFuZ2UgZW50cmllcy4gICovCitleHRlcm4gRHdhcmZfQXJhbmdlICpkd2FyZl9vbmVhcmFuZ2UgKER3YXJmX0FyYW5nZXMgKmFyYW5nZXMsIHNpemVfdCBpZHgpOworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gaW4gYWRkcmVzcyByYW5nZSByZWNvcmQuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRhcmFuZ2VpbmZvIChEd2FyZl9BcmFuZ2UgKmFyYW5nZSwgRHdhcmZfQWRkciAqYWRkcnAsCisJCQkJRHdhcmZfV29yZCAqbGVuZ3RocCwgRHdhcmZfT2ZmICpvZmZzZXRwKTsKKworLyogR2V0IGFkZHJlc3MgcmFuZ2Ugd2hpY2ggaW5jbHVkZXMgZ2l2ZW4gYWRkcmVzcy4gICovCitleHRlcm4gRHdhcmZfQXJhbmdlICpkd2FyZl9nZXRhcmFuZ2VfYWRkciAoRHdhcmZfQXJhbmdlcyAqYXJhbmdlcywKKwkJCQkJICAgRHdhcmZfQWRkciBhZGRyKTsKKworCisKKy8qIEdldCBmdW5jdGlvbnMgaW4gQ1VESUUuICAqLworZXh0ZXJuIHB0cmRpZmZfdCBkd2FyZl9nZXRmdW5jcyAoRHdhcmZfRGllICpjdWRpZSwKKwkJCQkgaW50ICgqY2FsbGJhY2spIChEd2FyZl9GdW5jICosIHZvaWQgKiksCisJCQkJIHZvaWQgKmFyZywgcHRyZGlmZl90IG9mZnNldCk7CisKKy8qIFJldHVybiBuYW1lIG9mIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpkd2FyZl9mdW5jX25hbWUgKER3YXJmX0Z1bmMgKmZ1bmMpOworCisvKiBSZXR1cm4gc3RhcnQgYWRkcmVzcyBvZiBmdW5jdGlvbi4gICovCitleHRlcm4gaW50IGR3YXJmX2Z1bmNfbG93cGMgKER3YXJmX0Z1bmMgKmZ1bmMsIER3YXJmX0FkZHIgKnJldHVybl9hZGRyKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisvKiBSZXR1cm4gZW5kIGFkZHJlc3Mgb2YgZnVuY3Rpb24uICAqLworZXh0ZXJuIGludCBkd2FyZl9mdW5jX2hpZ2hwYyAoRHdhcmZfRnVuYyAqZnVuYywgRHdhcmZfQWRkciAqcmV0dXJuX2FkZHIpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiBlbnRyeSBwb2ludCBhZGRyZXNzIG9mIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZnVuY19lbnRyeXBjIChEd2FyZl9GdW5jICpmdW5jLCBEd2FyZl9BZGRyICpyZXR1cm5fYWRkcikKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKKworLyogUmV0dXJuIGZpbGUgbmFtZSBjb250YWluaW5nIGRlZmluaXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpkd2FyZl9mdW5jX2ZpbGUgKER3YXJmX0Z1bmMgKmZ1bmMpOworCisvKiBHZXQgbGluZSBudW1iZXIgb2YgYmVnaW5uaW5nIG9mIGdpdmVuIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZnVuY19saW5lIChEd2FyZl9GdW5jICpmdW5jLCBpbnQgKmxpbmVwKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisvKiBHZXQgY29sdW1uIG51bWJlciBvZiBiZWdpbm5pbmcgb2YgZ2l2ZW4gZnVuY3Rpb24uICAqLworZXh0ZXJuIGludCBkd2FyZl9mdW5jX2NvbCAoRHdhcmZfRnVuYyAqZnVuYywgaW50ICpjb2xwKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisKKy8qIENhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVhY2ggb2YgdGhlIG1hY3JvIGluZm9ybWF0aW9uIGVudHJ5IGZvcgorICAgdGhlIENVLiAgKi8KK2V4dGVybiBwdHJkaWZmX3QgZHdhcmZfZ2V0bWFjcm9zIChEd2FyZl9EaWUgKmN1ZGllLAorCQkJCSAgaW50ICgqY2FsbGJhY2spIChEd2FyZl9NYWNybyAqLCB2b2lkICopLAorCQkJCSAgdm9pZCAqYXJnLCBwdHJkaWZmX3Qgb2Zmc2V0KQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisvKiBSZXR1cm4gbWFjcm8gb3Bjb2RlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfbWFjcm9fb3Bjb2RlIChEd2FyZl9NYWNybyAqbWFjcm8sIHVuc2lnbmVkIGludCAqb3Bjb2RlcCkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKKworLyogUmV0dXJuIGZpcnN0IG1hY3JvIHBhcmFtZXRlci4gICovCitleHRlcm4gaW50IGR3YXJmX21hY3JvX3BhcmFtMSAoRHdhcmZfTWFjcm8gKm1hY3JvLCBEd2FyZl9Xb3JkICpwYXJhbXApCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7CisKKy8qIFJldHVybiBzZWNvbmQgbWFjcm8gcGFyYW1ldGVyLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfbWFjcm9fcGFyYW0yIChEd2FyZl9NYWNybyAqbWFjcm8sIER3YXJmX1dvcmQgKnBhcmFtcCwKKwkJCSAgICAgICBjb25zdCBjaGFyICoqc3RycCk7CisKKworLyogUmV0dXJuIGVycm9yIGNvZGUgb2YgbGFzdCBmYWlsaW5nIGZ1bmN0aW9uIGNhbGwuICBUaGlzIHZhbHVlIGlzIGtlcHQKKyAgIHNlcGFyYXRlbHkgZm9yIGVhY2ggdGhyZWFkLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZXJybm8gKHZvaWQpOworCisvKiBSZXR1cm4gZXJyb3Igc3RyaW5nIGZvciBFUlJPUi4gIElmIEVSUk9SIGlzIHplcm8sIHJldHVybiBlcnJvciBzdHJpbmcKKyAgIGZvciBtb3N0IHJlY2VudCBlcnJvciBvciBOVUxMIGlzIG5vbmUgb2NjdXJyZWQuICBJZiBFUlJPUiBpcyAtMSB0aGUKKyAgIGJlaGF2aW91ciBpcyBzaW1pbGFyIHRvIHRoZSBsYXN0IGNhc2UgZXhjZXB0IHRoYXQgbm90IE5VTEwgYnV0IGEgbGVnYWwKKyAgIHN0cmluZyBpcyByZXR1cm5lZC4gICovCitleHRlcm4gY29uc3QgY2hhciAqZHdhcmZfZXJybXNnIChpbnQgZXJyKTsKKworCisvKiBSZWdpc3RlciBuZXcgT3V0LU9mLU1lbW9yeSBoYW5kbGVyLiAgVGhlIG9sZCBoYW5kbGVyIGlzIHJldHVybmVkLiAgKi8KK2V4dGVybiBEd2FyZl9PT00gZHdhcmZfbmV3X29vbV9oYW5kbGVyIChEd2FyZiAqZGJnLCBEd2FyZl9PT00gaGFuZGxlcik7CisKKworLyogSW5saW5lIG9wdGltaXphdGlvbnMuICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworLyogUmV0dXJuIGF0dHJpYnV0ZSBjb2RlIG9mIGdpdmVuIGF0dHJpYnV0ZS4gICovCitleHRlcm4gaW5saW5lIHVuc2lnbmVkIGludAorZHdhcmZfd2hhdGF0dHIgKER3YXJmX0F0dHJpYnV0ZSAqYXR0cikKK3sKKyAgcmV0dXJuIGF0dHIgPT0gTlVMTCA/IDAgOiBhdHRyLT5jb2RlOworfQorCisvKiBSZXR1cm4gYXR0cmlidXRlIGNvZGUgb2YgZ2l2ZW4gYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbmxpbmUgdW5zaWduZWQgaW50Citkd2FyZl93aGF0Zm9ybSAoRHdhcmZfQXR0cmlidXRlICphdHRyKQoreworICByZXR1cm4gYXR0ciA9PSBOVUxMID8gMCA6IGF0dHItPmZvcm07Cit9CisjZW5kaWYJLyogT3B0aW1pemUuICAqLworCisjZW5kaWYJLyogbGliZHcuaCAqLwpkaWZmIC0tZ2l0IGEvbGliZHcvbGliZHcubWFwIGIvbGliZHcvbGliZHcubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkM2M5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9saWJkdy5tYXAKQEAgLTAsMCArMSw5MiBAQAorRUxGVVRJTFNfMS4wIHsKKyAgZ2xvYmFsOgorICAgIGR3YXJmX2FiYnJldmhhc2NoaWxkcmVuOworICAgIGR3YXJmX2FkZHJkaWU7CisgICAgZHdhcmZfYWRkcmxvY2xpc3RzOworICAgIGR3YXJmX2F0dHI7CisgICAgZHdhcmZfYXR0cl9pbnRlZ3JhdGU7CisgICAgZHdhcmZfYXJyYXlvcmRlcjsKKyAgICBkd2FyZl9iZWdpbjsKKyAgICBkd2FyZl9iZWdpbl9lbGY7CisgICAgZHdhcmZfYml0b2Zmc2V0OworICAgIGR3YXJmX2JpdHNpemU7CisgICAgZHdhcmZfYnl0ZXNpemU7CisgICAgZHdhcmZfY2hpbGQ7CisgICAgZHdhcmZfY3VvZmZzZXQ7CisgICAgZHdhcmZfZGllbmFtZTsKKyAgICBkd2FyZl9kaWVvZmZzZXQ7CisgICAgZHdhcmZfZW5kOworICAgIGR3YXJmX2Vycm1zZzsKKyAgICBkd2FyZl9lcnJubzsKKyAgICBkd2FyZl9maWxlc3JjOworICAgIGR3YXJmX2Zvcm1hZGRyOworICAgIGR3YXJmX2Zvcm1ibG9jazsKKyAgICBkd2FyZl9mb3JtZmxhZzsKKyAgICBkd2FyZl9mb3JtcmVmOworICAgIGR3YXJmX2Zvcm1yZWZfZGllOworICAgIGR3YXJmX2Zvcm1zZGF0YTsKKyAgICBkd2FyZl9mb3Jtc3RyaW5nOworICAgIGR3YXJmX2Zvcm11ZGF0YTsKKyAgICBkd2FyZl9mdW5jX2NvbDsKKyAgICBkd2FyZl9mdW5jX2VudHJ5cGM7CisgICAgZHdhcmZfZnVuY19maWxlOworICAgIGR3YXJmX2Z1bmNfaGlnaHBjOworICAgIGR3YXJmX2Z1bmNfbGluZTsKKyAgICBkd2FyZl9mdW5jX2xvd3BjOworICAgIGR3YXJmX2Z1bmNfbmFtZTsKKyAgICBkd2FyZl9nZXRhYmJyZXY7CisgICAgZHdhcmZfZ2V0YWJicmV2YXR0cjsKKyAgICBkd2FyZl9nZXRhYmJyZXZjb2RlOworICAgIGR3YXJmX2dldGFiYnJldnRhZzsKKyAgICBkd2FyZl9nZXRhcmFuZ2VfYWRkcjsKKyAgICBkd2FyZl9nZXRhcmFuZ2VpbmZvOworICAgIGR3YXJmX2dldGFyYW5nZXM7CisgICAgZHdhcmZfZ2V0YXR0cmNudDsKKyAgICBkd2FyZl9nZXRhdHRyczsKKyAgICBkd2FyZl9nZXRlbGY7CisgICAgZHdhcmZfZ2V0ZnVuY3M7CisgICAgZHdhcmZfZ2V0bG9jbGlzdDsKKyAgICBkd2FyZl9nZXRtYWNyb3M7CisgICAgZHdhcmZfZ2V0cHVibmFtZXM7CisgICAgZHdhcmZfZ2V0c2NvcGVzOworICAgIGR3YXJmX2dldHNjb3BldmFyOworICAgIGR3YXJmX2dldHNjbl9pbmZvOworICAgIGR3YXJmX2dldHNyY19kaWU7CisgICAgZHdhcmZfZ2V0c3JjX2ZpbGU7CisgICAgZHdhcmZfZ2V0c3JjZmlsZXM7CisgICAgZHdhcmZfZ2V0c3JjbGluZXM7CisgICAgZHdhcmZfZ2V0c3RyaW5nOworICAgIGR3YXJmX2hhc2F0dHI7CisgICAgZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGU7CisgICAgZHdhcmZfaGFzcGM7CisgICAgZHdhcmZfaGFzY2hpbGRyZW47CisgICAgZHdhcmZfaGFzZm9ybTsKKyAgICBkd2FyZl9oaWdocGM7CisgICAgZHdhcmZfbGluZWFkZHI7CisgICAgZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50OworICAgIGR3YXJmX2xpbmVibG9jazsKKyAgICBkd2FyZl9saW5lY29sOworICAgIGR3YXJmX2xpbmVlbmRzZXF1ZW5jZTsKKyAgICBkd2FyZl9saW5lZXBpbG9ndWViZWdpbjsKKyAgICBkd2FyZl9saW5lbm87CisgICAgZHdhcmZfbGluZXByb2xvZ3VlZW5kOworICAgIGR3YXJmX2xpbmVzcmM7CisgICAgZHdhcmZfbG93cGM7CisgICAgZHdhcmZfbWFjcm9fb3Bjb2RlOworICAgIGR3YXJmX21hY3JvX3BhcmFtMTsKKyAgICBkd2FyZl9tYWNyb19wYXJhbTI7CisgICAgZHdhcmZfb2ZmYWJicmV2OworICAgIGR3YXJmX29mZmRpZTsKKyAgICBkd2FyZl9vbmVhcmFuZ2U7CisgICAgZHdhcmZfb25lc3JjbGluZTsKKyAgICBkd2FyZl9uZXh0Y3U7CisgICAgZHdhcmZfbmV3X29vbV9oYW5kbGVyOworICAgIGR3YXJmX3NpYmxpbmdvZjsKKyAgICBkd2FyZl9zcmNsYW5nOworICAgIGR3YXJmX3RhZzsKKyAgICBkd2FyZl93aGF0YXR0cjsKKyAgICBkd2FyZl93aGF0Zm9ybTsKKworICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL2xpYmR3L2xpYmR3UC5oIGIvbGliZHcvbGliZHdQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlMDJhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2xpYmR3UC5oCkBAIC0wLDAgKzEsMzc4IEBACisvKiBJbnRlcm5hbCBkZWZpbml0aW9ucyBmb3IgbGliZHdhcmYuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZm5kZWYgX0xJQkRXUF9ICisjZGVmaW5lIF9MSUJEV1BfSCAxCisKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaW5jbHVkZSA8bGliZHcuaD4KKworCisvKiBnZXR0ZXh0IGhlbHBlciBtYWNyb3MuICAqLworI2RlZmluZSBfKFN0cikgZGdldHRleHQgKCJlbGZ1dGlscyIsIFN0cikKKworCisvKiBWZXJzaW9uIG9mIHRoZSBEV0FSRiBzcGVjaWZpY2F0aW9uIHdlIHN1cHBvcnQuICAqLworI2RlZmluZSBEV0FSRl9WRVJTSU9OIDIKKworLyogVmVyc2lvbiBvZiB0aGUgQ0lFIGZvcm1hdC4gICovCisjZGVmaW5lIENJRV9WRVJTSU9OIDEKKworCisvKiBLbm93biBsb2NhdGlvbiBsaXN0cy4gICovCitzdHJ1Y3QgbG9jX3MKK3sKKyAgdm9pZCAqYWRkcjsKKyAgRHdhcmZfTG9jICpsb2M7CisgIHNpemVfdCBubG9jOworfTsKKworLyogVmFsaWQgaW5kZWNlcyBmb3IgdGhlIHNlY3Rpb24gZGF0YS4gICovCitlbnVtCisgIHsKKyAgICBJRFhfZGVidWdfaW5mbyA9IDAsCisgICAgSURYX2RlYnVnX2FiYnJldiwKKyAgICBJRFhfZGVidWdfYXJhbmdlcywKKyAgICBJRFhfZGVidWdfbGluZSwKKyAgICBJRFhfZGVidWdfZnJhbWUsCisgICAgSURYX2VoX2ZyYW1lLAorICAgIElEWF9kZWJ1Z19sb2MsCisgICAgSURYX2RlYnVnX3B1Ym5hbWVzLAorICAgIElEWF9kZWJ1Z19zdHIsCisgICAgSURYX2RlYnVnX2Z1bmNuYW1lcywKKyAgICBJRFhfZGVidWdfdHlwZW5hbWVzLAorICAgIElEWF9kZWJ1Z192YXJuYW1lcywKKyAgICBJRFhfZGVidWdfd2Vha25hbWVzLAorICAgIElEWF9kZWJ1Z19tYWNpbmZvLAorICAgIElEWF9kZWJ1Z19yYW5nZXMsCisgICAgSURYX2xhc3QKKyAgfTsKKworCisvKiBFcnJvciB2YWx1ZXMuICAqLworZW51bQoreworICBEV0FSRl9FX05PRVJST1IgPSAwLAorICBEV0FSRl9FX1VOS05PV05fRVJST1IsCisgIERXQVJGX0VfSU5WQUxJRF9BQ0NFU1MsCisgIERXQVJGX0VfTk9fUkVHRklMRSwKKyAgRFdBUkZfRV9JT19FUlJPUiwKKyAgRFdBUkZfRV9JTlZBTElEX0VMRiwKKyAgRFdBUkZfRV9OT19EV0FSRiwKKyAgRFdBUkZfRV9OT0VMRiwKKyAgRFdBUkZfRV9HRVRFSERSX0VSUk9SLAorICBEV0FSRl9FX05PTUVNLAorICBEV0FSRl9FX1VOSU1QTCwKKyAgRFdBUkZfRV9JTlZBTElEX0NNRCwKKyAgRFdBUkZfRV9JTlZBTElEX1ZFUlNJT04sCisgIERXQVJGX0VfSU5WQUxJRF9GSUxFLAorICBEV0FSRl9FX05PX0VOVFJZLAorICBEV0FSRl9FX0lOVkFMSURfRFdBUkYsCisgIERXQVJGX0VfTk9fU1RSSU5HLAorICBEV0FSRl9FX05PX0FERFIsCisgIERXQVJGX0VfTk9fQ09OU1RBTlQsCisgIERXQVJGX0VfTk9fUkVGRVJFTkNFLAorICBEV0FSRl9FX0lOVkFMSURfUkVGRVJFTkNFLAorICBEV0FSRl9FX05PX0RFQlVHX0xJTkUsCisgIERXQVJGX0VfSU5WQUxJRF9ERUJVR19MSU5FLAorICBEV0FSRl9FX1RPT19CSUcsCisgIERXQVJGX0VfVkVSU0lPTiwKKyAgRFdBUkZfRV9JTlZBTElEX0RJUl9JRFgsCisgIERXQVJGX0VfQUREUl9PVVRPRlJBTkdFLAorICBEV0FSRl9FX05PX0xPQ0xJU1QsCisgIERXQVJGX0VfTk9fQkxPQ0ssCisgIERXQVJGX0VfSU5WQUxJRF9MSU5FX0lEWCwKKyAgRFdBUkZfRV9JTlZBTElEX0FSQU5HRV9JRFgsCisgIERXQVJGX0VfTk9fTUFUQ0gsCisgIERXQVJGX0VfTk9fRkxBRywKKyAgRFdBUkZfRV9JTlZBTElEX09GRlNFVCwKKyAgRFdBUkZfRV9OT19ERUJVR19SQU5HRVMsCit9OworCisKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGRlYnVnZ2luZyBzdGF0ZS4gICovCitzdHJ1Y3QgRHdhcmYKK3sKKyAgLyogVGhlIHVuZGVybHlpbmcgRUxGIGZpbGUuICAqLworICBFbGYgKmVsZjsKKworICAvKiBUaGUgc2VjdGlvbiBkYXRhLiAgKi8KKyAgRWxmX0RhdGEgKnNlY3Rpb25kYXRhW0lEWF9sYXN0XTsKKworICAvKiBUcnVlIGlmIHRoZSBmaWxlIGhhcyBhIGJ5dGUgb3JkZXIgZGlmZmVyZW50IGZyb20gdGhlIGhvc3QuICAqLworICBib29sIG90aGVyX2J5dGVfb3JkZXI7CisKKyAgLyogSWYgdHJ1ZSwgd2UgYWxsb2NhdGVkIHRoZSBFTEYgZGVzY3JpcHRvciBvdXJzZWx2ZXMuICAqLworICBib29sIGZyZWVfZWxmOworCisgIC8qIEluZm9ybWF0aW9uIGZvciB0cmF2ZXJzaW5nIHRoZSAuZGVidWdfcHVibmFtZXMgc2VjdGlvbi4gIFRoaXMgaXMKKyAgICAgYW4gYXJyYXkgYW5kIHNlcGFyYXRlbHkgYWxsb2NhdGVkIHdpdGggbWFsbG9jLiAgKi8KKyAgc3RydWN0IHB1Ym5hbWVzX3MKKyAgeworICAgIER3YXJmX09mZiBjdV9vZmZzZXQ7CisgICAgRHdhcmZfT2ZmIHNldF9zdGFydDsKKyAgICB1bnNpZ25lZCBpbnQgY3VfaGVhZGVyX3NpemU7CisgICAgaW50IGFkZHJlc3NfbGVuOworICB9ICpwdWJuYW1lc19zZXRzOworICBzaXplX3QgcHVibmFtZXNfbnNldHM7CisKKyAgLyogU2VhcmNoIHRyZWUgZm9yIHRoZSBDVXMuICAqLworICB2b2lkICpjdV90cmVlOworICBEd2FyZl9PZmYgbmV4dF9jdV9vZmZzZXQ7CisKKyAgLyogQWRkcmVzcyByYW5nZXMuICAqLworICBEd2FyZl9BcmFuZ2VzICphcmFuZ2VzOworCisgIC8qIEludGVybmFsIG1lbW9yeSBoYW5kbGluZy4gIFRoaXMgaXMgYmFzaWNhbGx5IGEgc2ltcGxpZmllZAorICAgICByZWltcGxlbWVudGF0aW9uIG9mIG9ic3RhY2tzLiAgVW5mb3J0dW5hdGVseSB0aGUgc3RhbmRhcmQgb2JzdGFjaworICAgICBpbXBsZW1lbnRhdGlvbiBpcyBub3QgdXNhYmxlIGluIGxpYnJhcmllcy4gICovCisgIHN0cnVjdCBsaWJkd19tZW1ibG9jaworICB7CisgICAgc2l6ZV90IHNpemU7CisgICAgc2l6ZV90IHJlbWFpbmluZzsKKyAgICBzdHJ1Y3QgbGliZHdfbWVtYmxvY2sgKnByZXY7CisgICAgY2hhciBtZW1bMF07CisgIH0gKm1lbV90YWlsOworCisgIC8qIERlZmF1bHQgc2l6ZSBvZiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2Nrcy4gICovCisgIHNpemVfdCBtZW1fZGVmYXVsdF9zaXplOworCisgIC8qIFJlZ2lzdGVyZWQgT09NIGhhbmRsZXIuICAqLworICBEd2FyZl9PT00gb29tX2hhbmRsZXI7Cit9OworCisKKy8qIEFiYnJldmlhdGlvbiByZXByZXNlbnRhdGlvbi4gICovCitzdHJ1Y3QgRHdhcmZfQWJicmV2Cit7CisgIHVuc2lnbmVkIGludCBjb2RlOworICB1bnNpZ25lZCBpbnQgdGFnOworICBpbnQgaGFzX2NoaWxkcmVuOworICB1bnNpZ25lZCBpbnQgYXR0cmNudDsKKyAgdW5zaWduZWQgY2hhciAqYXR0cnA7CisgIER3YXJmX09mZiBvZmZzZXQ7Cit9OworCisjaW5jbHVkZSAiZHdhcmZfYWJicmV2X2hhc2guaCIKKworCisvKiBGaWxlcyBpbiBsaW5lIGluZm9ybWF0aW9uIHJlY29yZHMuICAqLworc3RydWN0IER3YXJmX0ZpbGVzX3MKKyAgeworICAgIER3YXJmICpkYmc7CisgICAgdW5zaWduZWQgaW50IG5maWxlczsKKyAgICBzdHJ1Y3QgRHdhcmZfRmlsZWluZm9fcworICAgIHsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBEd2FyZl9Xb3JkIG10aW1lOworICAgICAgRHdhcmZfV29yZCBsZW5ndGg7CisgICAgfSBpbmZvWzBdOworICB9OwordHlwZWRlZiBzdHJ1Y3QgRHdhcmZfRmlsZWluZm9fcyBEd2FyZl9GaWxlaW5mbzsKKworCisvKiBSZXByZXNlbnRhdGlvbiBvZiBhIHJvdyBpbiB0aGUgbGluZSB0YWJsZS4gICovCitzdHJ1Y3QgRHdhcmZfTGluZXNfcworICB7CisgICAgc2l6ZV90IG5saW5lczsKKworICAgIHN0cnVjdCBEd2FyZl9MaW5lX3MKKyAgICB7CisgICAgICBEd2FyZl9BZGRyIGFkZHI7CisgICAgICB1bnNpZ25lZCBpbnQgZmlsZTsKKyAgICAgIGludCBsaW5lOworICAgICAgdW5zaWduZWQgc2hvcnQgaW50IGNvbHVtbjsKKyAgICAgIHVuc2lnbmVkIGludCBpc19zdG10OjE7CisgICAgICB1bnNpZ25lZCBpbnQgYmFzaWNfYmxvY2s6MTsKKyAgICAgIHVuc2lnbmVkIGludCBlbmRfc2VxdWVuY2U6MTsKKyAgICAgIHVuc2lnbmVkIGludCBwcm9sb2d1ZV9lbmQ6MTsKKyAgICAgIHVuc2lnbmVkIGludCBlcGlsb2d1ZV9iZWdpbjoxOworCisgICAgICBEd2FyZl9GaWxlcyAqZmlsZXM7CisgICAgfSBpbmZvWzBdOworICB9OworCisKKy8qIFJlcHJlc2VudGF0aW9uIG9mIGFkZHJlc3MgcmFuZ2VzLiAgKi8KK3N0cnVjdCBEd2FyZl9BcmFuZ2VzX3MKK3sKKyAgRHdhcmYgKmRiZzsKKyAgc2l6ZV90IG5hcmFuZ2VzOworCisgIHN0cnVjdCBEd2FyZl9BcmFuZ2VfcworICB7CisgICAgRHdhcmZfQWRkciBhZGRyOworICAgIER3YXJmX1dvcmQgbGVuZ3RoOworICAgIER3YXJmX09mZiBvZmZzZXQ7CisgIH0gaW5mb1swXTsKK307CisKKworLyogQ1UgcmVwcmVzZW50YXRpb24uICAqLworc3RydWN0IER3YXJmX0NVCit7CisgIER3YXJmICpkYmc7CisgIER3YXJmX09mZiBzdGFydDsKKyAgRHdhcmZfT2ZmIGVuZDsKKyAgdWludDhfdCBhZGRyZXNzX3NpemU7CisgIHVpbnQ4X3Qgb2Zmc2V0X3NpemU7CisKKyAgLyogSGFzaCB0YWJsZSBmb3IgdGhlIGFiYnJldmlhdGlvbnMuICAqLworICBEd2FyZl9BYmJyZXZfSGFzaCBhYmJyZXZfaGFzaDsKKyAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBhYmJyZXZpYXRpb24uICAqLworICBzaXplX3Qgb3JpZ19hYmJyZXZfb2Zmc2V0OworICAvKiBPZmZzZXQgcGFzdCBsYXN0IHJlYWQgYWJicmV2aWF0aW9uLiAgKi8KKyAgc2l6ZV90IGxhc3RfYWJicmV2X29mZnNldDsKKworICAvKiBUaGUgc3JjbGluZSBpbmZvcm1hdGlvbi4gICovCisgIER3YXJmX0xpbmVzICpsaW5lczsKKworICAvKiBUaGUgc291cmNlIGZpbGUgaW5mb3JtYXRpb24uICAqLworICBEd2FyZl9GaWxlcyAqZmlsZXM7CisKKyAgLyogS25vd24gbG9jYXRpb24gbGlzdHMuICAqLworICB2b2lkICpsb2NzOworfTsKKworCisvKiBGdW5jdGlvbiBpbmZvcm1hdGlvbi4gICovCitzdHJ1Y3QgRHdhcmZfRnVuY19zCit7CisgIC8vIFhYWCBJZiB3ZSB3YW50IHRvIGNhY2hlIGZ1bmN0aW9ucywgd2UgbmVlZCB0byBjaGFuZ2UgdGhpcyBzdHJ1Y3QuCisgIER3YXJmX0RpZSAqZGllOworICBEd2FyZl9EaWUgKmN1ZGllOworfTsKKworCisvKiBNYWNybyBpbmZvcm1hdGlvbi4gICovCitzdHJ1Y3QgRHdhcmZfTWFjcm9fcworeworICB1bnNpZ25lZCBpbnQgb3Bjb2RlOworICBEd2FyZl9Xb3JkIHBhcmFtMTsKKyAgdW5pb24KKyAgeworICAgIER3YXJmX1dvcmQgdTsKKyAgICBjb25zdCBjaGFyICpzOworICB9IHBhcmFtMjsKK307CisKKworLyogV2UgaGF2ZSB0byBpbmNsdWRlIHRoZSBmaWxlIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0aGUgaW5saW5lCisgICBmdW5jdGlvbnMgYWNjZXNzIGludGVybmFscyBvZiB0aGUgRHdhcmYgc3RydWN0dXJlLiAgKi8KKyNpbmNsdWRlICJtZW1vcnktYWNjZXNzLmgiCisKKworLyogU2V0IGVycm9yIHZhbHVlLiAgKi8KK2V4dGVybiB2b2lkIF9fbGliZHdfc2V0ZXJybm8gKGludCB2YWx1ZSkgaW50ZXJuYWxfZnVuY3Rpb247CisKKworLyogTWVtb3J5IGhhbmRsaW5nLCB0aGUgZWFzeSBwYXJ0cy4gIFRoaXMgbWFjcm8gZG9lcyBub3QgZG8gYW55IGxvY2tpbmcuICAqLworI2RlZmluZSBsaWJkd19hbGxvYyhkYmcsIHR5cGUsIHRzaXplLCBjbnQpIFwKKyAgKHsgc3RydWN0IGxpYmR3X21lbWJsb2NrICpfdGFpbCA9IChkYmcpLT5tZW1fdGFpbDsJCQkgICAgICBcCisgICAgIHNpemVfdCBfcmVxdWlyZWQgPSAodHNpemUpICogKGNudCk7CQkJCSAgICAgIFwKKyAgICAgdHlwZSAqX3Jlc3VsdCA9ICh0eXBlICopIChfdGFpbC0+bWVtICsgKF90YWlsLT5zaXplIC0gX3RhaWwtPnJlbWFpbmluZykpO1wKKyAgICAgc2l6ZV90IF9wYWRkaW5nID0gKChfX2FsaWdub2YgKHR5cGUpCQkJCSAgICAgIFwKKwkJCSAtICgodWludHB0cl90KSBfcmVzdWx0ICYgKF9fYWxpZ25vZiAodHlwZSkgLSAxKSkpICAgIFwKKwkJCSYgKF9fYWxpZ25vZiAodHlwZSkgLSAxKSk7CQkJICAgICAgXAorICAgICBpZiAodW5saWtlbHkgKF90YWlsLT5yZW1haW5pbmcgPCBfcmVxdWlyZWQgKyBfcGFkZGluZykpCQkgICAgICBcCisgICAgICAgewkJCQkJCQkJICAgICAgXAorCSBfcmVzdWx0ID0gKHR5cGUgKikgX19saWJkd19hbGxvY2F0ZSAoZGJnLCBfcmVxdWlyZWQpOwkJICAgICAgXAorCSBfdGFpbCA9IChkYmcpLT5tZW1fdGFpbDsJCQkJCSAgICAgIFwKKyAgICAgICB9CQkJCQkJCQkgICAgICBcCisgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKyAgICAgICB7CQkJCQkJCQkgICAgICBcCisJIF9yZXF1aXJlZCArPSBfcGFkZGluZzsJCQkJCQkgICAgICBcCisJIF9yZXN1bHQgPSAodHlwZSAqKSAoKGNoYXIgKikgX3Jlc3VsdCArIF9wYWRkaW5nKTsJCSAgICAgIFwKKyAgICAgICB9CQkJCQkJCQkgICAgICBcCisgICAgIF90YWlsLT5yZW1haW5pbmcgLT0gX3JlcXVpcmVkOwkJCQkJICAgICAgXAorICAgICBfcmVzdWx0OyB9KQorCisjZGVmaW5lIGxpYmR3X3R5cGVkX2FsbG9jKGRiZywgdHlwZSkgXAorICBsaWJkd19hbGxvYyAoZGJnLCB0eXBlLCBzaXplb2YgKHR5cGUpLCAxKQorCisvKiBDYWxsYmFjayB0byBhbGxvY2F0ZSBtb3JlLiAgKi8KK2V4dGVybiB2b2lkICpfX2xpYmR3X2FsbG9jYXRlIChEd2FyZiAqZGJnLCBzaXplX3QgbWluc2l6ZSkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbWFsbG9jX18pKSBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpOworCisvKiBEZWZhdWx0IE9PTSBoYW5kbGVyLiAgKi8KK2V4dGVybiB2b2lkIF9fbGliZHdfb29tICh2b2lkKSBfX2F0dHJpYnV0ZSAoKG5vcmV0dXJuLCB2aXNpYmlsaXR5ICgiaGlkZGVuIikpKTsKKworLyogRmluZCBDVSBmb3IgZ2l2ZW4gb2Zmc2V0LiAgKi8KK2V4dGVybiBzdHJ1Y3QgRHdhcmZfQ1UgKl9fbGliZHdfZmluZGN1IChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgb2Zmc2V0KQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpIGludGVybmFsX2Z1bmN0aW9uOworCisvKiBSZXR1cm4gdGFnIG9mIGdpdmVuIERJRS4gICovCitleHRlcm4gRHdhcmZfQWJicmV2ICpfX2xpYmR3X2ZpbmRhYmJyZXYgKHN0cnVjdCBEd2FyZl9DVSAqY3UsCisJCQkJCSB1bnNpZ25lZCBpbnQgY29kZSkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKSBpbnRlcm5hbF9mdW5jdGlvbjsKKworLyogR2V0IGFiYnJldmlhdGlvbiBhdCBnaXZlbiBvZmZzZXQuICAqLworZXh0ZXJuIER3YXJmX0FiYnJldiAqX19saWJkd19nZXRhYmJyZXYgKER3YXJmICpkYmcsIHN0cnVjdCBEd2FyZl9DVSAqY3UsCisJCQkJCUR3YXJmX09mZiBvZmZzZXQsIHNpemVfdCAqbGVuZ3RocCwKKwkJCQkJRHdhcmZfQWJicmV2ICpyZXN1bHQpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSkgaW50ZXJuYWxfZnVuY3Rpb247CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIGZvcm0gaGFuZGxpbmcuICAqLworZXh0ZXJuIHNpemVfdCBfX2xpYmR3X2Zvcm1fdmFsX2xlbiAoRHdhcmYgKmRiZywgc3RydWN0IER3YXJmX0NVICpjdSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGZvcm0sCisJCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHApCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMiwgNCkgaW50ZXJuYWxfZnVuY3Rpb247CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBsb2NhdGUgYXR0cmlidXRlLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBjaGFyICpfX2xpYmR3X2ZpbmRfYXR0ciAoRHdhcmZfRGllICpkaWUsCisJCQkJCSB1bnNpZ25lZCBpbnQgc2VhcmNoX25hbWUsCisJCQkJCSB1bnNpZ25lZCBpbnQgKmNvZGVwLAorCQkJCQkgdW5zaWduZWQgaW50ICpmb3JtcCkKKyAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKSBpbnRlcm5hbF9mdW5jdGlvbjsKKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGFjY2VzcyBpbnRlZ2VyIGF0dHJpYnV0ZS4gICovCitleHRlcm4gaW50IF9fbGliZHdfZnVuY19pbnR2YWwgKER3YXJmX0Z1bmMgKmZ1bmMsIGludCAqbGluZXAsIGludCBhdHR2YWwpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMikgaW50ZXJuYWxfZnVuY3Rpb247CisKKy8qIFJldHVybiBlcnJvciBjb2RlIG9mIGxhc3QgZmFpbGluZyBmdW5jdGlvbiBjYWxsLiAgVGhpcyB2YWx1ZSBpcyBrZXB0CisgICBzZXBhcmF0ZWx5IGZvciBlYWNoIHRocmVhZC4gICovCitleHRlcm4gaW50IF9fZHdhcmZfZXJybm9faW50ZXJuYWwgKHZvaWQpOworCisKKy8qIEFsaWFzZXMgdG8gYXZvaWQgUExUcy4gICovCitJTlRERUNMIChkd2FyZl9hdHRyKQorSU5UREVDTCAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpCitJTlRERUNMIChkd2FyZl9iZWdpbl9lbGYpCitJTlRERUNMIChkd2FyZl9jaGlsZCkKK0lOVERFQ0wgKGR3YXJmX2RpZW9mZnNldCkKK0lOVERFQ0wgKGR3YXJmX2Zvcm1hZGRyKQorSU5UREVDTCAoZHdhcmZfZm9ybWJsb2NrKQorSU5UREVDTCAoZHdhcmZfZm9ybXJlZikKK0lOVERFQ0wgKGR3YXJmX2Zvcm1yZWZfZGllKQorSU5UREVDTCAoZHdhcmZfZm9ybXNkYXRhKQorSU5UREVDTCAoZHdhcmZfZm9ybXN0cmluZykKK0lOVERFQ0wgKGR3YXJmX2Zvcm11ZGF0YSkKK0lOVERFQ0wgKGR3YXJmX2dldGFyYW5nZV9hZGRyKQorSU5UREVDTCAoZHdhcmZfZ2V0YXJhbmdlaW5mbykKK0lOVERFQ0wgKGR3YXJmX2dldGFyYW5nZXMpCitJTlRERUNMIChkd2FyZl9nZXRzcmNmaWxlcykKK0lOVERFQ0wgKGR3YXJmX2dldHNyY2xpbmVzKQorSU5UREVDTCAoZHdhcmZfaGFzYXR0cikKK0lOVERFQ0wgKGR3YXJmX2hhc2NoaWxkcmVuKQorSU5UREVDTCAoZHdhcmZfaGFzcGMpCitJTlRERUNMIChkd2FyZl9oaWdocGMpCitJTlRERUNMIChkd2FyZl9sb3dwYykKK0lOVERFQ0wgKGR3YXJmX25leHRjdSkKK0lOVERFQ0wgKGR3YXJmX29mZmRpZSkKK0lOVERFQ0wgKGR3YXJmX3NpYmxpbmdvZikKK0lOVERFQ0wgKGR3YXJmX3RhZykKKworI2VuZGlmCS8qIGxpYmR3UC5oICovCmRpZmYgLS1naXQgYS9saWJkdy9saWJkd19hbGxvYy5jIGIvbGliZHcvbGliZHdfYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzUzZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvbGliZHdfYWxsb2MuYwpAQCAtMCwwICsxLDU5IEBACisvKiBNZW1vcnkgaGFuZGxpbmcgZm9yIGxpYmR3LgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgImxpYmR3UC5oIgorCisKK3ZvaWQgKgorX19saWJkd19hbGxvY2F0ZSAoRHdhcmYgKmRiZywgc2l6ZV90IG1pbnNpemUpCit7CisgIHNpemVfdCBzaXplID0gTUFYIChkYmctPm1lbV9kZWZhdWx0X3NpemUsCisJCSAgICAgMiAqIG1pbnNpemUgKyBvZmZzZXRvZiAoc3RydWN0IGxpYmR3X21lbWJsb2NrLCBtZW0pKTsKKyAgc3RydWN0IGxpYmR3X21lbWJsb2NrICpuZXdwID0gbWFsbG9jIChzaXplKTsKKyAgaWYgKG5ld3AgPT0gTlVMTCkKKyAgICBkYmctPm9vbV9oYW5kbGVyICgpOworCisgIG5ld3AtPnNpemUgPSBuZXdwLT5yZW1haW5pbmcgPSBzaXplIC0gb2Zmc2V0b2YgKHN0cnVjdCBsaWJkd19tZW1ibG9jaywgbWVtKTsKKworICBuZXdwLT5wcmV2ID0gZGJnLT5tZW1fdGFpbDsKKyAgZGJnLT5tZW1fdGFpbCA9IG5ld3A7CisKKyAgcmV0dXJuIG5ld3AtPm1lbTsKK30KKworCitEd2FyZl9PT00KK2R3YXJmX25ld19vb21faGFuZGxlciAoRHdhcmYgKmRiZywgRHdhcmZfT09NIGhhbmRsZXIpCit7CisgIER3YXJmX09PTSBvbGQgPSBkYmctPm9vbV9oYW5kbGVyOworICBkYmctPm9vbV9oYW5kbGVyID0gaGFuZGxlcjsKKyAgcmV0dXJuIG9sZDsKK30KKworCit2b2lkCitfX2F0dHJpYnV0ZSAoKG5vcmV0dXJuLCB2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQorX19saWJkd19vb20gKHZvaWQpCit7CisgIHdoaWxlICgxKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIEVOT01FTSwgImxpYmR3Iik7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9saWJkd19maW5kY3UuYyBiL2xpYmR3L2xpYmR3X2ZpbmRjdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDNhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkdy9saWJkd19maW5kY3UuYwpAQCAtMCwwICsxLDExMCBAQAorLyogRmluZCBDVSBmb3IgZ2l2ZW4gb2Zmc2V0LgorICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c2VhcmNoLmg+CisjaW5jbHVkZSAibGliZHdQLmgiCisKKworc3RhdGljIGludAorZmluZGN1X2NiIChjb25zdCB2b2lkICphcmcxLCBjb25zdCB2b2lkICphcmcyKQoreworICBzdHJ1Y3QgRHdhcmZfQ1UgKmN1MSA9IChzdHJ1Y3QgRHdhcmZfQ1UgKikgYXJnMTsKKyAgc3RydWN0IER3YXJmX0NVICpjdTIgPSAoc3RydWN0IER3YXJmX0NVICopIGFyZzI7CisKKyAgLyogRmluZCBvdXQgd2hpY2ggb2YgdGhlIHR3byBhcmd1bWVudHMgaXMgdGhlIHNlYXJjaCB2YWx1ZS4gIEl0IGhhcworICAgICBlbmQgb2Zmc2V0IDAuICAqLworICBpZiAoY3UxLT5lbmQgPT0gMCkKKyAgICB7CisgICAgICBpZiAoY3UxLT5zdGFydCA8IGN1Mi0+c3RhcnQpCisJcmV0dXJuIC0xOworICAgICAgaWYgKGN1MS0+c3RhcnQgPj0gY3UyLT5lbmQpCisJcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGN1Mi0+c3RhcnQgPCBjdTEtPnN0YXJ0KQorCXJldHVybiAxOworICAgICAgaWYgKGN1Mi0+c3RhcnQgPj0gY3UxLT5lbmQpCisJcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworCitzdHJ1Y3QgRHdhcmZfQ1UgKgorX19saWJkd19maW5kY3UgKGRiZywgc3RhcnQpCisgICAgIER3YXJmICpkYmc7CisgICAgIER3YXJmX09mZiBzdGFydDsKK3sKKyAgLyogTWF5YmUgd2UgYWxyZWFkeSBrbm93IHRoYXQgQ1UuICAqLworICBzdHJ1Y3QgRHdhcmZfQ1UgZmFrZSA9IHsgLnN0YXJ0ID0gc3RhcnQsIC5lbmQgPSAwIH07CisgIHN0cnVjdCBEd2FyZl9DVSAqKmZvdW5kID0gdGZpbmQgKCZmYWtlLCAmZGJnLT5jdV90cmVlLCBmaW5kY3VfY2IpOworICBpZiAoZm91bmQgIT0gTlVMTCkKKyAgICByZXR1cm4gKmZvdW5kOworCisgIGlmIChzdGFydCA8IGRiZy0+bmV4dF9jdV9vZmZzZXQpCisgICAgeworICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBOby4gIFRoZW4gcmVhZCBtb3JlIENVcy4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIER3YXJmX09mZiBvbGRvZmYgPSBkYmctPm5leHRfY3Vfb2Zmc2V0OworICAgICAgdWludDhfdCBhZGRyZXNzX3NpemU7CisgICAgICB1aW50OF90IG9mZnNldF9zaXplOworICAgICAgRHdhcmZfT2ZmIGFiYnJldl9vZmZzZXQ7CisKKyAgICAgIGlmIChJTlRVU0UoZHdhcmZfbmV4dGN1KSAoZGJnLCBvbGRvZmYsICZkYmctPm5leHRfY3Vfb2Zmc2V0LCBOVUxMLAorCQkJCSZhYmJyZXZfb2Zmc2V0LCAmYWRkcmVzc19zaXplLCAmb2Zmc2V0X3NpemUpCisJICAhPSAwKQorCS8qIE5vIG1vcmUgZW50cmllcy4gICovCisJcmV0dXJuIE5VTEw7CisKKyAgICAgIC8qIENyZWF0ZSBhbiBlbnRyeSBmb3IgdGhpcyBDVS4gICovCisgICAgICBzdHJ1Y3QgRHdhcmZfQ1UgKm5ld3AgPSBsaWJkd190eXBlZF9hbGxvYyAoZGJnLCBzdHJ1Y3QgRHdhcmZfQ1UpOworCisgICAgICBuZXdwLT5kYmcgPSBkYmc7CisgICAgICBuZXdwLT5zdGFydCA9IG9sZG9mZjsKKyAgICAgIG5ld3AtPmVuZCA9IGRiZy0+bmV4dF9jdV9vZmZzZXQ7CisgICAgICBuZXdwLT5hZGRyZXNzX3NpemUgPSBhZGRyZXNzX3NpemU7CisgICAgICBuZXdwLT5vZmZzZXRfc2l6ZSA9IG9mZnNldF9zaXplOworICAgICAgRHdhcmZfQWJicmV2X0hhc2hfaW5pdCAoJm5ld3AtPmFiYnJldl9oYXNoLCA0MSk7CisgICAgICBuZXdwLT5vcmlnX2FiYnJldl9vZmZzZXQgPSBuZXdwLT5sYXN0X2FiYnJldl9vZmZzZXQgPSBhYmJyZXZfb2Zmc2V0OworICAgICAgbmV3cC0+bGluZXMgPSBOVUxMOworICAgICAgbmV3cC0+bG9jcyA9IE5VTEw7CisKKyAgICAgIC8qIEFkZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSBzZWFyY2ggdHJlZS4gICovCisgICAgICBpZiAodHNlYXJjaCAobmV3cCwgJmRiZy0+Y3VfdHJlZSwgZmluZGN1X2NiKSA9PSBOVUxMKQorCXsKKwkgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgVW5mbyB0aGUgb3BlcmF0aW9uLiAgKi8KKwkgIGRiZy0+bmV4dF9jdV9vZmZzZXQgPSBvbGRvZmY7CisJICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PTUVNKTsKKwkgIHJldHVybiBOVUxMOworCX0KKworICAgICAgLyogSXMgdGhpcyB0aGUgb25lIHdlIGFyZSBsb29raW5nIGZvcj8gICovCisgICAgICBpZiAoc3RhcnQgPCBkYmctPm5leHRfY3Vfb2Zmc2V0KQorCS8vIFhYWCBNYXRjaCBleGFjdCBvZmZzZXQuCisJcmV0dXJuIG5ld3A7CisgICAgfQorICAvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS9saWJkdy9saWJkd19mb3JtLmMgYi9saWJkdy9saWJkd19mb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkNDcxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L2xpYmR3X2Zvcm0uYwpAQCAtMCwwICsxLDExMiBAQAorLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgZm9ybSBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJkd1AuaCIKKworCitzaXplX3QKK2ludGVybmFsX2Z1bmN0aW9uX2RlZgorX19saWJkd19mb3JtX3ZhbF9sZW4gKER3YXJmICpkYmcsIHN0cnVjdCBEd2FyZl9DVSAqY3UsIHVuc2lnbmVkIGludCBmb3JtLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp2YWxwKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzYXZlZDsKKyAgRHdhcmZfV29yZCB1MTI4OworICBzaXplX3QgcmVzdWx0OworCisgIHN3aXRjaCAoZm9ybSkKKyAgICB7CisgICAgY2FzZSBEV19GT1JNX2FkZHI6CisgICAgICByZXN1bHQgPSBjdS0+YWRkcmVzc19zaXplOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fc3RycDoKKyAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6CisgICAgICByZXN1bHQgPSBjdS0+b2Zmc2V0X3NpemU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9ibG9jazE6CisgICAgICByZXN1bHQgPSAqdmFscCArIDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9ibG9jazI6CisgICAgICByZXN1bHQgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGRiZywgdmFscCkgKyAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgorICAgICAgcmVzdWx0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHZhbHApICsgNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2Jsb2NrOgorICAgICAgc2F2ZWQgPSB2YWxwOworICAgICAgZ2V0X3VsZWIxMjggKHUxMjgsIHZhbHApOworICAgICAgcmVzdWx0ID0gdTEyOCArICh2YWxwIC0gc2F2ZWQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fcmVmMToKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTE6CisgICAgY2FzZSBEV19GT1JNX2ZsYWc6CisgICAgICByZXN1bHQgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTI6CisgICAgY2FzZSBEV19GT1JNX3JlZjI6CisgICAgICByZXN1bHQgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6CisgICAgY2FzZSBEV19GT1JNX3JlZjQ6CisgICAgICByZXN1bHQgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTg6CisgICAgY2FzZSBEV19GT1JNX3JlZjg6CisgICAgICByZXN1bHQgPSA4OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fc3RyaW5nOgorICAgICAgcmVzdWx0ID0gc3RybGVuICgoY2hhciAqKSB2YWxwKSArIDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9zZGF0YToKKyAgICBjYXNlIERXX0ZPUk1fdWRhdGE6CisgICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKKyAgICAgIHNhdmVkID0gdmFscDsKKyAgICAgIGdldF91bGViMTI4ICh1MTI4LCB2YWxwKTsKKyAgICAgIHJlc3VsdCA9IHZhbHAgLSBzYXZlZDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OgorICAgICAgc2F2ZWQgPSB2YWxwOworICAgICAgZ2V0X3VsZWIxMjggKHUxMjgsIHZhbHApOworICAgICAgLy8gWFhYIElzIHRoaXMgcmVhbGx5IGNvcnJlY3Q/CisgICAgICByZXN1bHQgPSBfX2xpYmR3X2Zvcm1fdmFsX2xlbiAoZGJnLCBjdSwgdTEyOCwgdmFscCk7CisgICAgICBpZiAocmVzdWx0ICE9IChzaXplX3QpIC0xKQorCXJlc3VsdCArPSB2YWxwIC0gc2F2ZWQ7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOworICAgICAgcmVzdWx0ID0gKHNpemVfdCkgLTFsOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJkdy9tZW1vcnktYWNjZXNzLmMgYi9saWJkdy9tZW1vcnktYWNjZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4OTlhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3L21lbW9yeS1hY2Nlc3MuYwpAQCAtMCwwICsxLDM1IEBACisvKiBPdXQgb2YgbGluZSBmdW5jdGlvbnMgZm9yIG1lbW9yeS1hY2Nlc3MuaCBtYWNyb3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlICJsaWJkd1AuaCIKKyNpbmNsdWRlICJtZW1vcnktYWNjZXNzLmgiCisKK3VpbnQ2NF90CitpbnRlcm5hbF9mdW5jdGlvbl9kZWYKK19fbGliZHdfZ2V0X3VsZWIxMjggKHVpbnQ2NF90IGFjYywgdW5zaWduZWQgaW50IGksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphZGRycCkKK3sKKyAgdW5zaWduZWQgY2hhciBfX2I7CisgIGdldF91bGViMTI4X3Jlc3RfcmV0dXJuIChhY2MsIGksIGFkZHJwKTsKK30KKworaW50NjRfdAoraW50ZXJuYWxfZnVuY3Rpb25fZGVmCitfX2xpYmR3X2dldF9zbGViMTI4IChpbnQ2NF90IGFjYywgdW5zaWduZWQgaW50IGksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphZGRycCkKK3sKKyAgdW5zaWduZWQgY2hhciBfX2I7CisgIGludDY0X3QgX3YgPSBhY2M7CisgIGdldF9zbGViMTI4X3Jlc3RfcmV0dXJuIChhY2MsIGksIGFkZHJwKTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3L21lbW9yeS1hY2Nlc3MuaCBiL2xpYmR3L21lbW9yeS1hY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWZkODk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHcvbWVtb3J5LWFjY2Vzcy5oCkBAIC0wLDAgKzEsMjQwIEBACisvKiBVbmFsaWduZWQgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbmFsaXR5LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9NRU1PUllfQUNDRVNTX0gKKyNkZWZpbmUgX01FTU9SWV9BQ0NFU1NfSCAxCisKKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKy8qIE51bWJlciBkZWNvZGluZyBtYWNyb3MuICBTZWUgNy42IFZhcmlhYmxlIExlbmd0aCBEYXRhLiAgKi8KKworI2RlZmluZSBnZXRfdWxlYjEyOF9zdGVwKHZhciwgYWRkciwgbnRoLCBicmVhaykJCQkJICAgICAgXAorICAgIF9fYiA9ICooYWRkcikrKzsJCQkJCQkJICAgICAgXAorICAgIHZhciB8PSAodWludG1heF90KSAoX19iICYgMHg3ZikgPDwgKG50aCAqIDcpOwkJCSAgICAgIFwKKyAgICBpZiAobGlrZWx5ICgoX19iICYgMHg4MCkgPT0gMCkpCQkJCQkgICAgICBcCisgICAgICBicmVhaworCisjZGVmaW5lIGdldF91bGViMTI4KHZhciwgYWRkcikJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5zaWduZWQgY2hhciBfX2I7CQkJCQkJCSAgICAgIFwKKyAgICB2YXIgPSAwOwkJCQkJCQkJICAgICAgXAorICAgIGdldF91bGViMTI4X3N0ZXAgKHZhciwgYWRkciwgMCwgYnJlYWspOwkJCQkgICAgICBcCisgICAgdmFyID0gX19saWJkd19nZXRfdWxlYjEyOCAodmFyLCAxLCAmKGFkZHIpKTsJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZ2V0X3VsZWIxMjhfcmVzdF9yZXR1cm4odmFyLCBpLCBhZGRycCkJCQkJICAgICAgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGZvciAoOyBpIDwgMTA7ICsraSkJCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlnZXRfdWxlYjEyOF9zdGVwICh2YXIsICphZGRycCwgaSwgcmV0dXJuIHZhcik7CQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICAvKiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgc2V0IFZBTFVFIHRvIFVJTlRfTUFYIGluIHRoaXMJCSAgICAgIFwKKyAgICAgICBjYXNlLiAgU28gd2UgYmV0dGVyIGRvIHRoaXMgYXMgd2VsbC4gICovCQkJCSAgICAgIFwKKyAgICByZXR1cm4gVUlOVDY0X01BWDsJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKiBUaGUgc2lnbmVkIGNhc2UgaXMgc2ltaWxhciwgYnV0IHdlIHNpZ24tZXh0ZW5kIHRoZSByZXN1bHQuICAqLworCisjZGVmaW5lIGdldF9zbGViMTI4X3N0ZXAodmFyLCBhZGRyLCBudGgsIGJyZWFrKQkJCQkgICAgICBcCisgICAgX19iID0gKihhZGRyKSsrOwkJCQkJCQkgICAgICBcCisgICAgX3YgfD0gKHVpbnQ2NF90KSAoX19iICYgMHg3ZikgPDwgKG50aCAqIDcpOwkJCQkgICAgICBcCisgICAgaWYgKGxpa2VseSAoKF9fYiAmIDB4ODApID09IDApKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwl2YXIgPSAoX3YgPDwgKDY0IC0gKG50aCAqIDcpIC0gNykgPj4gKDY0IC0gKG50aCAqIDcpIC0gNykpOwkgICAgICBcCisgICAgICAgIGJyZWFrOwkJCQkJIAkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgZWxzZSBkbyB7fSB3aGlsZSAoMCkKKworI2RlZmluZSBnZXRfc2xlYjEyOCh2YXIsIGFkZHIpCQkJCQkJICAgICAgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHVuc2lnbmVkIGNoYXIgX19iOwkJCQkJCQkgICAgICBcCisgICAgaW50NjRfdCBfdiA9IDA7CQkJCQkJCSAgICAgIFwKKyAgICBnZXRfc2xlYjEyOF9zdGVwICh2YXIsIGFkZHIsIDAsIGJyZWFrKTsJCQkJICAgICAgXAorICAgIHZhciA9IF9fbGliZHdfZ2V0X3NsZWIxMjggKF92LCAxLCAmKGFkZHIpKTsJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIGdldF9zbGViMTI4X3Jlc3RfcmV0dXJuKHZhciwgaSwgYWRkcnApCQkJCSAgICAgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBmb3IgKDsgaSA8IDk7ICsraSkJCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlnZXRfc2xlYjEyOF9zdGVwICh2YXIsICphZGRycCwgaSwgcmV0dXJuIHZhcik7CQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICAvKiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgc2V0IFZBTFVFIHRvIElOVF9NQVggaW4gdGhpcwkJICAgICAgXAorICAgICAgIGNhc2UuICBTbyB3ZSBiZXR0ZXIgZG8gdGhpcyBhcyB3ZWxsLiAgKi8JCQkJICAgICAgXAorICAgIHJldHVybiBJTlQ2NF9NQVg7CQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2lmZGVmIElTX0xJQkRXCitleHRlcm4gdWludDY0X3QgX19saWJkd19nZXRfdWxlYjEyOCAodWludDY0X3QgYWNjLCB1bnNpZ25lZCBpbnQgaSwKKwkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphZGRycCkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb24gYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBpbnQ2NF90IF9fbGliZHdfZ2V0X3NsZWIxMjggKGludDY0X3QgYWNjLCB1bnNpZ25lZCBpbnQgaSwKKwkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKmFkZHJwKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbiBhdHRyaWJ1dGVfaGlkZGVuOworI2Vsc2UKK3N0YXRpYyB1aW50NjRfdAorX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCitfX2xpYmR3X2dldF91bGViMTI4ICh1aW50NjRfdCBhY2MsIHVuc2lnbmVkIGludCBpLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqYWRkcnApCit7CisgIHVuc2lnbmVkIGNoYXIgX19iOworICBnZXRfdWxlYjEyOF9yZXN0X3JldHVybiAoYWNjLCBpLCBhZGRycCk7Cit9CitzdGF0aWMgaW50NjRfdAorX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCitfX2xpYmR3X2dldF9zbGViMTI4IChpbnQ2NF90IGFjYywgdW5zaWduZWQgaW50IGksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphZGRycCkKK3sKKyAgdW5zaWduZWQgY2hhciBfX2I7CisgIGludDY0X3QgX3YgPSBhY2M7CisgIGdldF9zbGViMTI4X3Jlc3RfcmV0dXJuIChhY2MsIGksIGFkZHJwKTsKK30KKyNlbmRpZgorCisKKy8qIFdlIHVzZSBzaW1wbGUgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMgaW4gY2FzZSB0aGUgaGFyZHdhcmUgYWxsb3dzIGl0LgorICAgVGhlIGNhbGxlciBoYXMgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYWxpYXMgcHJvYmxlbXMuICAqLworI2lmIEFMTE9XX1VOQUxJR05FRAorCisjIGRlZmluZSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCisgICh1bmxpa2VseSAoKERiZyktPm90aGVyX2J5dGVfb3JkZXIpCQkJCQkgICAgICBcCisgICA/IGJzd2FwXzE2ICgqKChjb25zdCB1aW50MTZfdCAqKSAoQWRkcikpKQkJCQkgICAgICBcCisgICA6ICooKGNvbnN0IHVpbnQxNl90ICopIChBZGRyKSkpCisjIGRlZmluZSByZWFkXzJzYnl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCisgICh1bmxpa2VseSAoKERiZyktPm90aGVyX2J5dGVfb3JkZXIpCQkJCQkgICAgICBcCisgICA/IChpbnQxNl90KSBic3dhcF8xNiAoKigoY29uc3QgaW50MTZfdCAqKSAoQWRkcikpKQkJCSAgICAgIFwKKyAgIDogKigoY29uc3QgaW50MTZfdCAqKSAoQWRkcikpKQorCisjIGRlZmluZSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0KEFkZHIpIFwKKyAgICooKGNvbnN0IHVpbnQzMl90ICopIChBZGRyKSkKKyMgZGVmaW5lIHJlYWRfNHVieXRlX3VuYWxpZ25lZChEYmcsIEFkZHIpIFwKKyAgKHVubGlrZWx5ICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcikJCQkJCSAgICAgIFwKKyAgID8gYnN3YXBfMzIgKCooKGNvbnN0IHVpbnQzMl90ICopIChBZGRyKSkpCQkJCSAgICAgIFwKKyAgIDogKigoY29uc3QgdWludDMyX3QgKikgKEFkZHIpKSkKKyMgZGVmaW5lIHJlYWRfNHNieXRlX3VuYWxpZ25lZChEYmcsIEFkZHIpIFwKKyAgKHVubGlrZWx5ICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcikJCQkJCSAgICAgIFwKKyAgID8gKGludDMyX3QpIGJzd2FwXzMyICgqKChjb25zdCBpbnQzMl90ICopIChBZGRyKSkpCQkJICAgICAgXAorICAgOiAqKChjb25zdCBpbnQzMl90ICopIChBZGRyKSkpCisKKyMgZGVmaW5lIHJlYWRfOHVieXRlX3VuYWxpZ25lZChEYmcsIEFkZHIpIFwKKyAgKHVubGlrZWx5ICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcikJCQkJCSAgICAgIFwKKyAgID8gYnN3YXBfNjQgKCooKGNvbnN0IHVpbnQ2NF90ICopIChBZGRyKSkpCQkJCSAgICAgIFwKKyAgIDogKigoY29uc3QgdWludDY0X3QgKikgKEFkZHIpKSkKKyMgZGVmaW5lIHJlYWRfOHNieXRlX3VuYWxpZ25lZChEYmcsIEFkZHIpIFwKKyAgKHVubGlrZWx5ICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcikJCQkJCSAgICAgIFwKKyAgID8gKGludDY0X3QpIGJzd2FwXzY0ICgqKChjb25zdCBpbnQ2NF90ICopIChBZGRyKSkpCQkJICAgICAgXAorICAgOiAqKChjb25zdCBpbnQ2NF90ICopIChBZGRyKSkpCisKKyNlbHNlCisKK3VuaW9uIHVuYWxpZ25lZAorICB7CisgICAgdm9pZCAqcDsKKyAgICB1aW50MTZfdCB1MjsKKyAgICB1aW50MzJfdCB1NDsKKyAgICB1aW50NjRfdCB1ODsKKyAgICBpbnQxNl90IHMyOworICAgIGludDMyX3QgczQ7CisgICAgaW50NjRfdCBzODsKKyAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK3JlYWRfMnVieXRlX3VuYWxpZ25lZCAoRHdhcmYgKmRiZywgY29uc3Qgdm9pZCAqcCkKK3sKKyAgY29uc3QgdW5pb24gdW5hbGlnbmVkICp1cCA9IHA7CisgIGlmIChkYmctPm90aGVyX2J5dGVfb3JkZXIpCisgICAgcmV0dXJuIGJzd2FwXzE2ICh1cC0+dTIpOworICByZXR1cm4gdXAtPnUyOworfQorc3RhdGljIGlubGluZSBpbnQxNl90CityZWFkXzJzYnl0ZV91bmFsaWduZWQgKER3YXJmICpkYmcsIGNvbnN0IHZvaWQgKnApCit7CisgIGNvbnN0IHVuaW9uIHVuYWxpZ25lZCAqdXAgPSBwOworICBpZiAoZGJnLT5vdGhlcl9ieXRlX29yZGVyKQorICAgIHJldHVybiAoaW50MTZfdCkgYnN3YXBfMTYgKHVwLT51Mik7CisgIHJldHVybiB1cC0+czI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK3JlYWRfNHVieXRlX3VuYWxpZ25lZF9ub25jdnQgKGNvbnN0IHZvaWQgKnApCit7CisgIGNvbnN0IHVuaW9uIHVuYWxpZ25lZCAqdXAgPSBwOworICByZXR1cm4gdXAtPnU0OworfQorc3RhdGljIGlubGluZSB1aW50MzJfdAorcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChEd2FyZiAqZGJnLCBjb25zdCB2b2lkICpwKQoreworICBjb25zdCB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKKyAgaWYgKGRiZy0+b3RoZXJfYnl0ZV9vcmRlcikKKyAgICByZXR1cm4gYnN3YXBfMzIgKHVwLT51NCk7CisgIHJldHVybiB1cC0+dTQ7Cit9CitzdGF0aWMgaW5saW5lIGludDMyX3QKK3JlYWRfNHNieXRlX3VuYWxpZ25lZCAoRHdhcmYgKmRiZywgY29uc3Qgdm9pZCAqcCkKK3sKKyAgY29uc3QgdW5pb24gdW5hbGlnbmVkICp1cCA9IHA7CisgIGlmIChkYmctPm90aGVyX2J5dGVfb3JkZXIpCisgICAgcmV0dXJuIChpbnQzMl90KSBic3dhcF8zMiAodXAtPnU0KTsKKyAgcmV0dXJuIHVwLT5zNDsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdAorcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChEd2FyZiAqZGJnLCBjb25zdCB2b2lkICpwKQoreworICBjb25zdCB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKKyAgaWYgKGRiZy0+b3RoZXJfYnl0ZV9vcmRlcikKKyAgICByZXR1cm4gYnN3YXBfNjQgKHVwLT51OCk7CisgIHJldHVybiB1cC0+dTg7Cit9CitzdGF0aWMgaW5saW5lIGludDY0X3QKK3JlYWRfOHNieXRlX3VuYWxpZ25lZCAoRHdhcmYgKmRiZywgY29uc3Qgdm9pZCAqcCkKK3sKKyAgY29uc3QgdW5pb24gdW5hbGlnbmVkICp1cCA9IHA7CisgIGlmIChkYmctPm90aGVyX2J5dGVfb3JkZXIpCisgICAgcmV0dXJuIChpbnQ2NF90KSBic3dhcF82NCAodXAtPnU4KTsKKyAgcmV0dXJuIHVwLT5zODsKK30KKworI2VuZGlmCS8qIGFsbG93IHVuYWxpZ25lZCAqLworCisKKyNkZWZpbmUgcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyhEYmcsIEFkZHIpIFwKKyAgKHsgdWludDE2X3QgdF8gPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKERiZywgQWRkcik7CQkJICAgICAgXAorICAgICBBZGRyID0gKF9fdHlwZW9mIChBZGRyKSkgKCgodWludHB0cl90KSAoQWRkcikpICsgMik7CQkgICAgICBcCisgICAgIHRfOyB9KQorI2RlZmluZSByZWFkXzJzYnl0ZV91bmFsaWduZWRfaW5jKERiZywgQWRkcikgXAorICAoeyBpbnQxNl90IHRfID0gcmVhZF8yc2J5dGVfdW5hbGlnbmVkIChEYmcsIEFkZHIpOwkJCSAgICAgIFwKKyAgICAgQWRkciA9IChfX3R5cGVvZiAoQWRkcikpICgoKHVpbnRwdHJfdCkgKEFkZHIpKSArIDIpOwkJICAgICAgXAorICAgICB0XzsgfSkKKworI2RlZmluZSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jKERiZywgQWRkcikgXAorICAoeyB1aW50MzJfdCB0XyA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoRGJnLCBBZGRyKTsJCQkgICAgICBcCisgICAgIEFkZHIgPSAoX190eXBlb2YgKEFkZHIpKSAoKCh1aW50cHRyX3QpIChBZGRyKSkgKyA0KTsJCSAgICAgIFwKKyAgICAgdF87IH0pCisjZGVmaW5lIHJlYWRfNHNieXRlX3VuYWxpZ25lZF9pbmMoRGJnLCBBZGRyKSBcCisgICh7IGludDMyX3QgdF8gPSByZWFkXzRzYnl0ZV91bmFsaWduZWQgKERiZywgQWRkcik7CQkJICAgICAgXAorICAgICBBZGRyID0gKF9fdHlwZW9mIChBZGRyKSkgKCgodWludHB0cl90KSAoQWRkcikpICsgNCk7CQkgICAgICBcCisgICAgIHRfOyB9KQorCisjZGVmaW5lIHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMoRGJnLCBBZGRyKSBcCisgICh7IHVpbnQ2NF90IHRfID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChEYmcsIEFkZHIpOwkJCSAgICAgIFwKKyAgICAgQWRkciA9IChfX3R5cGVvZiAoQWRkcikpICgoKHVpbnRwdHJfdCkgKEFkZHIpKSArIDgpOwkJICAgICAgXAorICAgICB0XzsgfSkKKyNkZWZpbmUgcmVhZF84c2J5dGVfdW5hbGlnbmVkX2luYyhEYmcsIEFkZHIpIFwKKyAgKHsgaW50NjRfdCB0XyA9IHJlYWRfOHNieXRlX3VuYWxpZ25lZCAoRGJnLCBBZGRyKTsJCQkgICAgICBcCisgICAgIEFkZHIgPSAoX190eXBlb2YgKEFkZHIpKSAoKCh1aW50cHRyX3QpIChBZGRyKSkgKyA4KTsJCSAgICAgIFwKKyAgICAgdF87IH0pCisKKyNlbmRpZgkvKiBtZW1vcnktYWNjZXNzLmggKi8KZGlmZiAtLWdpdCBhL2xpYmR3YXJmLy5jdnNpZ25vcmUgYi9saWJkd2FyZi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODQ1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK01ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9saWJkd2FyZi9BVkFJTEFCTEUgYi9saWJkd2FyZi9BVkFJTEFCTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyZGQyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL0FWQUlMQUJMRQpAQCAtMCwwICsxLDEzNiBAQAorRGF0YSBUeXBlczoKKworICBEd2FyZl9Cb29sCisgIER3YXJmX09mZgorICBEd2FyZl9VbnNpZ25lZAorICBEd2FyZl9IYWxmCisgIER3YXJmX1NtYWxsCisgIER3YXJmX1NpZ25lZAorICBEd2FyZl9BZGRyCisgIER3YXJmX1B0cgorICBEd2FyZl9IYW5kbGVyCisKKyAgRHdhcmZfRGVidWcKKyAgRHdhcmZfRGllCisgIER3YXJmX0xpbmUKKyAgRHdhcmZfR2xvYmFsCisgIER3YXJmX0xvYworICBEd2FyZl9Mb2NkZXNjCisgIER3YXJmX0Jsb2NrCisgIER3YXJmX0Vycm9yCisgIER3YXJmX0F0dHJpYnV0ZQorICBEd2FyZl9GZGUKKyAgRHdhcmZfQ2llCisgIER3YXJmX0FyYW5nZQorCisgTk9UISEhOgorCisgIER3YXJmX0ZyYW1lX09wCisgIER3YXJmX01hY3JvX0RldGFpbHMKKworICBEd2FyZl9XZWFrCisgIER3YXJmX0Z1bmMKKyAgRHdhcmZfVHlwZQorICBEd2FyZl9WYXIKKyAgRHdhcmZfQWJicmV2CisKK0Z1bmN0aW9uczoKKworICBkd2FyZl9pbml0KCkKKyAgZHdhcmZfZWxmX2luaXQoKQorICBkd2FyZl9nZXRfZWxmKCkKKyAgZHdhcmZfZmluaXNoKCkKKyAgZHdhcmZfbmV4dF9jdV9oZWFkZXIoKQorICBkd2FyZl9zaWJsaW5nb2YoKQorICBkd2FyZl9jaGlsZCgpCisgIGR3YXJmX29mZmRpZSgpCisgIGR3YXJmX3RhZygpCisgIGR3YXJmX2RpZW9mZnNldCgpCisgIGR3YXJmX2RpZV9DVV9vZmZzZXQoKQorICBkd2FyZl9kaWVuYW1lKCkKKyAgZHdhcmZfYXR0cmxpc3QoKQorICBkd2FyZl9zcmNsYW5nKCkKKyAgZHdhcmZfYXJyYXlvcmRlcigpCisgIGR3YXJmX2hhc2Zvcm0oKQorICBkd2FyZl93aGF0YXR0cigpCisgIGR3YXJmX2Zvcm1yZWYoKQorICBkd2FyZl9nbG9iYWxfZm9ybXJlZigpCisgIGR3YXJmX2Zvcm1hZGRyKCkKKyAgZHdhcmZfZm9ybWZsYWcoKQorICBkd2FyZl9oYXNhdHRyKCkKKyAgZHdhcmZfYXR0cigpCisgIGR3YXJmX2xvd3BjKCkKKyAgZHdhcmZfaGlnaHBjKCkKKyAgZHdhcmZfYnl0ZXNpemUoKQorICBkd2FyZl9iaXRzaXplKCkKKyAgZHdhcmZfYml0b2Zmc2V0KCkKKyAgZHdhcmZfZm9ybXVkYXRhKCkKKyAgZHdhcmZfZm9ybWJsb2NrKCkKKyAgZHdhcmZfZm9ybXN0cmluZygpCisgIGR3YXJmX2xvY2xpc3QoKQorICBkd2FyZl9zcmNsaW5lcygpCisgIGR3YXJmX3NyY2ZpbGVzKCkKKyAgZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50KCkKKyAgZHdhcmZfbGluZWVuZHNlcXVlbmNlKCkKKyAgZHdhcmZfbGluZW5vKCkKKyAgZHdhcmZfbGluZWFkZHIoKQorICBkd2FyZl9saW5lb2ZmKCkKKyAgZHdhcmZfbGluZXNyYygpCisgIGR3YXJmX2xpbmVibG9jaygpCisgIGR3YXJmX2dldF9nbG9iYWxzKCkKKyAgZHdhcmZfZ2xvYm5hbWUoKQorICBkd2FyZl9nbG9iYWxfZGllX29mZnNldCgpCisgIGR3YXJmX2dsb2JhbF9jdV9vZmZzZXQoKQorICBkd2FyZl9nbG9iYWxfbmFtZV9vZmZzZXRzKCkKKyAgZHdhcmZfZmluZF9tYWNyb192YWx1ZV9zdGFydCgpCisgIGR3YXJmX2dldF9mZGVfbGlzdF9laCgpCisgIGR3YXJmX2dldF9mZGVfcmFuZ2UoKQorICBkd2FyZl9nZXRfY2llX29mX2ZkZSgpCisgIGR3YXJmX2dldF9jaWVfaW5mbygpCisgIGR3YXJmX2dldF9mZGVfaW5zdHJfYnl0ZXMoKQorICBkd2FyZl9nZXRfZmRlX24oKQorICBkd2FyZl9nZXRfZmRlX2F0X3BjKCkKKyAgZHdhcmZfZ2V0X3N0cigpCisgIGR3YXJmX2dldF9hcmFuZ2VzKCkKKyAgZHdhcmZfZ2V0X2N1X2RpZV9vZmZzZXQoKQorICBkd2FyZl9nZXRfbG9jbGlzdF9lbnRyeSgpCisgIGR3YXJmX2dldF9hYmJyZXYoKQorICBkd2FyZl9nZXRfYWJicmV2X3RhZygpCisgIGR3YXJmX2dldF9hYmJyZXZfY29kZSgpCisgIGR3YXJmX2dldF9hYmJyZXZfY2hpbGRyZW5fZmxhZygpCisgIGR3YXJmX2dldF9hYmJyZXZfZW50cnkoKQorICBkd2FyZl9nZXRfYXJhbmdlX2luZm8oKQorICBkd2FyZl9nZXRfYWRkcmVzc19zaXplKCkKKyAgZHdhcmZfZXJybm8oKQorICBkd2FyZl9lcnJtc2coKQorICBkd2FyZl9zZXRlcnJoYW5kKCkKKyAgZHdhcmZfc2V0ZXJyYXJnKCkKKyAgZHdhcmZfZGVhbGxvYygpCisKKyBOT1QhISE6CisKKyAgZHdhcmZfZ2V0X3dlYWtzKCkKKyAgZHdhcmZfd2Vha25hbWUoKQorICBkd2FyZl93ZWFrX2RpZV9vZmZzZXQoKQorICBkd2FyZl93ZWFrX2N1X29mZnNldCgpCisgIGR3YXJmX3dlYWtfbmFtZV9vZmZzZXRzKCkKKyAgZHdhcmZfZ2V0X2Z1bmNzKCkKKyAgZHdhcmZfZnVuY25hbWUoKQorICBkd2FyZl9mdW5jX2RpZV9vZmZzZXQoKQorICBkd2FyZl9mdW5jX2N1X29mZnNldCgpCisgIGR3YXJmX2Z1bmNfbmFtZV9vZmZzZXRzKCkKKyAgZHdhcmZfZ2V0X3R5cGVzKCkKKyAgZHdhcmZfdHlwZW5hbWUoKQorICBkd2FyZl90eXBlX2RpZV9vZmZzZXQoKQorICBkd2FyZl90eXBlX2N1X29mZnNldCgpCisgIGR3YXJmX3R5cGVfbmFtZV9vZmZzZXRzKCkKKyAgZHdhcmZfZ2V0X3ZhcnMoKQorICBkd2FyZl92YXJuYW1lKCkKKyAgZHdhcmZfdmFyX2RpZV9vZmZzZXQoKQorICBkd2FyZl92YXJfY3Vfb2Zmc2V0KCkKKyAgZHdhcmZfdmFyX25hbWVfb2Zmc2V0cygpCisgIGR3YXJmX2dldF9mZGVfbGlzdCgpCisgIGR3YXJmX2dldF9mZGVfZm9yX2RpZSgpCisgIGR3YXJmX2dldF9mZGVfaW5mb19mb3JfcmVnKCkJCTw8LS0tLS0tLQorICBkd2FyZl9nZXRfZmRlX2luZm9fZm9yX2FsbF9yZWdzKCkKKyAgZHdhcmZfZXhwYW5kX2ZyYW1lX2luc3RydWN0aW9ucygpCTw8LS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvQ2hhbmdlTG9nIGIvbGliZHdhcmYvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmZmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9DaGFuZ2VMb2cKQEAgLTAsMCArMSwzIEBACisyMDAzLTA4LTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworICAgICAgICAqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvTWFrZWZpbGUuYW0gYi9saWJkd2FyZi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY3YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMDMgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluIC0qLU1ha2VmaWxlLSotCisjIyBDb25maWd1cmUgaW5wdXQgZmlsZSBmb3IgZWxmdXRpbHMuCisjIworIyMgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyMjCisjIyBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisjIyBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisjIworIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisjIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyMjIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyMjIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorIyMgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4KKyMjCitERUZTID0gLURfR05VX1NPVVJDRSAtREhBVkVfQ09ORklHX0ggLUREV0FSRl9ERUJVRworQU1fQ0ZMQUdTID0gLVdhbGwgLVdlcnJvcgorSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkkKHNyY2RpcikvLi4vbGliZWxmIC1JLi4gLUkkKHNyY2RpcikvLi4vbGliCitWRVJTSU9OID0gMQorCitsaWJfTElCUkFSSUVTID0gbGliZHdhcmYuYQorbm9pbnN0X0xJQlJBUklFUyA9IGxpYmR3YXJmX3BpYy5hCitub2luc3RfUFJPR1JBTVMgPSAkKG5vaW5zdF9MSUJSQVJJRVM6X3BpYy5hPS5zbykKK2luY2x1ZGVfSEVBREVSUyA9IGR3YXJmLmgKK2V1aW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn0vZWxmdXRpbHMKK2V1aW5jbHVkZV9IRUFERVJTID0gbGliZHdhcmYuaAorCitsaWJkd2FyZl9hX1NPVVJDRVMgPSBkd2FyZl9pbml0LmMgZHdhcmZfZWxmX2luaXQuYyBkd2FyZl9nZXRfZWxmLmMgXAorCQkgICAgIGR3YXJmX2ZpbmlzaC5jIFwKKwkJICAgICBkd2FyZl9uZXh0X2N1X2hlYWRlci5jIGR3YXJmX3NpYmxpbmdvZi5jIGR3YXJmX2NoaWxkLmMgXAorCQkgICAgIGR3YXJmX29mZmRpZS5jIFwKKwkJICAgICBkd2FyZl90YWcuYyBkd2FyZl9kaWVvZmZzZXQuYyBkd2FyZl9kaWVfQ1Vfb2Zmc2V0LmMgXAorCQkgICAgIGR3YXJmX2RpZW5hbWUuYyBkd2FyZl9hdHRybGlzdC5jIGR3YXJmX2hhc2F0dHIuYyBcCisJCSAgICAgZHdhcmZfYXR0ci5jIGR3YXJmX2xvd3BjLmMgZHdhcmZfaGlnaHBjLmMgXAorCQkgICAgIGR3YXJmX2dldGNvbnN0YW50LmMgXAorCQkgICAgIGR3YXJmX2J5dGVzaXplLmMgZHdhcmZfYml0c2l6ZS5jIGR3YXJmX2JpdG9mZnNldC5jIFwKKwkJICAgICBkd2FyZl9zcmNsYW5nLmMgZHdhcmZfd2hhdGF0dHIuYyBkd2FyZl9hcnJheW9yZGVyLmMgXAorCQkgICAgIGR3YXJmX2hhc2Zvcm0uYyBkd2FyZl93aGF0Zm9ybS5jIGR3YXJmX2Zvcm1yZWYuYyBcCisJCSAgICAgZHdhcmZfZ2xvYmFsX2Zvcm1yZWYuYyBkd2FyZl9mb3JtYWRkci5jIFwKKwkJICAgICBkd2FyZl9mb3Jtc3RyaW5nLmMgZHdhcmZfbG9jbGlzdC5jIFwKKwkJICAgICBkd2FyZl9mb3JtZmxhZy5jIGR3YXJmX2Zvcm11ZGF0YS5jIGR3YXJmX2Zvcm1zZGF0YS5jIFwKKwkJICAgICBkd2FyZl9mb3JtYmxvY2suYyBcCisJCSAgICAgZHdhcmZfc3JjbGluZXMuYyBkd2FyZl9zcmNmaWxlcy5jIFwKKwkJICAgICBkd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQuYyBkd2FyZl9saW5lZW5kc2VxdWVuY2UuYyBcCisJCSAgICAgZHdhcmZfbGluZW5vLmMgZHdhcmZfbGluZWFkZHIuYyBkd2FyZl9saW5lb2ZmLmMgXAorCQkgICAgIGR3YXJmX2xpbmVzcmMuYyBkd2FyZl9saW5lYmxvY2suYyBcCisJCSAgICAgZHdhcmZfbGluZXByb2xvZ3VlZW5kLmMgZHdhcmZfbGluZWVwaWxvZ3VlYmVnaW4uYyBcCisJCSAgICAgZHdhcmZfZ2V0X2dsb2JhbHMuYyBkd2FyZl9nbG9ibmFtZS5jIFwKKwkJICAgICBkd2FyZl9nbG9iYWxfZGllX29mZnNldC5jIGR3YXJmX2dsb2JhbF9jdV9vZmZzZXQuYyBcCisJCSAgICAgZHdhcmZfZ2xvYmFsX25hbWVfb2Zmc2V0cy5jIFwKKwkJICAgICBkd2FyZl9lcnJvci5jIGR3YXJmX2Vycm5vLmMgZHdhcmZfZXJybXNnLmMgXAorCQkgICAgIGR3YXJmX2FiYnJldl9oYXNoLmMgZHdhcmZfZ2V0YWJicmV2LmMgZHdhcmZfZm9ybS5jIFwKKwkJICAgICBkd2FyZl9maW5kX21hY3JvX3ZhbHVlX3N0YXJ0LmMgZHdhcmZfZ2V0X3N0ci5jIFwKKwkJICAgICBkd2FyZl9nZXRfYXJhbmdlcy5jIGR3YXJmX2dldF9hcmFuZ2UuYyBcCisJCSAgICAgZHdhcmZfZ2V0X2N1X2RpZV9vZmZzZXQuYyBkd2FyZl9nZXRfYXJhbmdlX2luZm8uYyBcCisJCSAgICAgZHdhcmZfZ2V0X2ZkZV9saXN0X2VoLmMgZHdhcmZfZ2V0X2NpZV9vZl9mZGUuYyBcCisJCSAgICAgZHdhcmZfZ2V0X2NpZV9pbmZvLmMgZHdhcmZfZ2V0X2ZkZV9pbnN0cl9ieXRlcy5jIFwKKwkJICAgICBkd2FyZl9nZXRfZmRlX3JhbmdlLmMgZHdhcmZfZ2V0X2ZkZV9uLmMgXAorCQkgICAgIGR3YXJmX2dldF9mZGVfYXRfcGMuYyAgXAorCQkgICAgIGR3YXJmX2dldF9sb2NsaXN0X2VudHJ5LmMgXAorCQkgICAgIGR3YXJmX2dldF9hYmJyZXYuYyBkd2FyZl9nZXRfYWJicmV2X3RhZy5jIFwKKwkJICAgICBkd2FyZl9nZXRfYWJicmV2X2NvZGUuYyBkd2FyZl9nZXRfYWJicmV2X2NoaWxkcmVuX2ZsYWcuY1wKKwkJICAgICBkd2FyZl9nZXRfYWJicmV2X2VudHJ5LmMgXAorCQkgICAgIGR3YXJmX2dldF9hZGRyZXNzX3NpemUuYyBcCisJCSAgICAgZHdhcmZfc2V0ZXJyaGFuZC5jIGR3YXJmX3NldGVycmFyZy5jIFwKKwkJICAgICBkd2FyZl9kZWFsbG9jLmMKKworbGliZHdhcmZfcGljX2FfU09VUkNFUyA9CithbV9saWJkd2FyZl9waWNfYV9PQkpFQ1RTID0gJChsaWJkd2FyZl9hX1NPVVJDRVM6LmM9Lm9zKQorCitsaWJkd2FyZl9zb19TT1VSQ0VTID0KK2xpYmR3YXJmLnNvOiBsaWJkd2FyZl9waWMuYSBsaWJkd2FyZi5tYXAKKwkkKENDKSAtc2hhcmVkIC1vICRAIC1XbCwtLXdob2xlLWFyY2hpdmUsJDwsLS1uby13aG9sZS1hcmNoaXZlIFwKKwkgICAgICAtV2wsLS12ZXJzaW9uLXNjcmlwdCwkKHNyY2RpcikvbGliZHdhcmYubWFwLC0tbm8tdW5kZWZpbmVkIFwKKwkgICAgICAtV2wsLS1zb25hbWUsJEAuJChWRVJTSU9OKSwteixkZWZzIFwKKwkgICAgICAuLi9saWJlbGYvbGliZWxmLnNvCisJbG4gLWZzICRAICRALiQoVkVSU0lPTikKKworCislLm9zOiAlLmMgJS5vCisJaWYgJChDT01QSUxFKSAtYyAtbyAkQCAtZnBpYyAtRFBJQyAtRFNIQVJFRCAtTVQgJEAgLU1EIC1NUCBcCisJICAtTUYgIiQoREVQRElSKS8kKi5UcG8iIGB0ZXN0IC1mICckPCcgfHwgZWNobyAnJChzcmNkaXIpLydgJDw7IFwKKwl0aGVuIGNhdCAiJChERVBESVIpLyQqLlRwbyIgPj4gIiQoREVQRElSKS8kKi5QbyI7IFwKKwkgICAgIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgXAorCWVsc2Ugcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBleGl0IDE7IFwKKwlmaQorCitpbnN0YWxsOiBpbnN0YWxsLWFtIGxpYmR3YXJmLnNvCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCisJJChJTlNUQUxMX1BST0dSQU0pIGxpYmR3YXJmLnNvICQoREVTVERJUikkKGxpYmRpcikvbGliZHdhcmYtJChQQUNLQUdFX1ZFUlNJT04pLnNvCisJbG4gLWZzIGxpYmR3YXJmLSQoUEFDS0FHRV9WRVJTSU9OKS5zbyAkKERFU1RESVIpJChsaWJkaXIpL2xpYmR3YXJmLnNvLiQoVkVSU0lPTikKKwlsbiAtZnMgbGliZHdhcmYuc28uJChWRVJTSU9OKSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmR3YXJmLnNvCisKK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisJcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJkd2FyZi0kKFBBQ0tBR0VfVkVSU0lPTikuc28KKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmR3YXJmLnNvLiQoVkVSU0lPTikKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmR3YXJmLnNvCisJcm1kaXIgLS1pZ25vcmUtZmFpbC1vbi1ub24tZW1wdHkgJChERVNURElSKSQoaW5jbHVkZWRpcikvZWxmdXRpbHMKKworbm9pbnN0X0hFQURFUlMgPSBsaWJkd2FyZlAuaCBtZW1vcnktYWNjZXNzLmggZHdhcmZfYWJicmV2X2hhc2guaAorRVhUUkFfRElTVCA9IEFWQUlMQUJMRSBsaWJkd2FyZi5tYXAKKworQ0xFQU5GSUxFUyA9ICQoYW1fbGliZHdhcmZfcGljX2FfT0JKRUNUUykKZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmLmggYi9saWJkd2FyZi9kd2FyZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYmRjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZi5oCkBAIC0wLDAgKzEsNTQ5IEBACisvKiBUaGlzIGZpbGUgZGVmaW5lcyBzdGFuZGFyZCBEV0FSRiB0eXBlcywgc3RydWN0dXJlcywgYW5kIG1hY3Jvcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9EV0FSRl9ICisjZGVmaW5lCV9EV0FSRl9IIDEKKworLyogRFdBUkYgdGFncy4gICovCitlbnVtCisgIHsKKyAgICBEV19UQUdfYXJyYXlfdHlwZSA9IDB4MDEsCisgICAgRFdfVEFHX2NsYXNzX3R5cGUgPSAweDAyLAorICAgIERXX1RBR19lbnRyeV9wb2ludCA9IDB4MDMsCisgICAgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGUgPSAweDA0LAorICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyID0gMHgwNSwKKyAgICBEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24gPSAweDA4LAorICAgIERXX1RBR19sYWJlbCA9IDB4MGEsCisgICAgRFdfVEFHX2xleGljYWxfYmxvY2sgPSAweDBiLAorICAgIERXX1RBR19tZW1iZXIgPSAweDBkLAorICAgIERXX1RBR19wb2ludGVyX3R5cGUgPSAweDBmLAorICAgIERXX1RBR19yZWZlcmVuY2VfdHlwZSA9IDB4MTAsCisgICAgRFdfVEFHX2NvbXBpbGVfdW5pdCA9IDB4MTEsCisgICAgRFdfVEFHX3N0cmluZ190eXBlID0gMHgxMiwKKyAgICBEV19UQUdfc3RydWN0dXJlX3R5cGUgPSAweDEzLAorICAgIERXX1RBR19zdWJyb3V0aW5lX3R5cGUgPSAweDE1LAorICAgIERXX1RBR190eXBlZGVmID0gMHgxNiwKKyAgICBEV19UQUdfdW5pb25fdHlwZSA9IDB4MTcsCisgICAgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMgPSAweDE4LAorICAgIERXX1RBR192YXJpYW50ID0gMHgxOSwKKyAgICBEV19UQUdfY29tbW9uX2Jsb2NrID0gMHgxYSwKKyAgICBEV19UQUdfY29tbW9uX2luY2x1c2lvbiA9IDB4MWIsCisgICAgRFdfVEFHX2luaGVyaXRhbmNlID0gMHgxYywKKyAgICBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lID0gMHgxZCwKKyAgICBEV19UQUdfbW9kdWxlID0gMHgxZSwKKyAgICBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlID0gMHgxZiwKKyAgICBEV19UQUdfc2V0X3R5cGUgPSAweDIwLAorICAgIERXX1RBR19zdWJyYW5nZV90eXBlID0gMHgyMSwKKyAgICBEV19UQUdfd2l0aF9zdG10ID0gMHgyMiwKKyAgICBEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uID0gMHgyMywKKyAgICBEV19UQUdfYmFzZV90eXBlID0gMHgyNCwKKyAgICBEV19UQUdfY2F0Y2hfYmxvY2sgPSAweDI1LAorICAgIERXX1RBR19jb25zdF90eXBlID0gMHgyNiwKKyAgICBEV19UQUdfY29uc3RhbnQgPSAweDI3LAorICAgIERXX1RBR19lbnVtZXJhdG9yID0gMHgyOCwKKyAgICBEV19UQUdfZmlsZV90eXBlID0gMHgyOSwKKyAgICBEV19UQUdfZnJpZW5kID0gMHgyYSwKKyAgICBEV19UQUdfbmFtZWxpc3QgPSAweDJiLAorICAgIERXX1RBR19uYW1lbGlzdF9pdGVtID0gMHgyYywKKyAgICBEV19UQUdfcGFja2VkX3R5cGUgPSAweDJkLAorICAgIERXX1RBR19zdWJwcm9ncmFtID0gMHgyZSwKKyAgICBEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbSA9IDB4MmYsCisgICAgRFdfVEFHX3RlbXBsYXRlX3ZhbHVlX3BhcmFtID0gMHgzMCwKKyAgICBEV19UQUdfdGhyb3duX3R5cGUgPSAweDMxLAorICAgIERXX1RBR190cnlfYmxvY2sgPSAweDMyLAorICAgIERXX1RBR192YXJpYW50X3BhcnQgPSAweDMzLAorICAgIERXX1RBR192YXJpYWJsZSA9IDB4MzQsCisgICAgRFdfVEFHX3ZvbGF0aWxlX3R5cGUgPSAweDM1LAorICAgIERXX1RBR19sb191c2VyID0gMHg0MDgwLAorICAgIERXX1RBR19NSVBTX2xvb3AgPSAweDQwODEsCisgICAgRFdfVEFHX2Zvcm1hdF9sYWJlbCA9IDB4NDEwMSwKKyAgICBEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGUgPSAweDQxMDIsCisgICAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzLAorICAgIERXX1RBR19oaV91c2VyID0gMHhmZmZmCisgIH07CisKKworLyogQ2hpbGRyZW4gZGV0ZXJtaW5hdGlvbiBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfQ0hJTERSRU5fbm8gPSAwLAorICAgIERXX0NISUxEUkVOX3llcyA9IDEKKyAgfTsKKworCisvKiBEV0FSRiBhdHRyaWJ1dGVzIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19BVF9zaWJsaW5nID0gMHgwMSwKKyAgICBEV19BVF9sb2NhdGlvbiA9IDB4MDIsCisgICAgRFdfQVRfbmFtZSA9IDB4MDMsCisgICAgRFdfQVRfb3JkZXJpbmcgPSAweDA5LAorICAgIERXX0FUX3N1YnNjcl9kYXRhID0gMHgwYSwKKyAgICBEV19BVF9ieXRlX3NpemUgPSAweDBiLAorICAgIERXX0FUX2JpdF9vZmZzZXQgPSAweDBjLAorICAgIERXX0FUX2JpdF9zaXplID0gMHgwZCwKKyAgICBEV19BVF9lbGVtZW50X2xpc3QgPSAweDBmLAorICAgIERXX0FUX3N0bXRfbGlzdCA9IDB4MTAsCisgICAgRFdfQVRfbG93X3BjID0gMHgxMSwKKyAgICBEV19BVF9oaWdoX3BjID0gMHgxMiwKKyAgICBEV19BVF9sYW5ndWFnZSA9IDB4MTMsCisgICAgRFdfQVRfbWVtYmVyID0gMHgxNCwKKyAgICBEV19BVF9kaXNjciA9IDB4MTUsCisgICAgRFdfQVRfZGlzY3JfdmFsdWUgPSAweDE2LAorICAgIERXX0FUX3Zpc2liaWxpdHkgPSAweDE3LAorICAgIERXX0FUX2ltcG9ydCA9IDB4MTgsCisgICAgRFdfQVRfc3RyaW5nX2xlbmd0aCA9IDB4MTksCisgICAgRFdfQVRfY29tbW9uX3JlZmVyZW5jZSA9IDB4MWEsCisgICAgRFdfQVRfY29tcF9kaXIgPSAweDFiLAorICAgIERXX0FUX2NvbnN0X3ZhbHVlID0gMHgxYywKKyAgICBEV19BVF9jb250YWluaW5nX3R5cGUgPSAweDFkLAorICAgIERXX0FUX2RlZmF1bHRfdmFsdWUgPSAweDFlLAorICAgIERXX0FUX2lubGluZSA9IDB4MjAsCisgICAgRFdfQVRfaXNfb3B0aW9uYWwgPSAweDIxLAorICAgIERXX0FUX2xvd2VyX2JvdW5kID0gMHgyMiwKKyAgICBEV19BVF9wcm9kdWNlciA9IDB4MjUsCisgICAgRFdfQVRfcHJvdG90eXBlZCA9IDB4MjcsCisgICAgRFdfQVRfcmV0dXJuX2FkZHIgPSAweDJhLAorICAgIERXX0FUX3N0YXJ0X3Njb3BlID0gMHgyYywKKyAgICBEV19BVF9zdHJpZGVfc2l6ZSA9IDB4MmUsCisgICAgRFdfQVRfdXBwZXJfYm91bmQgPSAweDJmLAorICAgIERXX0FUX2Fic3RyYWN0X29yaWdpbiA9IDB4MzEsCisgICAgRFdfQVRfYWNjZXNzaWJpbGl0eSA9IDB4MzIsCisgICAgRFdfQVRfYWRkcmVzc19jbGFzcyA9IDB4MzMsCisgICAgRFdfQVRfYXJ0aWZpY2lhbCA9IDB4MzQsCisgICAgRFdfQVRfYmFzZV90eXBlcyA9IDB4MzUsCisgICAgRFdfQVRfY2FsbGluZ19jb252ZW50aW9uID0gMHgzNiwKKyAgICBEV19BVF9jb3VudCA9IDB4MzcsCisgICAgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24gPSAweDM4LAorICAgIERXX0FUX2RlY2xfY29sdW1uID0gMHgzOSwKKyAgICBEV19BVF9kZWNsX2ZpbGUgPSAweDNhLAorICAgIERXX0FUX2RlY2xfbGluZSA9IDB4M2IsCisgICAgRFdfQVRfZGVjbGFyYXRpb24gPSAweDNjLAorICAgIERXX0FUX2Rpc2NyX2xpc3QgPSAweDNkLAorICAgIERXX0FUX2VuY29kaW5nID0gMHgzZSwKKyAgICBEV19BVF9leHRlcm5hbCA9IDB4M2YsCisgICAgRFdfQVRfZnJhbWVfYmFzZSA9IDB4NDAsCisgICAgRFdfQVRfZnJpZW5kID0gMHg0MSwKKyAgICBEV19BVF9pZGVudGlmaWVyX2Nhc2UgPSAweDQyLAorICAgIERXX0FUX21hY3JvX2luZm8gPSAweDQzLAorICAgIERXX0FUX25hbWVsaXN0X2l0ZW1zID0gMHg0NCwKKyAgICBEV19BVF9wcmlvcml0eSA9IDB4NDUsCisgICAgRFdfQVRfc2VnbWVudCA9IDB4NDYsCisgICAgRFdfQVRfc3BlY2lmaWNhdGlvbiA9IDB4NDcsCisgICAgRFdfQVRfc3RhdGljX2xpbmsgPSAweDQ4LAorICAgIERXX0FUX3R5cGUgPSAweDQ5LAorICAgIERXX0FUX3VzZV9sb2NhdGlvbiA9IDB4NGEsCisgICAgRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyID0gMHg0YiwKKyAgICBEV19BVF92aXJ0dWFsaXR5ID0gMHg0YywKKyAgICBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbiA9IDB4NGQsCisgICAgRFdfQVRfbG9fdXNlciA9IDB4MjAwMCwKKyAgICBEV19BVF9NSVBTX2ZkZSA9IDB4MjAwMSwKKyAgICBEV19BVF9NSVBTX2xvb3BfYmVnaW4gPSAweDIwMDIsCisgICAgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4gPSAweDIwMDMsCisgICAgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4gPSAweDIwMDQsCisgICAgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IgPSAweDIwMDUsCisgICAgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCA9IDB4MjAwNiwKKyAgICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKKyAgICBEV19BVF9NSVBTX3N0cmlkZSA9IDB4MjAwOCwKKyAgICBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUgPSAweDIwMDksCisgICAgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4gPSAweDIwMGEsCisgICAgRFdfQVRfTUlQU19oYXNfaW5saW5lcyA9IDB4MjAwYiwKKyAgICBEV19BVF9NSVBTX3N0cmlkZV9ieXRlID0gMHgyMDBjLAorICAgIERXX0FUX01JUFNfc3RyaWRlX2VsZW0gPSAweDIwMGQsCisgICAgRFdfQVRfTUlQU19wdHJfZG9wZXR5cGUgPSAweDIwMGUsCisgICAgRFdfQVRfTUlQU19hbGxvY2F0YWJsZV9kb3BldHlwZSA9IDB4MjAwZiwKKyAgICBEV19BVF9NSVBTX2Fzc3VtZWRfc2hhcGVfZG9wZXR5cGUgPSAweDIwMTAsCisgICAgRFdfQVRfTUlQU19hc3N1bWVkX3NpemUgPSAweDIwMTEsCisgICAgRFdfQVRfc2ZfbmFtZXMgPSAweDIxMDEsCisgICAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCisgICAgRFdfQVRfbWFjX2luZm8gPSAweDIxMDMsCisgICAgRFdfQVRfc3JjX2Nvb3JkcyA9IDB4MjEwNCwKKyAgICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAorICAgIERXX0FUX2JvZHlfZW5kID0gMHgyMTA2LAorICAgIERXX0FUX2hpX3VzZXIgPSAweDNmZmYKKyAgfTsKKworCisvKiBEV0FSRiBmb3JtIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19GT1JNX2FkZHIgPSAweDAxLAorICAgIERXX0ZPUk1fYmxvY2syID0gMHgwMywKKyAgICBEV19GT1JNX2Jsb2NrNCA9IDB4MDQsCisgICAgRFdfRk9STV9kYXRhMiA9IDB4MDUsCisgICAgRFdfRk9STV9kYXRhNCA9IDB4MDYsCisgICAgRFdfRk9STV9kYXRhOCA9IDB4MDcsCisgICAgRFdfRk9STV9zdHJpbmcgPSAweDA4LAorICAgIERXX0ZPUk1fYmxvY2sgPSAweDA5LAorICAgIERXX0ZPUk1fYmxvY2sxID0gMHgwYSwKKyAgICBEV19GT1JNX2RhdGExID0gMHgwYiwKKyAgICBEV19GT1JNX2ZsYWcgPSAweDBjLAorICAgIERXX0ZPUk1fc2RhdGEgPSAweDBkLAorICAgIERXX0ZPUk1fc3RycCA9IDB4MGUsCisgICAgRFdfRk9STV91ZGF0YSA9IDB4MGYsCisgICAgRFdfRk9STV9yZWZfYWRkciA9IDB4MTAsCisgICAgRFdfRk9STV9yZWYxID0gMHgxMSwKKyAgICBEV19GT1JNX3JlZjIgPSAweDEyLAorICAgIERXX0ZPUk1fcmVmNCA9IDB4MTMsCisgICAgRFdfRk9STV9yZWY4ID0gMHgxNCwKKyAgICBEV19GT1JNX3JlZl91ZGF0YSA9IDB4MTUsCisgICAgRFdfRk9STV9pbmRpcmVjdCA9IDB4MTYKKyAgfTsKKworCisvKiBEV0FSRiBsb2NhdGlvbiBvcGVyYXRpb24gZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX09QX2FkZHIgPSAweDAzLAkJLyogQ29uc3RhbnQgYWRkcmVzcy4gICovCisgICAgRFdfT1BfZGVyZWYgPSAweDA2LAorICAgIERXX09QX2NvbnN0MXUgPSAweDA4LAkvKiBVbnNpZ25lZCAxLWJ5dGUgY29uc3RhbnQuICAqLworICAgIERXX09QX2NvbnN0MXMgPSAweDA5LAkvKiBTaWduZWQgMS1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdDJ1ID0gMHgwYSwJLyogVW5zaWduZWQgMi1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdDJzID0gMHgwYiwJLyogU2lnbmVkIDItYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfY29uc3Q0dSA9IDB4MGMsCS8qIFVuc2lnbmVkIDQtYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfY29uc3Q0cyA9IDB4MGQsCS8qIFNpZ25lZCA0LWJ5dGUgY29uc3RhbnQuICAqLworICAgIERXX09QX2NvbnN0OHUgPSAweDBlLAkvKiBVbnNpZ25lZCA4LWJ5dGUgY29uc3RhbnQuICAqLworICAgIERXX09QX2NvbnN0OHMgPSAweDBmLAkvKiBTaWduZWQgOC1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9jb25zdHUgPSAweDEwLAkvKiBVbnNpZ25lZCBMRUIxMjggY29uc3RhbnQuICAqLworICAgIERXX09QX2NvbnN0cyA9IDB4MTEsCS8qIFNpZ25lZCBMRUIxMjggY29uc3RhbnQuICAqLworICAgIERXX09QX2R1cCA9IDB4MTIsCisgICAgRFdfT1BfZHJvcCA9IDB4MTMsCisgICAgRFdfT1Bfb3ZlciA9IDB4MTQsCisgICAgRFdfT1BfcGljayA9IDB4MTUsCQkvKiAxLWJ5dGUgc3RhY2sgaW5kZXguICAqLworICAgIERXX09QX3N3YXAgPSAweDE2LAorICAgIERXX09QX3JvdCA9IDB4MTcsCisgICAgRFdfT1BfeGRlcmVmID0gMHgxOCwKKyAgICBEV19PUF9hYnMgPSAweDE5LAorICAgIERXX09QX2FuZCA9IDB4MWEsCisgICAgRFdfT1BfZGl2ID0gMHgxYiwKKyAgICBEV19PUF9taW51cyA9IDB4MWMsCisgICAgRFdfT1BfbW9kID0gMHgxZCwKKyAgICBEV19PUF9tdWwgPSAweDFlLAorICAgIERXX09QX25lZyA9IDB4MWYsCisgICAgRFdfT1Bfbm90ID0gMHgyMCwKKyAgICBEV19PUF9vciA9IDB4MjEsCisgICAgRFdfT1BfcGx1cyA9IDB4MjIsCisgICAgRFdfT1BfcGx1c191Y29uc3QgPSAweDIzLAkvKiBVbnNpZ25lZCBMRUIxMjggYWRkZW5kLiAgKi8KKyAgICBEV19PUF9zaGwgPSAweDI0LAorICAgIERXX09QX3NociA9IDB4MjUsCisgICAgRFdfT1Bfc2hyYSA9IDB4MjYsCisgICAgRFdfT1BfeG9yID0gMHgyNywKKyAgICBEV19PUF9icmEgPSAweDI4LAkJLyogU2lnbmVkIDItYnl0ZSBjb25zdGFudC4gICovCisgICAgRFdfT1BfZXEgPSAweDI5LAorICAgIERXX09QX2dlID0gMHgyYSwKKyAgICBEV19PUF9ndCA9IDB4MmIsCisgICAgRFdfT1BfbGUgPSAweDJjLAorICAgIERXX09QX2x0ID0gMHgyZCwKKyAgICBEV19PUF9uZSA9IDB4MmUsCisgICAgRFdfT1Bfc2tpcCA9IDB4MmYsCQkvKiBTaWduZWQgMi1ieXRlIGNvbnN0YW50LiAgKi8KKyAgICBEV19PUF9saXQwID0gMHgzMCwJCS8qIExpdGVyYWwgMC4gICovCisgICAgRFdfT1BfbGl0MSA9IDB4MzEsCQkvKiBMaXRlcmFsIDEuICAqLworICAgIERXX09QX2xpdDIgPSAweDMyLAkJLyogTGl0ZXJhbCAyLiAgKi8KKyAgICBEV19PUF9saXQzID0gMHgzMywJCS8qIExpdGVyYWwgMy4gICovCisgICAgRFdfT1BfbGl0NCA9IDB4MzQsCQkvKiBMaXRlcmFsIDQuICAqLworICAgIERXX09QX2xpdDUgPSAweDM1LAkJLyogTGl0ZXJhbCA1LiAgKi8KKyAgICBEV19PUF9saXQ2ID0gMHgzNiwJCS8qIExpdGVyYWwgNi4gICovCisgICAgRFdfT1BfbGl0NyA9IDB4MzcsCQkvKiBMaXRlcmFsIDcuICAqLworICAgIERXX09QX2xpdDggPSAweDM4LAkJLyogTGl0ZXJhbCA4LiAgKi8KKyAgICBEV19PUF9saXQ5ID0gMHgzOSwJCS8qIExpdGVyYWwgOS4gICovCisgICAgRFdfT1BfbGl0MTAgPSAweDNhLAkJLyogTGl0ZXJhbCAxMC4gICovCisgICAgRFdfT1BfbGl0MTEgPSAweDNiLAkJLyogTGl0ZXJhbCAxMS4gICovCisgICAgRFdfT1BfbGl0MTIgPSAweDNjLAkJLyogTGl0ZXJhbCAxMi4gICovCisgICAgRFdfT1BfbGl0MTMgPSAweDNkLAkJLyogTGl0ZXJhbCAxMy4gICovCisgICAgRFdfT1BfbGl0MTQgPSAweDNlLAkJLyogTGl0ZXJhbCAxNC4gICovCisgICAgRFdfT1BfbGl0MTUgPSAweDNmLAkJLyogTGl0ZXJhbCAxNS4gICovCisgICAgRFdfT1BfbGl0MTYgPSAweDQwLAkJLyogTGl0ZXJhbCAxNi4gICovCisgICAgRFdfT1BfbGl0MTcgPSAweDQxLAkJLyogTGl0ZXJhbCAxNy4gICovCisgICAgRFdfT1BfbGl0MTggPSAweDQyLAkJLyogTGl0ZXJhbCAxOC4gICovCisgICAgRFdfT1BfbGl0MTkgPSAweDQzLAkJLyogTGl0ZXJhbCAxOS4gICovCisgICAgRFdfT1BfbGl0MjAgPSAweDQ0LAkJLyogTGl0ZXJhbCAyMC4gICovCisgICAgRFdfT1BfbGl0MjEgPSAweDQ1LAkJLyogTGl0ZXJhbCAyMS4gICovCisgICAgRFdfT1BfbGl0MjIgPSAweDQ2LAkJLyogTGl0ZXJhbCAyMi4gICovCisgICAgRFdfT1BfbGl0MjMgPSAweDQ3LAkJLyogTGl0ZXJhbCAyMy4gICovCisgICAgRFdfT1BfbGl0MjQgPSAweDQ4LAkJLyogTGl0ZXJhbCAyNC4gICovCisgICAgRFdfT1BfbGl0MjUgPSAweDQ5LAkJLyogTGl0ZXJhbCAyNS4gICovCisgICAgRFdfT1BfbGl0MjYgPSAweDRhLAkJLyogTGl0ZXJhbCAyNi4gICovCisgICAgRFdfT1BfbGl0MjcgPSAweDRiLAkJLyogTGl0ZXJhbCAyNy4gICovCisgICAgRFdfT1BfbGl0MjggPSAweDRjLAkJLyogTGl0ZXJhbCAyOC4gICovCisgICAgRFdfT1BfbGl0MjkgPSAweDRkLAkJLyogTGl0ZXJhbCAyOS4gICovCisgICAgRFdfT1BfbGl0MzAgPSAweDRlLAkJLyogTGl0ZXJhbCAzMC4gICovCisgICAgRFdfT1BfbGl0MzEgPSAweDRmLAkJLyogTGl0ZXJhbCAzMS4gICovCisgICAgRFdfT1BfcmVnMCA9IDB4NTAsCQkvKiBSZWdpc3RlciAwLiAgKi8KKyAgICBEV19PUF9yZWcxID0gMHg1MSwJCS8qIFJlZ2lzdGVyIDEuICAqLworICAgIERXX09QX3JlZzIgPSAweDUyLAkJLyogUmVnaXN0ZXIgMi4gICovCisgICAgRFdfT1BfcmVnMyA9IDB4NTMsCQkvKiBSZWdpc3RlciAzLiAgKi8KKyAgICBEV19PUF9yZWc0ID0gMHg1NCwJCS8qIFJlZ2lzdGVyIDQuICAqLworICAgIERXX09QX3JlZzUgPSAweDU1LAkJLyogUmVnaXN0ZXIgNS4gICovCisgICAgRFdfT1BfcmVnNiA9IDB4NTYsCQkvKiBSZWdpc3RlciA2LiAgKi8KKyAgICBEV19PUF9yZWc3ID0gMHg1NywJCS8qIFJlZ2lzdGVyIDcuICAqLworICAgIERXX09QX3JlZzggPSAweDU4LAkJLyogUmVnaXN0ZXIgOC4gICovCisgICAgRFdfT1BfcmVnOSA9IDB4NTksCQkvKiBSZWdpc3RlciA5LiAgKi8KKyAgICBEV19PUF9yZWcxMCA9IDB4NWEsCQkvKiBSZWdpc3RlciAxMC4gICovCisgICAgRFdfT1BfcmVnMTEgPSAweDViLAkJLyogUmVnaXN0ZXIgMTEuICAqLworICAgIERXX09QX3JlZzEyID0gMHg1YywJCS8qIFJlZ2lzdGVyIDEyLiAgKi8KKyAgICBEV19PUF9yZWcxMyA9IDB4NWQsCQkvKiBSZWdpc3RlciAxMy4gICovCisgICAgRFdfT1BfcmVnMTQgPSAweDVlLAkJLyogUmVnaXN0ZXIgMTQuICAqLworICAgIERXX09QX3JlZzE1ID0gMHg1ZiwJCS8qIFJlZ2lzdGVyIDE1LiAgKi8KKyAgICBEV19PUF9yZWcxNiA9IDB4NjAsCQkvKiBSZWdpc3RlciAxNi4gICovCisgICAgRFdfT1BfcmVnMTcgPSAweDYxLAkJLyogUmVnaXN0ZXIgMTcuICAqLworICAgIERXX09QX3JlZzE4ID0gMHg2MiwJCS8qIFJlZ2lzdGVyIDE4LiAgKi8KKyAgICBEV19PUF9yZWcxOSA9IDB4NjMsCQkvKiBSZWdpc3RlciAxOS4gICovCisgICAgRFdfT1BfcmVnMjAgPSAweDY0LAkJLyogUmVnaXN0ZXIgMjAuICAqLworICAgIERXX09QX3JlZzIxID0gMHg2NSwJCS8qIFJlZ2lzdGVyIDIxLiAgKi8KKyAgICBEV19PUF9yZWcyMiA9IDB4NjYsCQkvKiBSZWdpc3RlciAyMi4gICovCisgICAgRFdfT1BfcmVnMjMgPSAweDY3LAkJLyogUmVnaXN0ZXIgMjQuICAqLworICAgIERXX09QX3JlZzI0ID0gMHg2OCwJCS8qIFJlZ2lzdGVyIDI0LiAgKi8KKyAgICBEV19PUF9yZWcyNSA9IDB4NjksCQkvKiBSZWdpc3RlciAyNS4gICovCisgICAgRFdfT1BfcmVnMjYgPSAweDZhLAkJLyogUmVnaXN0ZXIgMjYuICAqLworICAgIERXX09QX3JlZzI3ID0gMHg2YiwJCS8qIFJlZ2lzdGVyIDI3LiAgKi8KKyAgICBEV19PUF9yZWcyOCA9IDB4NmMsCQkvKiBSZWdpc3RlciAyOC4gICovCisgICAgRFdfT1BfcmVnMjkgPSAweDZkLAkJLyogUmVnaXN0ZXIgMjkuICAqLworICAgIERXX09QX3JlZzMwID0gMHg2ZSwJCS8qIFJlZ2lzdGVyIDMwLiAgKi8KKyAgICBEV19PUF9yZWczMSA9IDB4NmYsCQkvKiBSZWdpc3RlciAzMS4gICovCisgICAgRFdfT1BfYnJlZzAgPSAweDcwLAkJLyogQmFzZSByZWdpc3RlciAwLiAgKi8KKyAgICBEV19PUF9icmVnMSA9IDB4NzEsCQkvKiBCYXNlIHJlZ2lzdGVyIDEuICAqLworICAgIERXX09QX2JyZWcyID0gMHg3MiwJCS8qIEJhc2UgcmVnaXN0ZXIgMi4gICovCisgICAgRFdfT1BfYnJlZzMgPSAweDczLAkJLyogQmFzZSByZWdpc3RlciAzLiAgKi8KKyAgICBEV19PUF9icmVnNCA9IDB4NzQsCQkvKiBCYXNlIHJlZ2lzdGVyIDQuICAqLworICAgIERXX09QX2JyZWc1ID0gMHg3NSwJCS8qIEJhc2UgcmVnaXN0ZXIgNS4gICovCisgICAgRFdfT1BfYnJlZzYgPSAweDc2LAkJLyogQmFzZSByZWdpc3RlciA2LiAgKi8KKyAgICBEV19PUF9icmVnNyA9IDB4NzcsCQkvKiBCYXNlIHJlZ2lzdGVyIDcuICAqLworICAgIERXX09QX2JyZWc4ID0gMHg3OCwJCS8qIEJhc2UgcmVnaXN0ZXIgOC4gICovCisgICAgRFdfT1BfYnJlZzkgPSAweDc5LAkJLyogQmFzZSByZWdpc3RlciA5LiAgKi8KKyAgICBEV19PUF9icmVnMTAgPSAweDdhLAkvKiBCYXNlIHJlZ2lzdGVyIDEwLiAgKi8KKyAgICBEV19PUF9icmVnMTEgPSAweDdiLAkvKiBCYXNlIHJlZ2lzdGVyIDExLiAgKi8KKyAgICBEV19PUF9icmVnMTIgPSAweDdjLAkvKiBCYXNlIHJlZ2lzdGVyIDEyLiAgKi8KKyAgICBEV19PUF9icmVnMTMgPSAweDdkLAkvKiBCYXNlIHJlZ2lzdGVyIDEzLiAgKi8KKyAgICBEV19PUF9icmVnMTQgPSAweDdlLAkvKiBCYXNlIHJlZ2lzdGVyIDE0LiAgKi8KKyAgICBEV19PUF9icmVnMTUgPSAweDdmLAkvKiBCYXNlIHJlZ2lzdGVyIDE1LiAgKi8KKyAgICBEV19PUF9icmVnMTYgPSAweDgwLAkvKiBCYXNlIHJlZ2lzdGVyIDE2LiAgKi8KKyAgICBEV19PUF9icmVnMTcgPSAweDgxLAkvKiBCYXNlIHJlZ2lzdGVyIDE3LiAgKi8KKyAgICBEV19PUF9icmVnMTggPSAweDgyLAkvKiBCYXNlIHJlZ2lzdGVyIDE4LiAgKi8KKyAgICBEV19PUF9icmVnMTkgPSAweDgzLAkvKiBCYXNlIHJlZ2lzdGVyIDE5LiAgKi8KKyAgICBEV19PUF9icmVnMjAgPSAweDg0LAkvKiBCYXNlIHJlZ2lzdGVyIDIwLiAgKi8KKyAgICBEV19PUF9icmVnMjEgPSAweDg1LAkvKiBCYXNlIHJlZ2lzdGVyIDIxLiAgKi8KKyAgICBEV19PUF9icmVnMjIgPSAweDg2LAkvKiBCYXNlIHJlZ2lzdGVyIDIyLiAgKi8KKyAgICBEV19PUF9icmVnMjMgPSAweDg3LAkvKiBCYXNlIHJlZ2lzdGVyIDIzLiAgKi8KKyAgICBEV19PUF9icmVnMjQgPSAweDg4LAkvKiBCYXNlIHJlZ2lzdGVyIDI0LiAgKi8KKyAgICBEV19PUF9icmVnMjUgPSAweDg5LAkvKiBCYXNlIHJlZ2lzdGVyIDI1LiAgKi8KKyAgICBEV19PUF9icmVnMjYgPSAweDhhLAkvKiBCYXNlIHJlZ2lzdGVyIDI2LiAgKi8KKyAgICBEV19PUF9icmVnMjcgPSAweDhiLAkvKiBCYXNlIHJlZ2lzdGVyIDI3LiAgKi8KKyAgICBEV19PUF9icmVnMjggPSAweDhjLAkvKiBCYXNlIHJlZ2lzdGVyIDI4LiAgKi8KKyAgICBEV19PUF9icmVnMjkgPSAweDhkLAkvKiBCYXNlIHJlZ2lzdGVyIDI5LiAgKi8KKyAgICBEV19PUF9icmVnMzAgPSAweDhlLAkvKiBCYXNlIHJlZ2lzdGVyIDMwLiAgKi8KKyAgICBEV19PUF9icmVnMzEgPSAweDhmLAkvKiBCYXNlIHJlZ2lzdGVyIDMxLiAgKi8KKyAgICBEV19PUF9yZWd4ID0gMHg5MCwJCS8qIFVuc2lnbmVkIExFQjEyOCByZWdpc3Rlci4gICovCisgICAgRFdfT1BfZmJyZWcgPSAweDkxLAkJLyogU2lnbmVkIExFQjEyOCByZWdpc3Rlci4gICovCisgICAgRFdfT1BfYnJlZ3ggPSAweDkyLAkJLyogVUxFQjEyOCByZWdpc3RlciBmb2xsb3dlZCBieSBTTEVCMTI4IG9mZi4gKi8KKyAgICBEV19PUF9waWVjZSA9IDB4OTMsCQkvKiBVTEVCMTI4IHNpemUgb2YgcGllY2UgYWRkcmVzc2VkLiAqLworICAgIERXX09QX2RlcmVmX3NpemUgPSAweDk0LAkvKiAxLWJ5dGUgc2l6ZSBvZiBkYXRhIHJldHJpZXZlZC4gICovCisgICAgRFdfT1BfeGRlcmVmX3NpemUgPSAweDk1LAkvKiAxLWJ5dGUgc2l6ZSBvZiBkYXRhIHJldHJpZXZlZC4gICovCisgICAgRFdfT1Bfbm9wID0gMHg5NiwKKyAgICBEV19PUF9wdXNoX29iamVjdF9hZGRyZXNzID0gMHg5NywKKyAgICBEV19PUF9jYWxsMiA9IDB4OTgsCisgICAgRFdfT1BfY2FsbDQgPSAweDk5LAorICAgIERXX09QX2NhbGxfcmVmID0gMHg5YSwKKworICAgIERXX09QX2xvX3VzZXIgPSAweGUwLAkvKiBJbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0LiAgKi8KKyAgICBEV19PUF9oaV91c2VyID0gMHhmZgkvKiBJbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZC4gICovCisgIH07CisKKworLyogRFdBUkYgYmFzZSB0eXBlIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19BVEVfdm9pZCA9IDB4MCwKKyAgICBEV19BVEVfYWRkcmVzcyA9IDB4MSwKKyAgICBEV19BVEVfYm9vbGVhbiA9IDB4MiwKKyAgICBEV19BVEVfY29tcGxleF9mbG9hdCA9IDB4MywKKyAgICBEV19BVEVfZmxvYXQgPSAweDQsCisgICAgRFdfQVRFX3NpZ25lZCA9IDB4NSwKKyAgICBEV19BVEVfc2lnbmVkX2NoYXIgPSAweDYsCisgICAgRFdfQVRFX3Vuc2lnbmVkID0gMHg3LAorICAgIERXX0FURV91bnNpZ25lZF9jaGFyID0gMHg4LAorCisgICAgRFdfQVRFX2xvX3VzZXIgPSAweDgwLAorICAgIERXX0FURV9oaV91c2VyID0gMHhmZgorICB9OworCisKKy8qIERXQVJGIGFjY2Vzc2liaWxpdHkgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0FDQ0VTU19wdWJsaWMgPSAxLAorICAgIERXX0FDQ0VTU19wcm90ZWN0ZWQgPSAyLAorICAgIERXX0FDQ0VTU19wcml2YXRlID0gMworICB9OworCisKKy8qIERXQVJGIHZpc2liaWxpdHkgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX1ZJU19sb2NhbCA9IDEsCisgICAgRFdfVklTX2V4cG9ydGVkID0gMiwKKyAgICBEV19WSVNfcXVhbGlmaWVkID0gMworICB9OworCisKKy8qIERXQVJGIHZpcnR1YWxpdHkgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX1ZJUlRVQUxJVFlfbm9uZSA9IDAsCisgICAgRFdfVklSVFVBTElUWV92aXJ0dWFsID0gMSwKKyAgICBEV19WSVJUVUFMSVRZX3B1cmVfdmlydHVhbCA9IDIKKyAgfTsKKworCisvKiBEV0FSRiBsYW5ndWFnZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfTEFOR19DODkgPSAweDAwMDEsCisgICAgRFdfTEFOR19DID0gMHgwMDAyLAorICAgIERXX0xBTkdfQWRhODMgPSAweDAwMDMsCisgICAgRFdfTEFOR19DX3BsdXNfcGx1cwk9IDB4MDAwNCwKKyAgICBEV19MQU5HX0NvYm9sNzQgPSAweDAwMDUsCisgICAgRFdfTEFOR19Db2JvbDg1ID0gMHgwMDA2LAorICAgIERXX0xBTkdfRm9ydHJhbjc3ID0gMHgwMDA3LAorICAgIERXX0xBTkdfRm9ydHJhbjkwID0gMHgwMDA4LAorICAgIERXX0xBTkdfUGFzY2FsODMgPSAweDAwMDksCisgICAgRFdfTEFOR19Nb2R1bGEyID0gMHgwMDBhLAorICAgIERXX0xBTkdfSmF2YSA9IDB4MDAwYiwKKyAgICBEV19MQU5HX0M5OSA9IDB4MDAwYywKKyAgICBEV19MQU5HX0FkYTk1ID0gMHgwMDBkLAorICAgIERXX0xBTkdfRm9ydHJhbjk1ID0gMHgwMDBlLAorICAgIERXX0xBTkdfUEwxID0gMHgwMDBmLAorICAgIERXX0xBTkdfbG9fdXNlciA9IDB4ODAwMCwKKyAgICBEV19MQU5HX01pcHNfQXNzZW1ibGVyID0gMHg4MDAxLAorICAgIERXX0xBTkdfaGlfdXNlciA9IDB4ZmZmZgorICB9OworCisKKy8qIERXQVJGIGlkZW50aWZpZXIgY2FzZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfSURfY2FzZV9zZW5zaXRpdmUgPSAwLAorICAgIERXX0lEX3VwX2Nhc2UgPSAxLAorICAgIERXX0lEX2Rvd25fY2FzZSA9IDIsCisgICAgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZSA9IDMKKyAgfTsKKworCisvKiBEV0FSRiBjYWxsaW5nIGNvbnZlbnRpb25zIGVuY29kaW5ncy4gICovCitlbnVtCisgIHsKKyAgICBEV19DQ19ub3JtYWwgPSAweDEsCisgICAgRFdfQ0NfcHJvZ3JhbSA9IDB4MiwKKyAgICBEV19DQ19ub2NhbGwgPSAweDMsCisgICAgRFdfQ0NfbG9fdXNlciA9IDB4NDAsCisgICAgRFdfQ0NfaGlfdXNlciA9IDB4ZmYKKyAgfTsKKworCisvKiBEV0FSRiBpbmxpbmUgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0lOTF9ub3RfaW5saW5lZCA9IDAsCisgICAgRFdfSU5MX2lubGluZWQgPSAxLAorICAgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDIsCisgICAgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQgPSAzCisgIH07CisKKworLyogRFdBUkYgb3JkZXJpbmcgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX09SRF9yb3dfbWFqb3IgPSAwLAorICAgIERXX09SRF9jb2xfbWFqb3IgPSAxCisgIH07CisKKworLyogRFdBUkYgZGlzY3JpbWluYW50IGRlc2NyaXB0b3IgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0RTQ19sYWJlbCA9IDAsCisgICAgRFdfRFNDX3JhbmdlID0gMQorICB9OworCisKKy8qIERXQVJGIHN0YW5kYXJkIG9wY29kZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfTE5TX2NvcHkgPSAxLAorICAgIERXX0xOU19hZHZhbmNlX3BjID0gMiwKKyAgICBEV19MTlNfYWR2YW5jZV9saW5lID0gMywKKyAgICBEV19MTlNfc2V0X2ZpbGUgPSA0LAorICAgIERXX0xOU19zZXRfY29sdW1uID0gNSwKKyAgICBEV19MTlNfbmVnYXRlX3N0bXQgPSA2LAorICAgIERXX0xOU19zZXRfYmFzaWNfYmxvY2sgPSA3LAorICAgIERXX0xOU19jb25zdF9hZGRfcGMgPSA4LAorICAgIERXX0xOU19maXhlZF9hZHZhbmNlX3BjID0gOSwKKyAgICBEV19MTlNfc2V0X3Byb2xvZ3VlX2VuZCA9IDEwLAorICAgIERXX0xOU19zZXRfZXBpbG9nX2JlZ2luID0gMTEKKyAgfTsKKworCisvKiBEV0FSRiBleHRlbmRlZCBvcGNpZGUgZW5jb2RpbmdzLiAgKi8KK2VudW0KKyAgeworICAgIERXX0xORV9lbmRfc2VxdWVuY2UgPSAxLAorICAgIERXX0xORV9zZXRfYWRkcmVzcyA9IDIsCisgICAgRFdfTE5FX2RlZmluZV9maWxlID0gMworICB9OworCisKKy8qIERXQVJGIG1hY2luZm8gdHlwZSBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfTUFDSU5GT19kZWZpbmUgPSAxLAorICAgIERXX01BQ0lORk9fdW5kZWYgPSAyLAorICAgIERXX01BQ0lORk9fc3RhcnRfZmlsZSA9IDMsCisgICAgRFdfTUFDSU5GT19lbmRfZmlsZSA9IDQsCisgICAgRFdfTUFDSU5GT192ZW5kb3JfZXh0ID0gMjU1CisgIH07CisKKworLyogRFdBUkYgY2FsbCBmcmFtZSBpbnN0cnVjdGlvbiBlbmNvZGluZ3MuICAqLworZW51bQorICB7CisgICAgRFdfQ0ZBX2FkdmFuY2VfbG9jID0gMHg0MCwKKyAgICBEV19DRkFfb2Zmc2V0ID0gMHg4MCwKKyAgICBEV19DRkFfcmVzdG9yZSA9IDB4YzAsCisgICAgRFdfQ0ZBX2V4dGVuZGVkID0gMCwKKworICAgIERXX0NGQV9ub3AgPSAweDAwLAorICAgIERXX0NGQV9zZXRfbG9jID0gMHgwMSwKKyAgICBEV19DRkFfYWR2YW5jZV9sb2MxID0gMHgwMiwKKyAgICBEV19DRkFfYWR2YW5jZV9sb2MyID0gMHgwMywKKyAgICBEV19DRkFfYWR2YW5jZV9sb2M0ID0gMHgwNCwKKyAgICBEV19DRkFfb2Zmc2V0X2V4dGVuZGVkID0gMHgwNSwKKyAgICBEV19DRkFfcmVzdG9yZV9leHRlbmRlZCA9IDB4MDYsCisgICAgRFdfQ0ZBX3VuZGVmaW5lZCA9IDB4MDcsCisgICAgRFdfQ0ZBX3NhbWVfdmFsdWUgPSAweDA4LAorICAgIERXX0NGQV9yZWdpc3RlciA9IDB4MDksCisgICAgRFdfQ0ZBX3JlbWVtYmVyX3N0YXRlID0gMHgwYSwKKyAgICBEV19DRkFfcmVzdG9yZV9zdGF0ZSA9IDB4MGIsCisgICAgRFdfQ0ZBX2RlZl9jZmEgPSAweDBjLAorICAgIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyID0gMHgwZCwKKyAgICBEV19DRkFfZGVmX2NmYV9vZmZzZXQgPSAweDBlLAorICAgIERXX0NGQV9sb3dfdXNlciA9IDB4MWMsCisgICAgRFdfQ0ZBX01JUFNfYWR2YW5jZV9sb2M4ID0gMHgxZCwKKyAgICBEV19DRkFfR05VX3dpbmRvd19zYXZlID0gMHgyZCwKKyAgICBEV19DRkFfR05VX2FyZ3Nfc2l6ZSA9IDB4MmUsCisgICAgRFdfQ0ZBX2hpZ2hfdXNlciA9IDB4M2YKKyAgfTsKKworCisvKiBEV0FSRiBYWFguICAqLworI2RlZmluZSBEV19BRERSX25vbmUJMAorCisjZW5kaWYJLyogZHdhcmYuaCAqLwpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfYWJicmV2X2hhc2guYyBiL2xpYmR3YXJmL2R3YXJmX2FiYnJldl9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5NjQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2FiYnJldl9oYXNoLmMKQEAgLTAsMCArMSwyOSBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgaGFzaCB0YWJsZSBmb3IgRFdBUkYgLmRlYnVnX2FiYnJldiBzZWN0aW9uIGNvbnRlbnQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgTk9fVU5ERUYKKyNpbmNsdWRlICJsaWJkd2FyZlAuaCIKKworI2RlZmluZSBuZXh0X3ByaW1lIF9fbGliZHdhcmZfbmV4dF9wcmltZQorZXh0ZXJuIHNpemVfdCBuZXh0X3ByaW1lIChzaXplX3QpIGF0dHJpYnV0ZV9oaWRkZW47CisKKyNpbmNsdWRlIDxkeW5hbWljc2l6ZWhhc2guYz4KKworI3VuZGVmIG5leHRfcHJpbWUKKyNkZWZpbmUgbmV4dF9wcmltZSBhdHRyaWJ1dGVfaGlkZGVuIF9fbGliZHdhcmZfbmV4dF9wcmltZQorI2luY2x1ZGUgIi4uL2xpYi9uZXh0X3ByaW1lLmMiCmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9hYmJyZXZfaGFzaC5oIGIvbGliZHdhcmYvZHdhcmZfYWJicmV2X2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWMyMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfYWJicmV2X2hhc2guaApAQCAtMCwwICsxLDI0IEBACisvKiBIYXNoIHRhYmxlIGZvciBEV0FSRiAuZGVidWdfYWJicmV2IHNlY3Rpb24gY29udGVudC4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBfRFdBUkZfQUJCUkVWX0hBU0hfSAorI2RlZmluZSBfRFdBUkZfQUJCUkVWX0hBU0hfSAkxCisKKyNkZWZpbmUgTkFNRSBEd2FyZl9BYmJyZXZfSGFzaAorI2RlZmluZSBUWVBFIER3YXJmX0FiYnJldgorI2RlZmluZSBDT01QQVJFKGEsIGIpICgwKQorCisjaW5jbHVkZSA8ZHluYW1pY3NpemVoYXNoLmg+CisKKyNlbmRpZgkvKiBkd2FyZl9hYmJyZXZfaGFzaC5oICovCmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9hcnJheW9yZGVyLmMgYi9saWJkd2FyZi9kd2FyZl9hcnJheW9yZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmMzA4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2FycmF5b3JkZXIuYwpAQCAtMCwwICsxLDMxIEBACisvKiBSZXR1cm4gYXJyYXkgb3JkZXJpbmcgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGRpZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2FycmF5b3JkZXIgKGRpZSwgcmV0dXJuX29yZGVyLCBlcnJvcikKKyAgICAgRHdhcmZfRGllIGRpZTsKKyAgICAgRHdhcmZfVW5zaWduZWQgKnJldHVybl9vcmRlcjsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICByZXR1cm4gX19saWJkd2FyZl9nZXRjb25zdGFudCAoZGllLCBEV19BVF9vcmRlcmluZywgcmV0dXJuX29yZGVyLCBlcnJvcik7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9hdHRyLmMgYi9saWJkd2FyZi9kd2FyZl9hdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiMjBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2F0dHIuYwpAQCAtMCwwICsxLDExMyBAQAorLyogUmV0dXJuIGRpZSBhdHRyaWJ1dGUgd2l0aCBzcGVjaWZpZWQgb2YgZ2l2ZW4gdHlwZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9hdHRyIChkaWUsIGF0dHIsIHJldHVybl9hdHRyLCBlcnJvcikKKyAgICAgRHdhcmZfRGllIGRpZTsKKyAgICAgRHdhcmZfSGFsZiBhdHRyOworICAgICBEd2FyZl9BdHRyaWJ1dGUgKnJldHVybl9hdHRyOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIER3YXJmX0RlYnVnIGRiZyA9IGRpZS0+Y3UtPmRiZzsKKyAgRHdhcmZfU21hbGwgKmRpZV9hZGRyOworICBEd2FyZl9Xb3JkIHUxMjg7CisgIER3YXJmX0FiYnJldiBhYmJyZXY7CisgIER3YXJmX1NtYWxsICphdHRycDsKKworICAvKiBBZGRyZXNzIG9mIHRoZSBnaXZlbiBkaWUuICAqLworICBkaWVfYWRkciA9IGRpZS0+YWRkcjsKKworICAvKiBHZXQgYWJicmV2IGNvZGUuICAqLworICBnZXRfdWxlYjEyOCAodTEyOCwgZGllX2FkZHIpOworICAvKiAgQW5kIGdldCB0aGUgYWJicmV2aWF0aW9uIGl0c2VsZi4gICovCisgIGFiYnJldiA9IF9fbGliZHdhcmZfZ2V0X2FiYnJldiAoZGJnLCBkaWUtPmN1LCB1MTI4LCBlcnJvcik7CisgIGlmIChhYmJyZXYgPT0gTlVMTCkKKyAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCisgIC8qIFRoaXMgaXMgd2hlcmUgdGhlIGF0dHJpYnV0ZXMgc3RhcnQuICAqLworICBhdHRycCA9IGFiYnJldi0+YXR0cnA7CisKKyAgLyogU2VhcmNoIHRoZSBuYW1lIGF0dHJpYnV0ZS4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIER3YXJmX1dvcmQgYXR0cl9uYW1lOworICAgICAgRHdhcmZfV29yZCBhdHRyX2Zvcm07CisKKyAgICAgIC8qIEFyZSB3ZSBzdGlsbCBpbiBib3VuZHM/ICAqLworICAgICAgaWYgKHVubGlrZWx5IChhdHRycAorCQkgICAgPj0gKChEd2FyZl9TbWFsbCAqKSBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19hYmJyZXZdLmFkZHIKKwkJCSsgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfYWJicmV2XS5zaXplKSkpCisJeworCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkgIHJldHVybiBEV19ETFZfRVJST1I7CisJfQorCisgICAgICAvKiBHZXQgYXR0cmlidXRlIG5hbWUgYW5kIGZvcm0uCisKKwkgWFhYIFdlIGRvbid0IGNoZWNrIHdoZXRoZXIgdGhpcyByZWFkcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKwkgc2VjdGlvbi4gICovCisgICAgICBnZXRfdWxlYjEyOCAoYXR0cl9uYW1lLCBhdHRycCk7CisgICAgICBnZXRfdWxlYjEyOCAoYXR0cl9mb3JtLCBhdHRycCk7CisKKyAgICAgIC8qIFdlIGNhbiBzdG9wIGlmIHdlIGZvdW5kIHRoZSBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSB6ZXJvLiAgKi8KKyAgICAgIGlmIChhdHRyX25hbWUgPT0gMCAmJiBhdHRyX2Zvcm0gPT0gMCkKKwlicmVhazsKKworICAgICAgLyogSXMgdGhpcyB0aGUgbmFtZSBhdHRyaWJ1dGU/ICAqLworICAgICAgaWYgKGF0dHJfbmFtZSA9PSBhdHRyKQorCXsKKwkgIER3YXJmX0F0dHJpYnV0ZSBuZXdfYXR0cjsKKworCSAgbmV3X2F0dHIgPQorCSAgICAoRHdhcmZfQXR0cmlidXRlKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IER3YXJmX0F0dHJpYnV0ZV9zKSk7CisJICBpZiAobmV3X2F0dHIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworCSAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisJICAgIH0KKworCSAgbmV3X2F0dHItPmNvZGUgPSBhdHRyX25hbWU7CisJICBuZXdfYXR0ci0+Zm9ybSA9IGF0dHJfZm9ybTsKKwkgIG5ld19hdHRyLT52YWxwID0gZGllX2FkZHI7CisJICBuZXdfYXR0ci0+Y3UgPSBkaWUtPmN1OworCisJICAqcmV0dXJuX2F0dHIgPSBuZXdfYXR0cjsKKwkgIHJldHVybiBEV19ETFZfT0s7CisJfQorCisgICAgICAvKiBTa2lwIG92ZXIgdGhlIHJlc3Qgb2YgdGhpcyBhdHRyaWJ1dGUgKGlmIHRoZXJlIGlzIGFueSkuICAqLworICAgICAgaWYgKGF0dHJfZm9ybSAhPSAwKQorCXsKKwkgIHNpemVfdCBsZW47CisKKwkgIGlmIChfX2xpYmR3YXJmX2Zvcm1fdmFsX2xlbiAoZGJnLCBkaWUtPmN1LCBhdHRyX2Zvcm0sIGRpZV9hZGRyLCAmbGVuLAorCQkJCSAgICAgICBlcnJvcikgIT0gRFdfRExWX09LKQorCSAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCisJICBkaWVfYWRkciArPSBsZW47CisJfQorICAgIH0KKworICAvKiBObyBzdWNoIGF0dHJpYnV0ZSBwcmVzZW50LiAgKi8KKyAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2F0dHJsaXN0LmMgYi9saWJkd2FyZi9kd2FyZl9hdHRybGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjVhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9hdHRybGlzdC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBSZXR1cm4gYXR0cmlidXRlIGxpc3QgZm9yIGRpZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworc3RydWN0IGF0dHJsaXN0Cit7CisgIHN0cnVjdCBhdHRybGlzdCAqbmV4dDsKKyAgRHdhcmZfQXR0cmlidXRlIGF0dHI7Cit9OworCisKK2ludAorZHdhcmZfYXR0cmxpc3QgKGRpZSwgYXR0cmJ1ZiwgYXR0cmNvdW50LCBlcnJvcikKKyAgICAgRHdhcmZfRGllIGRpZTsKKyAgICAgRHdhcmZfQXR0cmlidXRlICoqYXR0cmJ1ZjsKKyAgICAgRHdhcmZfU2lnbmVkICphdHRyY291bnQ7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfRGVidWcgZGJnID0gZGllLT5jdS0+ZGJnOworICBEd2FyZl9TbWFsbCAqZGllX2FkZHI7CisgIER3YXJmX1dvcmQgdTEyODsKKyAgRHdhcmZfQWJicmV2IGFiYnJldjsKKyAgRHdhcmZfU21hbGwgKmF0dHJwOworICBzdHJ1Y3QgYXR0cmxpc3QgKmFsaXN0OworICBpbnQgbmF0dHI7CisgIER3YXJmX0F0dHJpYnV0ZSAqcmVzdWx0OworCisgIC8qIEFkZHJlc3Mgb2YgdGhlIGdpdmVuIGRpZS4gICovCisgIGRpZV9hZGRyID0gZGllLT5hZGRyOworCisgIC8qIEdldCBhYmJyZXYgY29kZS4gICovCisgIGdldF91bGViMTI4ICh1MTI4LCBkaWVfYWRkcik7CisgIC8qICBBbmQgZ2V0IHRoZSBhYmJyZXZpYXRpb24gaXRzZWxmLiAgKi8KKyAgYWJicmV2ID0gX19saWJkd2FyZl9nZXRfYWJicmV2IChkYmcsIGRpZS0+Y3UsIHUxMjgsIGVycm9yKTsKKyAgaWYgKGFiYnJldiA9PSBOVUxMKQorICAgIHJldHVybiBEV19ETFZfRVJST1I7CisKKyAgLyogVGhpcyBpcyB3aGVyZSB0aGUgYXR0cmlidXRlcyBzdGFydC4gICovCisgIGF0dHJwID0gYWJicmV2LT5hdHRycDsKKworICAvKiBJbml0aWFsaXplIHRoZSBsaXN0LiAgV2UgY3JlYXRlIG9uZSBiZWNhdXNlIHdlIGRvbid0IGtub3cgeWV0IGhvdworICAgICBtYW55IGF0dHJpYnV0ZXMgdGhlcmUgd2lsbCBiZS4gICovCisgIGFsaXN0ID0gTlVMTDsKKyAgbmF0dHIgPSAwOworCisgIC8qIEdvIG92ZXIgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIER3YXJmX1dvcmQgYXR0cl9uYW1lOworICAgICAgRHdhcmZfV29yZCBhdHRyX2Zvcm07CisgICAgICBEd2FyZl9BdHRyaWJ1dGUgbmV3X2F0dHI7CisgICAgICBzdHJ1Y3QgYXR0cmxpc3QgKm5ld19hbGlzdDsKKworICAgICAgLyogQXJlIHdlIHN0aWxsIGluIGJvdW5kcz8gICovCisgICAgICBpZiAodW5saWtlbHkgKGF0dHJwCisJCSAgICA+PSAoKER3YXJmX1NtYWxsICopIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2FiYnJldl0uYWRkcgorCQkJKyBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19hYmJyZXZdLnNpemUpKSkKKwl7CisJICB3aGlsZSAoYWxpc3QgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZyZWUgKGFsaXN0LT5hdHRyKTsKKwkgICAgICBhbGlzdCA9IGFsaXN0LT5uZXh0OworCSAgICB9CisKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICByZXR1cm4gRFdfRExWX0VSUk9SOworCX0KKworICAgICAgLyogR2V0IGF0dHJpYnV0ZSBuYW1lIGFuZCBmb3JtLgorCisJIFhYWCBXZSBkb24ndCBjaGVjayB3aGV0aGVyIHRoaXMgcmVhZHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlCisJIHNlY3Rpb24uICAqLworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfbmFtZSwgYXR0cnApOworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfZm9ybSwgYXR0cnApOworCisgICAgICAvKiBXZSBjYW4gc3RvcCBpZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIHdpdGggdmFsdWUgemVyby4gICovCisgICAgICBpZiAoYXR0cl9uYW1lID09IDAgJiYgYXR0cl9mb3JtID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIEFsbG9jYXRlIHRoZSBhdHRyaWJ1dGUgZGF0YSBzdHJ1Y3R1cmUuICAqLworICAgICAgbmV3X2F0dHIgPSAoRHdhcmZfQXR0cmlidXRlKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IER3YXJmX0F0dHJpYnV0ZV9zKSk7CisgICAgICBpZiAobmV3X2F0dHIgPT0gTlVMTCkKKwl7CisJICB3aGlsZSAoYWxpc3QgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZyZWUgKGFsaXN0LT5hdHRyKTsKKwkgICAgICBhbGlzdCA9IGFsaXN0LT5uZXh0OworCSAgICB9CisKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwl9CisKKyAgICAgIC8qIEZpbGwgaW4gdGhlIHZhbHVlcy4gICovCisgICAgICBuZXdfYXR0ci0+Y29kZSA9IGF0dHJfbmFtZTsKKyAgICAgIG5ld19hdHRyLT5mb3JtID0gYXR0cl9mb3JtOworICAgICAgbmV3X2F0dHItPnZhbHAgPSBkaWVfYWRkcjsKKyAgICAgIG5ld19hdHRyLT5jdSA9IGRpZS0+Y3U7CisKKyAgICAgIC8qIEVucXVldWUuICAqLworICAgICAgbmV3X2FsaXN0ID0gKHN0cnVjdCBhdHRybGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IGF0dHJsaXN0KSk7CisgICAgICBuZXdfYWxpc3QtPmF0dHIgPSBuZXdfYXR0cjsKKyAgICAgIG5ld19hbGlzdC0+bmV4dCA9IGFsaXN0OworICAgICAgYWxpc3QgPSBuZXdfYWxpc3Q7CisgICAgICArK25hdHRyOworCisgICAgICAvKiBTa2lwIG92ZXIgdGhlIHJlc3Qgb2YgdGhpcyBhdHRyaWJ1dGUgKGlmIHRoZXJlIGlzIGFueSkuICAqLworICAgICAgaWYgKGF0dHJfZm9ybSAhPSAwKQorCXsKKwkgIHNpemVfdCBsZW47CisKKwkgIGlmICh1bmxpa2VseSAoX19saWJkd2FyZl9mb3JtX3ZhbF9sZW4gKGRiZywgZGllLT5jdSwgYXR0cl9mb3JtLAorCQkJCQkJIGRpZV9hZGRyLCAmbGVuLCBlcnJvcikKKwkJCSE9IERXX0RMVl9PSykpCisJICAgIHsKKwkgICAgICB3aGlsZSAoYWxpc3QgIT0gTlVMTCkKKwkJeworCQkgIGZyZWUgKGFsaXN0LT5hdHRyKTsKKwkJICBhbGlzdCA9IGFsaXN0LT5uZXh0OworCQl9CisKKwkgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCSAgICB9CisKKwkgIGRpZV9hZGRyICs9IGxlbjsKKwl9CisgICAgfQorCisgIGlmIChuYXR0ciA9PSAwKQorICAgIHsKKyAgICAgICphdHRyY291bnQgPSAwOworICAgICAgKmF0dHJidWYgPSBOVUxMOworICAgICAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUgdGhlIGFycmF5IGZvciB0aGUgcmVzdWx0LiAgKi8KKyAgcmVzdWx0ID0gKER3YXJmX0F0dHJpYnV0ZSAqKSBtYWxsb2MgKG5hdHRyICogc2l6ZW9mIChEd2FyZl9BdHRyaWJ1dGUpKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHdoaWxlIChhbGlzdCAhPSBOVUxMKQorCXsKKwkgIGZyZWUgKGFsaXN0LT5hdHRyKTsKKwkgIGFsaXN0ID0gYWxpc3QtPm5leHQ7CisJfQorCisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIC8qIFN0b3JlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBhbmQgdGhlIHJlc3VsdCBwb2ludGVyLiAgKi8KKyAgKmF0dHJjb3VudCA9IG5hdHRyOworICAqYXR0cmJ1ZiA9IHJlc3VsdDsKKworICAvKiBQdXQgdGhlIGF0dHJpYnV0ZSBlbnRyaWVzIGluIHRoZSBhcnJheSAoaW4gdGhlIHJpZ2h0IG9yZGVyKS4gICovCisgIGRvCisgICAgeworICAgICAgcmVzdWx0Wy0tbmF0dHJdID0gYWxpc3QtPmF0dHI7CisgICAgICBhbGlzdCA9IGFsaXN0LT5uZXh0OworICAgIH0KKyAgd2hpbGUgKG5hdHRyID4gMCk7CisKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2JpdG9mZnNldC5jIGIvbGliZHdhcmYvZHdhcmZfYml0b2Zmc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjOTE2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2JpdG9mZnNldC5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIFJldHVybiBiaXQgb2Zmc2V0IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBkaWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9iaXRvZmZzZXQgKGRpZSwgcmV0dXJuX3NpemUsIGVycm9yKQorICAgICBEd2FyZl9EaWUgZGllOworICAgICBEd2FyZl9VbnNpZ25lZCAqcmV0dXJuX3NpemU7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgcmV0dXJuIF9fbGliZHdhcmZfZ2V0Y29uc3RhbnQgKGRpZSwgRFdfQVRfYml0X29mZnNldCwgcmV0dXJuX3NpemUsIGVycm9yKTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2JpdHNpemUuYyBiL2xpYmR3YXJmL2R3YXJmX2JpdHNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDc5NzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfYml0c2l6ZS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIFJldHVybiBiaXQgc2l6ZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggZGllLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfYml0c2l6ZSAoZGllLCByZXR1cm5fc2l6ZSwgZXJyb3IpCisgICAgIER3YXJmX0RpZSBkaWU7CisgICAgIER3YXJmX1Vuc2lnbmVkICpyZXR1cm5fc2l6ZTsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICByZXR1cm4gX19saWJkd2FyZl9nZXRjb25zdGFudCAoZGllLCBEV19BVF9iaXRfc2l6ZSwgcmV0dXJuX3NpemUsIGVycm9yKTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2J5dGVzaXplLmMgYi9saWJkd2FyZi9kd2FyZl9ieXRlc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDcyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9ieXRlc2l6ZS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIFJldHVybiBieXRlIHNpemUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGRpZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2J5dGVzaXplIChkaWUsIHJldHVybl9zaXplLCBlcnJvcikKKyAgICAgRHdhcmZfRGllIGRpZTsKKyAgICAgRHdhcmZfVW5zaWduZWQgKnJldHVybl9zaXplOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIHJldHVybiBfX2xpYmR3YXJmX2dldGNvbnN0YW50IChkaWUsIERXX0FUX2J5dGVfc2l6ZSwgcmV0dXJuX3NpemUsIGVycm9yKTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2NoaWxkLmMgYi9saWJkd2FyZi9kd2FyZl9jaGlsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWM4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9jaGlsZC5jCkBAIC0wLDAgKzEsMTIzIEBACisvKiBSZXR1cm4gY2hpbGQgb2YgZGllLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2NoaWxkIChkaWUsIHJldHVybl9raWQsIGVycm9yKQorICAgICBEd2FyZl9EaWUgZGllOworICAgICBEd2FyZl9EaWUgKnJldHVybl9raWQ7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfRGVidWcgZGJnID0gZGllLT5jdS0+ZGJnOworICBEd2FyZl9BYmJyZXYgYWJicmV2OworICBEd2FyZl9TbWFsbCAqYXR0cnA7CisgIER3YXJmX1NtYWxsICpkaWVfYWRkcjsKKyAgRHdhcmZfV29yZCB1MTI4OworICBEd2FyZl9EaWUgbmV3X2RpZTsKKworICBpZiAoISBkaWUtPmFiYnJldi0+aGFzX2NoaWxkcmVuKQorICAgIHJldHVybiBEV19ETFZfTk9fRU5UUlk7CisKKyAgLyogQWRkcmVzcyBvZiB0aGUgZ2l2ZW4gZGllLiAgKi8KKyAgZGllX2FkZHIgPSBkaWUtPmFkZHI7CisKKyAgLyogR2V0IGFiYnJldiBjb2RlLiAgKi8KKyAgZ2V0X3VsZWIxMjggKHUxMjgsIGRpZV9hZGRyKTsKKyAgLyogIEFuZCBnZXQgdGhlIGFiYnJldmlhdGlvbiBpdHNlbGYuICAqLworICBhYmJyZXYgPSBfX2xpYmR3YXJmX2dldF9hYmJyZXYgKGRiZywgZGllLT5jdSwgdTEyOCwgZXJyb3IpOworICBpZiAoYWJicmV2ID09IE5VTEwpCisgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIHN0YXJ0LiAgKi8KKyAgYXR0cnAgPSBhYmJyZXYtPmF0dHJwOworCisgIC8qIFNraXAgb3ZlciB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZ2l2ZW4gZGllLiAgKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgRHdhcmZfV29yZCBhdHRyX25hbWU7CisgICAgICBEd2FyZl9Xb3JkIGF0dHJfZm9ybTsKKworICAgICAgLyogQXJlIHdlIHN0aWxsIGluIGJvdW5kcz8gICovCisgICAgICBpZiAodW5saWtlbHkgKGF0dHJwCisJCSAgICA+PSAoKER3YXJmX1NtYWxsICopZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfYWJicmV2XS5hZGRyCisJCQkrIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2FiYnJldl0uc2l6ZSkpKQorCXsKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICByZXR1cm4gRFdfRExWX0VSUk9SOworCX0KKworICAgICAgLyogR2V0IGF0dHJpYnV0ZSBuYW1lIGFuZCBmb3JtLgorCisJIFhYWCBXZSBkb24ndCBjaGVjayB3aGV0aGVyIHRoaXMgcmVhZHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlCisJIHNlY3Rpb24uICAqLworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfbmFtZSwgYXR0cnApOworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfZm9ybSwgYXR0cnApOworCisgICAgICAvKiBXZSBjYW4gc3RvcCBpZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIHdpdGggdmFsdWUgemVyby4gICovCisgICAgICBpZiAoYXR0cl9uYW1lID09IDAgJiYgYXR0cl9mb3JtID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIFNraXAgb3ZlciB0aGUgcmVzdCBvZiB0aGlzIGF0dHJpYnV0ZSAoaWYgdGhlcmUgaXMgYW55KS4gICovCisgICAgICBpZiAoYXR0cl9mb3JtICE9IDApCisJeworCSAgc2l6ZV90IGxlbjsKKworCSAgaWYgKHVubGlrZWx5IChfX2xpYmR3YXJmX2Zvcm1fdmFsX2xlbiAoZGJnLCBkaWUtPmN1LCBhdHRyX2Zvcm0sCisJCQkJCQkgZGllX2FkZHIsICZsZW4sIGVycm9yKQorCQkJIT0gRFdfRExWX09LKSkKKwkgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworCSAgZGllX2FkZHIgKz0gbGVuOworCX0KKyAgICB9CisKKyAgLyogQWxsb2NhdGUgdGhlIGRpZSBzdHJ1Y3R1cmUgZm9yIHRoZSByZXN1bHQuICAqLworICBuZXdfZGllID0gKER3YXJmX0RpZSkgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBEd2FyZl9EaWVfcykpOworICBpZiAobmV3X2RpZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisjaWZkZWYgRFdBUkZfREVCVUcKKyAgbmV3X2RpZS0+bWVtdGFnID0gRFdfRExBX0RJRTsKKyNlbmRpZgorCisgIC8qIFJlbWVtYmVyIHRoZSBhZGRyZXNzLiAgKi8KKyAgbmV3X2RpZS0+YWRkciA9IGRpZV9hZGRyOworCisgIC8qIEFuZCB0aGUgY29tcGlsZSB1bml0LiAgKi8KKyAgbmV3X2RpZS0+Y3UgPSBkaWUtPmN1OworCisgIC8qIDcuNS4yICBEZWJ1Z2dpbmcgSW5mb3JtYXRpb24gRW50cnkKKworICAgICBFYWNoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBiZWdpbnMgd2l0aCBhbiB1bnNpZ25lZCBMRUIxMjgKKyAgICAgbnVtYmVyIGNvbnRhaW5pbmcgdGhlIGFiYnJldmlhdGlvbiBjb2RlIGZvciB0aGUgZW50cnkuICAqLworICBnZXRfdWxlYjEyOCAodTEyOCwgZGllX2FkZHIpOworCisgIC8qIEZpbmQgdGhlIGFiYnJldmlhdGlvbi4gICovCisgIG5ld19kaWUtPmFiYnJldiA9IF9fbGliZHdhcmZfZ2V0X2FiYnJldiAoZGJnLCBkaWUtPmN1LCB1MTI4LCBlcnJvcik7CisgIGlmIChuZXdfZGllLT5hYmJyZXYgPT0gTlVMTCkKKyAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCisgICpyZXR1cm5fa2lkID0gbmV3X2RpZTsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2RlYWxsb2MuYyBiL2xpYmR3YXJmL2R3YXJmX2RlYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjUzMDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZGVhbGxvYy5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qIERlYWxsb2NhdGUgbWVtb3J5LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCit2b2lkCitkd2FyZl9kZWFsbG9jIChkYmcsIHNwYWNlLCBhbGxvY190eXBlKQorICAgICBEd2FyZl9EZWJ1ZyBkYmc7CisgICAgIER3YXJmX1B0ciBzcGFjZTsKKyAgICAgRHdhcmZfVW5zaWduZWQgYWxsb2NfdHlwZTsKK3sKKyAgLyogWFhYIEZvciBub3cgd2UgZG9uJ3QgZG8gYW55dGhpbmcgZmFuY3kuICAqLworICBmcmVlIChzcGFjZSk7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9kaWVfQ1Vfb2Zmc2V0LmMgYi9saWJkd2FyZi9kd2FyZl9kaWVfQ1Vfb2Zmc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4MGZkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2RpZV9DVV9vZmZzZXQuYwpAQCAtMCwwICsxLDMzIEBACisvKiBSZXR1cm4gb2Zmc2V0IG9mIGRpZSBpbiBjb21waWxlIHVuaXQgZGF0YS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfZGllX0NVX29mZnNldCAoZGllLCByZXR1cm5fb2Zmc2V0LCBlcnJvcikKKyAgICAgRHdhcmZfRGllIGRpZTsKKyAgICAgRHdhcmZfT2ZmICpyZXR1cm5fb2Zmc2V0OworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgICpyZXR1cm5fb2Zmc2V0ID0KKyAgICAoZGllLT5hZGRyCisgICAgIC0gKER3YXJmX1NtYWxsICopIGRpZS0+Y3UtPmRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2luZm9dLmFkZHIKKyAgICAgLSBkaWUtPmN1LT5vZmZzZXQpOworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZGllbmFtZS5jIGIvbGliZHdhcmYvZHdhcmZfZGllbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmNkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9kaWVuYW1lLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIFJldHVybiBzdHJpbmcgaW4gbmFtZSBhdHRyaWJ1dGUgb2YgZGllLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfZGllbmFtZSAoZGllLCByZXR1cm5fbmFtZSwgZXJyb3IpCisgICAgIER3YXJmX0RpZSBkaWU7CisgICAgIGNoYXIgKipyZXR1cm5fbmFtZTsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9EZWJ1ZyBkYmcgPSBkaWUtPmN1LT5kYmc7CisgIER3YXJmX1NtYWxsICpkaWVfYWRkcjsKKyAgRHdhcmZfV29yZCB1MTI4OworICBEd2FyZl9BYmJyZXYgYWJicmV2OworICBEd2FyZl9TbWFsbCAqYXR0cnA7CisKKyAgLyogQWRkcmVzcyBvZiB0aGUgZ2l2ZW4gZGllLiAgKi8KKyAgZGllX2FkZHIgPSBkaWUtPmFkZHI7CisKKyAgLyogR2V0IGFiYnJldiBjb2RlLiAgKi8KKyAgZ2V0X3VsZWIxMjggKHUxMjgsIGRpZV9hZGRyKTsKKyAgLyogIEFuZCBnZXQgdGhlIGFiYnJldmlhdGlvbiBpdHNlbGYuICAqLworICBhYmJyZXYgPSBfX2xpYmR3YXJmX2dldF9hYmJyZXYgKGRiZywgZGllLT5jdSwgdTEyOCwgZXJyb3IpOworICBpZiAoYWJicmV2ID09IE5VTEwpCisgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIHN0YXJ0LiAgKi8KKyAgYXR0cnAgPSBhYmJyZXYtPmF0dHJwOworCisgIC8qIFNlYXJjaCB0aGUgbmFtZSBhdHRyaWJ1dGUuICAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBEd2FyZl9Xb3JkIGF0dHJfbmFtZTsKKyAgICAgIER3YXJmX1dvcmQgYXR0cl9mb3JtOworCisgICAgICAvKiBBcmUgd2Ugc3RpbGwgaW4gYm91bmRzPyAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoYXR0cnAKKwkJICAgID49ICgoRHdhcmZfU21hbGwgKilkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19hYmJyZXZdLmFkZHIKKwkJCSsgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfYWJicmV2XS5zaXplKSkpCisJeworCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkgIHJldHVybiBEV19ETFZfRVJST1I7CisJfQorCisgICAgICAvKiBHZXQgYXR0cmlidXRlIG5hbWUgYW5kIGZvcm0uCisKKwkgWFhYIFdlIGRvbid0IGNoZWNrIHdoZXRoZXIgdGhpcyByZWFkcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKwkgc2VjdGlvbi4gICovCisgICAgICBnZXRfdWxlYjEyOCAoYXR0cl9uYW1lLCBhdHRycCk7CisgICAgICBnZXRfdWxlYjEyOCAoYXR0cl9mb3JtLCBhdHRycCk7CisKKyAgICAgIC8qIFdlIGNhbiBzdG9wIGlmIHdlIGZvdW5kIHRoZSBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSB6ZXJvLiAgKi8KKyAgICAgIGlmIChhdHRyX25hbWUgPT0gMCAmJiBhdHRyX2Zvcm0gPT0gMCkKKwlicmVhazsKKworICAgICAgLyogSXMgdGhpcyB0aGUgbmFtZSBhdHRyaWJ1dGU/ICAqLworICAgICAgaWYgKGF0dHJfbmFtZSA9PSBEV19BVF9uYW1lKQorCXsKKwkgIGNoYXIgKnN0cjsKKworCSAgLyogV2UgZm91bmQgaXQuICBEdXBsaWNhdGUgdGhlIHN0cmluZyBhbmQgcmV0dXJuLiAgVGhlcmUgYXJlCisgICAgICAgICAgICAgdHdvIHBvc3NpYmxlIGZvcm1zOiBEV19GT1JNX3N0cmluZyBhbmQgRFdfRk9STV9zdHJwLiAgKi8KKwkgIGlmIChhdHRyX2Zvcm0gPT0gRFdfRk9STV9zdHJpbmcpCisJICAgIHsKKwkgICAgICBzdHIgPSAoY2hhciAqKSBkaWVfYWRkcjsKKwkgICAgfQorCSAgZWxzZSBpZiAobGlrZWx5IChhdHRyX2Zvcm0gPT0gRFdfRk9STV9zdHJwKSkKKwkgICAgeworCSAgICAgIER3YXJmX1Vuc2lnbmVkIG9mZjsKKwkgICAgICBEd2FyZl9TaWduZWQgbGVuOworCisJICAgICAgaWYgKGRpZS0+Y3UtPm9mZnNldF9zaXplID09IDQpCisJCW9mZiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBkaWVfYWRkcik7CisJICAgICAgZWxzZQorCQlvZmYgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGllX2FkZHIpOworCisJICAgICAgLyogVGhpcyBpcyBhbiBvZmZzZXQgaW4gdGhlIC5kZWJ1Z19zdHIgc2VjdGlvbi4gIE1ha2Ugc3VyZQorCQkgaXQncyB3aXRoaW4gcmFuZ2UuICAqLworCSAgICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZ2V0X3N0ciAoZGJnLCBvZmYsICZzdHIsICZsZW4sIGVycm9yKQorCQkJICAgICE9IERXX0RMVl9PSykpCisJCXsKKwkJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgIHJldHVybiBEV19ETFZfRVJST1I7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCSAgICB9CisKKwkgIHN0ciA9IHN0cmR1cCAoc3RyKTsKKwkgIGlmIChzdHIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworCSAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisJICAgIH0KKworCSAgKnJldHVybl9uYW1lID0gc3RyOworCSAgcmV0dXJuIERXX0RMVl9PSzsKKwl9CisKKyAgICAgIC8qIFNraXAgb3ZlciB0aGUgcmVzdCBvZiB0aGlzIGF0dHJpYnV0ZSAoaWYgdGhlcmUgaXMgYW55KS4gICovCisgICAgICBpZiAoYXR0cl9mb3JtICE9IDApCisJeworCSAgc2l6ZV90IGxlbjsKKworCSAgaWYgKHVubGlrZWx5IChfX2xpYmR3YXJmX2Zvcm1fdmFsX2xlbiAoZGJnLCBkaWUtPmN1LCBhdHRyX2Zvcm0sCisJCQkJCQkgZGllX2FkZHIsICZsZW4sIGVycm9yKQorCQkJIT0gRFdfRExWX09LKSkKKwkgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworCSAgZGllX2FkZHIgKz0gbGVuOworCX0KKyAgICB9CisKKyAgLyogTm8gbmFtZSBhdHRyaWJ1dGUgcHJlc2VudC4gICovCisgIHJldHVybiBEV19ETFZfTk9fRU5UUlk7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9kaWVvZmZzZXQuYyBiL2xpYmR3YXJmL2R3YXJmX2RpZW9mZnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ODZmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9kaWVvZmZzZXQuYwpAQCAtMCwwICsxLDMxIEBACisvKiBSZXR1cm4gb2Zmc2V0IG9mIGRpZSBpbiAuZGVidWdfaW5mbyBzZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9kaWVvZmZzZXQgKGRpZSwgcmV0dXJuX29mZnNldCwgZXJyb3IpCisgICAgIER3YXJmX0RpZSBkaWU7CisgICAgIER3YXJmX09mZiAqcmV0dXJuX29mZnNldDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICAqcmV0dXJuX29mZnNldCA9CisgICAgKGRpZS0+YWRkciAtIChEd2FyZl9TbWFsbCAqKSBkaWUtPmN1LT5kYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19pbmZvXS5hZGRyKTsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2VsZl9pbml0LmMgYi9saWJkd2FyZi9kd2FyZl9lbGZfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OWQ3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9lbGZfaW5pdC5jCkBAIC0wLDAgKzEsMTk3IEBACisvKiBDcmVhdGUgZGVzY3JpcHRvciBmcm9tIEVMRiBoYW5kbGUgZm9yIHByb2Nlc3NpbmcgZmlsZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKKy8qIFNlY3Rpb24gbmFtZXMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgZHdhcmZfc2NubmFtZXNbSURYX2xhc3RdWzE3XSA9Cit7CisgIFtJRFhfZGVidWdfaW5mb10gPSAiLmRlYnVnX2luZm8iLAorICBbSURYX2RlYnVnX2FiYnJldl0gPSAiLmRlYnVnX2FiYnJldiIsCisgIFtJRFhfZGVidWdfYXJhbmdlc10gPSAiLmRlYnVnX2FyYW5nZXMiLAorICBbSURYX2RlYnVnX2xpbmVdID0gIi5kZWJ1Z19saW5lIiwKKyAgW0lEWF9kZWJ1Z19mcmFtZV0gPSAiLmRlYnVnX2ZyYW1lIiwKKyAgW0lEWF9laF9mcmFtZV0gPSAiLmVoX2ZyYW1lIiwKKyAgW0lEWF9kZWJ1Z19sb2NdID0gIi5kZWJ1Z19sb2MiLAorICBbSURYX2RlYnVnX3B1Ym5hbWVzXSA9ICIuZGVidWdfcHVibmFtZXMiLAorICBbSURYX2RlYnVnX3N0cl0gPSAiLmRlYnVnX3N0ciIsCisgIFtJRFhfZGVidWdfZnVuY25hbWVzXSA9ICIuZGVidWdfZnVuY25hbWVzIiwKKyAgW0lEWF9kZWJ1Z190eXBlbmFtZXNdID0gIi5kZWJ1Z190eXBlbmFtZXMiLAorICBbSURYX2RlYnVnX3Zhcm5hbWVzXSA9ICIuZGVidWdfdmFybmFtZXMiLAorICBbSURYX2RlYnVnX3dlYWtuYW1lc10gPSAiLmRlYnVnX3dlYWtuYW1lcyIsCisgIFtJRFhfZGVidWdfbWFjaW5mb10gPSAiLmRlYnVnX21hY2luZm8iCit9OworI2RlZmluZSBuZHdhcmZfc2NubmFtZXMgKHNpemVvZiAoZHdhcmZfc2NubmFtZXMpIC8gc2l6ZW9mIChkd2FyZl9zY25uYW1lc1swXSkpCisKKworaW50Citkd2FyZl9lbGZfaW5pdCAoZWxmLCBhY2Nlc3MsIGVycmhhbmQsIGVycmFyZywgZGJnLCBlcnJvcikKKyAgICAgRWxmICplbGY7CisgICAgIER3YXJmX1Vuc2lnbmVkIGFjY2VzczsKKyAgICAgRHdhcmZfSGFuZGxlciBlcnJoYW5kOworICAgICBEd2FyZl9QdHIgZXJyYXJnOworICAgICBEd2FyZl9EZWJ1ZyAqZGJnOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIGludCByZXN1bHQgPSBEV19ETFZfRVJST1I7CisgIER3YXJmX0RlYnVnIG5ld2RiZzsKKyAgR0VsZl9FaGRyIGVoZHJfbWVtOworICBHRWxmX0VoZHIgKmVoZHI7CisgIEVsZl9TY24gKnNjbjsKKworICAvKiBYWFggRm9yIG5vdyBub3RoaW5nIGJ1dCByZWFkLW9ubHkgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLworICBpZiAoYWNjZXNzICE9IERXX0RMQ19SRUFEKQorICAgIGFib3J0ICgpOworCisgIC8qIEdldCB0aGUgRUxGIGhlYWRlciBvZiB0aGUgZmlsZS4gIFdlIG5lZWQgdmFyaW91cyBwaWVjZXMgb2YKKyAgICAgaW5mb3JtYXRpb24gZnJvbSBpdC4gICovCisgIGVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgRHdhcmZfRGVidWdfcyB0bXBkYmc7CisKKyAgICAgIHRtcGRiZy5kYmdfZXJyaGFuZCA9IGVycmhhbmQ7CisgICAgICB0bXBkYmcuZGJnX2VycmFyZyA9IGVycmFyZzsKKworICAgICAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKKwlfX2xpYmR3YXJmX2Vycm9yICgmdG1wZGJnLCBlcnJvciwgRFdfRV9OT0VMRik7CisgICAgICBlbHNlCisJX19saWJkd2FyZl9lcnJvciAoJnRtcGRiZywgZXJyb3IsIERXX0VfR0VURUhEUl9FUlJPUik7CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgIC8qIEFsbG9jYXRlIGFuZCBmaWxsIHRoZSByZXN1bHQgZGF0YSBzdHJ1Y3R1cmUuICAqLworICBuZXdkYmcgPSAoRHdhcmZfRGVidWcpIGNhbGxvYyAoMSwgc2l6ZW9mIChzdHJ1Y3QgRHdhcmZfRGVidWdfcykpOworICBpZiAobmV3ZGJnID09IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IER3YXJmX0RlYnVnX3MgdG1wZGJnOworCisgICAgICB0bXBkYmcuZGJnX2VycmhhbmQgPSBlcnJoYW5kOworICAgICAgdG1wZGJnLmRiZ19lcnJhcmcgPSBlcnJhcmc7CisKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKCZ0bXBkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIGJlZW4gYWJsZSB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgZGVidWcgaGFuZGxlLiAgKi8KKyAgICAgIG5ld2RiZy0+ZGJnX2VycmhhbmQgPSBlcnJoYW5kOworICAgICAgbmV3ZGJnLT5kYmdfZXJyYXJnID0gZXJyYXJnOworICAgICAgbmV3ZGJnLT5lbGYgPSBlbGY7CisgICAgICBpZiAoKEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorCSAgICYmIGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJNU0IpCisJICB8fCAoQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisJICAgICAgJiYgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQikpCisJbmV3ZGJnLT5vdGhlcl9ieXRlX29yZGVyID0gMTsKKyAgICAgIG5ld2RiZy0+YWNjZXNzID0gYWNjZXNzOworI2lmZGVmIERXQVJGX0RFQlVHCisgICAgICBuZXdkYmctPm1lbXRhZyA9IERXX0RMQV9ERUJVRzsKKyNlbmRpZgorCisgICAgICAvKiBBbGwgZG9uZS4gICovCisgICAgICAqZGJnID0gbmV3ZGJnOworICAgICAgcmVzdWx0ID0gRFdfRExWX09LOworCisgICAgICAvKiBGaW5kIG91dCB3aGV0aGVyIHRoZSBmaWxlIGFjdHVhbGx5IGhhcyB0aGUgbmVjZXNzYXJ5IERXQVJGCisgICAgICAgICBzZWN0aW9ucy4gICovCisgICAgICBzY24gPSBOVUxMOworICAgICAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWxmLCBzY24pKSAhPSBOVUxMKQorCXsKKwkgIEdFbGZfU2hkciBzaGRyX21lbTsKKwkgIEdFbGZfU2hkciAqc2hkcjsKKwkgIGNvbnN0IGNoYXIgKnNjbm5hbWU7CisJICBzaXplX3QgY250OworCSAgRWxmX0RhdGEgKmRhdGE7CisKKwkgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgZGF0YS4gICovCisJICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisJICBpZiAoc2hkciA9PSBOVUxMKQorCSAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBJZiBpdCBkb2VzIHNvbWV0aGluZyBpcworCSAgICAgICB3cm9uZyBpbiB0aGUgbGliZWxmIGxpYnJhcnkuICAqLworCSAgICBhYm9ydCAoKTsKKworCSAgLyogV2UgcmVjb2duaXplIHRoZSBEV0FSRiBzZWN0aW9uIGJ5IHRoZWlyIG5hbWVzLiAgVGhpcyBpcworCSAgICAgbm90IHZlcnkgc2FmZSBhbmQgc3RhYmxlIGJ1dCB0aGUgYmVzdCB3ZSBjYW4gZG8uICAqLworCSAgc2NubmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgZWhkci0+ZV9zaHN0cm5keCwgc2hkci0+c2hfbmFtZSk7CisJICBpZiAoc2NubmFtZSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogVGhlIHNlY3Rpb24gbmFtZSBtdXN0IGJlIHZhbGlkLiAgT3RoZXJ3aXNlIGlzIHRoZSBFTEYgZmlsZQorCQkgaW52YWxpZC4gICovCisJICAgICAgX19saWJkd2FyZl9lcnJvciAobmV3ZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0VMRik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogUmVjb2duaXplIHRoZSB2YXJpb3VzIHNlY3Rpb25zLiAgTW9zdCBuYW1lcyBzdGFydCB3aXRoCisgICAgICAgICAgICAgLmRlYnVnXy4gICovCisJICBmb3IgKGNudCA9IDA7IGNudCA8IG5kd2FyZl9zY25uYW1lczsgKytjbnQpCisJICAgIGlmIChzdHJjbXAgKHNjbm5hbWUsIGR3YXJmX3Njbm5hbWVzW2NudF0pID09IDApCisJICAgICAgYnJlYWs7CisKKwkgIGlmIChjbnQgPCBuZHdhcmZfc2NubmFtZXMpCisJICAgIHsKKwkgICAgICAvKiBGb3VuZCBpdC4gIFJlbWVtYmVyIHdoZXJlIHRoZSBkYXRhIGlzLiAgKi8KKwkgICAgICBhc3NlcnQgKGNudCA8IElEWF9sYXN0KTsKKwkgICAgICBpZiAodW5saWtlbHkgKG5ld2RiZy0+c2VjdGlvbnNbY250XS5hZGRyICE9IE5VTEwpKQorCQl7CisJCSAgLyogQSBzZWN0aW9uIGFwcGVhcnMgdHdpY2UuICBUaGF0J3MgYmFkLiAgKi8KKwkJICBfX2xpYmR3YXJmX2Vycm9yIChuZXdkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gZGF0YS4gICovCisJICAgICAgZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworCSAgICAgIGlmIChkYXRhICE9IE5VTEwgJiYgZGF0YS0+ZF9zaXplICE9IDApCisJCXsKKwkJICAvKiBZZXAsIHRoZXJlIGlzIGFjdHVhbGx5IGRhdGEgYXZhaWxhYmxlLiAgKi8KKwkJICBuZXdkYmctPnNlY3Rpb25zW2NudF0uYWRkciA9IGRhdGEtPmRfYnVmOworCQkgIG5ld2RiZy0+c2VjdGlvbnNbY250XS5zaXplID0gZGF0YS0+ZF9zaXplOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChzY24gPT0gTlVMTCkKKwl7CisJICAvKiBXZSBsb29rZWQgYXQgYWxsIHRoZSBzZWN0aW9ucy4gIE5vdyBkZXRlcm1pbmUgd2hldGhlciBhbGwKKwkgICAgIHRoZSBzZWN0aW9ucyB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3ZSBuZWVkIGFyZSB0aGVyZS4KKworCSAgICAgWFhYIFdoaWNoIHNlY3Rpb25zIGFyZSBhYnNvbHV0ZWx5IG5lY2Vzc2FyeT8gIEFkZCB0ZXN0cworCSAgICAgaWYgbmVjZXNzYXJ5LiAgRm9yIG5vdyB3ZSByZXF1aXJlIG9ubHkgLmRlYnVnX2luZm8uICBIb3BlZnVsbHkKKwkgICAgIHRoaXMgaXMgY29ycmVjdC4gICovCisJICBpZiAobmV3ZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfaW5mb10uYWRkciA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX19saWJkd2FyZl9lcnJvciAobmV3ZGJnLCBlcnJvciwgRFdfRV9OT19EV0FSRik7CisJICAgICAgcmVzdWx0ID0gRFdfRExWX05PX0VOVFJZOworCSAgICB9CisJICBlbHNlCisJICAgIHJlc3VsdCA9IERXX0RMVl9PSzsKKwl9CisKKyAgICAgIGlmIChyZXN1bHQgIT0gRFdfRExWX09LKQorCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgKi8KKwlmcmVlIChuZXdkYmcpOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZXJybXNnLmMgYi9saWJkd2FyZi9kd2FyZl9lcnJtc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE5ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZXJybXNnLmMKQEAgLTAsMCArMSw2NyBAQAorLyogUmV0dXJuIGVycm9yIG1lc3NhZ2UuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCisvKiBNYXAgZXJyb3IgdmFsdWVzIHRvIHN0cmluZ3MuICAqLworLyogWFhYIFRoaXMgdGFibGUgc2hvdWxkIGF2b2lkIHN0cmluZyBwb2ludGVycy4gIEZpeGluZyBpdCBjYW4gd2FpdAorICAgdW50aWwgdGhlIGNvZGUgaXMgc3RhYmxlLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICptc2dzW10gPQoreworICBbRFdfRV9OT0VSUk9SXSA9IE5fKCJubyBlcnJvciIpLAorICBbRFdfRV9JTlZBTElEX0FDQ0VTU10gPSBOXygiaW52YWxpZCBhY2Nlc3MgbW9kZSIpLAorICBbRFdfRV9OT19SRUdGSUxFXSA9IE5fKCJubyByZWd1bGFyIGZpbGUiKSwKKyAgW0RXX0VfSU9fRVJST1JdID0gTl8oIkkvTyBlcnJvciIpLAorICBbRFdfRV9OT01FTV0gPSBOXygib3V0IG9mIG1lbW9yeSIpLAorICBbRFdfRV9OT0VMRl0gPSBOXygiZmlsZSBpcyBub3QgYW4gRUxGIGZpbGUiKSwKKyAgW0RXX0VfR0VURUhEUl9FUlJPUl0gPSBOXygiZ2V0ZWhkciBjYWxsIGZhaWxlZCIpLAorICBbRFdfRV9JTlZBTElEX0VMRl0gPSBOXygiaW52YWxpZCBFTEYgZmlsZSIpLAorICBbRFdfRV9JTlZBTElEX0RXQVJGXSA9IE5fKCJpbnZhbGlkIERXQVJGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpLAorICBbRFdfRV9OT19EV0FSRl0gPSBOXygibm8gRFdBUkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZSIpLAorICBbRFdfRV9OT19DVV0gPSBOXygibm8gY29tcGlsYXRpb24gdW5pdCIpLAorICBbRFdfRV8xU1RfTk9fQ1VdID0gTl8oImZpcnN0IGRpZSBpcyBubyBjb21waWxlIHVuaXQgZGllIiksCisgIFtEV19FX0lOVkFMSURfT0ZGU0VUXSA9IE5fKCJpbnZhbGlkIG9mZnNldCIpLAorICBbRFdfRV9JTlZBTElEX1JFRkVSRU5DRV0gPSBOXygiaW52YWxpZCByZWZlcmVuY2UgZm9ybSIpLAorICBbRFdfRV9OT19SRUZFUkVOQ0VdID0gTl8oIm5vIHJlZmVyZW5jZSBmb3JtIiksCisgIFtEV19FX05PX0FERFJdID0gTl8oIm5vIGFkZHJlc3MgZm9ybSIpLAorICBbRFdfRV9OT19GTEFHXSA9IE5fKCJubyBmbGFnIGZvcm0iKSwKKyAgW0RXX0VfTk9fQ09OU1RBTlRdID0gTl8oIm5vIGNvbnN0YW50IGZvcm0iKSwKKyAgW0RXX0VfTk9fQkxPQ0tdID0gTl8oIm5vIGJsb2NrIGZvcm0iKSwKKyAgW0RXX0VfTk9fU1RSSU5HXSA9IE5fKCJubyBzdHJpbmcgZm9ybSIpLAorICBbRFdfRV9XUk9OR19BVFRSXSA9IE5fKCJ3cm9uZyBhdHRyaWJ1dGUgY29kZSIpLAorICBbRFdfRV9OT19EQVRBXSA9IE5fKCJubyBkYXRhIGZvcm0iKSwKKyAgW0RXX0VfTk9fREVCVUdfTElORV0gPSBOXygiLmRlYnVnX2xpbmUgc2VjdGlvbiBtaXNzaW5nIiksCisgIFtEV19FX1ZFUlNJT05fRVJST1JdID0gTl8oInZlcnNpb24gbWlzbWF0Y2giKSwKKyAgW0RXX0VfSU5WQUxJRF9ESVJfSURYXSA9IE5fKCJpbnZhbGlkIGRpcmVjdG9yeSBpbmRleCIpLAorICBbRFdfRV9JTlZBTElEX0FERFJdID0gTl8oImludmFsaWQgYWRkcmVzcyIpLAorICBbRFdfRV9OT19BQkJSXSA9IE5fKCJubyB2YWxpZCBhYmJyZXZpYXRpb24iKSwKK307CisjZGVmaW5lIG5tc2dzIChzaXplb2YgKG1zZ3MpIC8gc2l6ZW9mIChtc2dzWzBdKSkKKworCitjb25zdCBjaGFyICoKK2R3YXJmX2Vycm1zZyAoRHdhcmZfRXJyb3IgZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5fKCJ1bmtub3duIGVycm9yIik7CisKKyAgaWYgKGVycm9yLT5kZV9lcnJvciA8IG5tc2dzKQorICAgIHJldHZhbCA9IG1zZ3NbZXJyb3ItPmRlX2Vycm9yXTsKKworICByZXR1cm4gXyhyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZXJybm8uYyBiL2xpYmR3YXJmL2R3YXJmX2Vycm5vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2NTllMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2Vycm5vLmMKQEAgLTAsMCArMSwyNiBAQAorLyogUmV0dXJuIGVycm9yIHZhbHVlLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworRHdhcmZfVW5zaWduZWQKK2R3YXJmX2Vycm5vIChEd2FyZl9FcnJvciBlcnJvcikKK3sKKyAgcmV0dXJuIGVycm9yLT5kZV9lcnJvcjsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2Vycm9yLmMgYi9saWJkd2FyZi9kd2FyZl9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzBjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9lcnJvci5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIEhhbmRsZSBlcnJvci4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisjaW5jbHVkZSA8c3lzdGVtLmg+CisKKwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb24KK19fbGliZHdhcmZfZXJyb3IgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfRXJyb3IgKmVycm9yLCBpbnQgZXJydmFsKQoreworICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBlcnJvciBzdHJ1Y3R1cmUgZ2l2ZW4gdG8gdGhlIHVzZXIuICAqLworICBEd2FyZl9FcnJvciBlcnJtZW0gPSAoRHdhcmZfRXJyb3IpIG1hbGxvYyAoc2l6ZW9mICgqZXJyb3IpKTsKKyAgLyogV2UgY2Fubm90IHJlcG9ydCBhbiBlcnJvciBpZiB3ZSBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5LiAgKi8KKyAgaWYgKGVycm1lbSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBlcnJtZW0tPmRlX2Vycm9yID0gZXJydmFsOworCisgIC8qIERCRyBtdXN0IG5ldmVyIGJlIE5VTEwuICAqLworICBhc3NlcnQgKGRiZyAhPSBOVUxMKTsKKworICBpZiAoZXJyb3IgIT0gTlVMTCkKKyAgICAvKiBJZiB0aGUgdXNlciBwcm92aWRlcyBhbiBFUlJPUiBwYXJhbWV0ZXIgd2UgaGF2ZSB0byB1c2UgaXQuICAqLworICAgICplcnJvciA9IGVycm1lbTsKKyAgZWxzZSBpZiAobGlrZWx5IChkYmctPmRiZ19lcnJoYW5kICE9IE5VTEwpKQorICAgIC8qIFVzZSB0aGUgaGFuZGxlciB0aGUgdXNlciBwcm92aWRlZCBpZiBwb3NzaWJsZS4gICovCisgICAgZGJnLT5kYmdfZXJyaGFuZCAoZXJyb3IsIGRiZy0+ZGJnX2VycmFyZyk7CisgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnQgKCEgImVycm9yIGFuZCBkYmctPmRiZ19lcnJoYW5kID09IE5VTEwiKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2ZpbmRfbWFjcm9fdmFsdWVfc3RhcnQuYyBiL2xpYmR3YXJmL2R3YXJmX2ZpbmRfbWFjcm9fdmFsdWVfc3RhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGFhZjcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZmluZF9tYWNyb192YWx1ZV9zdGFydC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIEZpbmQgc3RhcnQgb2YgbWFjcm8gdmFsdWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd2FyZi5oPgorCisKK2NoYXIgKgorZHdhcmZfZmluZF9tYWNyb192YWx1ZV9zdGFydCAobWFjcm9fc3RyaW5nKQorICAgICBjaGFyICptYWNyb19zdHJpbmc7Cit7CisgIGludCB3aXRoX3BhcmVuID0gMDsKKworICB3aGlsZSAoKm1hY3JvX3N0cmluZyAhPSAnXDAnKQorICAgIHsKKyAgICAgIGlmICgqbWFjcm9fc3RyaW5nID09ICcoJykKKwl3aXRoX3BhcmVuID0gMTsKKyAgICAgIGVsc2UgaWYgKCptYWNyb19zdHJpbmcgPT0gJyknKQorCS8qIEFmdGVyIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzIHRoZXJlIG11c3QgYmUgYSBzcGFjZS4gICovCisJcmV0dXJuIG1hY3JvX3N0cmluZyArIDI7CisgICAgICBlbHNlIGlmICgqbWFjcm9fc3RyaW5nID09ICcgJyAmJiAhIHdpdGhfcGFyZW4pCisJLyogTm90IGEgZnVuY3Rpb24gbGlrZSBtYWNybyBhbmQgd2UgZm91bmQgdGhlIHNwYWNlIHRlcm1pbmF0aW5nCisJICAgdGhlIG5hbWUuICAqLworCXJldHVybiBtYWNyb19zdHJpbmcgKyAxOworCisgICAgICArK21hY3JvX3N0cmluZzsKKyAgICB9CisKKyAgLyogVGhlIG1hY3JvIGhhcyBubyB2YWx1ZS4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIE5VTCBieXRlLiAgKi8KKyAgcmV0dXJuIG1hY3JvX3N0cmluZzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2ZpbmlzaC5jIGIvbGliZHdhcmYvZHdhcmZfZmluaXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4OWU3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2ZpbmlzaC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgZGVidWcgaGFuZGxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2ZpbmlzaCAoZGJnLCBlcnJvcikKKyAgICAgRHdhcmZfRGVidWcgZGJnOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIGlmIChkYmcgPT0gTlVMTCkKKyAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCisjaWZkZWYgRFdBUkZfREVCVUcKKyAgaWYgKGRiZy0+bWVtdGFnICE9IERXX0RMQV9ERUJVRykKKyAgICByZXR1cm4gRFdfRExWX0VSUk9SOworI2VuZGlmCisKKyAgZnJlZSAoZGJnKTsKKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZm9ybS5jIGIvbGliZHdhcmYvZHdhcmZfZm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZGYzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9mb3JtLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIGZvcm0gaGFuZGxpbmcuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50CitpbnRlcm5hbF9mdW5jdGlvbgorX19saWJkd2FyZl9mb3JtX3ZhbF9sZW4gKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfQ1VfSW5mbyBjdSwgRHdhcmZfV29yZCBmb3JtLAorCQkJIER3YXJmX1NtYWxsICp2YWxwLCBzaXplX3QgKmxlbiwgRHdhcmZfRXJyb3IgKmVycm9yKQoreworICBEd2FyZl9TbWFsbCAqc2F2ZWQ7CisgIER3YXJmX1dvcmQgdTEyODsKKworICBzd2l0Y2ggKGZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9hZGRyOgorICAgIGNhc2UgRFdfRk9STV9zdHJwOgorICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKKyAgICAgICpsZW4gPSBjdS0+YWRkcmVzc19zaXplOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgorICAgICAgKmxlbiA9ICp2YWxwICsgMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2Jsb2NrMjoKKyAgICAgICpsZW4gPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGRiZywgdmFscCkgKyAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgorICAgICAgKmxlbiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCB2YWxwKSArIDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9ibG9jazoKKyAgICAgIHNhdmVkID0gdmFscDsKKyAgICAgIGdldF91bGViMTI4ICh1MTI4LCB2YWxwKTsKKyAgICAgICpsZW4gPSB1MTI4ICsgKHZhbHAgLSBzYXZlZCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWYxOgorICAgIGNhc2UgRFdfRk9STV9kYXRhMToKKyAgICBjYXNlIERXX0ZPUk1fZmxhZzoKKyAgICAgICpsZW4gPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTI6CisgICAgY2FzZSBEV19GT1JNX3JlZjI6CisgICAgICAqbGVuID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2RhdGE0OgorICAgIGNhc2UgRFdfRk9STV9yZWY0OgorICAgICAgKmxlbiA9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9kYXRhODoKKyAgICBjYXNlIERXX0ZPUk1fcmVmODoKKyAgICAgICpsZW4gPSA4OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fc3RyaW5nOgorICAgICAgKmxlbiA9IHN0cmxlbiAoKGNoYXIgKikgdmFscCkgKyAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fc2RhdGE6CisgICAgY2FzZSBEV19GT1JNX3VkYXRhOgorICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6CisgICAgICBzYXZlZCA9IHZhbHA7CisgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgdmFscCk7CisgICAgICAqbGVuID0gdmFscCAtIHNhdmVkOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6CisgICAgICBzYXZlZCA9IHZhbHA7CisgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgdmFscCk7CisgICAgICBpZiAoX19saWJkd2FyZl9mb3JtX3ZhbF9sZW4gKGRiZywgY3UsIHUxMjgsIHZhbHAsIGxlbiwgZXJyb3IpCisJICAhPSBEV19ETFZfT0spCisJcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICAgICpsZW4gKz0gdmFscCAtIHNhdmVkOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9mb3JtYWRkci5jIGIvbGliZHdhcmYvZHdhcmZfZm9ybWFkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDg1MDhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZm9ybWFkZHIuYwpAQCAtMCwwICsxLDQyIEBACisvKiBSZXR1cm4gYWRkcmVzcyByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9mb3JtYWRkciAoYXR0ciwgcmV0dXJuX2FkZHIsIGVycm9yKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKyAgICAgRHdhcmZfQWRkciAqcmV0dXJuX2FkZHI7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgaWYgKHVubGlrZWx5IChhdHRyLT5mb3JtICE9IERXX0ZPUk1fYWRkcikpCisgICAgeworICAgICAgX19saWJkd2FyZl9lcnJvciAoYXR0ci0+Y3UtPmRiZywgZXJyb3IsIERXX0VfTk9fQUREUik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICBpZiAoYXR0ci0+Y3UtPmFkZHJlc3Nfc2l6ZSA9PSA0KQorICAgICpyZXR1cm5fYWRkciA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCk7CisgIGVsc2UKKyAgICAqcmV0dXJuX2FkZHIgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworCisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9mb3JtYmxvY2suYyBiL2xpYmR3YXJmL2R3YXJmX2Zvcm1ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjA2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9mb3JtYmxvY2suYwpAQCAtMCwwICsxLDc2IEBACisvKiBSZXR1cm4gYmxvY2sgb2YgdW5pbnRlcnByZXRlZCBkYXRhIHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2Zvcm1ibG9jayAoYXR0ciwgcmV0dXJuX2Jsb2NrLCBlcnJvcikKKyAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgIER3YXJmX0Jsb2NrICoqcmV0dXJuX2Jsb2NrOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIER3YXJmX1NtYWxsICphdHRycCA9IGF0dHItPnZhbHA7CisgIER3YXJmX1Vuc2lnbmVkIGxlbjsKKyAgRHdhcmZfUHRyICpkYXRhOworICBEd2FyZl9CbG9jayAqcmVzdWx0OworCisgIHN3aXRjaCAoYXR0ci0+Zm9ybSkKKyAgICB7CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKKyAgICAgIGxlbiA9ICphdHRycDsKKyAgICAgIGRhdGEgPSAoRHdhcmZfUHRyKSAoYXR0cnAgKyAxKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2Jsb2NrMjoKKyAgICAgIGxlbiA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0cnApOworICAgICAgZGF0YSA9IChEd2FyZl9QdHIpIChhdHRycCArIDIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgorICAgICAgbGVuID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRycCk7CisgICAgICBkYXRhID0gKER3YXJmX1B0cikgKGF0dHJwICsgMik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9ibG9jazoKKyAgICAgIGdldF91bGViMTI4IChsZW4sIGF0dHJwKTsKKyAgICAgIGRhdGEgPSAoRHdhcmZfUHRyKSBhdHRycDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGF0dHItPmN1LT5kYmcsIGVycm9yLCBEV19FX05PX0JMT0NLKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHJlc3VsdC4gICovCisgIHJlc3VsdCA9IChEd2FyZl9CbG9jayAqKSBtYWxsb2MgKHNpemVvZiAoRHdhcmZfQmxvY2spKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGF0dHItPmN1LT5kYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIHJlc3VsdC0+YmxfbGVuID0gbGVuOworICByZXN1bHQtPmJsX2RhdGEgPSBkYXRhOworCisgICpyZXR1cm5fYmxvY2sgPSByZXN1bHQ7CisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9mb3JtZmxhZy5jIGIvbGliZHdhcmYvZHdhcmZfZm9ybWZsYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE5OGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZm9ybWZsYWcuYwpAQCAtMCwwICsxLDM5IEBACisvKiBSZXR1cm4gZmxhZyByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9mb3JtZmxhZyAoYXR0ciwgcmV0dXJuX2Jvb2wsIGVycm9yKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKyAgICAgRHdhcmZfQm9vbCAqcmV0dXJuX2Jvb2w7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgaWYgKHVubGlrZWx5IChhdHRyLT5mb3JtICE9IERXX0ZPUk1fZmxhZykpCisgICAgeworICAgICAgX19saWJkd2FyZl9lcnJvciAoYXR0ci0+Y3UtPmRiZywgZXJyb3IsIERXX0VfTk9fRkxBRyk7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAqcmV0dXJuX2Jvb2wgPSBhdHRyLT52YWxwICE9IDA7CisKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2Zvcm1yZWYuYyBiL2xpYmR3YXJmL2R3YXJmX2Zvcm1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWUzNTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZm9ybXJlZi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIFJldHVybiBjb21waWxlLXVuaXQgcmVsYXRpdmUgb2Zmc2V0IG9mIHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggZm9ybS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2Zvcm1yZWYgKGF0dHIsIHJldHVybl9vZmZzZXQsIGVycm9yKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKyAgICAgRHdhcmZfT2ZmICpyZXR1cm5fb2Zmc2V0OworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIHN3aXRjaCAoYXR0ci0+Zm9ybSkKKyAgICB7CisgICAgY2FzZSBEV19GT1JNX3JlZjE6CisgICAgICAqcmV0dXJuX29mZnNldCA9ICphdHRyLT52YWxwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fcmVmMjoKKyAgICAgICpyZXR1cm5fb2Zmc2V0ID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3JlZjQ6CisgICAgICAqcmV0dXJuX29mZnNldCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWY4OgorICAgICAgKnJldHVybl9vZmZzZXQgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgorICAgICAgeworCUR3YXJmX09mZiBvZmY7CisJRHdhcmZfU21hbGwgKmF0dHJwID0gYXR0ci0+dmFscDsKKwlnZXRfdWxlYjEyOCAob2ZmLCBhdHRycCk7CisJKnJldHVybl9vZmZzZXQgPSBvZmY7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGF0dHItPmN1LT5kYmcsIGVycm9yLCBEV19FX0lOVkFMSURfUkVGRVJFTkNFKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisKKyAgICBkZWZhdWx0OgorICAgICAgX19saWJkd2FyZl9lcnJvciAoYXR0ci0+Y3UtPmRiZywgZXJyb3IsIERXX0VfTk9fUkVGRVJFTkNFKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9mb3Jtc2RhdGEuYyBiL2xpYmR3YXJmL2R3YXJmX2Zvcm1zZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMjRlNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9mb3Jtc2RhdGEuYwpAQCAtMCwwICsxLDcyIEBACisvKiBSZXR1cm4gc2lnbmVkIGNvbnN0YW50IHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2Zvcm1zZGF0YSAoYXR0ciwgcmV0dXJuX3N2YWwsIGVycm9yKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKyAgICAgRHdhcmZfU2lnbmVkICpyZXR1cm5fc3ZhbDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9TaWduZWQgdTEyODsKKworICBzd2l0Y2ggKGF0dHItPmZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9kYXRhMToKKyAgICAgICpyZXR1cm5fc3ZhbCA9ICphdHRyLT52YWxwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTI6CisgICAgICAqcmV0dXJuX3N2YWwgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6CisgICAgICAqcmV0dXJuX3N2YWwgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTg6CisgICAgICAqcmV0dXJuX3N2YWwgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fc2RhdGE6CisgICAgICB7CisJRHdhcmZfU21hbGwgKmF0dHJwID0gYXR0ci0+dmFscDsKKwlnZXRfc2xlYjEyOCAodTEyOCwgYXR0cnApOworCSpyZXR1cm5fc3ZhbCA9IHUxMjg7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV91ZGF0YToKKyAgICAgIHsKKwlEd2FyZl9TbWFsbCAqYXR0cnAgPSBhdHRyLT52YWxwOworCWdldF91bGViMTI4ICh1MTI4LCBhdHRycCk7CisJKnJldHVybl9zdmFsID0gdTEyODsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGF0dHItPmN1LT5kYmcsIGVycm9yLCBEV19FX05PX0NPTlNUQU5UKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9mb3Jtc3RyaW5nLmMgYi9saWJkd2FyZi9kd2FyZl9mb3Jtc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1YTk0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2Zvcm1zdHJpbmcuYwpAQCAtMCwwICsxLDUxIEBACisvKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2Zvcm1zdHJpbmcgKGF0dHIsIHJldHVybl9zdHJpbmcsIGVycm9yKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKyAgICAgY2hhciAqKnJldHVybl9zdHJpbmc7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgY2hhciAqcmVzdWx0OworCisgIGlmIChhdHRyLT5mb3JtID09IERXX0ZPUk1fc3RyaW5nKQorICAgIHJlc3VsdCA9IChjaGFyICopIGF0dHItPnZhbHA7CisgIGVsc2UgaWYgKGxpa2VseSAoYXR0ci0+Zm9ybSA9PSBEV19GT1JNX3N0cnApKQorICAgIHsKKyAgICAgIER3YXJmX1Vuc2lnbmVkIG9mZnNldDsKKworICAgICAgb2Zmc2V0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKKworICAgICAgcmVzdWx0ID0gKGNoYXIgKikgYXR0ci0+Y3UtPmRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX3N0cl0uYWRkciArIG9mZnNldDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChhdHRyLT5jdS0+ZGJnLCBlcnJvciwgRFdfRV9OT19TVFJJTkcpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgKnJldHVybl9zdHJpbmcgPSByZXN1bHQ7CisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9mb3JtdWRhdGEuYyBiL2xpYmR3YXJmL2R3YXJmX2Zvcm11ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZTEzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9mb3JtdWRhdGEuYwpAQCAtMCwwICsxLDcyIEBACisvKiBSZXR1cm4gdW5zaWduZWQgY29uc3RhbnQgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfZm9ybXVkYXRhIChhdHRyLCByZXR1cm5fdXZhbCwgZXJyb3IpCisgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOworICAgICBEd2FyZl9VbnNpZ25lZCAqcmV0dXJuX3V2YWw7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfVW5zaWduZWQgdTEyODsKKworICBzd2l0Y2ggKGF0dHItPmZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9kYXRhMToKKyAgICAgICpyZXR1cm5fdXZhbCA9ICphdHRyLT52YWxwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTI6CisgICAgICAqcmV0dXJuX3V2YWwgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6CisgICAgICAqcmV0dXJuX3V2YWwgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTg6CisgICAgICAqcmV0dXJuX3V2YWwgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fc2RhdGE6CisgICAgICB7CisJRHdhcmZfU21hbGwgKmF0dHJwID0gYXR0ci0+dmFscDsKKwlnZXRfc2xlYjEyOCAodTEyOCwgYXR0cnApOworCSpyZXR1cm5fdXZhbCA9IHUxMjg7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV91ZGF0YToKKyAgICAgIHsKKwlEd2FyZl9TbWFsbCAqYXR0cnAgPSBhdHRyLT52YWxwOworCWdldF91bGViMTI4ICh1MTI4LCBhdHRycCk7CisJKnJldHVybl91dmFsID0gdTEyODsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGF0dHItPmN1LT5kYmcsIGVycm9yLCBEV19FX05PX0NPTlNUQU5UKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9nZXRfYWJicmV2LmMgYi9saWJkd2FyZi9kd2FyZl9nZXRfYWJicmV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5NWY5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hYmJyZXYuYwpAQCAtMCwwICsxLDExMSBAQAorLyogR2V0IGFiYnJldmlhdGlvbiByZWNvcmQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9nZXRfYWJicmV2IChkYmcsIG9mZnNldCwgcmV0dXJuX2FiYnJldiwgbGVuZ3RoLCBhdHRyX2NvdW50LCBlcnJvcikKKyAgICAgRHdhcmZfRGVidWcgZGJnOworICAgICBEd2FyZl9VbnNpZ25lZCBvZmZzZXQ7CisgICAgIER3YXJmX0FiYnJldiAqcmV0dXJuX2FiYnJldjsKKyAgICAgRHdhcmZfVW5zaWduZWQgKmxlbmd0aDsKKyAgICAgRHdhcmZfVW5zaWduZWQgKmF0dHJfY291bnQ7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfQWJicmV2IGVudDsKKyAgRHdhcmZfU21hbGwgKmFiYnJldnA7CisgIER3YXJmX1NtYWxsICpzdGFydF9hYmJyZXZwOworCisgIC8qIEFkZHJlc3MgaW4gbWVtb3J5LiAgKi8KKyAgYWJicmV2cCA9IChEd2FyZl9TbWFsbCAqKSBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19hYmJyZXZdLmFkZHIgKyBvZmZzZXQ7CisKKyAgLyogUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZC4gICovCisgIHN0YXJ0X2FiYnJldnAgPSBhYmJyZXZwOworCisgIGlmICgqYWJicmV2cCAhPSAnXDAnKQorICAgIHsKKyAgICAgIC8qIDcuNS4zIEFiYnJldmlhdGlvbnMgVGFibGVzCisKKwkgWy4uLl0gRWFjaCBkZWNsYXJhdGlvbiBiZWdpbnMgd2l0aCBhbiB1bnNpZ25lZCBMRUIxMjggbnVtYmVyCisJIHJlcHJlc2VudGluZyB0aGUgYWJicmV2aWF0aW9uIGNvZGUgaXRzZWxmLiAgWy4uLl0gIFRoZQorCSBhYmJyZXZpYXRpb24gY29kZSBpcyBmb2xsb3dlZCBieSBhbm90aGVyIHVuc2lnbmVkIExFQjEyOAorCSBudW1iZXIgdGhhdCBlbmNvZGVzIHRoZSBlbnRyeSdzIHRhZy4gIFsuLi5dCisKKwkgWy4uLl0gRm9sbG93aW5nIHRoZSB0YWcgZW5jb2RpbmcgaXMgYSAxLWJ5dGUgdmFsdWUgdGhhdAorCSBkZXRlcm1pbmVzIHdoZXRoZXIgYSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgdXNpbmcgdGhpcworCSBhYmJyZXZpYXRpb24gaGFzIGNoaWxkIGVudHJpZXMgb3Igbm90LiBbLi4uXQorCisJIFsuLi5dIEZpbmFsbHksIHRoZSBjaGlsZCBlbmNvZGluZyBpcyBmb2xsb3dlZCBieSBhIHNlcmllcyBvZgorCSBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbnMuIEVhY2ggYXR0cmlidXRlIHNwZWNpZmljYXRpb24KKwkgY29uc2lzdHMgb2YgdHdvIHBhcnRzLiBUaGUgZmlyc3QgcGFydCBpcyBhbiB1bnNpZ25lZCBMRUIxMjgKKwkgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlJ3MgbmFtZS4gVGhlIHNlY29uZCBwYXJ0IGlzCisJIGFuIHVuc2lnbmVkIExFQjEyOCBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUgcyBmb3JtLiAgKi8KKyAgICAgIER3YXJmX1dvcmQgYWJicmV2X2NvZGU7CisgICAgICBEd2FyZl9Xb3JkIGFiYnJldl90YWc7CisgICAgICBEd2FyZl9Xb3JkIGF0dHJfbmFtZTsKKyAgICAgIER3YXJmX1dvcmQgYXR0cl9mb3JtOworICAgICAgRHdhcmZfVW5zaWduZWQgYXR0cmNudDsKKworICAgICAgLyogWFhYIFdlIGhhdmUgbm8gdGVzdHMgZm9yIGNyb3NzaW5nIHRoZSBzZWN0aW9uIGJvdW5kYXJ5IGhlcmUuCisJIFdlIHNob3VsZCBjb21wYXJlIHdpdGggZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfYWJicmV2XS5zaXplLiAgKi8KKyAgICAgIGdldF91bGViMTI4IChhYmJyZXZfY29kZSwgYWJicmV2cCk7CisgICAgICBnZXRfdWxlYjEyOCAoYWJicmV2X3RhZywgYWJicmV2cCk7CisKKyAgICAgIC8qIEdldCBtZW1vcnkgZm9yIHRoZSByZXN1bHQuICAqLworICAgICAgZW50ID0gKER3YXJmX0FiYnJldikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBEd2FyZl9BYmJyZXZfcykpOworICAgICAgaWYgKGVudCA9PSBOVUxMKQorCXsKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwl9CisKKyAgICAgIGVudC0+Y29kZSA9IGFiYnJldl9jb2RlOworICAgICAgZW50LT50YWcgPSBhYmJyZXZfdGFnOworICAgICAgZW50LT5oYXNfY2hpbGRyZW4gPSAqYWJicmV2cCsrID09IERXX0NISUxEUkVOX3llczsKKyAgICAgIGVudC0+YXR0cnAgPSBhYmJyZXZwOworICAgICAgZW50LT5vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAgIC8qIFNraXAgb3ZlciBhbGwgdGhlIGF0dHJpYnV0ZXMuICAqLworICAgICAgYXR0cmNudCA9IDA7CisgICAgICBkbworCXsKKwkgIGdldF91bGViMTI4IChhdHRyX25hbWUsIGFiYnJldnApOworCSAgZ2V0X3VsZWIxMjggKGF0dHJfZm9ybSwgYWJicmV2cCk7CisJfQorICAgICAgd2hpbGUgKGF0dHJfbmFtZSAhPSAwICYmIGF0dHJfZm9ybSAhPSAwICYmICsrYXR0cmNudCk7CisKKyAgICAgIC8qIE51bWJlciBvZiBhdHRyaWJ1dGVzLiAgKi8KKyAgICAgICphdHRyX2NvdW50ID0gZW50LT5hdHRyY250ID0gYXR0cmNudDsKKworICAgICAgLyogU3RvcmUgdGhlIGFjdHVhbCBhYmJyZXZpYXRpb24gcmVjb3JkLiAgKi8KKyAgICAgICpyZXR1cm5fYWJicmV2ID0gZW50OworICAgIH0KKyAgZWxzZQorICAgIC8qIFJlYWQgb3ZlciB0aGUgTlVMIGJ5dGUuICAqLworICAgICsrYWJicmV2cDsKKworICAvKiBMZW5ndGggb2YgdGhlIGVudHJ5LiAgKi8KKyAgKmxlbmd0aCA9IGFiYnJldnAgLSBzdGFydF9hYmJyZXZwOworCisgIC8qIElmIHdlIGNvbWUgaGVyZSB3ZSBoYXZlbid0IGZvdW5kIGFueXRoaW5nLiAgKi8KKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldF9hYmJyZXZfY2hpbGRyZW5fZmxhZy5jIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2FiYnJldl9jaGlsZHJlbl9mbGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5Yzg1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hYmJyZXZfY2hpbGRyZW5fZmxhZy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIEdldCBjaGlsZHJlbiBmbGFnIG9mIGFiYnJldmlhdGlvbiByZWNvcmQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd2FyZlAuaCIKKworCitpbnQgZHdhcmZfZ2V0X2FiYnJldl9jaGlsZHJlbl9mbGFnIChhYmJyZXYsIHJldHVybl9mbGFnLCBlcnJvcikKKyAgICAgRHdhcmZfQWJicmV2IGFiYnJldjsKKyAgICAgRHdhcmZfU2lnbmVkICpyZXR1cm5fZmxhZzsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICAqcmV0dXJuX2ZsYWcgPSBhYmJyZXYtPmhhc19jaGlsZHJlbjsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldF9hYmJyZXZfY29kZS5jIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2FiYnJldl9jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlY2I0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hYmJyZXZfY29kZS5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIEdldCBjb2RlIG9mIGFiYnJldmlhdGlvbiByZWNvcmQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd2FyZlAuaCIKKworCitpbnQgZHdhcmZfZ2V0X2FiYnJldl9jb2RlIChhYmJyZXYsIHJldHVybl9jb2RlLCBlcnJvcikKKyAgICAgRHdhcmZfQWJicmV2IGFiYnJldjsKKyAgICAgRHdhcmZfVW5zaWduZWQgKnJldHVybl9jb2RlOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgICpyZXR1cm5fY29kZSA9IGFiYnJldi0+Y29kZTsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldF9hYmJyZXZfZW50cnkuYyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hYmJyZXZfZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGVjY2QwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2FiYnJldl9lbnRyeS5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEdldCBhdHRyaWJ1dGUgZnJvbSBhYmJyZXZpYXRpb24gcmVjb3JkLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfZ2V0X2FiYnJldl9lbnRyeSAoYWJicmV2LCBpZHgsIGF0dHJfbnVtLCBmb3JtLCBvZmZzZXQsIGVycm9yKQorICAgICBEd2FyZl9BYmJyZXYgYWJicmV2OworICAgICBEd2FyZl9TaWduZWQgaWR4OworICAgICBEd2FyZl9IYWxmICphdHRyX251bTsKKyAgICAgRHdhcmZfU2lnbmVkICpmb3JtOworICAgICBEd2FyZl9PZmYgKm9mZnNldDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9TbWFsbCAqYXR0cnA7CisgIER3YXJmX1NtYWxsICpzdGFydF9hdHRycDsKKyAgRHdhcmZfV29yZCBhdHRyX25hbWU7CisgIER3YXJmX1dvcmQgYXR0cl9mb3JtOworCisgIGlmIChpZHggPCAwKQorICAgIHJldHVybiBEV19ETFZfTk9fRU5UUlk7CisKKyAgLyogQWRkcmVzcyBpbiBtZW1vcnkuICAqLworICBhdHRycCA9IGFiYnJldi0+YXR0cnA7CisKKyAgLyogUmVhZCB0aGUgYXR0cmlidXRlcywgc2tpcCBvdmVyIHRoZSBvbmVzIHdlIGRvbid0IHdhbnQuICAqLworICBkbworICAgIHsKKyAgICAgIHN0YXJ0X2F0dHJwID0gYXR0cnA7CisKKyAgICAgIGdldF91bGViMTI4IChhdHRyX25hbWUsIGF0dHJwKTsKKyAgICAgIGdldF91bGViMTI4IChhdHRyX2Zvcm0sIGF0dHJwKTsKKworICAgICAgaWYgKGF0dHJfbmFtZSA9PSAwIHx8IGF0dHJfZm9ybSA9PSAwKQorCXJldHVybiBEV19ETFZfTk9fRU5UUlk7CisgICAgfQorICB3aGlsZSAoaWR4LS0gPiAwKTsKKworICAqYXR0cl9udW0gPSBhdHRyX25hbWU7CisgICpmb3JtID0gYXR0cl9mb3JtOworICAqb2Zmc2V0ID0gKHN0YXJ0X2F0dHJwIC0gYWJicmV2LT5hdHRycCkgKyBhYmJyZXYtPm9mZnNldDsKKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2V0X2FiYnJldl90YWcuYyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hYmJyZXZfdGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmOWZkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hYmJyZXZfdGFnLmMKQEAgLTAsMCArMSwyOSBAQAorLyogR2V0IHRhZyBvZiBhYmJyZXZpYXRpb24gcmVjb3JkLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliZHdhcmZQLmgiCisKKworaW50IGR3YXJmX2dldF9hYmJyZXZfdGFnIChhYmJyZXYsIHJldHVybl90YWcsIGVycm9yKQorICAgICBEd2FyZl9BYmJyZXYgYWJicmV2OworICAgICBEd2FyZl9IYWxmICpyZXR1cm5fdGFnOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgICpyZXR1cm5fdGFnID0gYWJicmV2LT50YWc7CisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9nZXRfYWRkcmVzc19zaXplLmMgYi9saWJkd2FyZi9kd2FyZl9nZXRfYWRkcmVzc19zaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1MjM0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hZGRyZXNzX3NpemUuYwpAQCAtMCwwICsxLDMwIEBACisvKiBSZXR1cm4gYWRkcmVzcyBzaXplLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9nZXRfYWRkcmVzc19zaXplIChkYmcsIGFkZHJfc2l6ZSwgZXJyb3IpCisgICAgIER3YXJmX0RlYnVnIGRiZzsKKyAgICAgRHdhcmZfSGFsZiAqYWRkcl9zaXplOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgICphZGRyX3NpemUgPSBlbGZfZ2V0aWRlbnQgKGRiZy0+ZWxmLCBOVUxMKVtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NCA/IDggOiA0OworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2V0X2FyYW5nZS5jIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2FyYW5nZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGYxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9nZXRfYXJhbmdlLmMKQEAgLTAsMCArMSw0MSBAQAorLyogRmluZCBtYXRjaGluZyByYW5nZSBmb3IgYWRkcmVzcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfZ2V0X2FyYW5nZSAoYXJhbmdlcywgYXJhbmdlX2NvdW50LCBhZGRyZXNzLCByZXR1cm5fYXJhbmdlLCBlcnJvcikKKyAgICAgRHdhcmZfQXJhbmdlICphcmFuZ2VzOworICAgICBEd2FyZl9VbnNpZ25lZCBhcmFuZ2VfY291bnQ7CisgICAgIER3YXJmX0FkZHIgYWRkcmVzczsKKyAgICAgRHdhcmZfQXJhbmdlICpyZXR1cm5fYXJhbmdlOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIER3YXJmX1Vuc2lnbmVkIGNudDsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IGFyYW5nZV9jb3VudDsgKytjbnQpCisgICAgaWYgKGFyYW5nZXNbY250XS0+YWRkcmVzcyA8PSBhZGRyZXNzCisJJiYgYWRkcmVzcyA8IGFyYW5nZXNbY250XS0+YWRkcmVzcyArIGFyYW5nZXNbY250XS0+bGVuZ3RoKQorICAgICAgeworCSpyZXR1cm5fYXJhbmdlID0gYXJhbmdlc1tjbnRdOworCXJldHVybiBEV19ETFZfT0s7CisgICAgICB9CisKKyAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldF9hcmFuZ2VfaW5mby5jIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2FyYW5nZV9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzN2UwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hcmFuZ2VfaW5mby5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIFJldHVybiBzdGFydCwgbGVuZ3RoLCBhbmQgQ1UgRElFIG9mZnNldCBvZiByYW5nZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfZ2V0X2FyYW5nZV9pbmZvIChhcmFuZ2UsIHN0YXJ0LCBsZW5ndGgsIGN1X2RpZV9vZmZzZXQsIGVycm9yKQorICAgICBEd2FyZl9BcmFuZ2UgYXJhbmdlOworICAgICBEd2FyZl9BZGRyICpzdGFydDsKKyAgICAgRHdhcmZfVW5zaWduZWQgKmxlbmd0aDsKKyAgICAgRHdhcmZfT2ZmICpjdV9kaWVfb2Zmc2V0OworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIER3YXJmX1NtYWxsICpjdV9oZWFkZXI7CisgIHVuc2lnbmVkIGludCBvZmZzZXRfc2l6ZTsKKworICAqc3RhcnQgPSBhcmFuZ2UtPmFkZHJlc3M7CisgICpsZW5ndGggPSBhcmFuZ2UtPmxlbmd0aDsKKworICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIENVIGhlYWRlci4gICovCisgIGN1X2hlYWRlciA9CisgICAgKChEd2FyZl9TbWFsbCAqKSBhcmFuZ2UtPmluZm8tPmRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2luZm9dLmFkZHIKKyAgICAgKyBhcmFuZ2UtPmluZm8tPm9mZnNldCk7CisgIGlmIChyZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IChjdV9oZWFkZXIpID09IDB4ZmZmZmZmZmYpCisgICAgb2Zmc2V0X3NpemUgPSA4OworICBlbHNlCisgICAgb2Zmc2V0X3NpemUgPSA0OworCisgICpjdV9kaWVfb2Zmc2V0ID0gYXJhbmdlLT5pbmZvLT5vZmZzZXQgKyAzICogb2Zmc2V0X3NpemUgLSA0ICsgMzsKKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2V0X2FyYW5nZXMuYyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hcmFuZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjYWJiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9hcmFuZ2VzLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qIFJldHVybiBsaXN0IGFkZHJlc3MgcmFuZ2VzLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitzdHJ1Y3QgYXJhbmdlbGlzdAoreworICBEd2FyZl9BcmFuZ2UgYXJhbmdlOworICBzdHJ1Y3QgYXJhbmdlbGlzdCAqbmV4dDsKK307CisKKworaW50Citkd2FyZl9nZXRfYXJhbmdlcyAoZGJnLCBhcmFuZ2VzLCByZXR1cm5fY291bnQsIGVycm9yKQorICAgICBEd2FyZl9EZWJ1ZyBkYmc7CisgICAgIER3YXJmX0FyYW5nZSAqKmFyYW5nZXM7CisgICAgIER3YXJmX1NpZ25lZCAqcmV0dXJuX2NvdW50OworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIER3YXJmX1NtYWxsICpyZWFkcDsKKyAgRHdhcmZfU21hbGwgKnJlYWRlbmRwOworICBzdHJ1Y3QgYXJhbmdlbGlzdCAqYXJhbmdlbGlzdCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCBuYXJhbmdlbGlzdCA9IDA7CisKKyAgaWYgKGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2FyYW5nZXNdLmFkZHIgPT0gTlVMTCkKKyAgICByZXR1cm4gRFdfRExWX05PX0VOVFJZOworCisgIHJlYWRwID0gKER3YXJmX1NtYWxsICopIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2FyYW5nZXNdLmFkZHI7CisgIHJlYWRlbmRwID0gcmVhZHAgKyBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19hcmFuZ2VzXS5zaXplOworCisgIHdoaWxlIChyZWFkcCA8IHJlYWRlbmRwKQorICAgIHsKKyAgICAgIER3YXJmX1NtYWxsICpoZHJzdGFydCA9IHJlYWRwOworICAgICAgRHdhcmZfVW5zaWduZWQgbGVuZ3RoOworICAgICAgdW5zaWduZWQgaW50IGxlbmd0aF9ieXRlczsKKyAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uOworICAgICAgRHdhcmZfVW5zaWduZWQgb2Zmc2V0OworICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3Nfc2l6ZTsKKyAgICAgIHVuc2lnbmVkIGludCBzZWdtZW50X3NpemU7CisgICAgICBEd2FyZl9BcmFuZ2VfSW5mbyBhcmFuZ2VfaW5mbzsKKworICAgICAgLyogRWFjaCBlbnRyeSBzdGFydHMgd2l0aCBhIGhlYWRlcjoKKworCSAxLiBBIDQtYnl0ZSBvciAxMi1ieXRlIGxlbmd0aCBjb250YWluaW5nIHRoZSBsZW5ndGggb2YgdGhlCisJIHNldCBvZiBlbnRyaWVzIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsIG5vdCBpbmNsdWRpbmcgdGhlCisJIGxlbmd0aCBmaWVsZCBpdHNlbGYuIFsuLi5dCisKKwkgMi4gQSAyLWJ5dGUgdmVyc2lvbiBpZGVudGlmaWVyIGNvbnRhaW5pbmcgdGhlIHZhbHVlIDIgZm9yCisJIERXQVJGIFZlcnNpb24gMi4xLgorCisJIDMuIEEgNC1ieXRlIG9yIDgtYnl0ZSBvZmZzZXQgaW50byB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gWy4uLl0KKworCSA0LiBBIDEtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgaW4gYnl0ZXMgb2YKKwkgYW4gYWRkcmVzcyAob3IgdGhlIG9mZnNldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MgZm9yIHNlZ21lbnRlZAorCSBhZGRyZXNzaW5nKSBvbiB0aGUgdGFyZ2V0IHN5c3RlbS4KKworCSA1LiBBIDEtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgaW4gYnl0ZXMgb2YKKwkgYSBzZWdtZW50IGRlc2NyaXB0b3Igb24gdGhlIHRhcmdldCBzeXN0ZW0uICAqLworICAgICAgbGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKyAgICAgIHJlYWRwICs9IDQ7CisgICAgICBsZW5ndGhfYnl0ZXMgPSA0OworICAgICAgaWYgKGxlbmd0aCA9PSAweGZmZmZmZmZmKQorCXsKKwkgIGxlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7CisJICByZWFkcCArPSA4OworCSAgbGVuZ3RoX2J5dGVzID0gODsKKwl9CisKKyAgICAgIHZlcnNpb24gPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOworICAgICAgcmVhZHAgKz0gMjsKKyAgICAgIGlmICh2ZXJzaW9uICE9IDIpCisJeworCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkgIHJldHVybiBEV19ETFZfRVJST1I7CisJfQorCisgICAgICBpZiAobGVuZ3RoX2J5dGVzID09IDQpCisJb2Zmc2V0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKyAgICAgIGVsc2UKKwlvZmZzZXQgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOworICAgICAgcmVhZHAgKz0gbGVuZ3RoX2J5dGVzOworCisgICAgICBhZGRyZXNzX3NpemUgPSAqcmVhZHArKzsKKyAgICAgIHNlZ21lbnRfc2l6ZSA9ICpyZWFkcCsrOworCisgICAgICAvKiBSb3VuZCB0aGUgYWRkcmVzcyB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiAyKmFkZHJlc3Nfc2l6ZS4gICovCisgICAgICByZWFkcCArPSAoKDIgKiBhZGRyZXNzX3NpemUgLSAoKHJlYWRwIC0gaGRyc3RhcnQpICUgKDIgKiBhZGRyZXNzX3NpemUpKSkKKwkJJSAoMiAqIGFkZHJlc3Nfc2l6ZSkpOworCisgICAgICBhcmFuZ2VfaW5mbyA9CisJKER3YXJmX0FyYW5nZV9JbmZvKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IER3YXJmX0FyYW5nZV9zKSk7CisgICAgICBpZiAoYXJhbmdlX2luZm8gPT0gTlVMTCkKKwl7CisJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKwkgIHJldHVybiBEV19ETFZfRVJST1I7CisJfQorCisgICAgICBhcmFuZ2VfaW5mby0+ZGJnID0gZGJnOworICAgICAgYXJhbmdlX2luZm8tPm9mZnNldCA9IG9mZnNldDsKKworICAgICAgd2hpbGUgKDEpCisJeworCSAgRHdhcmZfVW5zaWduZWQgcmFuZ2VfYWRkcmVzczsKKwkgIER3YXJmX1Vuc2lnbmVkIHJhbmdlX2xlbmd0aDsKKwkgIHN0cnVjdCBhcmFuZ2VsaXN0ICpuZXdfYXJhbmdlOworCisJICBpZiAoYWRkcmVzc19zaXplID09IDQpCisJICAgIHsKKwkgICAgICByYW5nZV9hZGRyZXNzID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKwkgICAgICByZWFkcCArPSA0OworCSAgICAgIHJhbmdlX2xlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7CisJICAgICAgcmVhZHAgKz0gNDsKKwkgICAgfQorCSAgZWxzZSBpZiAobGlrZWx5IChhZGRyZXNzX3NpemUgPT0gOCkpCisJICAgIHsKKwkgICAgICByYW5nZV9hZGRyZXNzID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKwkgICAgICByZWFkcCArPSA4OworCSAgICAgIHJhbmdlX2xlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7CisJICAgICAgcmVhZHAgKz0gODsKKwkgICAgfQorCSAgZWxzZQorCSAgICBhYm9ydCAoKTsKKworCSAgLyogVHdvIHplcm8gdmFsdWVzIG1hcmsgdGhlIGVuZC4gICovCisJICBpZiAocmFuZ2VfYWRkcmVzcyA9PSAwICYmIHJhbmdlX2xlbmd0aCA9PSAwKQorCSAgICBicmVhazsKKworCSAgbmV3X2FyYW5nZSA9CisJICAgIChzdHJ1Y3QgYXJhbmdlbGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IGFyYW5nZWxpc3QpKTsKKwkgIG5ld19hcmFuZ2UtPmFyYW5nZSA9CisJICAgIChEd2FyZl9BcmFuZ2UpIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgRHdhcmZfQXJhbmdlX3MpKTsKKwkgIGlmIChuZXdfYXJhbmdlLT5hcmFuZ2UgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworCSAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisJICAgIH0KKworCSAgbmV3X2FyYW5nZS0+YXJhbmdlLT5hZGRyZXNzID0gcmFuZ2VfYWRkcmVzczsKKwkgIG5ld19hcmFuZ2UtPmFyYW5nZS0+bGVuZ3RoID0gcmFuZ2VfbGVuZ3RoOworCSAgbmV3X2FyYW5nZS0+YXJhbmdlLT5pbmZvID0gYXJhbmdlX2luZm87CisKKwkgIG5ld19hcmFuZ2UtPm5leHQgPSBhcmFuZ2VsaXN0OworCSAgYXJhbmdlbGlzdCA9IG5ld19hcmFuZ2U7CisJICArK25hcmFuZ2VsaXN0OworCX0KKyAgICB9CisKKyAgaWYgKG5hcmFuZ2VsaXN0ID09IDApCisgICAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKKworICAvKiBBbGxvY2F0ZSB0aGUgYXJyYXkgZm9yIHRoZSByZXN1bHQuICAqLworICAqcmV0dXJuX2NvdW50ID0gbmFyYW5nZWxpc3Q7CisgICphcmFuZ2VzID0gKER3YXJmX0FyYW5nZSAqKSBtYWxsb2MgKG5hcmFuZ2VsaXN0CisJCQkJICAgICAgKiBzaXplb2YgKHN0cnVjdCBEd2FyZl9BcmFuZ2VfcykpOworICBpZiAoKmFyYW5nZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIHdoaWxlIChuYXJhbmdlbGlzdC0tID4gMCkKKyAgICB7CisgICAgICAoKmFyYW5nZXMpW25hcmFuZ2VsaXN0XSA9IGFyYW5nZWxpc3QtPmFyYW5nZTsKKyAgICAgIGFyYW5nZWxpc3QgPSBhcmFuZ2VsaXN0LT5uZXh0OworICAgIH0KKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2V0X2NpZV9pbmZvLmMgYi9saWJkd2FyZi9kd2FyZl9nZXRfY2llX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlkOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2NpZV9pbmZvLmMKQEAgLTAsMCArMSw1MyBAQAorLyogR2V0IGluZm9ybWF0aW9uIGFib3V0IENJRS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfZ2V0X2NpZV9pbmZvIChjaWUsIGJ5dGVzX2luX2NpZSwgdmVyc2lvbiwgYXVnbWVudGVyLAorCQkgICAgY29kZV9hbGlnbm1lbnRfZmFjdG9yLCBkYXRhX2FsaWdubWVudF9mYWN0b3IsCisJCSAgICByZXR1cm5fYWRkcmVzc19yZWdpc3RlciwgaW5pdGlhbF9pbnN0cnVjdGlvbnMsCisJCSAgICBpbml0aWFsX2luc3RydWN0aW9uc19sZW5ndGgsIGVycm9yKQorICAgICBEd2FyZl9DaWUgY2llOworICAgICBEd2FyZl9VbnNpZ25lZCAqYnl0ZXNfaW5fY2llOworICAgICBEd2FyZl9TbWFsbCAqdmVyc2lvbjsKKyAgICAgY2hhciAqKmF1Z21lbnRlcjsKKyAgICAgRHdhcmZfVW5zaWduZWQgKmNvZGVfYWxpZ25tZW50X2ZhY3RvcjsKKyAgICAgRHdhcmZfU2lnbmVkICpkYXRhX2FsaWdubWVudF9mYWN0b3I7CisgICAgIER3YXJmX0hhbGYgKnJldHVybl9hZGRyZXNzX3JlZ2lzdGVyOworICAgICBEd2FyZl9QdHIgKmluaXRpYWxfaW5zdHJ1Y3Rpb25zOworICAgICBEd2FyZl9VbnNpZ25lZCAqaW5pdGlhbF9pbnN0cnVjdGlvbnNfbGVuZ3RoOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgICpieXRlc19pbl9jaWUgPSBjaWUtPmxlbmd0aDsKKworICAqdmVyc2lvbiA9IENJRV9WRVJTSU9OOworCisgICphdWdtZW50ZXIgPSBjaWUtPmF1Z21lbnRhdGlvbjsKKworICAqY29kZV9hbGlnbm1lbnRfZmFjdG9yID0gY2llLT5jb2RlX2FsaWdubWVudF9mYWN0b3I7CisgICpkYXRhX2FsaWdubWVudF9mYWN0b3IgPSBjaWUtPmRhdGFfYWxpZ25tZW50X2ZhY3RvcjsKKworICAqcmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgPSBjaWUtPnJldHVybl9hZGRyZXNzX3JlZ2lzdGVyOworCisgICppbml0aWFsX2luc3RydWN0aW9ucyA9IGNpZS0+aW5pdGlhbF9pbnN0cnVjdGlvbnM7CisgICppbml0aWFsX2luc3RydWN0aW9uc19sZW5ndGggPSBjaWUtPmluaXRpYWxfaW5zdHJ1Y3Rpb25zX2xlbmd0aDsKKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2V0X2NpZV9vZl9mZGUuYyBiL2xpYmR3YXJmL2R3YXJmX2dldF9jaWVfb2ZfZmRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3MThlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9jaWVfb2ZfZmRlLmMKQEAgLTAsMCArMSwzMCBAQAorLyogR2V0IENJRSBvZiBGREUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2dldF9jaWVfb2ZfZmRlIChmZGUsIHJldHVybl9jaWUsIGVycm9yKQorICAgICBEd2FyZl9GZGUgZmRlOworICAgICBEd2FyZl9DaWUgKnJldHVybl9jaWU7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgKnJldHVybl9jaWUgPSBmZGUtPmNpZTsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldF9jdV9kaWVfb2Zmc2V0LmMgYi9saWJkd2FyZi9kd2FyZl9nZXRfY3VfZGllX29mZnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNThkNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9nZXRfY3VfZGllX29mZnNldC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIFJldHVybiBvZmZzZXQgb2YgY29tcGlsZSB1bml0IERJRSBjb250YWluaW5nIHRoZSByYW5nZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfZ2V0X2N1X2RpZV9vZmZzZXQgKGFyYW5nZSwgcmV0dXJuX29mZnNldCwgZXJyb3IpCisgICAgIER3YXJmX0FyYW5nZSBhcmFuZ2U7CisgICAgIER3YXJmX09mZiAqcmV0dXJuX29mZnNldDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9TbWFsbCAqY3VfaGVhZGVyOworICB1bnNpZ25lZCBpbnQgb2Zmc2V0X3NpemU7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBDVSBoZWFkZXIuICAqLworICBjdV9oZWFkZXIgPQorICAgICgoRHdhcmZfU21hbGwgKikgYXJhbmdlLT5pbmZvLT5kYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19pbmZvXS5hZGRyCisgICAgICsgYXJhbmdlLT5pbmZvLT5vZmZzZXQpOworICBpZiAocmVhZF80dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAoY3VfaGVhZGVyKSA9PSAweGZmZmZmZmZmKQorICAgIG9mZnNldF9zaXplID0gODsKKyAgZWxzZQorICAgIG9mZnNldF9zaXplID0gNDsKKworICAqcmV0dXJuX29mZnNldCA9IGFyYW5nZS0+aW5mby0+b2Zmc2V0ICsgMyAqIG9mZnNldF9zaXplIC0gNCArIDM7CisKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldF9lbGYuYyBiL2xpYmR3YXJmL2R3YXJmX2dldF9lbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzEzZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2VsZi5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIFJldHVybiBFTEYgaGFuZGxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9nZXRfZWxmX2luaXQgKGRiZywgZWxmLCBlcnJvcikKKyAgICAgRHdhcmZfRGVidWcgZGJnOworICAgICBFbGYgKiplbGY7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgaWYgKGRiZyA9PSBOVUxMKQorICAgIHJldHVybiBEV19ETFZfRVJST1I7CisKKyAgKmVsZiA9IGRiZy0+ZWxmOworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2V0X2ZkZV9hdF9wYy5jIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2ZkZV9hdF9wYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTJlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9nZXRfZmRlX2F0X3BjLmMKQEAgLTAsMCArMSw1NyBAQAorLyogRmluZCBGREUgZm9yIGdpdmVuIGFkZHJlc3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd2FyZlAuaCIKKworCitpbnQKK2R3YXJmX2dldF9mZGVfYXRfcGMgKGZkZV9kYXRhLCBwY19vZl9pbnRlcmVzdCwgcmV0dXJuZWRfZmRlLCBsb3BjLCBoaXBjLCBlcnJvcikKKyAgICAgRHdhcmZfRmRlICpmZGVfZGF0YTsKKyAgICAgRHdhcmZfQWRkciBwY19vZl9pbnRlcmVzdDsKKyAgICAgRHdhcmZfRmRlICpyZXR1cm5lZF9mZGU7CisgICAgIER3YXJmX0FkZHIgKmxvcGM7CisgICAgIER3YXJmX0FkZHIgKmhpcGM7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfRGVidWcgZGJnID0gZmRlX2RhdGFbMF0tPmNpZS0+ZGJnOworICBpbnQgbG93ID0gMDsKKyAgaW50IGhpZ2ggPSBkYmctPmZkZV9jbnQgLSAxOworCisgIC8qIFNpbmNlIHRoZSBGREVzIGFyZSBzb3J0ZWQgYnkgdGhlaXIgYWRkcmVzc2VzIGFuZCBzaW5jZSB0aGVyZSBjYW4KKyAgICAgcG90ZW50aWFsbHkgYmUgbWFueSBGREVzIHdlIGJldHRlciB1c2UgYmluYXJ5IHNlYXJjaC4gICovCisgIHdoaWxlIChsb3cgPD0gaGlnaCkKKyAgICB7CisgICAgICBpbnQgY3VyaWR4ID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICAgIER3YXJmX0ZkZSBjdXIgPSBmZGVfZGF0YVtjdXJpZHhdOworCisgICAgICBpZiAocGNfb2ZfaW50ZXJlc3QgPCBjdXItPmluaXRpYWxfbG9jYXRpb24pCisJaGlnaCA9IGN1cmlkeCAtIDE7CisgICAgICBlbHNlIGlmIChsaWtlbHkgKGN1ci0+aW5pdGlhbF9sb2NhdGlvbiArIGN1ci0+YWRkcmVzc19yYW5nZQorCQkgICAgICAgPD0gcGNfb2ZfaW50ZXJlc3QpKQorCWxvdyA9IGN1cmlkeCArIDE7CisgICAgICBlbHNlCisJeworCSAgKnJldHVybmVkX2ZkZSA9IGN1cjsKKwkgICpsb3BjID0gY3VyLT5pbml0aWFsX2xvY2F0aW9uOworCSAgKmhpcGMgPSBjdXItPmluaXRpYWxfbG9jYXRpb24gKyBjdXItPmFkZHJlc3NfcmFuZ2UgLSAxOworCSAgcmV0dXJuIERXX0RMVl9PSzsKKwl9CisgICAgfQorCisgIHJldHVybiBEV19ETFZfTk9fRU5UUlk7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9nZXRfZmRlX2luc3RyX2J5dGVzLmMgYi9saWJkd2FyZi9kd2FyZl9nZXRfZmRlX2luc3RyX2J5dGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhNTM4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9mZGVfaW5zdHJfYnl0ZXMuYwpAQCAtMCwwICsxLDMzIEBACisvKiBHZXQgZnJhbWUgY29uc3RydWN0aW9uIGluc3RydWN0aW9ucyBvZiBGREUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2dldF9mZGVfaW5zdHJfYnl0ZXMgKGZkZSwgb3V0aW5zdHJzLCBvdXRsZW4sIGVycm9yKQorICAgICBEd2FyZl9GZGUgZmRlOworICAgICBEd2FyZl9QdHIgKm91dGluc3RyczsKKyAgICAgRHdhcmZfVW5zaWduZWQgKm91dGxlbjsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICAqb3V0aW5zdHJzID0gZmRlLT5pbnN0cnVjdGlvbnM7CisgICpvdXRsZW4gPSBmZGUtPmluc3RydWN0aW9uc19sZW5ndGg7CisKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldF9mZGVfbGlzdF9laC5jIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2ZkZV9saXN0X2VoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkYTcxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9mZGVfbGlzdF9laC5jCkBAIC0wLDAgKzEsMzYzIEBACisvKiBHZXQgZnJhbWUgZGVzY3JpcHRpb25zLiAgR0NDIHZlcnNpb24gdXNpbmcgLmVoX2ZyYW1lLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitzdHJ1Y3QgY2llbGlzdAoreworICBEd2FyZl9DaWUgY2llOworICBzdHJ1Y3QgY2llbGlzdCAqbmV4dDsKK307CisKKworc3RydWN0IGZkZWxpc3QKK3sKKyAgRHdhcmZfRmRlIGZkZTsKKyAgRHdhcmZfU21hbGwgKmNpZV9pZF9wdHI7CisgIHN0cnVjdCBmZGVsaXN0ICpuZXh0OworfTsKKworCitpbnQKK2R3YXJmX2dldF9mZGVfbGlzdF9laCAoZGJnLCBjaWVfZGF0YSwgY2llX2VsZW1lbnRfY291bnQsIGZkZV9kYXRhLAorCQkgICAgICAgZmRlX2VsZW1lbnRfY291bnQsIGVycm9yKQorICAgICBEd2FyZl9EZWJ1ZyBkYmc7CisgICAgIER3YXJmX0NpZSAqKmNpZV9kYXRhOworICAgICBEd2FyZl9TaWduZWQgKmNpZV9lbGVtZW50X2NvdW50OworICAgICBEd2FyZl9GZGUgKipmZGVfZGF0YTsKKyAgICAgRHdhcmZfU2lnbmVkICpmZGVfZWxlbWVudF9jb3VudDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9TbWFsbCAqcmVhZHA7CisgIER3YXJmX1NtYWxsICpyZWFkZW5kcDsKKyAgc3RydWN0IGNpZWxpc3QgKmNpZWxpc3QgPSBOVUxMOworICBzdHJ1Y3QgY2llbGlzdCAqY29weV9jaWVsaXN0OworICB1bnNpZ25lZCBpbnQgbmNpZWxpc3QgPSAwOworICBzdHJ1Y3QgZmRlbGlzdCAqZmRlbGlzdCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCBuZmRlbGlzdCA9IDA7CisKKyAgaWYgKGRiZy0+c2VjdGlvbnNbSURYX2VoX2ZyYW1lXS5hZGRyID09IE5VTEwpCisgICAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKKworICByZWFkcCA9IChEd2FyZl9TbWFsbCAqKSBkYmctPnNlY3Rpb25zW0lEWF9laF9mcmFtZV0uYWRkcjsKKyAgcmVhZGVuZHAgPSByZWFkcCArIGRiZy0+c2VjdGlvbnNbSURYX2VoX2ZyYW1lXS5zaXplOworCisgIHdoaWxlIChyZWFkcCA8IHJlYWRlbmRwKQorICAgIHsKKyAgICAgIC8qIEVhY2ggQ0lFIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CisKKwkgMS4gQ0lFX2xlbmd0aCAoaW5pdGlhbCBsZW5ndGgpCisKKwkgQSBjb25zdGFudCB0aGF0IGdpdmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIENJRQorCSBzdHJ1Y3R1cmUsIG5vdCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCwgaXRzZWxmIFsuLi5dLgorCisJIDIuIENJRV9pZAorCisJIEEgY29uc3RhbnQgdGhhdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIENJRXMgZnJvbSBGREVzLgorCisJIDMuIHZlcnNpb24gKHVieXRlKSBbLi4uXQorCisJIDQuIGF1Z21lbnRhdGlvbiAoYXJyYXkgb2YgdWJ5dGUpCisKKwkgQSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgYXVnbWVudGF0aW9uIHRvCisJIHRoaXMgQ0lFIG9yIHRvIHRoZSBGREVzIHRoYXQgdXNlIGl0LgorCisJIDUuIGNvZGVfYWxpZ25tZW50X2ZhY3RvciAodW5zaWduZWQgTEVCMTI4KQorCisJIEEgY29uc3RhbnQgdGhhdCBpcyBmYWN0b3JlZCBvdXQgb2YgYWxsIGFkdmFuY2UgbG9jYXRpb24KKwkgaW5zdHJ1Y3Rpb25zIChzZWUgYmVsb3cpLgorCisJIDYuIGRhdGFfYWxpZ25tZW50X2ZhY3RvciAoc2lnbmVkIExFQjEyOCkKKworCSBBIGNvbnN0YW50IHRoYXQgaXMgZmFjdG9yZWQgb3V0IG9mIGFsbCBvZmZzZXQgaW5zdHJ1Y3Rpb25zCisJIFsuLi5dLgorCisJIDcuIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyICh1Ynl0ZSkKKworCSBBIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHdoaWNoIGNvbHVtbiBpbiB0aGUgcnVsZSB0YWJsZQorCSByZXByZXNlbnRzIHRoZSByZXR1cm4gYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24uCisKKwkgOC4gaW5pdGlhbF9pbnN0cnVjdGlvbnMgKGFycmF5IG9mIHVieXRlKSBbLi4uXSAqLworICAgICAgRHdhcmZfU21hbGwgKmZkZV9jaWVfc3RhcnQ7CisgICAgICBEd2FyZl9TbWFsbCAqcmVhZHN0YXJ0cDsKKyAgICAgIER3YXJmX1NtYWxsICpjaWVfaWRfcHRyOworICAgICAgRHdhcmZfVW5zaWduZWQgbGVuZ3RoOworICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3Nfc2l6ZTsKKyAgICAgIER3YXJmX1Vuc2lnbmVkIHN0YXJ0X29mZnNldDsKKyAgICAgIER3YXJmX1Vuc2lnbmVkIGNpZV9pZDsKKworICAgICAgLyogUmVtZW1iZXIgd2hlcmUgdGhpcyBlbnRyeSBzdGFydGVkLiAgKi8KKyAgICAgIGZkZV9jaWVfc3RhcnQgPSByZWFkcDsKKyAgICAgIHN0YXJ0X29mZnNldCA9IChyZWFkcAorCQkgICAgICAtIChEd2FyZl9TbWFsbCAqKSBkYmctPnNlY3Rpb25zW0lEWF9laF9mcmFtZV0uYWRkcik7CisKKyAgICAgIGxlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7CisgICAgICBhZGRyZXNzX3NpemUgPSA0OworICAgICAgcmVhZHAgKz0gNDsKKyAgICAgIGlmIChsZW5ndGggPT0gMHhmZmZmZmZmZikKKwl7CisJICBsZW5ndGggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOworCSAgcmVhZHAgKz0gODsKKwkgIGFkZHJlc3Nfc2l6ZSA9IDg7CisJfQorICAgICAgcmVhZHN0YXJ0cCA9IHJlYWRwOworCisgICAgICAvKiBSZXF1aXJlbWVudCBmcm9tIHRoZSBEV0FSRiBzcGVjaWZpY2F0aW9uLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAobGVuZ3RoICUgYWRkcmVzc19zaXplICE9IDApKQorCXsKKwkgIC8qIFhYWCBGcmVlIHJlc291cmNlcy4gICovCisJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwl9CisKKyAgICAgIC8qIE5vIG1vcmUgZW50cmllcy4gICovCisgICAgICBpZiAobGVuZ3RoID09IDApCisJYnJlYWs7CisKKyAgICAgIGNpZV9pZF9wdHIgPSByZWFkcDsKKyAgICAgIGlmIChhZGRyZXNzX3NpemUgPT0gNCkKKwl7CisJICBjaWVfaWQgPSByZWFkXzRzYnl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOworCSAgcmVhZHAgKz0gNDsKKwl9CisgICAgICBlbHNlCisJeworCSAgY2llX2lkID0gcmVhZF84c2J5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKwkgIHJlYWRwICs9IDg7CisJfQorCisgICAgICAvKiBOb3cgd2UgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gQ0lFcyBhbmQgRkRFcy4gIGdjYyB1c2VzIDAgdG8KKwkgc2lnbmFsIHRoZSByZWNvcmQgaXMgYSBDSUUuICAqLworICAgICAgaWYgKGNpZV9pZCA9PSAwKQorCXsKKwkgIGNoYXIgKmF1Z21lbnRhdGlvbjsKKwkgIER3YXJmX1Vuc2lnbmVkIGNvZGVfYWxpZ25tZW50X2ZhY3RvcjsKKwkgIER3YXJmX1NpZ25lZCBkYXRhX2FsaWdubWVudF9mYWN0b3I7CisJICBEd2FyZl9TbWFsbCAqaW5pdGlhbF9pbnN0cnVjdGlvbnM7CisJICBEd2FyZl9TbWFsbCByZXR1cm5fYWRkcmVzc19yZWdpc3RlcjsKKwkgIHN0cnVjdCBjaWVsaXN0ICpuZXdfY2llOworCisJICBpZiAodW5saWtlbHkgKCpyZWFkcCsrICE9IENJRV9WRVJTSU9OKSkKKwkgICAgeworCSAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkgICAgfQorCisJICBhdWdtZW50YXRpb24gPSAoY2hhciAqKSByZWFkcDsKKwkgIHJlYWRwICs9IHN0cmxlbiAoYXVnbWVudGF0aW9uKSArIDE7CisKKwkgIGlmIChzdHJjbXAgKGF1Z21lbnRhdGlvbiwgIiIpID09IDApCisJICAgIHsKKwkgICAgICBnZXRfdWxlYjEyOCAoY29kZV9hbGlnbm1lbnRfZmFjdG9yLCByZWFkcCk7CisJICAgICAgZ2V0X3NsZWIxMjggKGRhdGFfYWxpZ25tZW50X2ZhY3RvciwgcmVhZHApOworCSAgICAgIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyID0gKnJlYWRwKys7CisJICAgICAgaW5pdGlhbF9pbnN0cnVjdGlvbnMgPSByZWFkcDsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChhdWdtZW50YXRpb24sICJlaCIpID09IDApCisJICAgIHsKKwkgICAgICAvKiBHQ0MgZXhjZXB0aW9uIGhhbmRsaW5nLiAgSXQgaGFzIGFuIGV4dHJhIGZpZWxkIG5leHQKKwkJIHdoaWNoIGlzIHRoZSBhZGRyZXNzIG9mIGEgZXhjZXB0aW9uIHRhYmxlLiAgV2UgaWdub3JlCisJCSB0aGlzIHZhbHVlIHNpbmNlIGl0J3Mgb25seSB1c2VkIGF0IHJ1bnRpbWUgYnkgdGhlCisJCSBleGNlcHRpb24gaGFuZGxpbmcuICAqLworCSAgICAgIHJlYWRwICs9IGFkZHJlc3Nfc2l6ZTsKKworCSAgICAgIC8qIE5vdyB0aGUgc3RhbmRhcmQgZmllbGRzLiAgKi8KKwkgICAgICBnZXRfdWxlYjEyOCAoY29kZV9hbGlnbm1lbnRfZmFjdG9yLCByZWFkcCk7CisJICAgICAgZ2V0X3NsZWIxMjggKGRhdGFfYWxpZ25tZW50X2ZhY3RvciwgcmVhZHApOworCSAgICAgIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyID0gKnJlYWRwKys7CisJICAgICAgaW5pdGlhbF9pbnN0cnVjdGlvbnMgPSByZWFkcDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogV2UgZG9uJ3Qga25vdyB0aGlzIGF1Z21lbnRhdGlvbi4gIFNraXAgdGhlIHJlc3QuICBUaGUKKwkJIHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IG5vdGhpbmcgYWZ0ZXIgdGhlIGF1Z21lbnRhdGlvbgorCQkgc3RyaW5nIGlzIHVzYWJsZS4gICovCisJICAgICAgY29kZV9hbGlnbm1lbnRfZmFjdG9yID0gMDsKKwkgICAgICBkYXRhX2FsaWdubWVudF9mYWN0b3IgPSAwOworCSAgICAgIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyID0gMDsKKwkgICAgICBpbml0aWFsX2luc3RydWN0aW9ucyA9IE5VTEw7CisJICAgIH0KKworCSAgLyogR28gdG8gdGhlIG5leHQgcmVjb3JkLiAgKi8KKwkgIHJlYWRwID0gcmVhZHN0YXJ0cCArIGxlbmd0aDsKKworCSAgLyogQ3JlYXRlIHRoZSBuZXcgQ0lFIHJlY29yZC4gICovCisJICBuZXdfY2llID0gKHN0cnVjdCBjaWVsaXN0ICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgY2llbGlzdCkpOworCSAgbmV3X2NpZS0+Y2llID0gKER3YXJmX0NpZSkgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBEd2FyZl9DaWVfcykpOworCSAgaWYgKG5ld19jaWUtPmNpZSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9OT01FTSk7CisJICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkgICAgfQorCisJICBuZXdfY2llLT5jaWUtPmRiZyA9IGRiZzsKKwkgIG5ld19jaWUtPmNpZS0+bGVuZ3RoID0gbGVuZ3RoOworCSAgbmV3X2NpZS0+Y2llLT5hdWdtZW50YXRpb24gPSBhdWdtZW50YXRpb247CisJICBuZXdfY2llLT5jaWUtPmNvZGVfYWxpZ25tZW50X2ZhY3RvciA9IGNvZGVfYWxpZ25tZW50X2ZhY3RvcjsKKwkgIG5ld19jaWUtPmNpZS0+ZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gZGF0YV9hbGlnbm1lbnRfZmFjdG9yOworCSAgbmV3X2NpZS0+Y2llLT5yZXR1cm5fYWRkcmVzc19yZWdpc3RlciA9IHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyOworCSAgbmV3X2NpZS0+Y2llLT5pbml0aWFsX2luc3RydWN0aW9ucyA9IGluaXRpYWxfaW5zdHJ1Y3Rpb25zOworCSAgbmV3X2NpZS0+Y2llLT5pbml0aWFsX2luc3RydWN0aW9uc19sZW5ndGggPQorCSAgICByZWFkcCAtIGluaXRpYWxfaW5zdHJ1Y3Rpb25zOworCisJICBuZXdfY2llLT5jaWUtPm9mZnNldCA9IHN0YXJ0X29mZnNldDsKKwkgIG5ld19jaWUtPmNpZS0+aW5kZXggPSBuY2llbGlzdDsKKwkgIG5ld19jaWUtPm5leHQgPSBjaWVsaXN0OworCSAgY2llbGlzdCA9IG5ld19jaWU7CisJICArK25jaWVsaXN0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBEd2FyZl9BZGRyIGluaXRpYWxfbG9jYXRpb247CisJICBEd2FyZl9VbnNpZ25lZCBhZGRyZXNzX3JhbmdlOworCSAgRHdhcmZfU21hbGwgKmluc3RydWN0aW9uczsKKwkgIHN0cnVjdCBmZGVsaXN0ICpuZXdfZmRlOworCSAgc3RydWN0IGNpZWxpc3QgKmNpZTsKKworCSAgaWYgKGFkZHJlc3Nfc2l6ZSA9PSA0KQorCSAgICB7CisJICAgICAgaW5pdGlhbF9sb2NhdGlvbiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7CisJICAgICAgcmVhZHAgKz0gNDsKKwkgICAgICBhZGRyZXNzX3JhbmdlID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKwkgICAgICByZWFkcCArPSA0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbml0aWFsX2xvY2F0aW9uID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKwkgICAgICByZWFkcCArPSA4OworCSAgICAgIGFkZHJlc3NfcmFuZ2UgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOworCSAgICAgIHJlYWRwICs9IDg7CisJICAgIH0KKworCSAgaW5zdHJ1Y3Rpb25zID0gcmVhZHA7CisKKwkgIC8qIEdvIHRvIHRoZSBuZXh0IHJlY29yZC4gICovCisJICByZWFkcCA9IHJlYWRzdGFydHAgKyBsZW5ndGg7CisKKwkgIC8qIENyZWF0ZSB0aGUgbmV3IEZERSByZWNvcmQuICAqLworCSAgbmV3X2ZkZSA9IChzdHJ1Y3QgZmRlbGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IGZkZWxpc3QpKTsKKwkgIG5ld19mZGUtPmZkZSA9IChEd2FyZl9GZGUpIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgRHdhcmZfRmRlX3MpKTsKKwkgIGlmIChuZXdfZmRlLT5mZGUgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworCSAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisJICAgIH0KKworCSAgbmV3X2ZkZS0+ZmRlLT5pbml0aWFsX2xvY2F0aW9uID0gaW5pdGlhbF9sb2NhdGlvbjsKKwkgIG5ld19mZGUtPmZkZS0+YWRkcmVzc19yYW5nZSA9IGFkZHJlc3NfcmFuZ2U7CisJICBuZXdfZmRlLT5mZGUtPmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uczsKKwkgIG5ld19mZGUtPmZkZS0+aW5zdHJ1Y3Rpb25zX2xlbmd0aCA9IHJlYWRwIC0gaW5zdHJ1Y3Rpb25zOworCSAgbmV3X2ZkZS0+ZmRlLT5mZGVfYnl0ZXMgPSBmZGVfY2llX3N0YXJ0OworCSAgbmV3X2ZkZS0+ZmRlLT5mZGVfYnl0ZV9sZW5ndGggPSByZWFkc3RhcnRwICsgbGVuZ3RoIC0gZmRlX2NpZV9zdGFydDsKKwkgIG5ld19mZGUtPmZkZS0+Y2llID0gTlVMTDsKKwkgIG5ld19mZGUtPmNpZV9pZF9wdHIgPSBjaWVfaWRfcHRyOworCisJICBmb3IgKGNpZSA9IGNpZWxpc3Q7IGNpZSAhPSBOVUxMOyBjaWUgPSBjaWUtPm5leHQpCisJICAgIC8qIFRoaXMgdGVzdCB0YWtlcyB0aGUgbm9uLXN0YW5kYXJkIHdheSBvZiB1c2luZyB0aGUgQ0lFIElECisJICAgICAgIGluIHRoZSBHTlUgLmVoX2ZyYW1lIHNlY3RpbyBpbnRvIGFjY291bnQuICBJbnN0ZWFkIG9mIGJlaW5nCisJICAgICAgIGEgZGlyZWN0IG9mZnNldCBpbiB0aGUgc2VjdGlvbiBpdCBpcyBhIG9mZnNldCBmcm9tIHRoZQorCSAgICAgICBsb2NhdGlvbiBvZiB0aGUgRkRFJ1MgQ0lFIElEIHZhbHVlIGl0c2VsZiB0byB0aGUgQ0lFIGVudHJ5LiAgKi8KKwkgICAgaWYgKGNpZS0+Y2llLT5vZmZzZXQKKwkJPT0gKHNpemVfdCkgKGNpZV9pZF9wdHIgLSBjaWVfaWQKKwkJCSAgICAgLSAoRHdhcmZfU21hbGwgKikgZGJnLT5zZWN0aW9uc1tJRFhfZWhfZnJhbWVdLmFkZHIpKQorCSAgICAgIHsKKwkJbmV3X2ZkZS0+ZmRlLT5jaWUgPSBjaWUtPmNpZTsKKwkJYnJlYWs7CisJICAgICAgfQorCisJICBuZXdfZmRlLT5mZGUtPm9mZnNldCA9IGNpZV9pZDsKKwkgIG5ld19mZGUtPm5leHQgPSBmZGVsaXN0OworCSAgZmRlbGlzdCA9IG5ld19mZGU7CisJICArK25mZGVsaXN0OworCX0KKyAgICB9CisKKyAgLyogVGhlcmUgbXVzdCBhbHdheXMgYmUgYXQgbGVhc3Qgb25lIENJRS4gICovCisgIGlmICh1bmxpa2VseSAobmNpZWxpc3QgPT0gMCkpCisgICAgeworICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIC8qIENyZWF0ZSB0aGUgbGlzdHMuICAqLworICAqY2llX2RhdGEgPSAoRHdhcmZfQ2llICopIG1hbGxvYyAobmNpZWxpc3QgKiBzaXplb2YgKHN0cnVjdCBEd2FyZl9DaWVfcykpOworICBpZiAobmZkZWxpc3QgPiAwKQorICAgICpmZGVfZGF0YSA9IChEd2FyZl9GZGUgKikgbWFsbG9jIChuZmRlbGlzdCAqIHNpemVvZiAoc3RydWN0IER3YXJmX0ZkZV9zKSk7CisgIGVsc2UKKyAgICAqZmRlX2RhdGEgPSBOVUxMOworICBpZiAoKG5mZGVsaXN0ID4gMCAmJiAqZmRlX2RhdGEgPT0gTlVMTCkgfHwgKmNpZV9kYXRhID09IE5VTEwpCisgICAgeworICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9OT01FTSk7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAvKiBSZW1lbWJlciB0aGUgY291bnRzLiAgKi8KKyAgZGJnLT5mZGVfY250ID0gbmZkZWxpc3Q7CisgIGRiZy0+Y2llX2NudCA9IG5jaWVsaXN0OworCisgIC8qIEFkZCBhbGwgdGhlIENJRXMuICAqLworICBjb3B5X2NpZWxpc3QgPSBjaWVsaXN0OworICAqY2llX2VsZW1lbnRfY291bnQgPSBuY2llbGlzdDsKKyAgd2hpbGUgKG5jaWVsaXN0LS0gPiAwKQorICAgIHsKKyAgICAgICgqY2llX2RhdGEpW25jaWVsaXN0XSA9IGNpZWxpc3QtPmNpZTsKKyAgICAgIGNpZWxpc3QgPSBjaWVsaXN0LT5uZXh0OworICAgIH0KKworICAvKiBBZGQgYWxsIHRoZSBGREVzLiAgKi8KKyAgKmZkZV9lbGVtZW50X2NvdW50ID0gbmZkZWxpc3Q7CisgIHdoaWxlIChuZmRlbGlzdC0tID4gMCkKKyAgICB7CisgICAgICAoKmZkZV9kYXRhKVtuZmRlbGlzdF0gPSBmZGVsaXN0LT5mZGU7CisKKyAgICAgIGlmIChmZGVsaXN0LT5mZGUtPmNpZSA9PSBOVUxMKQorCXsKKwkgIC8qIFdlIGhhdmUgbm90IHlldCBmb3VuZCB0aGUgQ0lFLiAgU2VhcmNoIG5vdyB0aGF0IHdlIGtub3cKKyAgICAgICAgICAgICBhYm91dCBhbGwgb2YgdGhlbS4gICovCisJICBjaWVsaXN0ID0gY29weV9jaWVsaXN0OworCSAgZG8KKwkgICAgeworCSAgICAgIGlmIChjaWVsaXN0LT5jaWUtPm9mZnNldAorCQkgID09IChzaXplX3QpIChmZGVsaXN0LT5jaWVfaWRfcHRyIC0gZmRlbGlzdC0+ZmRlLT5vZmZzZXQKKwkJCSAgICAgICAtIChEd2FyZl9TbWFsbCAqKSBkYmctPnNlY3Rpb25zW0lEWF9laF9mcmFtZV0uYWRkcikpCisJCXsKKwkJICBmZGVsaXN0LT5mZGUtPmNpZSA9IGNpZWxpc3QtPmNpZTsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGNpZWxpc3QgPSBjaWVsaXN0LT5uZXh0OworCSAgICB9CisJICB3aGlsZSAoY2llbGlzdCAhPSBOVUxMKTsKKworCSAgaWYgKGNpZWxpc3QgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIFRoZXJlIGlzIG5vIG1hdGNoaW5nIENJRS4gIFRoaXMgaXMgYmFkLiAgKi8KKwkgICAgICAvKiBYWFggRnJlZSBldmVyeXRoaW5nLiAgKi8KKwkgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCSAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisJICAgIH0KKwl9CisKKyAgICAgIGZkZWxpc3QgPSBmZGVsaXN0LT5uZXh0OworICAgIH0KKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2V0X2ZkZV9uLmMgYi9saWJkd2FyZi9kd2FyZl9nZXRfZmRlX24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTMxZGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2ZkZV9uLmMKQEAgLTAsMCArMSwzNiBAQAorLyogR2V0IG50aCBmcmFtZSBkZXNjcmlwdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd2FyZlAuaCIKKworCitpbnQKK2R3YXJmX2dldF9mZGVfbiAoZmRlX2RhdGEsIGZkZV9pbmRleCwgcmV0dXJuZWRfZmRlLCBlcnJvcikKKyAgICAgRHdhcmZfRmRlICpmZGVfZGF0YTsKKyAgICAgRHdhcmZfVW5zaWduZWQgZmRlX2luZGV4OworICAgICBEd2FyZl9GZGUgKnJldHVybmVkX2ZkZTsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9EZWJ1ZyBkYmcgPSBmZGVfZGF0YVswXS0+Y2llLT5kYmc7CisKKyAgaWYgKGZkZV9pbmRleCA+PSBkYmctPmZkZV9jbnQpCisgICAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKKworICAqcmV0dXJuZWRfZmRlID0gZmRlX2RhdGFbZmRlX2luZGV4XTsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldF9mZGVfcmFuZ2UuYyBiL2xpYmR3YXJmL2R3YXJmX2dldF9mZGVfcmFuZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzA0OTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2ZkZV9yYW5nZS5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZnVuY3Rpb24gcmFuZ2UuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd2FyZlAuaCIKKworCitpbnQKK2R3YXJmX2dldF9mZGVfcmFuZ2UgKGZkZSwgbG93X3BjLCBmdW5jX2xlbmd0aCwgZmRlX2J5dGVzLCBmZGVfYnl0ZV9sZW5ndGgsCisJCSAgICAgY2llX29mZnNldCwgY2llX2luZGV4LCBmZGVfb2Zmc2V0LCBlcnJvcikKKyAgICAgRHdhcmZfRmRlIGZkZTsKKyAgICAgRHdhcmZfQWRkciAqbG93X3BjOworICAgICBEd2FyZl9VbnNpZ25lZCAqZnVuY19sZW5ndGg7CisgICAgIER3YXJmX1B0ciAqZmRlX2J5dGVzOworICAgICBEd2FyZl9VbnNpZ25lZCAqZmRlX2J5dGVfbGVuZ3RoOworICAgICBEd2FyZl9PZmYgKmNpZV9vZmZzZXQ7CisgICAgIER3YXJmX1NpZ25lZCAqY2llX2luZGV4OworICAgICBEd2FyZl9PZmYgKmZkZV9vZmZzZXQ7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgKmxvd19wYyA9IGZkZS0+aW5pdGlhbF9sb2NhdGlvbjsKKyAgKmZ1bmNfbGVuZ3RoID0gZmRlLT5hZGRyZXNzX3JhbmdlOworICAqZmRlX2J5dGVzID0gZmRlLT5mZGVfYnl0ZXM7CisgICpmZGVfYnl0ZV9sZW5ndGggPSBmZGUtPmZkZV9ieXRlX2xlbmd0aDsKKyAgKmNpZV9vZmZzZXQgPSBmZGUtPmNpZS0+b2Zmc2V0OworICAqY2llX2luZGV4ID0gZmRlLT5jaWUtPmluZGV4OworICAqZmRlX29mZnNldCA9IGZkZS0+b2Zmc2V0OworCisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9nZXRfZ2xvYmFscy5jIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2dsb2JhbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI0OGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZ2V0X2dsb2JhbHMuYwpAQCAtMCwwICsxLDE3NiBAQAorLyogUmV0dXJuIGxpc3Qgb2YgZ2xvYmFsIGRlZmluaXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitzdHJ1Y3QgZ2xvYmFsbGlzdAoreworICBEd2FyZl9HbG9iYWwgZ2xvYmFsOworICBzdHJ1Y3QgZ2xvYmFsbGlzdCAqbmV4dDsKK307CisKKworLyogUmVhZCB0aGUgd2hvbGUgZ2l2ZW4gc2VjdGlvbi4gICovCitpbnQKK2R3YXJmX2dldF9nbG9iYWxzIChkYmcsIGdsb2JhbHMsIHJldHVybl9jb3VudCwgZXJyb3IpCisgICAgIER3YXJmX0RlYnVnIGRiZzsKKyAgICAgRHdhcmZfR2xvYmFsICoqZ2xvYmFsczsKKyAgICAgRHdhcmZfU2lnbmVkICpyZXR1cm5fY291bnQ7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfU21hbGwgKnJlYWRwOworICBEd2FyZl9TbWFsbCAqcmVhZGVuZHA7CisgIHN0cnVjdCBnbG9iYWxsaXN0ICpnbG9iYWxsaXN0ID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IG5nbG9iYWxsaXN0ID0gMDsKKworICBpZiAoZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfcHVibmFtZXNdLmFkZHIgPT0gTlVMTCkKKyAgICByZXR1cm4gRFdfRExWX05PX0VOVFJZOworCisgIHJlYWRwID0gKER3YXJmX1NtYWxsICopIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX3B1Ym5hbWVzXS5hZGRyOworICByZWFkZW5kcCA9IHJlYWRwICsgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfcHVibmFtZXNdLnNpemU7CisKKyAgd2hpbGUgKHJlYWRwIDwgcmVhZGVuZHApCisgICAgeworICAgICAgRHdhcmZfVW5zaWduZWQgbGVuZ3RoOworICAgICAgRHdhcmZfVW5zaWduZWQgaW5mb19sZW5ndGg7CisgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2J5dGVzOworICAgICAgdW5zaWduZWQgaW50IHZlcnNpb247CisgICAgICBEd2FyZl9VbnNpZ25lZCBvZmZzZXQ7CisgICAgICBEd2FyZl9HbG9iYWxfSW5mbyBnbG9iYWxfaW5mbzsKKworICAgICAgLyogRWFjaCBlbnRyeSBzdGFydHMgd2l0aCBhIGhlYWRlcjoKKworIAkgMS4gQSA0LWJ5dGUgb3IgMTItYnl0ZSBsZW5ndGggb2YgdGhlIHNldCBvZiBlbnRyaWVzIGZvciB0aGlzCisgCSBjb21waWxhdGlvbiB1bml0LCBub3QgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmLiBbLi4uXQorCisJIDIuIEEgMi1ieXRlIHZlcnNpb24gaWRlbnRpZmllciBjb250YWluaW5nIHRoZSB2YWx1ZSAyIGZvcgorCSBEV0FSRiBWZXJzaW9uIDIuMS4KKworCSAzLiBBIDQtYnl0ZSBvciA4LWJ5dGUgb2Zmc2V0IGludG8gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uIFsuLi5dCisKKwkgNC4gQSA0LWJ5dGUgb3IgOC1ieXRlIGxlbmd0aCBjb250YWluaW5nIHRoZSBzaXplIGluIGJ5dGVzIG9mCisJIHRoZSBjb250ZW50cyBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBnZW5lcmF0ZWQgdG8KKwkgcmVwcmVzZW50IHRoaXMgY29tcGlsYXRpb24gdW5pdC4gWy4uLl0gICovCisgICAgICBsZW5ndGggPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOworICAgICAgcmVhZHAgKz0gNDsKKyAgICAgIGxlbmd0aF9ieXRlcyA9IDQ7CisgICAgICBpZiAobGVuZ3RoID09IDB4ZmZmZmZmZmYpCisJeworCSAgbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKwkgIHJlYWRwICs9IDg7CisJICBsZW5ndGhfYnl0ZXMgPSA4OworCX0KKworICAgICAgdmVyc2lvbiA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7CisgICAgICByZWFkcCArPSAyOworICAgICAgaWYgKHVubGlrZWx5ICh2ZXJzaW9uICE9IDIpKQorCXsKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICByZXR1cm4gRFdfRExWX0VSUk9SOworCX0KKworICAgICAgaWYgKGxlbmd0aF9ieXRlcyA9PSA0KQorCXsKKwkgIG9mZnNldCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7CisJICByZWFkcCArPSA0OworCSAgaW5mb19sZW5ndGggPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOworCSAgcmVhZHAgKz0gNDsKKwl9CisgICAgICBlbHNlCisJeworCSAgb2Zmc2V0ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKwkgIHJlYWRwICs9IDg7CisJICBpbmZvX2xlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7CisJICByZWFkcCArPSA4OworCX0KKworICAgICAgZ2xvYmFsX2luZm8gPQorCShEd2FyZl9HbG9iYWxfSW5mbykgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBEd2FyZl9HbG9iYWxfcykpOworICAgICAgaWYgKGdsb2JhbF9pbmZvID09IE5VTEwpCisJeworCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9OT01FTSk7CisJICByZXR1cm4gRFdfRExWX0VSUk9SOworCX0KKworICAgICAgZ2xvYmFsX2luZm8tPmRiZyA9IGRiZzsKKyAgICAgIGdsb2JhbF9pbmZvLT5vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAgIC8qIEZvbGxvd2luZyB0aGUgc2VjdGlvbiBjb250YWlucyB0dXBsZXMgb2Ygb2Zmc2V0cyBhbmQKKyAgICAgICAgIG51bC10ZXJtaW5hdGVkIHN0cmluZ3MuICAqLworICAgICAgd2hpbGUgKDEpCisJeworCSAgRHdhcmZfVW5zaWduZWQgZGllX29mZnNldDsKKwkgIHN0cnVjdCBnbG9iYWxsaXN0ICpuZXdfZ2xvYmFsOworCisJICBpZiAobGVuZ3RoX2J5dGVzID09IDQpCisJICAgIGRpZV9vZmZzZXQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOworCSAgZWxzZQorCSAgICBkaWVfb2Zmc2V0ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKKwkgIHJlYWRwICs9IGxlbmd0aF9ieXRlczsKKworCSAgaWYgKGRpZV9vZmZzZXQgPT0gMCkKKwkgICAgLyogVGhpcyBjbG9zZXMgdGhpcyBlbnRyeS4gICovCisJICAgIGJyZWFrOworCisJICBuZXdfZ2xvYmFsID0KKwkgICAgKHN0cnVjdCBnbG9iYWxsaXN0ICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgZ2xvYmFsbGlzdCkpOworCSAgbmV3X2dsb2JhbC0+Z2xvYmFsID0KKwkgICAgKER3YXJmX0dsb2JhbCkgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBEd2FyZl9HbG9iYWxfcykpOworCSAgaWYgKG5ld19nbG9iYWwtPmdsb2JhbCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9OT01FTSk7CisJICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkgICAgfQorCisJICBuZXdfZ2xvYmFsLT5nbG9iYWwtPm9mZnNldCA9IGRpZV9vZmZzZXQ7CisJICBuZXdfZ2xvYmFsLT5nbG9iYWwtPm5hbWUgPSAoY2hhciAqKSByZWFkcDsKKwkgIG5ld19nbG9iYWwtPmdsb2JhbC0+aW5mbyA9IGdsb2JhbF9pbmZvOworCisJICBuZXdfZ2xvYmFsLT5uZXh0ID0gZ2xvYmFsbGlzdDsKKwkgIGdsb2JhbGxpc3QgPSBuZXdfZ2xvYmFsOworCSAgKytuZ2xvYmFsbGlzdDsKKworCSAgcmVhZHAgPSAoRHdhcmZfU21hbGwgKikgcmF3bWVtY2hyIChyZWFkcCwgJ1wwJykgKyAxOworCX0KKyAgICB9CisKKyAgaWYgKG5nbG9iYWxsaXN0ID09IDApCisgICAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKKworICAvKiBBbGxvY2F0ZSB0aGUgYXJyYXkgZm9yIHRoZSByZXN1bHQuICAqLworICAqcmV0dXJuX2NvdW50ID0gbmdsb2JhbGxpc3Q7CisgICpnbG9iYWxzID0gKER3YXJmX0dsb2JhbCAqKSBtYWxsb2MgKG5nbG9iYWxsaXN0CisJCQkJICAgICAgKiBzaXplb2YgKHN0cnVjdCBEd2FyZl9HbG9iYWxfcykpOworICBpZiAoKmdsb2JhbHMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIHdoaWxlIChuZ2xvYmFsbGlzdC0tID4gMCkKKyAgICB7CisgICAgICAoKmdsb2JhbHMpW25nbG9iYWxsaXN0XSA9IGdsb2JhbGxpc3QtPmdsb2JhbDsKKyAgICAgIGdsb2JhbGxpc3QgPSBnbG9iYWxsaXN0LT5uZXh0OworICAgIH0KKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2V0X2xvY2xpc3RfZW50cnkuYyBiL2xpYmR3YXJmL2R3YXJmX2dldF9sb2NsaXN0X2VudHJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1MTBjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dldF9sb2NsaXN0X2VudHJ5LmMKQEAgLTAsMCArMSw4OCBAQAorLyogUmV0dXJuIGxvY2F0aW9uIGxpc3QgZW50cnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJkd2FyZlAuaCIKKworCitpbnQKK2R3YXJmX2dldF9sb2NsaXN0X2VudHJ5IChkYmcsIG9mZnNldCwgaGlwY19vZmZzZXQsIGxvcGNfb2Zmc2V0LCBkYXRhLAorCQkJIGVudHJ5X2xlbiwgbmV4dF9lbnRyeSwgZXJyb3IpCisgICAgIER3YXJmX0RlYnVnIGRiZzsKKyAgICAgRHdhcmZfVW5zaWduZWQgb2Zmc2V0OworICAgICBEd2FyZl9BZGRyICpoaXBjX29mZnNldDsKKyAgICAgRHdhcmZfQWRkciAqbG9wY19vZmZzZXQ7CisgICAgIER3YXJmX1B0ciAqZGF0YTsKKyAgICAgRHdhcmZfVW5zaWduZWQgKmVudHJ5X2xlbjsKKyAgICAgRHdhcmZfVW5zaWduZWQgKm5leHRfZW50cnk7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfU21hbGwgKmxvY3A7CisKKyAgLyogTWFrZSBzdXJlIHdlIGhhdmUgcm9vbSBmb3IgYXQgbGVhc3QgdHdvIGFkZHJlc3Nlcy4gICovCisgIGlmICh1bmxpa2VseSAob2Zmc2V0ICsgMiAqIGRiZy0+Y3VfbGlzdC0+YWRkcmVzc19zaXplCisJCT4gZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfbG9jXS5zaXplKSkKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgbG9jcCA9IChEd2FyZl9TbWFsbCAqKSBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19sb2NdLmFkZHIgKyBvZmZzZXQ7CisKKyAgLyogR2V0IHRoZSB0d28gdmFsdWVzLiAgKi8KKyAgaWYgKGRiZy0+Y3VfbGlzdC0+YWRkcmVzc19zaXplID09IDQpCisgICAgeworICAgICAgKmxvcGNfb2Zmc2V0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGxvY3ApOworICAgICAgKmhpcGNfb2Zmc2V0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGxvY3AgKyA0KTsKKyAgICAgIGxvY3AgKz0gODsKKyAgICAgIG9mZnNldCArPSA4OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpsb3BjX29mZnNldCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCBsb2NwKTsKKyAgICAgICpoaXBjX29mZnNldCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCBsb2NwICsgOCk7CisgICAgICBsb2NwICs9IDE2OworICAgICAgb2Zmc2V0ICs9IDE2OworICAgIH0KKworICAvKiBEb2VzIHRoaXMgc2lnbmFsIHRoZSBlbmQ/ICAqLworICBpZiAoKmxvcGNfb2Zmc2V0ID09IDAgJiYgKmhpcGNfb2Zmc2V0ID09IDApCisgICAgcmV0dXJuIERXX0RMVl9PSzsKKworICAvKiBNYWtlIHN1cmUgYW5vdGhlciAyIGJ5dGVzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBsZW5ndGguICAqLworICBpZiAodW5saWtlbHkgKG9mZnNldCArIDIgPiBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19sb2NdLnNpemUpKQorICAgIHsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKyAgKmVudHJ5X2xlbiA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoZGJnLCBsb2NwKTsKKyAgbG9jcCArPSAyOworICBvZmZzZXQgKz0gMjsKKyAgKmRhdGEgPSBsb2NwOworCisgIC8qIE5vdyB3ZSBrbm93IGhvdyBsb25nIHRoZSBibG9jayBpcy4gIFRlc3Qgd2hldGhlciB0aGF0IG11Y2gKKyAgICAgZGF0YSBpcyBhdmFpbGFibGUuICAqLworICBpZiAodW5saWtlbHkgKG9mZnNldCArICplbnRyeV9sZW4gPiBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19sb2NdLnNpemUpKQorICAgIHsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAqbmV4dF9lbnRyeSA9IG9mZnNldCArICplbnRyeV9sZW47CisKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldF9zdHIuYyBiL2xpYmR3YXJmL2R3YXJmX2dldF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjI4OWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZ2V0X3N0ci5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIFJldHVybiBzdHJpbmcgZnJvbSBkZWJ1ZyBzdHJpbmcgc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZHdhcmZQLmgiCisKKworaW50Citkd2FyZl9nZXRfc3RyIChkYmcsIG9mZnNldCwgc3RyaW5nLCByZXR1cm5lZF9zdHJfbGVuLCBlcnJvcikKKyAgICAgRHdhcmZfRGVidWcgZGJnOworICAgICBEd2FyZl9PZmYgb2Zmc2V0OworICAgICBjaGFyICoqc3RyaW5nOworICAgICBEd2FyZl9TaWduZWQgKnJldHVybmVkX3N0cl9sZW47CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgKnN0cmluZyA9IChjaGFyICopIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX3N0cl0uYWRkcjsKKyAgaWYgKCpzdHJpbmcgPT0gTlVMTCkKKyAgICByZXR1cm4gRFdfRExWX05PX0VOVFJZOworCisgIGlmICh1bmxpa2VseSAob2Zmc2V0ID49IGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX3N0cl0uc2l6ZSkpCisgICAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKKworICAqc3RyaW5nICs9IG9mZnNldDsKKyAgKnJldHVybmVkX3N0cl9sZW4gPSBzdHJsZW4gKCpzdHJpbmcpOworCisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9nZXRhYmJyZXYuYyBiL2xpYmR3YXJmL2R3YXJmX2dldGFiYnJldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjBmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9nZXRhYmJyZXYuYwpAQCAtMCwwICsxLDczIEBACisvKiBJbnRlcm5hbCBhYmJyZXYgbGlzdCBoYW5kbGluZworICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK0R3YXJmX0FiYnJldgorX19saWJkd2FyZl9nZXRfYWJicmV2IChkYmcsIGN1LCBjb2RlLCBlcnJvcikKKyAgICAgRHdhcmZfRGVidWcgZGJnOworICAgICBEd2FyZl9DVV9JbmZvIGN1OworICAgICBEd2FyZl9Xb3JkIGNvZGU7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfQWJicmV2IGVudDsKKworICAvKiBTZWUgd2hldGhlciB0aGUgZW50cnkgaXMgYWxyZWFkeSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCisgIGVudCA9IER3YXJmX0FiYnJldl9IYXNoX2ZpbmQgKCZjdS0+YWJicmV2X2hhc2gsIGNvZGUsIE5VTEwpOworICBpZiAoZW50ICE9IE5VTEwpCisgICAgcmV0dXJuIGVudDsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBEd2FyZl9VbnNpZ25lZCBsZW5ndGg7CisgICAgICBEd2FyZl9VbnNpZ25lZCBhdHRyX2NvdW50OworCisgICAgICBpZiAoZHdhcmZfZ2V0X2FiYnJldiAoZGJnLCBjdS0+bGFzdF9hYmJyZXZfb2Zmc2V0LCAmZW50LCAmbGVuZ3RoLAorCQkJICAgICZhdHRyX2NvdW50LCBlcnJvcikgIT0gRFdfRExWX09LKQorCXJldHVybiBOVUxMOworCisgICAgICBpZiAobGVuZ3RoID09IDEpCisJLyogVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgKi8KKwlicmVhazsKKworICAgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgdG8gdGhlIG5leHQgcmVjb3JkLiAgKi8KKyAgICAgIGN1LT5sYXN0X2FiYnJldl9vZmZzZXQgKz0gbGVuZ3RoOworCisgICAgICAvKiBJbnNlcnQgdGhlIG5ldyBlbnRyeSBpbnRvIHRoZSBoYXNoaW5nIHRhYmxlLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoRHdhcmZfQWJicmV2X0hhc2hfaW5zZXJ0ICgmY3UtPmFiYnJldl9oYXNoLCBlbnQtPmNvZGUsIGVudCkKKwkJICAgICE9IDApKQorCXsKKwkgIGZyZWUgKGVudCk7CisJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKwkgIHJldHVybiBOVUxMOworCX0KKworICAgICAgLyogSXMgdGhpcyB0aGUgY29kZSB3ZSBhcmUgbG9va2luZyBmb3I/ICAqLworICAgICAgaWYgKGVudC0+Y29kZSA9PSBjb2RlKQorCS8qIFllcyEgICovCisJcmV0dXJuIGVudDsKKyAgICB9CisKKyAgLyogSWYgd2UgY29tZSBoZXJlIHdlIGhhdmVuJ3QgZm91bmQgYW55dGhpbmcuICAqLworICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PX0FCQlIpOworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dldGNvbnN0YW50LmMgYi9saWJkd2FyZi9kd2FyZl9nZXRjb25zdGFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzI3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9nZXRjb25zdGFudC5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiBSZXR1cm4gY29uc3RhbnQgdmFsdWUgb2YgZ2l2ZW4gYXR0cmlidXRlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGRpZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK19fbGliZHdhcmZfZ2V0Y29uc3RhbnQgKGRpZSwgbmFtZSwgcmV0dXJuX3NpemUsIGVycm9yKQorICAgICBEd2FyZl9EaWUgZGllOworICAgICBEd2FyZl9IYWxmIG5hbWU7CisgICAgIER3YXJmX1Vuc2lnbmVkICpyZXR1cm5fc2l6ZTsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9EZWJ1ZyBkYmcgPSBkaWUtPmN1LT5kYmc7CisgIER3YXJmX1NtYWxsICpkaWVfYWRkcjsKKyAgRHdhcmZfV29yZCB1MTI4OworICBEd2FyZl9BYmJyZXYgYWJicmV2OworICBEd2FyZl9TbWFsbCAqYXR0cnA7CisKKyAgLyogQWRkcmVzcyBvZiB0aGUgZ2l2ZW4gZGllLiAgKi8KKyAgZGllX2FkZHIgPSBkaWUtPmFkZHI7CisKKyAgLyogR2V0IGFiYnJldiBjb2RlLiAgKi8KKyAgZ2V0X3VsZWIxMjggKHUxMjgsIGRpZV9hZGRyKTsKKyAgLyogIEFuZCBnZXQgdGhlIGFiYnJldmlhdGlvbiBpdHNlbGYuICAqLworICBhYmJyZXYgPSBfX2xpYmR3YXJmX2dldF9hYmJyZXYgKGRiZywgZGllLT5jdSwgdTEyOCwgZXJyb3IpOworICBpZiAoYWJicmV2ID09IE5VTEwpCisgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIHN0YXJ0LiAgKi8KKyAgYXR0cnAgPSBhYmJyZXYtPmF0dHJwOworCisgIC8qIFNlYXJjaCB0aGUgbmFtZSBhdHRyaWJ1dGUuICAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBEd2FyZl9Xb3JkIGF0dHJfbmFtZTsKKyAgICAgIER3YXJmX1dvcmQgYXR0cl9mb3JtOworCisgICAgICAvKiBBcmUgd2Ugc3RpbGwgaW4gYm91bmRzPyAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoYXR0cnAKKwkJICAgID49ICgoRHdhcmZfU21hbGwgKikgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfYWJicmV2XS5hZGRyCisJCQkrIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2FiYnJldl0uc2l6ZSkpKQorCXsKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICByZXR1cm4gRFdfRExWX0VSUk9SOworCX0KKworICAgICAgLyogR2V0IGF0dHJpYnV0ZSBuYW1lIGFuZCBmb3JtLgorCisJIFhYWCBXZSBkb24ndCBjaGVjayB3aGV0aGVyIHRoaXMgcmVhZHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlCisJIHNlY3Rpb24uICAqLworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfbmFtZSwgYXR0cnApOworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfZm9ybSwgYXR0cnApOworCisgICAgICAvKiBXZSBjYW4gc3RvcCBpZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIHdpdGggdmFsdWUgemVyby4gICovCisgICAgICBpZiAoYXR0cl9uYW1lID09IDAgJiYgYXR0cl9mb3JtID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIElzIHRoaXMgdGhlIG5hbWUgYXR0cmlidXRlPyAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoYXR0cl9uYW1lID09IG5hbWUpKQorCXsKKwkgIHN3aXRjaCAoYXR0cl9mb3JtKQorCSAgICB7CisJICAgIGNhc2UgRFdfRk9STV9kYXRhMToKKwkgICAgICAqcmV0dXJuX3NpemUgPSAqZGllX2FkZHI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfRk9STV9kYXRhMjoKKwkgICAgICAqcmV0dXJuX3NpemUgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGllX2FkZHIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6CisJICAgICAgKnJldHVybl9zaXplID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRpZV9hZGRyKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBEV19GT1JNX2RhdGE4OgorCSAgICAgICpyZXR1cm5fc2l6ZSA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCBkaWVfYWRkcik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfRk9STV9zZGF0YToKKwkgICAgICBnZXRfc2xlYjEyOCAodTEyOCwgZGllX2FkZHIpOworCSAgICAgICpyZXR1cm5fc2l6ZSA9IHUxMjg7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfRk9STV91ZGF0YToKKwkgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgZGllX2FkZHIpOworCSAgICAgICpyZXR1cm5fc2l6ZSA9IHUxMjg7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9OT19DT05TVEFOVCk7CisJICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkgICAgfQorCisJICByZXR1cm4gRFdfRExWX09LOworCX0KKworICAgICAgLyogU2tpcCBvdmVyIHRoZSByZXN0IG9mIHRoaXMgYXR0cmlidXRlIChpZiB0aGVyZSBpcyBhbnkpLiAgKi8KKyAgICAgIGlmIChhdHRyX2Zvcm0gIT0gMCkKKwl7CisJICBzaXplX3QgbGVuOworCisJICBpZiAodW5saWtlbHkgKF9fbGliZHdhcmZfZm9ybV92YWxfbGVuIChkYmcsIGRpZS0+Y3UsIGF0dHJfZm9ybSwKKwkJCQkJCSBkaWVfYWRkciwgJmxlbiwgZXJyb3IpCisJCQkhPSBEV19ETFZfT0spKQorCSAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCisJICBkaWVfYWRkciArPSBsZW47CisJfQorICAgIH0KKworICAvKiBObyBzdWNoIGF0dHJpYnV0ZSBwcmVzZW50LiAgKi8KKyAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dsb2JhbF9jdV9vZmZzZXQuYyBiL2xpYmR3YXJmL2R3YXJmX2dsb2JhbF9jdV9vZmZzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWEzMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZ2xvYmFsX2N1X29mZnNldC5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIFJldHVybiBvZmZzZXQgb2YgaGVhZGVyIG9mIGNvbXBpbGUgdW5pdCBjb250YWluaW5nIHRoZSBnbG9iYWwgZGVmaW5pdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9nbG9iYWxfY3Vfb2Zmc2V0IChnbG9iYWwsIHJldHVybl9vZmZzZXQsIGVycm9yKQorICAgICBEd2FyZl9HbG9iYWwgZ2xvYmFsOworICAgICBEd2FyZl9PZmYgKnJldHVybl9vZmZzZXQ7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfU21hbGwgKmN1X2hlYWRlcjsKKyAgdW5zaWduZWQgaW50IG9mZnNldF9zaXplOworCisgIGN1X2hlYWRlciA9CisgICAgKChEd2FyZl9TbWFsbCAqKSBnbG9iYWwtPmluZm8tPmRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2luZm9dLmFkZHIKKyAgICAgKyBnbG9iYWwtPmluZm8tPm9mZnNldCk7CisgIGlmIChyZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IChjdV9oZWFkZXIpID09IDB4ZmZmZmZmZmYpCisgICAgb2Zmc2V0X3NpemUgPSA4OworICBlbHNlCisgICAgb2Zmc2V0X3NpemUgPSA0OworCisgICpyZXR1cm5fb2Zmc2V0ID0gZ2xvYmFsLT5pbmZvLT5vZmZzZXQgKyAzICogb2Zmc2V0X3NpemUgLSA0ICsgMzsKKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2xvYmFsX2RpZV9vZmZzZXQuYyBiL2xpYmR3YXJmL2R3YXJmX2dsb2JhbF9kaWVfb2Zmc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0MzQwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2dsb2JhbF9kaWVfb2Zmc2V0LmMKQEAgLTAsMCArMSwzMyBAQAorLyogUmV0dXJuIERJRSBvZmZzZXQgZm9yIGdsb2JhbCBkZWZpbml0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2dsb2JhbF9kaWVfb2Zmc2V0IChnbG9iYWwsIHJldHVybl9vZmZzZXQsIGVycm9yKQorICAgICBEd2FyZl9HbG9iYWwgZ2xvYmFsOworICAgICBEd2FyZl9PZmYgKnJldHVybl9vZmZzZXQ7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgKnJldHVybl9vZmZzZXQgPSBnbG9iYWwtPmluZm8tPm9mZnNldCArIGdsb2JhbC0+b2Zmc2V0OworCisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9nbG9iYWxfZm9ybXJlZi5jIGIvbGliZHdhcmYvZHdhcmZfZ2xvYmFsX2Zvcm1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmVhN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfZ2xvYmFsX2Zvcm1yZWYuYwpAQCAtMCwwICsxLDczIEBACisvKiBSZXR1cm4gLmRlYnVnX2luZm8gc2VjdGlvbiBnbG9iYWwgb2Zmc2V0IG9mIHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggZm9ybS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2dsb2JhbF9mb3JtcmVmIChhdHRyLCByZXR1cm5fb2Zmc2V0LCBlcnJvcikKKyAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgIER3YXJmX09mZiAqcmV0dXJuX29mZnNldDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBzd2l0Y2ggKGF0dHItPmZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9yZWYxOgorICAgICAgKnJldHVybl9vZmZzZXQgPSAqYXR0ci0+dmFscCArIGF0dHItPmN1LT5vZmZzZXQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWYyOgorICAgICAgKnJldHVybl9vZmZzZXQgPSAocmVhZF8ydWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKQorCQkJKyBhdHRyLT5jdS0+b2Zmc2V0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3JlZjQ6CisgICAgICAqcmV0dXJuX29mZnNldCA9IChyZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApCisJCQkrIGF0dHItPmN1LT5vZmZzZXQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fcmVmODoKKyAgICAgICpyZXR1cm5fb2Zmc2V0ID0gKHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCkKKwkJCSsgYXR0ci0+Y3UtPm9mZnNldCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6CisgICAgICB7CisJRHdhcmZfT2ZmIG9mZjsKKwlEd2FyZl9TbWFsbCAqYXR0cnAgPSBhdHRyLT52YWxwOworCWdldF91bGViMTI4IChvZmYsIGF0dHJwKTsKKwkqcmV0dXJuX29mZnNldCA9IG9mZiArIGF0dHItPmN1LT5vZmZzZXQ7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKKyAgICAgIGlmIChhdHRyLT5jdS0+YWRkcmVzc19zaXplID09IDQpCisJKnJldHVybl9vZmZzZXQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOworICAgICAgZWxzZQorCSpyZXR1cm5fb2Zmc2V0ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGF0dHItPmN1LT5kYmcsIGVycm9yLCBEV19FX05PX1JFRkVSRU5DRSk7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfZ2xvYmFsX25hbWVfb2Zmc2V0cy5jIGIvbGliZHdhcmYvZHdhcmZfZ2xvYmFsX25hbWVfb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjE0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9nbG9iYWxfbmFtZV9vZmZzZXRzLmMKQEAgLTAsMCArMSw2NCBAQAorLyogUmV0dXJuIG5hbWUsIERJRSBvZmZzZXQsIGFuZCBvZmZzZXQgb2YgdGhlIGNvbXBpbGUgdW5pdCBmb3IgZ2xvYmFsCisgICBkZWZpbml0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2dsb2JhbF9uYW1lX29mZnNldHMgKGdsb2JhbCwgcmV0dXJuX25hbWUsIGRpZV9vZmZzZXQsIGN1X29mZnNldCwgZXJyb3IpCisgICAgIER3YXJmX0dsb2JhbCBnbG9iYWw7CisgICAgIGNoYXIgKipyZXR1cm5fbmFtZTsKKyAgICAgRHdhcmZfT2ZmICpkaWVfb2Zmc2V0OworICAgICBEd2FyZl9PZmYgKmN1X29mZnNldDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBpZiAocmV0dXJuX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICAqcmV0dXJuX25hbWUgPSBzdHJkdXAgKGdsb2JhbC0+bmFtZSk7CisgICAgICBpZiAoKnJldHVybl9uYW1lID09IE5VTEwpCisJeworCSAgX19saWJkd2FyZl9lcnJvciAoZ2xvYmFsLT5pbmZvLT5kYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKwkgIHJldHVybiBEV19ETFZfRVJST1I7CisJfQorICAgIH0KKworICBpZiAoZGllX29mZnNldCAhPSBOVUxMKQorICAgICpkaWVfb2Zmc2V0ID0gZ2xvYmFsLT5vZmZzZXQgKyBnbG9iYWwtPmluZm8tPm9mZnNldDsKKworICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIENVIGhlYWRlci4gICovCisgIGlmIChjdV9vZmZzZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICBEd2FyZl9TbWFsbCAqY3VfaGVhZGVyOworICAgICAgdW5zaWduZWQgaW50IG9mZnNldF9zaXplOworCisgICAgICBjdV9oZWFkZXIgPQorCSgoRHdhcmZfU21hbGwgKikgZ2xvYmFsLT5pbmZvLT5kYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19pbmZvXS5hZGRyCisJICsgZ2xvYmFsLT5pbmZvLT5vZmZzZXQpOworICAgICAgaWYgKHJlYWRfNHVieXRlX3VuYWxpZ25lZF9ub25jdnQgKGN1X2hlYWRlcikgPT0gMHhmZmZmZmZmZikKKwlvZmZzZXRfc2l6ZSA9IDg7CisgICAgICBlbHNlCisJb2Zmc2V0X3NpemUgPSA0OworCisgICAgICAqY3Vfb2Zmc2V0ID0gZ2xvYmFsLT5pbmZvLT5vZmZzZXQgKyAzICogb2Zmc2V0X3NpemUgLSA0ICsgMzsKKyAgICB9CisKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2dsb2JuYW1lLmMgYi9saWJkd2FyZi9kd2FyZl9nbG9ibmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTY1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9nbG9ibmFtZS5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIFJldHVybiBuYW1lIGZvciBnbG9iYWwgZGVmaW5pdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9nbG9ibmFtZSAoZ2xvYmFsLCByZXR1cm5fbmFtZSwgZXJyb3IpCisgICAgIER3YXJmX0dsb2JhbCBnbG9iYWw7CisgICAgIGNoYXIgKipyZXR1cm5fbmFtZTsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICAqcmV0dXJuX25hbWUgPSBzdHJkdXAgKGdsb2JhbC0+bmFtZSk7CisgIGlmICgqcmV0dXJuX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChnbG9iYWwtPmluZm8tPmRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2hhc2F0dHIuYyBiL2xpYmR3YXJmL2R3YXJmX2hhc2F0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzdhM2UxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfaGFzYXR0ci5jCkBAIC0wLDAgKzEsOTggQEAKKy8qIERldGVybWluZSB3aGV0aGVyIGRpZSBoYXMgYXR0cmlidXRlIHNwZWNpZmllZCBvZiBnaXZlbiB0eXBlLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9oYXNhdHRyIChkaWUsIGF0dHIsIHJldHVybl9ib29sLCBlcnJvcikKKyAgICAgRHdhcmZfRGllIGRpZTsKKyAgICAgRHdhcmZfSGFsZiBhdHRyOworICAgICBEd2FyZl9Cb29sICpyZXR1cm5fYm9vbDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9EZWJ1ZyBkYmcgPSBkaWUtPmN1LT5kYmc7CisgIER3YXJmX1NtYWxsICpkaWVfYWRkcjsKKyAgRHdhcmZfV29yZCB1MTI4OworICBEd2FyZl9BYmJyZXYgYWJicmV2OworICBEd2FyZl9TbWFsbCAqYXR0cnA7CisKKyAgLyogQWRkcmVzcyBvZiB0aGUgZ2l2ZW4gZGllLiAgKi8KKyAgZGllX2FkZHIgPSBkaWUtPmFkZHI7CisKKyAgLyogR2V0IGFiYnJldiBjb2RlLiAgKi8KKyAgZ2V0X3VsZWIxMjggKHUxMjgsIGRpZV9hZGRyKTsKKyAgLyogIEFuZCBnZXQgdGhlIGFiYnJldmlhdGlvbiBpdHNlbGYuICAqLworICBhYmJyZXYgPSBfX2xpYmR3YXJmX2dldF9hYmJyZXYgKGRiZywgZGllLT5jdSwgdTEyOCwgZXJyb3IpOworICBpZiAoYWJicmV2ID09IE5VTEwpCisgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIHN0YXJ0LiAgKi8KKyAgYXR0cnAgPSBhYmJyZXYtPmF0dHJwOworCisgIC8qIFNlYXJjaCB0aGUgbmFtZSBhdHRyaWJ1dGUuICAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBEd2FyZl9Xb3JkIGF0dHJfbmFtZTsKKyAgICAgIER3YXJmX1dvcmQgYXR0cl9mb3JtOworCisgICAgICAvKiBBcmUgd2Ugc3RpbGwgaW4gYm91bmRzPyAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoYXR0cnAKKwkJICAgID49ICgoRHdhcmZfU21hbGwgKikgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfYWJicmV2XS5hZGRyCisJCQkrIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2FiYnJldl0uc2l6ZSkpKQorCXsKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICByZXR1cm4gRFdfRExWX0VSUk9SOworCX0KKworICAgICAgLyogR2V0IGF0dHJpYnV0ZSBuYW1lIGFuZCBmb3JtLgorCisJIFhYWCBXZSBkb24ndCBjaGVjayB3aGV0aGVyIHRoaXMgcmVhZHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlCisJIHNlY3Rpb24uICAqLworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfbmFtZSwgYXR0cnApOworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfZm9ybSwgYXR0cnApOworCisgICAgICAvKiBXZSBjYW4gc3RvcCBpZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIHdpdGggdmFsdWUgemVyby4gICovCisgICAgICBpZiAoYXR0cl9uYW1lID09IDAgJiYgYXR0cl9mb3JtID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIElzIHRoaXMgdGhlIG5hbWUgYXR0cmlidXRlPyAgKi8KKyAgICAgIGlmIChhdHRyX25hbWUgPT0gYXR0cikKKwl7CisJICAqcmV0dXJuX2Jvb2wgPSAxOworCSAgcmV0dXJuIERXX0RMVl9PSzsKKwl9CisKKyAgICAgIC8qIFNraXAgb3ZlciB0aGUgcmVzdCBvZiB0aGlzIGF0dHJpYnV0ZSAoaWYgdGhlcmUgaXMgYW55KS4gICovCisgICAgICBpZiAoYXR0cl9mb3JtICE9IDApCisJeworCSAgc2l6ZV90IGxlbjsKKworCSAgaWYgKHVubGlrZWx5IChfX2xpYmR3YXJmX2Zvcm1fdmFsX2xlbiAoZGJnLCBkaWUtPmN1LCBhdHRyX2Zvcm0sCisJCQkJCQkgZGllX2FkZHIsICZsZW4sIGVycm9yKQorCQkJIT0gRFdfRExWX09LKSkKKwkgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworCSAgZGllX2FkZHIgKz0gbGVuOworCX0KKyAgICB9CisKKyAgLyogTm8gc3VjaCBhdHRyaWJ1dGUgcHJlc2VudC4gICovCisgICpyZXR1cm5fYm9vbCA9IDA7CisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9oYXNmb3JtLmMgYi9saWJkd2FyZi9kd2FyZl9oYXNmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiNmNmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2hhc2Zvcm0uYwpAQCAtMCwwICsxLDMxIEBACisvKiBEZXRlcm1pbmUgd2hldGhlciBhdHRyaWJ1dGUgaGFzIGdpdmVuIGZvcm0uCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2hhc2Zvcm0gKGF0dHIsIGZvcm0sIHJldHVybl9oYXNmb3JtLCBlcnJvcikKKyAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgIER3YXJmX0hhbGYgZm9ybTsKKyAgICAgRHdhcmZfQm9vbCAqcmV0dXJuX2hhc2Zvcm07CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgKnJldHVybl9oYXNmb3JtID0gYXR0ci0+Zm9ybSA9PSBmb3JtOworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfaGlnaHBjLmMgYi9saWJkd2FyZi9kd2FyZl9oaWdocGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTU2Mzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfaGlnaHBjLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIFJldHVybiBoaWdoIHByb2dyYW0gY291bnRlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggZGllLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfaGlnaHBjIChkaWUsIHJldHVybl9oaWdocGMsIGVycm9yKQorICAgICBEd2FyZl9EaWUgZGllOworICAgICBEd2FyZl9BZGRyICpyZXR1cm5faGlnaHBjOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIER3YXJmX0RlYnVnIGRiZyA9IGRpZS0+Y3UtPmRiZzsKKyAgRHdhcmZfU21hbGwgKmRpZV9hZGRyOworICBEd2FyZl9Xb3JkIHUxMjg7CisgIER3YXJmX0FiYnJldiBhYmJyZXY7CisgIER3YXJmX1NtYWxsICphdHRycDsKKworICAvKiBBZGRyZXNzIG9mIHRoZSBnaXZlbiBkaWUuICAqLworICBkaWVfYWRkciA9IGRpZS0+YWRkcjsKKworICAvKiBHZXQgYWJicmV2IGNvZGUuICAqLworICBnZXRfdWxlYjEyOCAodTEyOCwgZGllX2FkZHIpOworICAvKiAgQW5kIGdldCB0aGUgYWJicmV2aWF0aW9uIGl0c2VsZi4gICovCisgIGFiYnJldiA9IF9fbGliZHdhcmZfZ2V0X2FiYnJldiAoZGJnLCBkaWUtPmN1LCB1MTI4LCBlcnJvcik7CisgIGlmIChhYmJyZXYgPT0gTlVMTCkKKyAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCisgIC8qIFRoaXMgaXMgd2hlcmUgdGhlIGF0dHJpYnV0ZXMgc3RhcnQuICAqLworICBhdHRycCA9IGFiYnJldi0+YXR0cnA7CisKKyAgLyogU2VhcmNoIHRoZSBuYW1lIGF0dHJpYnV0ZS4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIER3YXJmX1dvcmQgYXR0cl9uYW1lOworICAgICAgRHdhcmZfV29yZCBhdHRyX2Zvcm07CisKKyAgICAgIC8qIEFyZSB3ZSBzdGlsbCBpbiBib3VuZHM/ICAqLworICAgICAgaWYgKHVubGlrZWx5ICAoYXR0cnAKKwkJICAgICA+PSAoKER3YXJmX1NtYWxsICopIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2FiYnJldl0uYWRkcgorCQkJICsgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfYWJicmV2XS5zaXplKSkpCisJeworCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkgIHJldHVybiBEV19ETFZfRVJST1I7CisJfQorCisgICAgICAvKiBHZXQgYXR0cmlidXRlIG5hbWUgYW5kIGZvcm0uCisKKwkgWFhYIFdlIGRvbid0IGNoZWNrIHdoZXRoZXIgdGhpcyByZWFkcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKKwkgc2VjdGlvbi4gICovCisgICAgICBnZXRfdWxlYjEyOCAoYXR0cl9uYW1lLCBhdHRycCk7CisgICAgICBnZXRfdWxlYjEyOCAoYXR0cl9mb3JtLCBhdHRycCk7CisKKyAgICAgIC8qIFdlIGNhbiBzdG9wIGlmIHdlIGZvdW5kIHRoZSBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSB6ZXJvLiAgKi8KKyAgICAgIGlmIChhdHRyX25hbWUgPT0gMCAmJiBhdHRyX2Zvcm0gPT0gMCkKKwlicmVhazsKKworICAgICAgLyogSXMgdGhpcyB0aGUgbmFtZSBhdHRyaWJ1dGU/ICAqLworICAgICAgaWYgKHVubGlrZWx5IChhdHRyX25hbWUgPT0gRFdfQVRfaGlnaF9wYykpCisJeworCSAgaWYgKHVubGlrZWx5IChhdHRyX2Zvcm0gIT0gRFdfRk9STV9hZGRyKSkKKwkgICAgeworCSAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkgICAgfQorCisJICBpZiAoZGllLT5jdS0+YWRkcmVzc19zaXplID09IDQpCisJICAgICpyZXR1cm5faGlnaHBjID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRpZV9hZGRyKTsKKwkgIGVsc2UKKwkgICAgKnJldHVybl9oaWdocGMgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGllX2FkZHIpOworCisJICByZXR1cm4gRFdfRExWX09LOworCX0KKworICAgICAgLyogU2tpcCBvdmVyIHRoZSByZXN0IG9mIHRoaXMgYXR0cmlidXRlIChpZiB0aGVyZSBpcyBhbnkpLiAgKi8KKyAgICAgIGlmIChhdHRyX2Zvcm0gIT0gMCkKKwl7CisJICBzaXplX3QgbGVuOworCisJICBpZiAodW5saWtlbHkgKF9fbGliZHdhcmZfZm9ybV92YWxfbGVuIChkYmcsIGRpZS0+Y3UsIGF0dHJfZm9ybSwKKwkJCQkJCSBkaWVfYWRkciwgJmxlbiwgZXJyb3IpCisJCQkhPSBEV19ETFZfT0spKQorCSAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCisJICBkaWVfYWRkciArPSBsZW47CisJfQorICAgIH0KKworICAvKiBObyBzdWNoIGF0dHJpYnV0ZSBwcmVzZW50LiAgKi8KKyAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2luaXQuYyBiL2xpYmR3YXJmL2R3YXJmX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI4NjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfaW5pdC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIENyZWF0ZSBkZXNjcmlwdG9yIGZyb20gZmlsZSBkZXNjcmlwdG9yIGZvciBwcm9jZXNzaW5nIGZpbGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9pbml0IChmZCwgYWNjZXNzLCBlcnJoYW5kLCBlcnJhcmcsIGRiZywgZXJyb3IpCisgICAgIGludCBmZDsKKyAgICAgRHdhcmZfVW5zaWduZWQgYWNjZXNzOworICAgICBEd2FyZl9IYW5kbGVyIGVycmhhbmQ7CisgICAgIER3YXJmX1B0ciBlcnJhcmc7CisgICAgIER3YXJmX0RlYnVnICpkYmc7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRWxmICplbGY7CisgIEVsZl9DbWQgY21kOworICBzdHJ1Y3QgRHdhcmZfRGVidWdfcyBuZXdkYmc7CisgIGludCByZXN1bHQgPSBEV19ETFZfRVJST1I7CisKKyAgc3dpdGNoIChhY2Nlc3MpCisgICAgeworICAgIGNhc2UgRFdfRExDX1JFQUQ6CisgICAgICBjbWQgPSBFTEZfQ19SRUFEX01NQVA7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0RMQ19XUklURToKKyAgICAgIGNtZCA9IEVMRl9DX1dSSVRFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19ETENfUkRXUjoKKyAgICAgIGNtZCA9IEVMRl9DX1JEV1I7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogVGhlc2UgYXJlIHRoZSBlcnJvciB2YWx1ZXMgd2Ugd2FudCB0byB1c2UuICAqLworICAgICAgbmV3ZGJnLmRiZ19lcnJoYW5kID0gZXJyaGFuZDsKKyAgICAgIG5ld2RiZy5kYmdfZXJyYXJnID0gZXJyYXJnOworCisgICAgICBfX2xpYmR3YXJmX2Vycm9yICgmbmV3ZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0FDQ0VTUyk7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAvKiBXZSBoYXZlIHRvIGNhbGwgYGVsZl92ZXJzaW9uJyBoZXJlIHNpbmNlIHRoZSB1c2VyIG1pZ2h0IGhhdmUgbm90CisgICAgIGRvbmUgaXQgb3IgaW5pdGlhbGl6ZWQgbGliZWxmIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbi4gIFRoaXMKKyAgICAgd291bGQgYnJlYWsgbGliZHdhcmYgc2luY2Ugd2UgYXJlIHVzaW5nIHRoZSBFTEYgZGF0YSBzdHJ1Y3R1cmVzCisgICAgIGluIGEgY2VydGFpbiB3YXkuICAqLworICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7CisKKyAgLyogR2V0IGFuIEVMRiBkZXNjcmlwdG9yLiAgKi8KKyAgZWxmID0gZWxmX2JlZ2luIChmZCwgY21kLCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRlc3Qgd2h5IHRoZSBgZWxmX2JlZ2luIiBjYWxsIGZhaWxlZC4gICovCisgICAgICBzdHJ1Y3Qgc3RhdDY0IHN0OworCisgICAgICAvKiBUaGVzZSBhcmUgdGhlIGVycm9yIHZhbHVlcyB3ZSB3YW50IHRvIHVzZS4gICovCisgICAgICBuZXdkYmcuZGJnX2VycmhhbmQgPSBlcnJoYW5kOworICAgICAgbmV3ZGJnLmRiZ19lcnJhcmcgPSBlcnJhcmc7CisKKyAgICAgIGlmIChmc3RhdDY0IChmZCwgJnN0KSA9PSAwICYmICEgU19JU1JFRyAoc3Quc3RfbW9kZSkpCisJX19saWJkd2FyZl9lcnJvciAoJm5ld2RiZywgZXJyb3IsIERXX0VfTk9fUkVHRklMRSk7CisgICAgICBlbHNlCisJX19saWJkd2FyZl9lcnJvciAoJm5ld2RiZywgZXJyb3IsIERXX0VfSU9fRVJST1IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIERvIHRoZSByZWFsIHdvcmsgbm93IHRoYXQgd2UgaGF2ZSBhbiBFTEYgZGVzY3JpcHRvci4gICovCisgICAgICByZXN1bHQgPSBkd2FyZl9lbGZfaW5pdCAoZWxmLCBhY2Nlc3MsIGVycmhhbmQsIGVycmFyZywgZGJnLCBlcnJvcik7CisKKyAgICAgIC8qIElmIHRoaXMgZmFpbGVkLCBmcmVlIHRoZSByZXNvdXJjZXMuICAqLworICAgICAgaWYgKHJlc3VsdCAhPSBEV19ETFZfT0spCisJZWxmX2VuZCAoZWxmKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2xpbmVhZGRyLmMgYi9saWJkd2FyZi9kd2FyZl9saW5lYWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZjQ5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9saW5lYWRkci5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFJldHVybiBhZGRyZXNzIGFzc29jaWF0ZSB3aXRoIGxpbmUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2xpbmVhZGRyIChsaW5lLCByZXR1cm5fbGluZWFkZHIsIGVycm9yKQorICAgICBEd2FyZl9MaW5lIGxpbmU7CisgICAgIER3YXJmX0FkZHIgKnJldHVybl9saW5lYWRkcjsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICAqcmV0dXJuX2xpbmVhZGRyID0gbGluZS0+YWRkcjsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2xpbmViZWdpbnN0YXRlbWVudC5jIGIvbGliZHdhcmYvZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0YzZlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2xpbmViZWdpbnN0YXRlbWVudC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIERldGVybWluZSB3aGV0aGVyIGxpbmUgaXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0YXRlbWVudC4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50IChsaW5lLCByZXR1cm5fYm9vbCwgZXJyb3IpCisgICAgIER3YXJmX0xpbmUgbGluZTsKKyAgICAgRHdhcmZfQm9vbCAqcmV0dXJuX2Jvb2w7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgKnJldHVybl9ib29sID0gbGluZS0+aXNfc3RtdDsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2xpbmVibG9jay5jIGIvbGliZHdhcmYvZHdhcmZfbGluZWJsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1ZTU0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2xpbmVibG9jay5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIERldGVybWluZSB3aGV0aGVyIGxpbmUgaXMgbWFya2VkIGFzIGJlZ2lubmluZyBhIGJhc2ljIGJsb2NrLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9saW5lYmxvY2sgKGxpbmUsIHJldHVybl9ib29sLCBlcnJvcikKKyAgICAgRHdhcmZfTGluZSBsaW5lOworICAgICBEd2FyZl9Cb29sICpyZXR1cm5fYm9vbDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICAqcmV0dXJuX2Jvb2wgPSBsaW5lLT5iYXNpY19ibG9jazsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2xpbmVlbmRzZXF1ZW5jZS5jIGIvbGliZHdhcmYvZHdhcmZfbGluZWVuZHNlcXVlbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjYmY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2xpbmVlbmRzZXF1ZW5jZS5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIERldGVybWluZSB3aGV0aGVyIGxpbmUgaXMgbWFya2VkIGFzIGVuZGluZyBhIHRleHQgc2VxdWVuY2UuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2xpbmVlbmRzZXF1ZW5jZSAobGluZSwgcmV0dXJuX2Jvb2wsIGVycm9yKQorICAgICBEd2FyZl9MaW5lIGxpbmU7CisgICAgIER3YXJmX0Jvb2wgKnJldHVybl9ib29sOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgICpyZXR1cm5fYm9vbCA9IGxpbmUtPmVuZF9zZXF1ZW5jZTsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luLmMgYi9saWJkd2FyZi9kd2FyZl9saW5lZXBpbG9ndWViZWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZGYxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9saW5lZXBpbG9ndWViZWdpbi5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIERldGVybWluZSB3aGV0aGVyIGxpbmUgaXMgbWFya2VkIGFzIGJlZ2lubmluZyB0aGUgZXBpbG9ndWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luIChsaW5lLCByZXR1cm5fYm9vbCwgZXJyb3IpCisgICAgIER3YXJmX0xpbmUgbGluZTsKKyAgICAgRHdhcmZfQm9vbCAqcmV0dXJuX2Jvb2w7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgKnJldHVybl9ib29sID0gbGluZS0+ZXBpbG9ndWVfYmVnaW47CisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9saW5lbm8uYyBiL2xpYmR3YXJmL2R3YXJmX2xpbmVuby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjkxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9saW5lbm8uYwpAQCAtMCwwICsxLDMwIEBACisvKiBSZXR1cm4gc291cmNlIHN0YXRlbWVudCBsaW5lIG51bWJlci4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfbGluZW5vIChsaW5lLCByZXR1cm5fbGluZW5vLCBlcnJvcikKKyAgICAgRHdhcmZfTGluZSBsaW5lOworICAgICBEd2FyZl9VbnNpZ25lZCAqcmV0dXJuX2xpbmVubzsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICAqcmV0dXJuX2xpbmVubyA9IGxpbmUtPmxpbmU7CisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9saW5lb2ZmLmMgYi9saWJkd2FyZi9kd2FyZl9saW5lb2ZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmNGJiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2xpbmVvZmYuYwpAQCAtMCwwICsxLDMwIEBACisvKiBSZXR1cm4gY29sdW1uIGF0IHdoaWNoIHRoZSBzdGF0ZW1lbnQgYmVnaW5zLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9saW5lb2ZmIChsaW5lLCByZXR1cm5fbGluZW9mZiwgZXJyb3IpCisgICAgIER3YXJmX0xpbmUgbGluZTsKKyAgICAgRHdhcmZfU2lnbmVkICpyZXR1cm5fbGluZW9mZjsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICAqcmV0dXJuX2xpbmVvZmYgPSBsaW5lLT5jb2x1bW4gPzogLTE7CisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9saW5lcHJvbG9ndWVlbmQuYyBiL2xpYmR3YXJmL2R3YXJmX2xpbmVwcm9sb2d1ZWVuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDJmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9saW5lcHJvbG9ndWVlbmQuYwpAQCAtMCwwICsxLDMwIEBACisvKiBEZXRlcm1pbmUgd2hldGhlciBsaW5lIGlzIG1hcmtlZCBhcyBlbmRpbmcgdGhlIHByb2xvZ3VlLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl9saW5lcHJvbG9ndWVlbmQgKGxpbmUsIHJldHVybl9ib29sLCBlcnJvcikKKyAgICAgRHdhcmZfTGluZSBsaW5lOworICAgICBEd2FyZl9Cb29sICpyZXR1cm5fYm9vbDsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICAqcmV0dXJuX2Jvb2wgPSBsaW5lLT5wcm9sb2d1ZV9lbmQ7CisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9saW5lc3JjLmMgYi9saWJkd2FyZi9kd2FyZl9saW5lc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5OTAwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX2xpbmVzcmMuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBSZXR1cm4gc291cmNlIGZpbGUgZm9yIGxpbmUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfbGluZXNyYyAobGluZSwgcmV0dXJuX2xpbmVzcmMsIGVycm9yKQorICAgICBEd2FyZl9MaW5lIGxpbmU7CisgICAgIGNoYXIgKipyZXR1cm5fbGluZXNyYzsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBpZiAodW5saWtlbHkgKGxpbmUtPmZpbGUgPj0gbGluZS0+ZmlsZXMtPm5maWxlcykpCisgICAgeworICAgICAgX19saWJkd2FyZl9lcnJvciAobGluZS0+ZmlsZXMtPmRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAqcmV0dXJuX2xpbmVzcmMgPSBzdHJkdXAgKGxpbmUtPmZpbGVzLT5pbmZvW2xpbmUtPmZpbGVdLm5hbWUpOworICBpZiAoKnJldHVybl9saW5lc3JjID09IE5VTEwpCisgICAgeworICAgICAgX19saWJkd2FyZl9lcnJvciAobGluZS0+ZmlsZXMtPmRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX2xvY2xpc3QuYyBiL2xpYmR3YXJmL2R3YXJmX2xvY2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmEzOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfbG9jbGlzdC5jCkBAIC0wLDAgKzEsNDcwIEBACisvKiBSZXR1cm4gbG9jYXRpb24gZXhwcmVzc2lvbiBsaXN0LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK3N0cnVjdCBsb2NsaXN0Cit7CisgIER3YXJmX1NtYWxsIGF0b207CisgIER3YXJmX1Vuc2lnbmVkIG51bWJlcjsKKyAgRHdhcmZfVW5zaWduZWQgbnVtYmVyMjsKKyAgRHdhcmZfVW5zaWduZWQgb2Zmc2V0OworICBzdHJ1Y3QgbG9jbGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCBsb2NkZXNjbGlzdAoreworICBEd2FyZl9BZGRyIGxvcGM7CisgIER3YXJmX0FkZHIgaGlwYzsKKyAgRHdhcmZfSGFsZiBjZW50czsKKyAgc3RydWN0IGxvY2xpc3QgKnM7CisgIHN0cnVjdCBsb2NkZXNjbGlzdCAqbmV4dDsKK307CisKKworaW50Citkd2FyZl9sb2NsaXN0IChhdHRyLCBsbGJ1ZiwgbGlzdGxlbiwgZXJyb3IpCisgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOworICAgICBEd2FyZl9Mb2NkZXNjICoqbGxidWY7CisgICAgIER3YXJmX1NpZ25lZCAqbGlzdGxlbjsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9DVV9JbmZvIGN1ID0gYXR0ci0+Y3U7CisgIER3YXJmX0RlYnVnIGRiZyA9IGN1LT5kYmc7CisgIER3YXJmX1Vuc2lnbmVkIG9mZnNldDsKKyAgRHdhcmZfVW5zaWduZWQgb2Zmc2V0X2VuZDsKKyAgRHdhcmZfU21hbGwgKmxvY3A7CisgIHN0cnVjdCBsb2NkZXNjbGlzdCAqbG9jZGVzY2xpc3Q7CisgIER3YXJmX0xvY2Rlc2MgKnJlc3VsdDsKKyAgdW5zaWduZWQgaW50IG47CisKKyAgLyogTXVzdCBieSBvbmUgb2YgdGhlIGF0dHJpYnV0ZSBsaXN0ZWQgYmVsb3cuICAqLworICBpZiAoYXR0ci0+Y29kZSAhPSBEV19BVF9sb2NhdGlvbgorICAgICAgJiYgYXR0ci0+Y29kZSAhPSBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbgorICAgICAgJiYgYXR0ci0+Y29kZSAhPSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbgorICAgICAgJiYgYXR0ci0+Y29kZSAhPSBEV19BVF9zdHJpbmdfbGVuZ3RoCisgICAgICAmJiBhdHRyLT5jb2RlICE9IERXX0FUX3VzZV9sb2NhdGlvbgorICAgICAgJiYgYXR0ci0+Y29kZSAhPSBEV19BVF9yZXR1cm5fYWRkcikKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX1dST05HX0FUVFIpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgLyogTXVzdCBoYXZlIHRoZSBmb3JtIGRhdGE0IG9yIGRhdGE4IHdoaWNoIGFjdCBhcyBhbiBvZmZzZXQuICAqLworICBpZiAoYXR0ci0+Zm9ybSA9PSBEV19GT1JNX2RhdGE0KQorICAgIG9mZnNldCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBhdHRyLT52YWxwKTsKKyAgZWxzZSBpZiAobGlrZWx5IChhdHRyLT5mb3JtID09IERXX0ZPUk1fZGF0YTgpKQorICAgIG9mZnNldCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCBhdHRyLT52YWxwKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9fREFUQSk7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAvKiBDaGVjayB3aGV0aGVyIHRoZSAuZGVidWdfbG9jIHNlY3Rpb24gaXMgYXZhaWxhYmxlLiAgKi8KKyAgaWYgKHVubGlrZWx5IChkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19sb2NdLmFkZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIC8qIFRoaXMgaXMgdGhlIHBhcnQgb2YgdGhlIC5kZWJ1Z19sb2Mgc2VjdGlvbiB3ZSBjYW4gcmVhZC4gICovCisgIGxvY3AgPSAoRHdhcmZfU21hbGwgKikgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfbG9jXS5hZGRyICsgb2Zmc2V0OworICBvZmZzZXRfZW5kID0gb2Zmc2V0ICsgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfbG9jXS5zaXplOworCisgIGxvY2Rlc2NsaXN0ID0gTlVMTDsKKyAgbiA9IDA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIER3YXJmX0FkZHIgbG9wYzsKKyAgICAgIER3YXJmX0FkZHIgaGlwYzsKKyAgICAgIER3YXJmX1B0ciBkYXRhOworICAgICAgRHdhcmZfVW5zaWduZWQgbGVuMjsKKyAgICAgIHN0cnVjdCBsb2NkZXNjbGlzdCAqbmV3ZGVzYzsKKyAgICAgIER3YXJmX1NtYWxsICpsb2NwOworICAgICAgRHdhcmZfU21hbGwgKmJsa2VuZHA7CisgICAgICBEd2FyZl9TbWFsbCAqYmxrc3RhcnRwOworCisgICAgICBpZiAodW5saWtlbHkgKGR3YXJmX2dldF9sb2NsaXN0X2VudHJ5IChkYmcsIG9mZnNldCwgJmhpcGMsICZsb3BjLCAmZGF0YSwKKwkJCQkJICAgICAmbGVuMiwgJm9mZnNldCwgZXJyb3IpCisJCSAgICAhPSBEV19ETFZfT0spKQorCXJldHVybiBEV19ETFZfRVJST1I7CisKKyAgICAgIC8qIERvZXMgdGhpcyBzaWduYWwgdGhlIGVuZD8gICovCisgICAgICBpZiAobG9wYyA9PSAwICYmIGhpcGMgPT0gMCkKKwlicmVhazsKKworICAgICAgbG9jcCA9IGRhdGE7CisgICAgICBibGtzdGFydHAgPSBsb2NwOworICAgICAgYmxrZW5kcCA9IGxvY3AgKyBsZW4yOworCisgICAgICAvKiBDcmVhdGUgYSBuZXcgTG9jZGVzYyBlbnRyeS4gICovCisgICAgICBuZXdkZXNjID0gKHN0cnVjdCBsb2NkZXNjbGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IGxvY2Rlc2NsaXN0KSk7CisgICAgICBuZXdkZXNjLT5sb3BjID0gbG9wYzsKKyAgICAgIG5ld2Rlc2MtPmhpcGMgPSBoaXBjOworICAgICAgbmV3ZGVzYy0+Y2VudHMgPSAwOworICAgICAgbmV3ZGVzYy0+cyA9IE5VTEw7CisgICAgICBuZXdkZXNjLT5uZXh0ID0gbG9jZGVzY2xpc3Q7CisgICAgICBsb2NkZXNjbGlzdCA9IG5ld2Rlc2M7CisgICAgICArK247CisKKyAgICAgIC8qIERlY29kZSB0aGUgb3Bjb2Rlcy4gIEl0IGlzIHBvc3NpYmxlIGluIHNvbWUgc2l0dWF0aW9ucyB0bworICAgICAgICAgaGF2ZSBhIGJsb2NrIG9mIHNpemUgemVyby4gICovCisgICAgICB3aGlsZSAobG9jcCA8IGJsa2VuZHApCisJeworCSAgc3RydWN0IGxvY2xpc3QgKm5ld2xvYzsKKworCSAgbmV3bG9jID0gKHN0cnVjdCBsb2NsaXN0ICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgbG9jbGlzdCkpOworCSAgbmV3bG9jLT5udW1iZXIgPSAwOworCSAgbmV3bG9jLT5udW1iZXIyID0gMDsKKwkgIG5ld2xvYy0+b2Zmc2V0ID0gbG9jcCAtIGJsa3N0YXJ0cDsKKwkgIG5ld2xvYy0+bmV4dCA9IG5ld2Rlc2MtPnM7CisJICBuZXdkZXNjLT5zID0gbmV3bG9jOworCSAgKytuZXdkZXNjLT5jZW50czsKKworCSAgbmV3bG9jLT5hdG9tID0gKmxvY3A7CisJICBzd2l0Y2ggKCpsb2NwKyspCisJICAgIHsKKwkgICAgY2FzZSBEV19PUF9hZGRyOgorCSAgICAgIC8qIEFkZHJlc3MsIGRlcGVuZHMgb24gYWRkcmVzcyBzaXplIG9mIENVLiAgKi8KKwkgICAgICBpZiAoY3UtPmFkZHJlc3Nfc2l6ZSA9PSA0KQorCQl7CisJCSAgaWYgKHVubGlrZWx5IChsb2NwICsgNCA+IGJsa2VuZHApKQorCQkgICAgeworCQkgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCQkgICAgfQorCQkgIG5ld2xvYy0+bnVtYmVyID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGxvY3ApOworCQkgIGxvY3AgKz0gNDsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmICh1bmxpa2VseSAobG9jcCArIDggPiBibGtlbmRwKSkKKwkJICAgIHsKKwkJICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkJICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkJICAgIH0KKwkJICBuZXdsb2MtPm51bWJlciA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCBsb2NwKTsKKwkJICBsb2NwICs9IDg7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERXX09QX2RlcmVmOgorCSAgICBjYXNlIERXX09QX2R1cDoKKwkgICAgY2FzZSBEV19PUF9kcm9wOgorCSAgICBjYXNlIERXX09QX292ZXI6CisJICAgIGNhc2UgRFdfT1Bfc3dhcDoKKwkgICAgY2FzZSBEV19PUF9yb3Q6CisJICAgIGNhc2UgRFdfT1BfeGRlcmVmOgorCSAgICBjYXNlIERXX09QX2FiczoKKwkgICAgY2FzZSBEV19PUF9hbmQ6CisJICAgIGNhc2UgRFdfT1BfZGl2OgorCSAgICBjYXNlIERXX09QX21pbnVzOgorCSAgICBjYXNlIERXX09QX21vZDoKKwkgICAgY2FzZSBEV19PUF9tdWw6CisJICAgIGNhc2UgRFdfT1BfbmVnOgorCSAgICBjYXNlIERXX09QX25vdDoKKwkgICAgY2FzZSBEV19PUF9vcjoKKwkgICAgY2FzZSBEV19PUF9wbHVzOgorCSAgICBjYXNlIERXX09QX3NobDoKKwkgICAgY2FzZSBEV19PUF9zaHI6CisJICAgIGNhc2UgRFdfT1Bfc2hyYToKKwkgICAgY2FzZSBEV19PUF94b3I6CisJICAgIGNhc2UgRFdfT1BfZXE6CisJICAgIGNhc2UgRFdfT1BfZ2U6CisJICAgIGNhc2UgRFdfT1BfZ3Q6CisJICAgIGNhc2UgRFdfT1BfbGU6CisJICAgIGNhc2UgRFdfT1BfbHQ6CisJICAgIGNhc2UgRFdfT1BfbmU6CisJICAgIGNhc2UgRFdfT1BfbGl0MDoKKwkgICAgY2FzZSBEV19PUF9saXQxOgorCSAgICBjYXNlIERXX09QX2xpdDI6CisJICAgIGNhc2UgRFdfT1BfbGl0MzoKKwkgICAgY2FzZSBEV19PUF9saXQ0OgorCSAgICBjYXNlIERXX09QX2xpdDU6CisJICAgIGNhc2UgRFdfT1BfbGl0NjoKKwkgICAgY2FzZSBEV19PUF9saXQ3OgorCSAgICBjYXNlIERXX09QX2xpdDg6CisJICAgIGNhc2UgRFdfT1BfbGl0OToKKwkgICAgY2FzZSBEV19PUF9saXQxMDoKKwkgICAgY2FzZSBEV19PUF9saXQxMToKKwkgICAgY2FzZSBEV19PUF9saXQxMjoKKwkgICAgY2FzZSBEV19PUF9saXQxMzoKKwkgICAgY2FzZSBEV19PUF9saXQxNDoKKwkgICAgY2FzZSBEV19PUF9saXQxNToKKwkgICAgY2FzZSBEV19PUF9saXQxNjoKKwkgICAgY2FzZSBEV19PUF9saXQxNzoKKwkgICAgY2FzZSBEV19PUF9saXQxODoKKwkgICAgY2FzZSBEV19PUF9saXQxOToKKwkgICAgY2FzZSBEV19PUF9saXQyMDoKKwkgICAgY2FzZSBEV19PUF9saXQyMToKKwkgICAgY2FzZSBEV19PUF9saXQyMjoKKwkgICAgY2FzZSBEV19PUF9saXQyMzoKKwkgICAgY2FzZSBEV19PUF9saXQyNDoKKwkgICAgY2FzZSBEV19PUF9saXQyNToKKwkgICAgY2FzZSBEV19PUF9saXQyNjoKKwkgICAgY2FzZSBEV19PUF9saXQyNzoKKwkgICAgY2FzZSBEV19PUF9saXQyODoKKwkgICAgY2FzZSBEV19PUF9saXQyOToKKwkgICAgY2FzZSBEV19PUF9saXQzMDoKKwkgICAgY2FzZSBEV19PUF9saXQzMToKKwkgICAgY2FzZSBEV19PUF9yZWcwOgorCSAgICBjYXNlIERXX09QX3JlZzE6CisJICAgIGNhc2UgRFdfT1BfcmVnMjoKKwkgICAgY2FzZSBEV19PUF9yZWczOgorCSAgICBjYXNlIERXX09QX3JlZzQ6CisJICAgIGNhc2UgRFdfT1BfcmVnNToKKwkgICAgY2FzZSBEV19PUF9yZWc2OgorCSAgICBjYXNlIERXX09QX3JlZzc6CisJICAgIGNhc2UgRFdfT1BfcmVnODoKKwkgICAgY2FzZSBEV19PUF9yZWc5OgorCSAgICBjYXNlIERXX09QX3JlZzEwOgorCSAgICBjYXNlIERXX09QX3JlZzExOgorCSAgICBjYXNlIERXX09QX3JlZzEyOgorCSAgICBjYXNlIERXX09QX3JlZzEzOgorCSAgICBjYXNlIERXX09QX3JlZzE0OgorCSAgICBjYXNlIERXX09QX3JlZzE1OgorCSAgICBjYXNlIERXX09QX3JlZzE2OgorCSAgICBjYXNlIERXX09QX3JlZzE3OgorCSAgICBjYXNlIERXX09QX3JlZzE4OgorCSAgICBjYXNlIERXX09QX3JlZzE5OgorCSAgICBjYXNlIERXX09QX3JlZzIwOgorCSAgICBjYXNlIERXX09QX3JlZzIxOgorCSAgICBjYXNlIERXX09QX3JlZzIyOgorCSAgICBjYXNlIERXX09QX3JlZzIzOgorCSAgICBjYXNlIERXX09QX3JlZzI0OgorCSAgICBjYXNlIERXX09QX3JlZzI1OgorCSAgICBjYXNlIERXX09QX3JlZzI2OgorCSAgICBjYXNlIERXX09QX3JlZzI3OgorCSAgICBjYXNlIERXX09QX3JlZzI4OgorCSAgICBjYXNlIERXX09QX3JlZzI5OgorCSAgICBjYXNlIERXX09QX3JlZzMwOgorCSAgICBjYXNlIERXX09QX3JlZzMxOgorCSAgICBjYXNlIERXX09QX25vcDoKKwkgICAgY2FzZSBEV19PUF9wdXNoX29iamVjdF9hZGRyZXNzOgorCSAgICBjYXNlIERXX09QX2NhbGxfcmVmOgorCSAgICAgIC8qIE5vIG9wZXJhbmQuICAqLworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFdfT1BfY29uc3QxdToKKwkgICAgY2FzZSBEV19PUF9waWNrOgorCSAgICBjYXNlIERXX09QX2RlcmVmX3NpemU6CisJICAgIGNhc2UgRFdfT1BfeGRlcmVmX3NpemU6CisJICAgICAgaWYgKHVubGlrZWx5IChsb2NwID49IGJsa2VuZHApKQorCQl7CisJCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkJICByZXR1cm4gRFdfRExWX0VSUk9SOworCQl9CisJICAgICAgbmV3bG9jLT5udW1iZXIgPSAqKCh1aW50OF90ICopIGxvY3ApKys7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEV19PUF9jb25zdDFzOgorCSAgICAgIGlmICh1bmxpa2VseSAobG9jcCA+PSBibGtlbmRwKSkKKwkJeworCQkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkJfQorCSAgICAgIG5ld2xvYy0+bnVtYmVyID0gKigoaW50OF90ICopIGxvY3ApKys7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEV19PUF9jb25zdDJ1OgorCSAgICAgIGlmICh1bmxpa2VseSAobG9jcCArIDIgPiBibGtlbmRwKSkKKwkJeworCQkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkJfQorCSAgICAgIG5ld2xvYy0+bnVtYmVyID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkIChkYmcsIGxvY3ApOworCSAgICAgIGxvY3AgKz0gMjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERXX09QX2NvbnN0MnM6CisJICAgIGNhc2UgRFdfT1Bfc2tpcDoKKwkgICAgY2FzZSBEV19PUF9icmE6CisJICAgIGNhc2UgRFdfT1BfY2FsbDI6CisJICAgICAgaWYgKHVubGlrZWx5IChsb2NwICsgMiA+IGJsa2VuZHApKQorCQl7CisJCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkJICByZXR1cm4gRFdfRExWX0VSUk9SOworCQl9CisJICAgICAgbmV3bG9jLT5udW1iZXIgPSByZWFkXzJzYnl0ZV91bmFsaWduZWQgKGRiZywgbG9jcCk7CisJICAgICAgbG9jcCArPSAyOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFdfT1BfY29uc3Q0dToKKwkgICAgICBpZiAodW5saWtlbHkgKGxvY3AgKyA0ID4gYmxrZW5kcCkpCisJCXsKKwkJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgIHJldHVybiBEV19ETFZfRVJST1I7CisJCX0KKwkgICAgICBuZXdsb2MtPm51bWJlciA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBsb2NwKTsKKwkgICAgICBsb2NwICs9IDQ7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEV19PUF9jb25zdDRzOgorCSAgICBjYXNlIERXX09QX2NhbGw0OgorCSAgICAgIGlmICh1bmxpa2VseSAobG9jcCArIDQgPiBibGtlbmRwKSkKKwkJeworCQkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkJfQorCSAgICAgIG5ld2xvYy0+bnVtYmVyID0gcmVhZF80c2J5dGVfdW5hbGlnbmVkIChkYmcsIGxvY3ApOworCSAgICAgIGxvY3AgKz0gNDsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERXX09QX2NvbnN0OHU6CisJICAgICAgaWYgKHVubGlrZWx5IChsb2NwICsgOCA+IGJsa2VuZHApKQorCQl7CisJCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkJICByZXR1cm4gRFdfRExWX0VSUk9SOworCQl9CisJICAgICAgbmV3bG9jLT5udW1iZXIgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgbG9jcCk7CisJICAgICAgbG9jcCArPSA4OworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFdfT1BfY29uc3Q4czoKKwkgICAgICBpZiAodW5saWtlbHkgKGxvY3AgKyA4ID4gYmxrZW5kcCkpCisJCXsKKwkJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgIHJldHVybiBEV19ETFZfRVJST1I7CisJCX0KKwkgICAgICBuZXdsb2MtPm51bWJlciA9IHJlYWRfOHNieXRlX3VuYWxpZ25lZCAoZGJnLCBsb2NwKTsKKwkgICAgICBsb2NwICs9IDg7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEV19PUF9jb25zdHU6CisJICAgIGNhc2UgRFdfT1BfcGx1c191Y29uc3Q6CisJICAgIGNhc2UgRFdfT1BfcmVneDoKKwkgICAgY2FzZSBEV19PUF9waWVjZToKKwkgICAgICAvKiBYWFggQ2hlY2sgc2l6ZS4gICovCisJICAgICAgZ2V0X3VsZWIxMjggKG5ld2xvYy0+bnVtYmVyLCBsb2NwKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERXX09QX2NvbnN0czoKKwkgICAgY2FzZSBEV19PUF9icmVnMDoKKwkgICAgY2FzZSBEV19PUF9icmVnMToKKwkgICAgY2FzZSBEV19PUF9icmVnMjoKKwkgICAgY2FzZSBEV19PUF9icmVnMzoKKwkgICAgY2FzZSBEV19PUF9icmVnNDoKKwkgICAgY2FzZSBEV19PUF9icmVnNToKKwkgICAgY2FzZSBEV19PUF9icmVnNjoKKwkgICAgY2FzZSBEV19PUF9icmVnNzoKKwkgICAgY2FzZSBEV19PUF9icmVnODoKKwkgICAgY2FzZSBEV19PUF9icmVnOToKKwkgICAgY2FzZSBEV19PUF9icmVnMTA6CisJICAgIGNhc2UgRFdfT1BfYnJlZzExOgorCSAgICBjYXNlIERXX09QX2JyZWcxMjoKKwkgICAgY2FzZSBEV19PUF9icmVnMTM6CisJICAgIGNhc2UgRFdfT1BfYnJlZzE0OgorCSAgICBjYXNlIERXX09QX2JyZWcxNToKKwkgICAgY2FzZSBEV19PUF9icmVnMTY6CisJICAgIGNhc2UgRFdfT1BfYnJlZzE3OgorCSAgICBjYXNlIERXX09QX2JyZWcxODoKKwkgICAgY2FzZSBEV19PUF9icmVnMTk6CisJICAgIGNhc2UgRFdfT1BfYnJlZzIwOgorCSAgICBjYXNlIERXX09QX2JyZWcyMToKKwkgICAgY2FzZSBEV19PUF9icmVnMjI6CisJICAgIGNhc2UgRFdfT1BfYnJlZzIzOgorCSAgICBjYXNlIERXX09QX2JyZWcyNDoKKwkgICAgY2FzZSBEV19PUF9icmVnMjU6CisJICAgIGNhc2UgRFdfT1BfYnJlZzI2OgorCSAgICBjYXNlIERXX09QX2JyZWcyNzoKKwkgICAgY2FzZSBEV19PUF9icmVnMjg6CisJICAgIGNhc2UgRFdfT1BfYnJlZzI5OgorCSAgICBjYXNlIERXX09QX2JyZWczMDoKKwkgICAgY2FzZSBEV19PUF9icmVnMzE6CisJICAgIGNhc2UgRFdfT1BfZmJyZWc6CisJICAgICAgLyogWFhYIENoZWNrIHNpemUuICAqLworCSAgICAgIGdldF9zbGViMTI4IChuZXdsb2MtPm51bWJlciwgbG9jcCk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEV19PUF9icmVneDoKKwkgICAgICAvKiBYWFggQ2hlY2sgc2l6ZS4gICovCisJICAgICAgZ2V0X3VsZWIxMjggKG5ld2xvYy0+bnVtYmVyLCBsb2NwKTsKKwkgICAgICBnZXRfc2xlYjEyOCAobmV3bG9jLT5udW1iZXIyLCBsb2NwKTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChuID09IDApKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgbm90IGFsbG93ZWQuCisKKwkgWFhYIElzIGl0PyAgKi8KKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAvKiBBbGxvY2F0ZSB0aGUgYXJyYXkuICAqLworICByZXN1bHQgPSAoRHdhcmZfTG9jZGVzYyAqKSBtYWxsb2MgKG4gKiBzaXplb2YgKER3YXJmX0xvY2Rlc2MpKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgLyogU3RvcmUgdGhlIHJlc3VsdC4gICovCisgICpsbGJ1ZiA9IHJlc3VsdDsKKyAgKmxpc3RsZW4gPSBuOworCisgIGRvCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGNlbnRzOworICAgICAgc3RydWN0IGxvY2xpc3QgKnM7CisKKyAgICAgIC8qIFdlIHBvcHVsYXRlIHRoZSBhcnJheSBmcm9tIHRoZSBiYWNrIHNpbmNlIHRoZSBsaXN0IGlzCisgICAgICAgICBiYWNrd2FyZHMuICAqLworICAgICAgLS1uOworCisgICAgICByZXN1bHRbbl0ubGRfbG9wYyA9IGxvY2Rlc2NsaXN0LT5sb3BjOworICAgICAgcmVzdWx0W25dLmxkX2hpcGMgPSBsb2NkZXNjbGlzdC0+aGlwYzsKKyAgICAgIHJlc3VsdFtuXS5sZF9jZW50cyA9IGNlbnRzID0gbG9jZGVzY2xpc3QtPmNlbnRzOworICAgICAgcmVzdWx0W25dLmxkX3MgPSAoRHdhcmZfTG9jICopIG1hbGxvYyAoY2VudHMgKiBzaXplb2YgKER3YXJmX0xvYykpOworICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorCXsKKwkgIC8qIFhYWCBTaG91bGQgYmUgYm90aGVyIGZyZWVpbmcgbWVtb3J5PyAgKi8KKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwl9CisKKyAgICAgIHMgPSBsb2NkZXNjbGlzdC0+czsKKyAgICAgIHdoaWxlIChjZW50cy0tID4gMCkKKwl7CisJICAvKiBUaGlzIGxpc3QgaXMgYWxzbyBiYWNrd2FyZHMuICAqLworCSAgcmVzdWx0W25dLmxkX3NbY2VudHNdLmxyX2F0b20gPSBzLT5hdG9tOworCSAgcmVzdWx0W25dLmxkX3NbY2VudHNdLmxyX251bWJlciA9IHMtPm51bWJlcjsKKwkgIHJlc3VsdFtuXS5sZF9zW2NlbnRzXS5scl9udW1iZXIyID0gcy0+bnVtYmVyMjsKKwkgIHJlc3VsdFtuXS5sZF9zW2NlbnRzXS5scl9vZmZzZXQgPSBzLT5vZmZzZXQ7CisJICBzID0gcy0+bmV4dDsKKwl9CisKKyAgICAgIGxvY2Rlc2NsaXN0ID0gbG9jZGVzY2xpc3QtPm5leHQ7CisgICAgfQorICB3aGlsZSAobiA+IDApOworCisgIC8qIFdlIGRpZCBpdC4gICovCisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9sb3dwYy5jIGIvbGliZHdhcmYvZHdhcmZfbG93cGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjFlZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfbG93cGMuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogUmV0dXJuIGxvdyBwcm9ncmFtIGNvdW50ZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGRpZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitpbnQKK2R3YXJmX2xvd3BjIChkaWUsIHJldHVybl9sb3dwYywgZXJyb3IpCisgICAgIER3YXJmX0RpZSBkaWU7CisgICAgIER3YXJmX0FkZHIgKnJldHVybl9sb3dwYzsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9EZWJ1ZyBkYmcgPSBkaWUtPmN1LT5kYmc7CisgIER3YXJmX1NtYWxsICpkaWVfYWRkcjsKKyAgRHdhcmZfV29yZCB1MTI4OworICBEd2FyZl9BYmJyZXYgYWJicmV2OworICBEd2FyZl9TbWFsbCAqYXR0cnA7CisKKyAgLyogQWRkcmVzcyBvZiB0aGUgZ2l2ZW4gZGllLiAgKi8KKyAgZGllX2FkZHIgPSBkaWUtPmFkZHI7CisKKyAgLyogR2V0IGFiYnJldiBjb2RlLiAgKi8KKyAgZ2V0X3VsZWIxMjggKHUxMjgsIGRpZV9hZGRyKTsKKyAgLyogIEFuZCBnZXQgdGhlIGFiYnJldmlhdGlvbiBpdHNlbGYuICAqLworICBhYmJyZXYgPSBfX2xpYmR3YXJmX2dldF9hYmJyZXYgKGRiZywgZGllLT5jdSwgdTEyOCwgZXJyb3IpOworICBpZiAoYWJicmV2ID09IE5VTEwpCisgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIHN0YXJ0LiAgKi8KKyAgYXR0cnAgPSBhYmJyZXYtPmF0dHJwOworCisgIC8qIFNlYXJjaCB0aGUgbmFtZSBhdHRyaWJ1dGUuICAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBEd2FyZl9Xb3JkIGF0dHJfbmFtZTsKKyAgICAgIER3YXJmX1dvcmQgYXR0cl9mb3JtOworCisgICAgICAvKiBBcmUgd2Ugc3RpbGwgaW4gYm91bmRzPyAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoYXR0cnAKKwkJICAgID49ICgoRHdhcmZfU21hbGwgKikgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfYWJicmV2XS5hZGRyCisJCQkrIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2FiYnJldl0uc2l6ZSkpKQorCXsKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICByZXR1cm4gRFdfRExWX0VSUk9SOworCX0KKworICAgICAgLyogR2V0IGF0dHJpYnV0ZSBuYW1lIGFuZCBmb3JtLgorCisJIFhYWCBXZSBkb24ndCBjaGVjayB3aGV0aGVyIHRoaXMgcmVhZHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlCisJIHNlY3Rpb24uICAqLworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfbmFtZSwgYXR0cnApOworICAgICAgZ2V0X3VsZWIxMjggKGF0dHJfZm9ybSwgYXR0cnApOworCisgICAgICAvKiBXZSBjYW4gc3RvcCBpZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIHdpdGggdmFsdWUgemVyby4gICovCisgICAgICBpZiAoYXR0cl9uYW1lID09IDAgJiYgYXR0cl9mb3JtID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIElzIHRoaXMgdGhlIG5hbWUgYXR0cmlidXRlPyAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoYXR0cl9uYW1lID09IERXX0FUX2xvd19wYykpCisJeworCSAgaWYgKHVubGlrZWx5IChhdHRyX2Zvcm0gIT0gRFdfRk9STV9hZGRyKSkKKwkgICAgeworCSAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkgICAgfQorCisJICBpZiAoZGllLT5jdS0+YWRkcmVzc19zaXplID09IDQpCisJICAgICpyZXR1cm5fbG93cGMgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGllX2FkZHIpOworCSAgZWxzZQorCSAgICAqcmV0dXJuX2xvd3BjID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRpZV9hZGRyKTsKKworCSAgcmV0dXJuIERXX0RMVl9PSzsKKwl9CisKKyAgICAgIC8qIFNraXAgb3ZlciB0aGUgcmVzdCBvZiB0aGlzIGF0dHJpYnV0ZSAoaWYgdGhlcmUgaXMgYW55KS4gICovCisgICAgICBpZiAoYXR0cl9mb3JtICE9IDApCisJeworCSAgc2l6ZV90IGxlbjsKKworCSAgaWYgKHVubGlrZWx5IChfX2xpYmR3YXJmX2Zvcm1fdmFsX2xlbiAoZGJnLCBkaWUtPmN1LCBhdHRyX2Zvcm0sCisJCQkJCQkgZGllX2FkZHIsICZsZW4sIGVycm9yKQorCQkJIT0gRFdfRExWX09LKSkKKwkgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworCSAgZGllX2FkZHIgKz0gbGVuOworCX0KKyAgICB9CisKKyAgLyogTm8gc3VjaCBhdHRyaWJ1dGUgcHJlc2VudC4gICovCisgIHJldHVybiBEV19ETFZfTk9fRU5UUlk7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9uZXh0X2N1X2hlYWRlci5jIGIvbGliZHdhcmYvZHdhcmZfbmV4dF9jdV9oZWFkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGJiMzllCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfbmV4dF9jdV9oZWFkZXIuYwpAQCAtMCwwICsxLDIzNCBAQAorLyogR2V0IG9mZnNldCBvZiBuZXh0IGNvbXBpbGF0aW9uIHVuaXQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKKy8qIEEgZ29vZCBpbml0aWFsIHNpemUgZm9yIHRoZSBhYmJyZXZpYXRpb24gaGFzaGluZyB0YWJsZS4gICovCisjZGVmaW5lIERFRkFVTFRfQUJCUkVWX0hBU0hfU0laRQkyNTcKKworCitpbnQKK2ludGVybmFsX2Z1bmN0aW9uCitfX2xpYmR3YXJmX2dldF9jdV9hdF9vZmZzZXQgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfVW5zaWduZWQgb2Zmc2V0LAorCQkJICAgICBEd2FyZl9DVV9JbmZvICpyZXN1bHRfY3UsIER3YXJmX0Vycm9yICplcnJvcikKK3sKKyAgRHdhcmZfQ1VfSW5mbyBjdTsKKyAgRHdhcmZfU21hbGwgKmN1X2J5dGVzOworICBEd2FyZl9VbnNpZ25lZCBsZW5ndGg7CisgIER3YXJmX0hhbGYgb2Zmc2V0X3NpemU7CisKKyAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBmb3IgYXQKKyAgICAgbGVhc3QgdGhlIGluaXRpYWwgd29yZC4gIFdlIGNhbm5vdCB0ZXN0IHRoZSByZXN0IHNpbmNlIHdlIGRvbid0CisgICAgIGtub3cgeWV0IHdoZXRoZXIgdGhpcyBpcyBhIDY0LWJpdCBvYmplY3Qgb3Igbm90LiAgKi8KKyAgaWYgKHVubGlrZWx5IChvZmZzZXQgKyA0ID49IGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2luZm9dLnNpemUpKQorICAgIHsKKyAgICAgIGRiZy0+Y3VfbGlzdF9jdXJyZW50ID0gTlVMTDsKKyAgICAgIHJldHVybiBEV19ETFZfTk9fRU5UUlk7CisgICAgfQorCisgIC8qIFRoaXMgcG9pbnRzIGludG8gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgQ1UgZW50cnkuICAqLworICBjdV9ieXRlcyA9IChEd2FyZl9TbWFsbCAqKSBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19pbmZvXS5hZGRyICsgb2Zmc2V0OworCisgIC8qIFRoZSBmb3JtYXQgb2YgdGhlIENVIGhlYWRlciBpcyBkZXNjcmliZWQgaW4gZHdhcmYycDEgNy41LjE6CisKKyAgICAgMS4gIEEgNC1ieXRlIG9yIDEyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGxlbmd0aAorCSBvZiB0aGUgLmRlYnVnX2luZm8gY29udHJpYnV0aW9uIGZvciB0aGF0IGNvbXBpbGF0aW9uIHVuaXQsIG5vdAorCSBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYuIEluIHRoZSAzMi1iaXQgRFdBUkYgZm9ybWF0LAorCSB0aGlzIGlzIGEgNC1ieXRlIHVuc2lnbmVkIGludGVnZXIgKHdoaWNoIG11c3QgYmUgbGVzcyB0aGFuCisJIDB4ZmZmZmZmMDApOyBpbiB0aGUgNjQtYml0IERXQVJGIGZvcm1hdCwgdGhpcyBjb25zaXN0cyBvZiB0aGUKKwkgNC1ieXRlIHZhbHVlIDB4ZmZmZmZmZmYgZm9sbG93ZWQgYnkgYW4gOC1ieXRlIHVuc2lnbmVkIGludGVnZXIKKwkgdGhhdCBnaXZlcyB0aGUgYWN0dWFsIGxlbmd0aCAoc2VlIFNlY3Rpb24gNy40KS4KKworICAgICAgMi4gQSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlCisJIERXQVJGIGluZm9ybWF0aW9uIGZvciB0aGF0IGNvbXBpbGF0aW9uIHVuaXQuIEZvciBEV0FSRiBWZXJzaW9uCisJIDIuMSwgdGhlIHZhbHVlIGluIHRoaXMgZmllbGQgaXMgMi4KKworICAgICAgMy4gQSA0LWJ5dGUgb3IgOC1ieXRlIHVuc2lnbmVkIG9mZnNldCBpbnRvIHRoZSAuZGVidWdfYWJicmV2CisJIHNlY3Rpb24uIFRoaXMgb2Zmc2V0IGFzc29jaWF0ZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCBhCisJIHBhcnRpY3VsYXIgc2V0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBhYmJyZXZpYXRpb25zLiBJbgorCSB0aGUgMzItYml0IERXQVJGIGZvcm1hdCwgdGhpcyBpcyBhIDQtYnl0ZSB1bnNpZ25lZCBsZW5ndGg7IGluCisJIHRoZSA2NC1iaXQgRFdBUkYgZm9ybWF0LCB0aGlzIGlzIGFuIDgtYnl0ZSB1bnNpZ25lZCBsZW5ndGggKHNlZQorCSBTZWN0aW9uIDcuNCkuCisKKyAgICAgIDQuIEEgMS1ieXRlIHVuc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBzaXplIGluIGJ5dGVzIG9mCisJIGFuIGFkZHJlc3Mgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIElmIHRoZSBzeXN0ZW0gdXNlcworCSBzZWdtZW50ZWQgYWRkcmVzc2luZywgdGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBzaXplIG9mIHRoZQorCSBvZmZzZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiAgKi8KKyAgbGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGN1X2J5dGVzKTsKKyAgY3VfYnl0ZXMgKz0gNDsKKyAgb2Zmc2V0X3NpemUgPSA0OworICBpZiAobGVuZ3RoID09IDB4ZmZmZmZmZmYpCisgICAgb2Zmc2V0X3NpemUgPSA4OworCisgIC8qIE5vdyB3ZSBrbm93IGhvdyBsYXJnZSB0aGUgaGVhZGVyIGlzLiAgTm90ZSB0aGUgdHJpY2sgaW4gdGhlCisgICAgIGNvbXB1dGF0aW9uLiAgSWYgdGhlIG9mZnNldF9zaXplIGlzIDQgdGhlICctIDQnIHRlcm0gdW5kb2VzIHRoZQorICAgICAnMiAqJy4gIElmIG9mZnNldF9zaXplIGlzIDggdGhpcyB0ZXJtIGNvbXB1dGVzIHRoZSBzaXplIG9mIHRoZQorICAgICBlc2NhcGUgdmFsdWUgcGx1cyB0aGUgOCBieXRlIG9mZnNldC4gICovCisgIGlmICh1bmxpa2VseSAob2Zmc2V0ICsgMiAqIG9mZnNldF9zaXplIC0gNCArIHNpemVvZiAoRHdhcmZfSGFsZikKKwkJKyBvZmZzZXRfc2l6ZSArIHNpemVvZiAoRHdhcmZfU21hbGwpCisJCT49IGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2luZm9dLnNpemUpKQorICAgIHsKKyAgICAgIGRiZy0+Y3VfbGlzdF9jdXJyZW50ID0gTlVMTDsKKyAgICAgIHJldHVybiBEV19ETFZfTk9fRU5UUlk7CisgICAgfQorCisgIGlmIChsZW5ndGggPT0gMHhmZmZmZmZmZikKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgNjQtYml0IERXQVJGIGZvcm1hdC4gICovCisgICAgICBsZW5ndGggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgY3VfYnl0ZXMpOworICAgICAgY3VfYnl0ZXMgKz0gODsKKyAgICB9CisKKyAgLyogV2Uga25vdyB3ZSBoYXZlIGVub3VnaCByb29tIGluIHRoZSAuZGVidWdfc2VjdGlvbi4gIEFsbG9jYXRlIHRoZQorICAgICByZXN1bHQgZGF0YSBzdHJ1Y3R1cmUuICAqLworICBjdSA9IChEd2FyZl9DVV9JbmZvKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IER3YXJmX0NVX0luZm9fcykpOworICBpZiAoY3UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIC8qIFN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAgKi8KKyAgY3UtPm9mZnNldCA9IG9mZnNldDsKKyAgY3UtPm9mZnNldF9zaXplID0gb2Zmc2V0X3NpemU7CisgIGN1LT5sZW5ndGggPSBsZW5ndGg7CisKKyAgLyogU3RvcmUgdGhlIHZlcnNpb24gc3RhbXAuICBBbHdheXMgYSAxNi1iaXQgdmFsdWUuICAqLworICBjdS0+dmVyc2lvbl9zdGFtcCA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoZGJnLCBjdV9ieXRlcyk7CisgIGN1X2J5dGVzICs9IDI7CisKKyAgLyogR2V0IG9mZnNldCBpbiAuZGVidWdfYWJicmV2LiAgTm90ZSB0aGF0IHRoZSBzaXplIG9mIHRoZSBlbnRyeQorICAgICBkZXBlbmRzIG9uIHdoZXRoZXIgdGhpcyBpcyBhIDMyLWJpdCBvciA2NC1iaXQgRFdBUkYgZGVmaW5pdGlvbi4gICovCisgIGlmIChvZmZzZXRfc2l6ZSA9PSA0KQorICAgIGN1LT5hYmJyZXZfb2Zmc2V0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGN1X2J5dGVzKTsKKyAgZWxzZQorICAgIGN1LT5hYmJyZXZfb2Zmc2V0ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGN1X2J5dGVzKTsKKyAgY3VfYnl0ZXMgKz0gb2Zmc2V0X3NpemU7CisgIGN1LT5sYXN0X2FiYnJldl9vZmZzZXQgPSBjdS0+YWJicmV2X29mZnNldDsKKworICAvKiBUaGUgYWRkcmVzcyBzaXplLiAgQWx3YXlzIGFuIDgtYml0IHZhbHVlLiAgKi8KKyAgY3UtPmFkZHJlc3Nfc2l6ZSA9ICpjdV9ieXRlcysrOworCisgIC8qIFN0b3JlIHRoZSBoZWFkZXIgbGVuZ3RoLiAgKi8KKyAgY3UtPmhlYWRlcl9sZW5ndGggPSAoY3VfYnl0ZXMKKwkJICAgICAgIC0gKChEd2FyZl9TbWFsbCAqKSBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19pbmZvXS5hZGRyCisJCQkgICsgb2Zmc2V0KSk7CisKKyAgLyogSW5pdGlsaXplIGEgZmV3IG1vcmUgbWVtYmVycy4gICovCisgIGlmICh1bmxpa2VseSAoRHdhcmZfQWJicmV2X0hhc2hfaW5pdCAoJmN1LT5hYmJyZXZfaGFzaCwKKwkJCQkJREVGQVVMVF9BQkJSRVZfSEFTSF9TSVpFKSAhPSAwKSkKKyAgICB7CisgICAgICBmcmVlIChjdSk7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIC8qIFJlbWVtYmVyIHRoZSBkZWJ1Z2dpbmcgaGFuZGxlLiAgKi8KKyAgY3UtPmRiZyA9IGRiZzsKKworICAvKiBUaGVyZSBpcyBubyBvdGhlciBlbnRyeSB5ZXQuICAqLworICBjdS0+bmV4dCA9IE5VTEw7CisKKyAgLyogRW5xdWV1ZSB0aGUgbmV3IGVudHJ5LiAgKi8KKyAgaWYgKGRiZy0+Y3VfbGlzdCA9PSBOVUxMKQorICAgIGRiZy0+Y3VfbGlzdCA9IGRiZy0+Y3VfbGlzdF90YWlsID0gY3U7CisgIGVsc2UKKyAgICB7CisgICAgICBkYmctPmN1X2xpc3RfdGFpbC0+bmV4dCA9IGN1OworICAgICAgZGJnLT5jdV9saXN0X3RhaWwgPSBjdTsKKyAgICB9CisgICpyZXN1bHRfY3UgPSBjdTsKKworICByZXR1cm4gRFdfRExWX09LOworfQorCisKK2ludAorZHdhcmZfbmV4dF9jdV9oZWFkZXIgKGRiZywgY3VfaGVhZGVyX2xlbmd0aCwgdmVyc2lvbl9zdGFtcCwgYWJicmV2X29mZnNldCwKKwkJICAgICAgYWRkcmVzc19zaXplLCBuZXh0X2N1X2hlYWRlciwgZXJyb3IpCisgICAgIER3YXJmX0RlYnVnIGRiZzsKKyAgICAgRHdhcmZfVW5zaWduZWQgKmN1X2hlYWRlcl9sZW5ndGg7CisgICAgIER3YXJmX0hhbGYgKnZlcnNpb25fc3RhbXA7CisgICAgIER3YXJmX1Vuc2lnbmVkICphYmJyZXZfb2Zmc2V0OworICAgICBEd2FyZl9IYWxmICphZGRyZXNzX3NpemU7CisgICAgIER3YXJmX1Vuc2lnbmVkICpuZXh0X2N1X2hlYWRlcjsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9VbnNpZ25lZCBvZmZzZXRfbmV4dF9jdTsKKyAgRHdhcmZfQ1VfSW5mbyBjdTsKKworICBpZiAoZGJnID09IE5VTEwpCisgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworICAvKiBEZXRlcm1pbmUgb2Zmc2V0IG9mIG5leHQgQ1UgaGVhZGVyLiAgSWYgd2UgZG9uJ3QgaGF2ZSBhIGN1cnJlbnQKKyAgICAgQ1UgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCBhbmQgd2Ugc3RhcnQgcmlnaHQgYXQgdGhlIGJlZ2lubmluZy4gICovCisgIGlmIChkYmctPmN1X2xpc3RfY3VycmVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIG9mZnNldF9uZXh0X2N1ID0gMDsKKyAgICAgIGN1ID0gZGJnLT5jdV9saXN0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGNhbiBjb21wdXRlIHRoZSBvZmZzZXQgZnJvbSB0aGUgaW5mb3JtYXRpb24gd2UgcmVhZCBmcm9tCisJIHRoZSBsYXN0IENVIGhlYWRlci4gICovCisgICAgICBjdSA9IGRiZy0+Y3VfbGlzdF9jdXJyZW50OworCisgICAgICBvZmZzZXRfbmV4dF9jdSA9IGN1LT5vZmZzZXQgKyAyICogY3UtPm9mZnNldF9zaXplIC0gNCArIGN1LT5sZW5ndGg7CisKKyAgICAgIC8qIFNlZSB3aGV0aGVyIHRoZSBuZXh0IGVudHJ5IGVudHJ5IGlzIGF2YWlsYWJsZS4gICovCisgICAgICBjdSA9IGN1LT5uZXh0OworICAgIH0KKworICAvKiBJZiB0aGUgZW50cnkgaXMgbm90IHlldCBhdmFpbGFibGUgZ2V0IGl0LiAgKi8KKyAgaWYgKGN1ID09IE5VTEwpCisgICAgeworICAgICAgaW50IHJlcyA9IF9fbGliZHdhcmZfZ2V0X2N1X2F0X29mZnNldCAoZGJnLCBvZmZzZXRfbmV4dF9jdSwgJmN1LCBlcnJvcik7CisKKyAgICAgIC8qIElmIGl0IHN0aWxsIGRvZXMgbm90IGV4aXN0LCBmYWlsLiAgTm90ZSB0aGF0IHRoaXMgY2FuIG1lYW4gYW4KKwkgZXJyb3Igb3IgdGhhdCB3ZSByZWFjaGVkIHRoZSBlbmQuICAqLworICAgICAgaWYgKHJlcyAhPSBEV19ETFZfT0spCisJcmV0dXJuIHJlczsKKworICAgICAgZGJnLT5jdV9saXN0X2N1cnJlbnQgPSBjdTsKKyAgICAgIGFzc2VydCAoY3UgIT0gTlVMTCk7CisgICAgfQorCisgIC8qIFNlZSBnZXRfY3VfYXRfb2Zmc2V0IGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgdHJpY2sgaW4gdGhpcworICAgICBmb3JtdWxhLiAgKi8KKyAgKm5leHRfY3VfaGVhZGVyID0gb2Zmc2V0X25leHRfY3UgKyAyICogY3UtPm9mZnNldF9zaXplIC0gNCArIGN1LT5sZW5ndGg7CisKKyAgLyogRXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gYW5kIHB1dCBpdCB3aGVyZSB0aGUgdXNlciB3YW50cyBpdC4gICovCisgIGlmIChjdV9oZWFkZXJfbGVuZ3RoICE9IE5VTEwpCisgICAgKmN1X2hlYWRlcl9sZW5ndGggPSBjdS0+aGVhZGVyX2xlbmd0aDsKKworICBpZiAodmVyc2lvbl9zdGFtcCAhPSBOVUxMKQorICAgICp2ZXJzaW9uX3N0YW1wID0gY3UtPnZlcnNpb25fc3RhbXA7CisKKyAgaWYgKGFiYnJldl9vZmZzZXQgIT0gTlVMTCkKKyAgICAqYWJicmV2X29mZnNldCA9IGN1LT5hYmJyZXZfb2Zmc2V0OworCisgIGlmIChhZGRyZXNzX3NpemUgIT0gTlVMTCkKKyAgICAqYWRkcmVzc19zaXplID0gY3UtPmFkZHJlc3Nfc2l6ZTsKKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfb2ZmZGllLmMgYi9saWJkd2FyZi9kd2FyZl9vZmZkaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTk0ZDJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfb2ZmZGllLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qIFJldHVybiBkaWUgYXQgZ2l2ZW4gb2Zmc2V0LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKKy8qIFhYWCBUaGlzIGZ1bmN0aW9uIHdpbGwgaGF2ZSB0byBiZSBvcHRpbWl6ZWQuICBUaGUgc2VhcmNoIGlzIHRvbyBsaW5lYXIKKyAgIHRvIGJlIHBlcmZvcm1lZCB0b28gb2Z0ZW4gLT4gTyhusikuICAqLworc3RhdGljIER3YXJmX0NVX0luZm8KK2ZpbmRfY3UgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfT2ZmIG9mZnNldCwgRHdhcmZfRXJyb3IgKmVycm9yKQoreworICBEd2FyZl9DVV9JbmZvIGN1OworICBEd2FyZl9Xb3JkIGN1X29mZnNldDsKKworICAvKiBTZWFyY2ggaW4gdGhlIENVcyBhbHJlYWR5IGtub3duLiAgKi8KKyAgZm9yIChjdSA9IGRiZy0+Y3VfbGlzdDsgY3UgIT0gTlVMTDsgY3UgPSBjdS0+bmV4dCkKKyAgICBpZiAoY3UtPm9mZnNldCA8PSBvZmZzZXQKKwkmJiBjdS0+b2Zmc2V0ICsgMiAqIGN1LT5vZmZzZXRfc2l6ZSAtIDQgKyBjdS0+bGVuZ3RoID4gb2Zmc2V0KQorICAgICAgcmV0dXJuIGN1OworCisgIC8qIFRoZSBDVSBpcyBub3QgeWV0IGxvYWRlZC4gIERvIHRoaXMgbm93LiAgKi8KKyAgaWYgKGRiZy0+Y3VfbGlzdF90YWlsID09IE5VTEwpCisgICAgY3Vfb2Zmc2V0ID0gMDsKKyAgZWxzZQorICAgIGN1X29mZnNldCA9IChkYmctPmN1X2xpc3RfdGFpbC0+b2Zmc2V0CisJCSArIDIgKiBkYmctPmN1X2xpc3RfdGFpbC0+b2Zmc2V0X3NpemUgLSA0CisJCSArIGRiZy0+Y3VfbGlzdF90YWlsLT5sZW5ndGgpOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIEdldCBuZXh0IENVIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gICovCisgICAgICBpZiAoX19saWJkd2FyZl9nZXRfY3VfYXRfb2Zmc2V0IChkYmcsIGN1X29mZnNldCwgJmN1LCBlcnJvcikKKwkgICE9IERXX0RMVl9PSykKKwlyZXR1cm4gTlVMTDsKKworICAgICAgLyogT2Zmc2V0IG9mIG5leHQgQ1UuICAqLworICAgICAgY3Vfb2Zmc2V0ICs9IDIgKiBjdS0+b2Zmc2V0X3NpemUgLSA0ICsgY3UtPmxlbmd0aDsKKworICAgICAgLyogSWYgdGhpcyB0aGUgQ1Ugd2UgYXJlIGxvb2tpbmcgZm9yPyAgKi8KKyAgICAgIGlmIChvZmZzZXQgPCBjdV9vZmZzZXQpCisJcmV0dXJuIGN1OworICAgIH0KK30KKworCitpbnQKK2R3YXJmX29mZmRpZSAoZGJnLCBvZmZzZXQsIHJldHVybl9kaWUsIGVycm9yKQorICAgICBEd2FyZl9EZWJ1ZyBkYmc7CisgICAgIER3YXJmX09mZiBvZmZzZXQ7CisgICAgIER3YXJmX0RpZSAqcmV0dXJuX2RpZTsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICBEd2FyZl9DVV9JbmZvIGN1OworICBEd2FyZl9EaWUgbmV3X2RpZTsKKyAgRHdhcmZfU21hbGwgKmRpZV9hZGRyOworICBEd2FyZl9Xb3JkIHUxMjg7CisKKyAgaWYgKG9mZnNldCA+PSBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19pbmZvXS5zaXplKQorICAgIHsKKyAgICAgIC8qIENvbXBsZXRlbHkgb3V0IG9mIGJvdW5kcy4gICovCisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfT0ZGU0VUKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIC8qIEZpbmQgdGhlIGNvbXBpbGUgdW5pdCB0aGlzIGFkZHJlc3MgYmVsb25ncyB0by4gICovCisgIGN1ID0gZmluZF9jdSAoZGJnLCBvZmZzZXQsIGVycm9yKTsKKyAgaWYgKGN1ID09IE5VTEwpCisgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworICAvKiBDcmVhdGEgYSBuZXcgZGllLiAgKi8KKyAgbmV3X2RpZSA9IChEd2FyZl9EaWUpIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgRHdhcmZfRGllX3MpKTsKKyAgaWYgKG5ld19kaWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisjaWZkZWYgRFdBUkZfREVCVUcKKyAgbmV3X2RpZS0+bWVtdGFnID0gRFdfRExBX0RJRTsKKyNlbmRpZgorCisgIC8qIFJlbWVtYmVyIHRoZSBhZGRyZXNzLiAgKi8KKyAgZGllX2FkZHIgPSAoRHdhcmZfU21hbGwgKikgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfaW5mb10uYWRkciArIG9mZnNldDsKKyAgbmV3X2RpZS0+YWRkciA9IGRpZV9hZGRyOworCisgIC8qIEFuZCB0aGUgY29tcGlsZSB1bml0LiAgKi8KKyAgbmV3X2RpZS0+Y3UgPSBjdTsKKworICAvKiA3LjUuMiAgRGVidWdnaW5nIEluZm9ybWF0aW9uIEVudHJ5CisKKyAgICAgRWFjaCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgYmVnaW5zIHdpdGggYW4gdW5zaWduZWQgTEVCMTI4CisgICAgIG51bWJlciBjb250YWluaW5nIHRoZSBhYmJyZXZpYXRpb24gY29kZSBmb3IgdGhlIGVudHJ5LiAgKi8KKyAgZ2V0X3VsZWIxMjggKHUxMjgsIGRpZV9hZGRyKTsKKworICAvKiBGaW5kIHRoZSBhYmJyZXZpYXRpb24uICAqLworICBuZXdfZGllLT5hYmJyZXYgPSBfX2xpYmR3YXJmX2dldF9hYmJyZXYgKGRiZywgY3UsIHUxMjgsIGVycm9yKTsKKyAgaWYgKG5ld19kaWUtPmFiYnJldiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKG5ld19kaWUpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgKnJldHVybl9kaWUgPSBuZXdfZGllOworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfc2V0ZXJyYXJnLmMgYi9saWJkd2FyZi9kd2FyZl9zZXRlcnJhcmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjUyZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfc2V0ZXJyYXJnLmMKQEAgLTAsMCArMSwzMCBAQAorLyogU2V0IG5ldyBlcnJvciBoYW5kbGVyIGFyZ3VtZW50LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworRHdhcmZfUHRyCitkd2FyZl9zZXRlcnJhcmcgKGRiZywgZXJyYXJnKQorICAgICBEd2FyZl9EZWJ1ZyBkYmc7CisgICAgIER3YXJmX1B0ciBlcnJhcmc7Cit7CisgIER3YXJmX1B0ciBvbGQgPSBkYmctPmRiZ19lcnJhcmc7CisgIGRiZy0+ZGJnX2VycmFyZyA9IGVycmFyZzsKKyAgcmV0dXJuIG9sZDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX3NldGVycmhhbmQuYyBiL2xpYmR3YXJmL2R3YXJmX3NldGVycmhhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTlhMjUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvZHdhcmZfc2V0ZXJyaGFuZC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFNldCBuZXcgZXJyb3IgaGFuZGxlci4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK0R3YXJmX0hhbmRsZXIKK2R3YXJmX3NldGVycmhhbmQgKGRiZywgZXJyaGFuZCkKKyAgICAgRHdhcmZfRGVidWcgZGJnOworICAgICBEd2FyZl9IYW5kbGVyIGVycmhhbmQ7Cit7CisgIER3YXJmX0hhbmRsZXIgb2xkID0gZGJnLT5kYmdfZXJyaGFuZDsKKyAgZGJnLT5kYmdfZXJyaGFuZCA9IGVycmhhbmQ7CisgIHJldHVybiBvbGQ7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9kd2FyZl9zaWJsaW5nb2YuYyBiL2xpYmR3YXJmL2R3YXJmX3NpYmxpbmdvZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTNhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9zaWJsaW5nb2YuYwpAQCAtMCwwICsxLDI1NyBAQAorLyogUmV0dXJuIGRlc2NyaXB0b3IgZm9yIHNpYmxpbmcgb2YgZGllLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfc2libGluZ29mIChkYmcsIGRpZSwgcmV0dXJuX3N1YiwgZXJyb3IpCisgICAgIER3YXJmX0RlYnVnIGRiZzsKKyAgICAgRHdhcmZfRGllIGRpZTsKKyAgICAgRHdhcmZfRGllICpyZXR1cm5fc3ViOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIER3YXJmX1NtYWxsICpkaWVfYWRkcjsKKyAgRHdhcmZfQ1VfSW5mbyBjdTsKKyAgRHdhcmZfVW5zaWduZWQgdTEyODsKKyAgRHdhcmZfRGllIG5ld19kaWU7CisKKyAgaWYgKGRiZyA9PSBOVUxMKQorICAgIHJldHVybiBEV19ETFZfRVJST1I7CisKKyAgaWYgKGRpZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIER3YXJmX1Vuc2lnbmVkIGRpZV9vZmZzZXQ7CisKKyAgICAgIC8qIFdlIGFyZSBzdXBwb3NlZCB0byByZXR1cm4gdGhlIERXX1RBR19jb21waWxlX3VuaXQgZGllIGZvciB0aGUKKwkgY3VycmVudCBjb21waWxlIHVuaXQuICBGb3IgdGhpcyB0byBzdWNjZWVkIHRoZSB1c2VyIG11c3QgaGF2ZQorCSBsb29rZWQgZm9yIHRoZSBjb21waWxlIHVuaXQgYmVmb3JlLiAgKi8KKyAgICAgIGlmIChkYmctPmN1X2xpc3RfY3VycmVudCA9PSBOVUxMKQorCXsKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9fQ1UpOworCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwl9CisKKyAgICAgIGN1ID0gZGJnLT5jdV9saXN0X2N1cnJlbnQ7CisKKyAgICAgIGRpZV9vZmZzZXQgPSAoY3UtPm9mZnNldCArIDIgKiBjdS0+b2Zmc2V0X3NpemUgLSA0ICsgc2l6ZW9mIChEd2FyZl9IYWxmKQorCQkgICAgKyBjdS0+b2Zmc2V0X3NpemUgKyAxKTsKKworICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGlzIHdpdGhpbmcgdGhlIGRlYnVnIHNlY3Rpb24uICAqLworICAgICAgaWYgKGRpZV9vZmZzZXQgPj0gZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfaW5mb10uc2l6ZSkKKwlyZXR1cm4gRFdfRExWX05PX0VOVFJZOworCisgICAgICAvKiBDb21wdXRlIHRoZSBwb2ludGVyLiAgKi8KKyAgICAgIGRpZV9hZGRyID0gKChEd2FyZl9TbWFsbCAqKSBkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19pbmZvXS5hZGRyCisJCSAgKyBkaWVfb2Zmc2V0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOworCisgICAgICAvKiBXZSBzdGFydCBmcm9tIHRoZSBnaXZlbiBkaWUuICAqLworICAgICAgY3UgPSBkaWUtPmN1OworCisgICAgICAvKiBBZGRyZXNzIG9mIHRoZSBnaXZlbiBkaWUuICAqLworICAgICAgZGllX2FkZHIgPSBkaWUtPmFkZHI7CisKKyAgICAgIC8qIFNlYXJjaCBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBkaWUgb24gdGhpcyBsZXZlbC4gIFdlCisgICAgICAgICBtdXN0IG5vdCByZXR1cm4gdGhlIGRpZXMgZm9yIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBkaWUuICAqLworICAgICAgZG8KKwl7CisJICBEd2FyZl9BYmJyZXYgYWJicmV2OworCSAgRHdhcmZfU21hbGwgKmF0dHJwOworCSAgRHdhcmZfV29yZCBhdHRyX25hbWU7CisJICBEd2FyZl9Xb3JkIGF0dHJfZm9ybTsKKworCSAgLyogR2V0IGFiYnJldiBjb2RlLiAgKi8KKwkgIGdldF91bGViMTI4ICh1MTI4LCBkaWVfYWRkcik7CisJICAvKiAgQW5kIGdldCB0aGUgYWJicmV2aWF0aW9uIGl0c2VsZi4gICovCisJICBhYmJyZXYgPSBfX2xpYmR3YXJmX2dldF9hYmJyZXYgKGRiZywgY3UsIHUxMjgsIGVycm9yKTsKKwkgIGlmIChhYmJyZXYgPT0gTlVMTCkKKwkgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKworCSAgLyogVGhpcyBpcyB3aGVyZSB0aGUgYXR0cmlidXRlcyBzdGFydC4gICovCisJICBhdHRycCA9IGFiYnJldi0+YXR0cnA7CisKKwkgIC8qIERvZXMgdGhpcyBhYmJyZXZpYXRpb24gaGF2ZSBjaGlsZHJlbj8gICovCisJICBpZiAoYWJicmV2LT5oYXNfY2hpbGRyZW4pCisJICAgICsrbGV2ZWw7CisKKwkgIHdoaWxlICgxKQorCSAgICB7CisJICAgICAgLyogQXJlIHdlIHN0aWxsIGluIGJvdW5kcz8gICovCisJICAgICAgaWYgKGF0dHJwID49ICgoRHdhcmZfU21hbGwgKilkYmctPnNlY3Rpb25zW0lEWF9kZWJ1Z19hYmJyZXZdLmFkZHIKKwkJCSAgICArIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2FiYnJldl0uc2l6ZSkpCisJCXsKKwkJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgIHJldHVybiBEV19ETFZfRVJST1I7CisJCX0KKworCSAgICAgIC8qIEdldCBhdHRyaWJ1dGUgbmFtZSBhbmQgZm9ybS4KKworCQkgWFhYIFdlIGRvbid0IGNoZWNrIHdoZXRoZXIgdGhpcyByZWFkcyBiZXlvbmQgdGhlIGVuZCBvZgorCQkgdGhlIHNlY3Rpb24uICAqLworCSAgICAgIGdldF91bGViMTI4IChhdHRyX25hbWUsIGF0dHJwKTsKKwkgICAgICBnZXRfdWxlYjEyOCAoYXR0cl9mb3JtLCBhdHRycCk7CisKKwkgICAgICAvKiBXZSBjYW4gc3RvcCBpZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIHdpdGggdmFsdWUgemVyby4gICovCisJICAgICAgaWYgKGF0dHJfbmFtZSA9PSAwICYmIGF0dHJfZm9ybSA9PSAwKQorCQlicmVhazsKKworCSAgICAgIC8qIFNlZSB3aGV0aGVyIHRoaXMgaXMgYW4gc2libGluZyBhdHRyaWJ1dGUgd2hpY2ggd291bGQgaGVscAorCQkgdXMgdG8gc2tpcCBhaGVhZC4gICovCisJICAgICAgaWYgKGF0dHJfbmFtZSA9PSBEV19BVF9zaWJsaW5nKQorCQl7CisJCSAgLyogQ29vbC4gIFdlIGp1c3QgaGF2ZSB0byBkZWNvZGUgdGhlIHBhcmFtZXRlciBhbmQgd2Uga25vdworCQkgICAgIHRoZSBvZmZzZXQuICAqLworCQkgIER3YXJmX1Vuc2lnbmVkIG9mZnNldDsKKworCQkgIHN3aXRjaCAoYXR0cl9mb3JtKQorCQkgICAgeworCQkgICAgY2FzZSBEV19GT1JNX3JlZjE6CisJCSAgICAgIG9mZnNldCA9ICpkaWVfYWRkcjsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgRFdfRk9STV9yZWYyOgorCQkgICAgICBvZmZzZXQgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGllX2FkZHIpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSBEV19GT1JNX3JlZjQ6CisJCSAgICAgIG9mZnNldCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBkaWVfYWRkcik7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlIERXX0ZPUk1fcmVmODoKKwkJICAgICAgb2Zmc2V0ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRpZV9hZGRyKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6CisJCSAgICAgIGdldF91bGViMTI4IChvZmZzZXQsIGRpZV9hZGRyKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIC8qIFRoZSBhYm92ZSBhcmUgYWxsIGxlZ2FsIGZvcm1zLiAgRXZlcnl0aGluZyBlbHNlIGlzCisJCQkgYW4gZXJyb3IuICAqLworCQkgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCQkgICAgfQorCisJCSAgLyogQ29tcHV0ZSB0aGUgbmV3IGFkZHJlc3MuICBTb21lIHNhbml0eSBjaGVjayBmaXJzdCwKKwkJICAgICB0aG91Z2guICAqLworCQkgIGlmICh1bmxpa2VseSAob2Zmc2V0ID4gMiAqIGN1LT5vZmZzZXRfc2l6ZSAtIDQgKyBjdS0+bGVuZ3RoKSkKKwkJICAgIHsKKwkJICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkJICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkJICAgIH0KKworCQkgIGRpZV9hZGRyID0KKwkJICAgICgoRHdhcmZfU21hbGwgKikgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfaW5mb10uYWRkcgorCQkgICAgICsgY3UtPm9mZnNldCArIG9mZnNldCk7CisKKwkJICAvKiBFdmVuIGlmIHRoZSBhYmJyZXZpYXRpb24gaGFzIGNoaWxkcmVuIHdlIGhhdmUgc3RlcHBlZAorCQkgICAgIG92ZXIgdGhlbSBub3cuICAqLworCQkgIGlmIChhYmJyZXYtPmhhc19jaGlsZHJlbikKKwkJICAgIC0tbGV2ZWw7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIC8qIFNraXAgb3ZlciB0aGUgcmVzdCBvZiB0aGlzIGF0dHJpYnV0ZSAoaWYgdGhlcmUgaXMgYW55KS4gICovCisJICAgICAgaWYgKGF0dHJfZm9ybSAhPSAwKQorCQl7CisJCSAgc2l6ZV90IGxlbjsKKworCQkgIGlmICh1bmxpa2VseSAoX19saWJkd2FyZl9mb3JtX3ZhbF9sZW4gKGRiZywgY3UsIGF0dHJfZm9ybSwKKwkJCQkJCQkgZGllX2FkZHIsICZsZW4sIGVycm9yKQorCQkJCSE9IERXX0RMVl9PSykpCisJCSAgICByZXR1cm4gRFdfRExWX0VSUk9SOworCisJCSAgZGllX2FkZHIgKz0gbGVuOworCQl9CisJICAgIH0KKworCSAgLyogQ2hlY2sgdGhhdCB3ZSBhcmUgbm90IHlldCBhdCB0aGUgZW5kLiAgKi8KKwkgIGlmICgqZGllX2FkZHIgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChsZXZlbCA9PSAwKQorCQlyZXR1cm4gRFdfRExWX05PX0VOVFJZOworCisJICAgICAgZG8KKwkJKytkaWVfYWRkcjsKKwkgICAgICB3aGlsZSAoLS1sZXZlbCA+IDAgJiYgKmRpZV9hZGRyID09IDApOworCSAgICB9CisJfQorICAgICAgd2hpbGUgKGxldmVsID4gMCk7CisgICAgfQorCisgIC8qIEFyZSB3ZSBhdCB0aGUgZW5kLiAgKi8KKyAgaWYgKGRpZSAhPSBOVUxMCisgICAgICAmJiBkaWVfYWRkciA+PSAoKER3YXJmX1NtYWxsICopIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2luZm9dLmFkZHIKKwkJICAgICAgKyBjdS0+b2Zmc2V0ICsgY3UtPmxlbmd0aCArIDIgKiBjdS0+b2Zmc2V0X3NpemUgLSA0KSkKKyAgICByZXR1cm4gRFdfRExWX05PX0VOVFJZOworCisgIC8qIFNlZSB3aGV0aGVyIHRoZXJlIGlzIGFub3RoZXIgc2libGluZyBhdmFpbGFibGUgb3Igd2hldGhlciB0aGlzIGlzCisgICAgIHRoZSBlbmQuICAqLworICBpZiAoKmRpZV9hZGRyID09IDApCisgICAgcmV0dXJuIERXX0RMVl9OT19FTlRSWTsKKworICAvKiBUaGVyZSBpcyBtb3JlIGRhdGEuICBDcmVhdGUgdGhlIGRhdGEgc3RydWN0dXJlLiAgKi8KKyAgbmV3X2RpZSA9IChEd2FyZl9EaWUpIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgRHdhcmZfRGllX3MpKTsKKyAgaWYgKG5ld19kaWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisjaWZkZWYgRFdBUkZfREVCVUcKKyAgbmV3X2RpZS0+bWVtdGFnID0gRFdfRExBX0RJRTsKKyNlbmRpZgorCisgIC8qIFJlbWVtYmVyIHRoZSBhZGRyZXNzLiAgKi8KKyAgbmV3X2RpZS0+YWRkciA9IGRpZV9hZGRyOworCisgIC8qIEFuZCB0aGUgY29tcGlsZSB1bml0LiAgKi8KKyAgbmV3X2RpZS0+Y3UgPSBjdTsKKworICAvKiA3LjUuMiAgRGVidWdnaW5nIEluZm9ybWF0aW9uIEVudHJ5CisKKyAgICAgRWFjaCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgYmVnaW5zIHdpdGggYW4gdW5zaWduZWQgTEVCMTI4CisgICAgIG51bWJlciBjb250YWluaW5nIHRoZSBhYmJyZXZpYXRpb24gY29kZSBmb3IgdGhlIGVudHJ5LiAgKi8KKyAgZ2V0X3VsZWIxMjggKHUxMjgsIGRpZV9hZGRyKTsKKworICAvKiBGaW5kIHRoZSBhYmJyZXZpYXRpb24uICAqLworICBuZXdfZGllLT5hYmJyZXYgPSBfX2xpYmR3YXJmX2dldF9hYmJyZXYgKGRiZywgY3UsIHUxMjgsIGVycm9yKTsKKyAgaWYgKG5ld19kaWUtPmFiYnJldiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKG5ld19kaWUpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgLyogSWYgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBlbnRyeSB0aGlzIG11c3QgYmUgYSBjb21waWxlIHVuaXQuICAqLworICBpZiAoZGllID09IE5VTEwgJiYgdW5saWtlbHkgKG5ld19kaWUtPmFiYnJldi0+dGFnICE9IERXX1RBR19jb21waWxlX3VuaXQpKQorICAgIHsKKyAgICAgIGZyZWUgKG5ld19kaWUpOworICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV8xU1RfTk9fQ1UpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgKnJldHVybl9zdWIgPSBuZXdfZGllOworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfc3JjZmlsZXMuYyBiL2xpYmR3YXJmL2R3YXJmX3NyY2ZpbGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5MGQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX3NyY2ZpbGVzLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qIFJldHVybiBzb3VyY2UgZmlsZXMgb2YgY29tcGlsYXRpb24gdW5pdC4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJkd2FyZlAuaD4KKworCitzdHJ1Y3QgZGlybGlzdAoreworICBjaGFyICpkaXI7CisgIHNpemVfdCBsZW47CisgIHN0cnVjdCBkaXJsaXN0ICpuZXh0OworfTsKKworc3RydWN0IGZpbGVsaXN0Cit7CisgIGNoYXIgKm5hbWU7CisgIER3YXJmX1Vuc2lnbmVkIG10aW1lOworICBEd2FyZl9VbnNpZ25lZCBsZW5ndGg7CisgIHN0cnVjdCBmaWxlbGlzdCAqbmV4dDsKK307CisKKworc3RhdGljIGludAorcmVhZF9maWxlX25hbWVzIChEd2FyZl9EZWJ1ZyBkYmcsIGNoYXIgKmNvbXBfZGlyLCBEd2FyZl9TbWFsbCAqKmxpbmVwcCwKKwkJIGNoYXIgKioqcmVzdWx0LCBEd2FyZl9TaWduZWQgKm5yZXN1bHQsIER3YXJmX0Vycm9yICplcnJvcikKK3sKKyAgRHdhcmZfU21hbGwgKmxpbmVwID0gKmxpbmVwcDsKKyAgc3RydWN0IGRpcmxpc3QgY29tcF9kaXJfZWxlbTsKKyAgc3RydWN0IGRpcmxpc3QgKmRpcmxpc3Q7CisgIHVuc2lnbmVkIGludCBuZGlybGlzdDsKKyAgc3RydWN0IGRpcmxpc3QgKipkaXJhcnJheTsKKyAgc3RydWN0IGZpbGVsaXN0ICpmaWxlbGlzdCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCBuZmlsZWxpc3QgPSAwOworCisgIC8qIEZpcnN0IGNvbWVzIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzLiAgQWRkIHRoZSBjb21waWxhdGlvbiBkaXJlY3RvcnkKKyAgICAgZmlyc3Qgc2luY2UgdGhlIGluZGV4IHplcm8gaXMgdXNlZCBmb3IgaXQuICAqLworICBjb21wX2Rpcl9lbGVtLmRpciA9IGNvbXBfZGlyOworICBjb21wX2Rpcl9lbGVtLmxlbiA9IGNvbXBfZGlyID8gc3RybGVuIChjb21wX2RpcikgOiAwOworICBjb21wX2Rpcl9lbGVtLm5leHQgPSBOVUxMOworICBkaXJsaXN0ID0gJmNvbXBfZGlyX2VsZW07CisgIG5kaXJsaXN0ID0gMTsKKworICB3aGlsZSAoKmxpbmVwICE9IDApCisgICAgeworICAgICAgc3RydWN0IGRpcmxpc3QgKm5ld19kaXIgPSAoc3RydWN0IGRpcmxpc3QgKikgYWxsb2NhIChzaXplb2YgKCpuZXdfZGlyKSk7CisKKyAgICAgIG5ld19kaXItPmRpciA9IChjaGFyICopIGxpbmVwOworICAgICAgbmV3X2Rpci0+bGVuID0gc3RybGVuICgoY2hhciAqKSBsaW5lcCk7CisgICAgICBuZXdfZGlyLT5uZXh0ID0gZGlybGlzdDsKKyAgICAgIGRpcmxpc3QgPSBuZXdfZGlyOworICAgICAgKytuZGlybGlzdDsKKyAgICAgIGxpbmVwICs9IG5ld19kaXItPmxlbiArIDE7CisgICAgfQorICAvKiBTa2lwIHRoZSBmaW5hbCBOVUwgYnl0ZS4gICovCisgICsrbGluZXA7CisKKyAgLyogUmVhcnJhbmdlIHRoZSBsaXN0IGluIGFycmF5IGZvcm0uICAqLworICBkaXJhcnJheSA9IChzdHJ1Y3QgZGlybGlzdCAqKikgYWxsb2NhIChzaXplb2YgKCpkaXJhcnJheSkpOworICB3aGlsZSAobmRpcmxpc3QtLSA+IDApCisgICAgeworICAgICAgZGlyYXJyYXlbbmRpcmxpc3RdID0gZGlybGlzdDsKKyAgICAgIGRpcmxpc3QgPSBkaXJsaXN0LT5uZXh0OworICAgIH0KKworICAvKiBOb3cgcmVhZCB0aGUgZmlsZXMuICAqLworICB3aGlsZSAoKmxpbmVwICE9IDApCisgICAgeworICAgICAgc3RydWN0IGZpbGVsaXN0ICpuZXdfZmlsZSA9CisJKHN0cnVjdCBmaWxlbGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoKm5ld19maWxlKSk7CisgICAgICBjaGFyICpmbmFtZTsKKyAgICAgIHNpemVfdCBmbmFtZWxlbjsKKyAgICAgIER3YXJmX1Vuc2lnbmVkIGRpcmlkeDsKKworICAgICAgLyogRmlyc3QgY29tZXMgdGhlIGZpbGUgbmFtZS4gICovCisgICAgICBmbmFtZSA9IChjaGFyICopIGxpbmVwOworICAgICAgZm5hbWVsZW4gPSBzdHJsZW4gKGZuYW1lKTsKKyAgICAgIGxpbmVwICs9IGZuYW1lbGVuICsgMTsKKworICAgICAgLyogVGhlbiB0aGUgaW5kZXguICAqLworICAgICAgZ2V0X3VsZWIxMjggKGRpcmlkeCwgbGluZXApOworICAgICAgaWYgKHVubGlrZWx5IChkaXJpZHggPj0gbmRpcmxpc3QpKQorCXsKKwkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9ESVJfSURYKTsKKwkgIHJldHVybiBEV19ETFZfRVJST1I7CisJfQorCisgICAgICBpZiAoKmZuYW1lID09ICcvJykKKwkvKiBJdCdzIGFuIGFic29sdXRlIHBhdGguICAqLworCW5ld19maWxlLT5uYW1lID0gc3RyZHVwIChmbmFtZSk7CisgICAgICBlbHNlCisJeworCSAgbmV3X2ZpbGUtPm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGRpcmFycmF5W2RpcmlkeF0tPmxlbiArIDEKKwkJCQkJICAgICsgZm5hbWVsZW4gKyAxKTsKKwkgIGlmIChuZXdfZmlsZS0+bmFtZSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgY2hhciAqY3AgPSBuZXdfZmlsZS0+bmFtZTsKKworCSAgICAgIGlmIChkaXJhcnJheVtkaXJpZHhdLT5kaXIgIT0gTlVMTCkKKwkJLyogVGhpcyB2YWx1ZSBjb3VsZCBiZSBOVUxMIGluIGNhc2UgdGhlIERXX0FUX2NvbXBfZGlyCisJCSAgIHdhcyBub3QgcHJlc2VudC4gIFdlIGNhbm5vdCBkbyBtdWNoIGluIHRoaXMgY2FzZS4KKwkJICAgVGhlIGVhc2llc3QgdGhpbmcgaXMgdG8gY29udmVydCB0aGUgcGF0aCBpbiBhbgorCQkgICBhYnNvbHV0ZSBwYXRoLiAgKi8KKwkJY3AgPSBzdHBjcHkgKGNwLCBkaXJhcnJheVtkaXJpZHhdLT5kaXIpOworCSAgICAgICpjcCsrID0gJy8nOworCSAgICAgIHN0cmNweSAoY3AsIGZuYW1lKTsKKwkgICAgfQorCX0KKyAgICAgIGlmIChuZXdfZmlsZS0+bmFtZSA9PSBOVUxMKQorCXsKKwkgIC8qIFhYWCBTaG91bGQgd2UgYm90aGVyIHRvIGZyZWUgYWxsIHRoZSBtZW1vcnk/ICAqLworCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9OT01FTSk7CisJICByZXR1cm4gRFdfRExWX0VSUk9SOworCX0KKworICAgICAgLyogTmV4dCBjb21lcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUuICAqLworICAgICAgZ2V0X3VsZWIxMjggKG5ld19maWxlLT5tdGltZSwgbGluZXApOworCisgICAgICAvKiBGaW5hbGx5IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuICAqLworICAgICAgZ2V0X3VsZWIxMjggKG5ld19maWxlLT5sZW5ndGgsIGxpbmVwKTsKKworICAgICAgbmV3X2ZpbGUtPm5leHQgPSBmaWxlbGlzdDsKKyAgICAgIGZpbGVsaXN0ID0gbmV3X2ZpbGU7CisgICAgICArK25maWxlbGlzdDsKKyAgICB9CisKKyAgLyogUHV0IGFsbCB0aGUgZmlsZXMgaW4gYW4gYXJyYXkuICAqLworICAqcmVzdWx0ID0gKGNoYXIgKiopIG1hbGxvYyAobmZpbGVsaXN0ICogc2l6ZW9mIChjaGFyICopKTsKKyAgaWYgKCpyZXN1bHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBYWFggU2hvdWxkIHdlIGJvdGhlciB0byBmcmVlIGFsbCB0aGUgbWVtb3J5PyAgKi8KKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgKm5yZXN1bHQgPSBuZmlsZWxpc3Q7CisgIHdoaWxlIChuZmlsZWxpc3QtLSA+IDApCisgICAgeworICAgICAgKCpyZXN1bHQpW25maWxlbGlzdF0gPSBmaWxlbGlzdC0+bmFtZTsKKyAgICAgIGZpbGVsaXN0ID0gZmlsZWxpc3QtPm5leHQ7CisgICAgfQorCisgIC8qIFByb3ZpZGUgY2FsbGVyIGFkZHJlc3Mgb2YgbmV4dCBieXRlLiAgKi8KKyAgKmxpbmVwcCA9IGxpbmVwICsgMTsKKworICByZXR1cm4gRFdfRExWX09LOworfQorCisKK2ludAorZHdhcmZfc3JjZmlsZXMgKGRpZSwgc3JjZmlsZXMsIHNyY2ZpbGVjb3VudCwgZXJyb3IpCisgICAgIER3YXJmX0RpZSBkaWU7CisgICAgIGNoYXIgKioqc3JjZmlsZXM7CisgICAgIER3YXJmX1NpZ25lZCAqc3JjZmlsZWNvdW50OworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgIER3YXJmX0NVX0luZm8gY3UgPSBkaWUtPmN1OworICBEd2FyZl9EZWJ1ZyBkYmcgPSBjdS0+ZGJnOworICBEd2FyZl9BdHRyaWJ1dGUgc3RtdF9saXN0OworICBEd2FyZl9BdHRyaWJ1dGUgY29tcF9kaXJfYXR0cjsKKyAgY2hhciAqY29tcF9kaXI7CisgIER3YXJmX1Vuc2lnbmVkIG9mZnNldDsKKyAgRHdhcmZfU21hbGwgKmxpbmVwOworICBEd2FyZl9TbWFsbCAqbGluZWVuZHA7CisgIER3YXJmX1NtYWxsICpoZWFkZXJfc3RhcnQ7CisgIER3YXJmX1Vuc2lnbmVkIGhlYWRlcl9sZW5ndGg7CisgIHVuc2lnbmVkIGludCB1bml0X2xlbmd0aDsKKyAgdW5zaWduZWQgaW50IHZlcnNpb247CisgIHVuc2lnbmVkIGludCBvcGNvZGVfYmFzZTsKKyAgaW50IGxlbmd0aDsKKyAgaW50IHJlczsKKworICAvKiBGb3Igbm93IHdlIGhhdmVuJ3QgZm91bmQgYW55dGhpbmcuICAqLworICAqc3JjZmlsZWNvdW50ID0gMDsKKworICAvKiBUaGUgZGllIG11c3QgYmUgZm9yIGEgY29tcGlsYXRpb24gdW5pdC4gICovCisgIGlmIChkaWUtPmFiYnJldi0+dGFnICE9IERXX1RBR19jb21waWxlX3VuaXQpCisgICAgeworICAgICAgX19saWJkd2FyZl9lcnJvciAoZGllLT5jdS0+ZGJnLCBlcnJvciwgRFdfRV9OT19DVSk7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAvKiBUaGUgZGllIG11c3QgaGF2ZSBhIHN0YXRlbWVudCBsaXN0IGFzc29jaWF0ZWQuICAqLworICByZXMgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX3N0bXRfbGlzdCwgJnN0bXRfbGlzdCwgZXJyb3IpOworICBpZiAocmVzICE9IERXX0RMVl9PSykKKyAgICByZXR1cm4gcmVzOworCisgIC8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLworICByZXMgPSBkd2FyZl9mb3JtdWRhdGEgKHN0bXRfbGlzdCwgJm9mZnNldCwgZXJyb3IpOworICBpZiAocmVzICE9IERXX0RMVl9PSykKKyAgICB7CisgICAgICBkd2FyZl9kZWFsbG9jIChkYmcsIHN0bXRfbGlzdCwgRFdfRExBX0FUVFIpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgLyogV2UgbmVlZCBhIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLworICBpZiAoZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfbGluZV0uYWRkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PX0RFQlVHX0xJTkUpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgbGluZXAgPSAoRHdhcmZfU21hbGwgKikgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfbGluZV0uYWRkciArIG9mZnNldDsKKyAgbGluZWVuZHAgPSAoKER3YXJmX1NtYWxsICopIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2xpbmVdLmFkZHIKKwkgICAgICArIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2xpbmVdLnNpemUpOworCisgIC8qIFRlc3Qgd2hldGhlciBhdCBsZWFzdCB0aGUgZmlyc3QgNCBieXRlcyBhcmUgYXZhaWxhYmxlLiAgKi8KKyAgaWYgKHVubGlrZWx5IChsaW5lcCArIDQgPiBsaW5lZW5kcCkpCisgICAgeworICAgICAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAvKiBHZXQgdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeS4gICovCisgIHJlcyA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfY29tcF9kaXIsICZjb21wX2Rpcl9hdHRyLCBlcnJvcik7CisgIGlmICh1bmxpa2VseSAocmVzID09IERXX0RMVl9FUlJPUikKKyAgICAgIHx8IChyZXMgPT0gRFdfRExWX09LCisJICAmJiB1bmxpa2VseSAoZHdhcmZfZm9ybXN0cmluZyAoY29tcF9kaXJfYXR0ciwgJmNvbXBfZGlyLCBlcnJvcikKKwkJICAgICAgID09IERXX0RMVl9FUlJPUikpKQorICAgIHsKKyAgICAgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisgIGVsc2UgaWYgKHJlcyA9PSBEV19ETFZfT0spCisgICAgZHdhcmZfZGVhbGxvYyAoZGJnLCBjb21wX2Rpcl9hdHRyLCBEV19ETEFfQVRUUik7CisgIGVsc2UKKyAgICBjb21wX2RpciA9IE5VTEw7CisKKyAgLyogUmVhZCB0aGUgdW5pdF9sZW5ndGguICAqLworICB1bml0X2xlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBsaW5lcCk7CisgIGxpbmVwICs9IDQ7CisgIGxlbmd0aCA9IDQ7CisgIGlmICh1bml0X2xlbmd0aCA9PSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgIGlmICh1bmxpa2VseSAobGluZXAgKyA4ID4gbGluZWVuZHApKQorCXsKKwkgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwl9CisKKyAgICAgIHVuaXRfbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGxpbmVwKTsKKyAgICAgIGxpbmVwICs9IDg7CisgICAgICBsZW5ndGggPSA4OworICAgIH0KKworICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgZW5vdWdoIHJvb20gaW4gdGhlIHNlY3Rpb24uICAqLworICBpZiAodW5saWtlbHkgKGxpbmVwICsgdW5pdF9sZW5ndGggPiBsaW5lZW5kcCkpCisgICAgeworICAgICAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKyAgbGluZWVuZHAgPSBsaW5lcCArIHVuaXRfbGVuZ3RoOworCisgIC8qIFRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGhlYWRlciBpcyB0aGUgdmVyc2lvbiBpZGVudGlmaWVyLiAgKi8KKyAgdmVyc2lvbiA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoZGJnLCBsaW5lcCk7CisgIGlmICh1bmxpa2VseSAodmVyc2lvbiAhPSBEV0FSRl9WRVJTSU9OKSkKKyAgICB7CisgICAgICBkd2FyZl9kZWFsbG9jIChkYmcsIHN0bXRfbGlzdCwgRFdfRExBX0FUVFIpOworICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9WRVJTSU9OX0VSUk9SKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorICBsaW5lcCArPSAyOworCisgIC8qIE5leHQgY29tZXMgdGhlIGhlYWRlciBsZW5ndGguICAqLworICBpZiAobGVuZ3RoID09IDQpCisgICAgeworICAgICAgaGVhZGVyX2xlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBsaW5lcCk7CisgICAgICBsaW5lcCArPSA0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGhlYWRlcl9sZW5ndGggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgbGluZXApOworICAgICAgbGluZXAgKz0gODsKKyAgICB9CisgIGhlYWRlcl9zdGFydCA9IGxpbmVwOworCisgIC8qIE5leHQgdGhlIG1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoLiAgU2tpcCBpdC4gICovCisgICsrbGluZXA7CisKKyAgLyogVGhlbiB0aGUgZmxhZyBkZXRlcm1pbmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgaXNfc3RtdAorICAgICByZWdpc3Rlci4gIFNraXAgaXQuICAqLworICArK2xpbmVwOworCisgIC8qIE5vdyB0aGUgbGluZSBiYXNlLiAgU2tpcCBpdC4gICovCisgICsrbGluZXA7CisKKyAgLyogQW5kIHRoZSBsaW5lIHJhbmdlLiAgU2tpcCBpdC4gICovCisgICsrbGluZXA7CisKKyAgLyogVGhlIG9wY29kZSBiYXNlLiAgKi8KKyAgb3Bjb2RlX2Jhc2UgPSAqbGluZXArKzsKKworICAvKiBTa2lwIHRoZSBhcnJheSB3aXRoIHRoZSBzdGFuZGFyZCBvcGNvZGUgbGVuZ3RoLiAgKi8KKyAgbGluZXAgKz0gb3Bjb2RlX2Jhc2UgLSAxOworCisgIC8qIE5leHQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIHRoZSBmaWxlIG5hbWVzLiAgKi8KKyAgaWYgKHVubGlrZWx5IChyZWFkX2ZpbGVfbmFtZXMgKGRiZywgY29tcF9kaXIsICZsaW5lcCwgc3JjZmlsZXMsIHNyY2ZpbGVjb3VudCwKKwkJCQkgZXJyb3IpICE9IERXX0RMVl9PSykpCisgICAgeworICAgICAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIC8qIENvbnNpc3RlbmN5IGNoZWNrLiAgKi8KKyAgaWYgKHVubGlrZWx5IChsaW5lcCAhPSBoZWFkZXJfc3RhcnQgKyBoZWFkZXJfbGVuZ3RoKSkKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8ICpzcmNmaWxlY291bnQ7ICsraSkKKwlkd2FyZl9kZWFsbG9jIChkYmcsICgqc3JjZmlsZXMpW2ldLCBEV19ETEFfU1RSSU5HKTsKKyAgICAgIGR3YXJmX2RlYWxsb2MgKGRiZywgKnNyY2ZpbGVzLCBEV19ETEFfTElTVCk7CisKKyAgICAgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfc3JjbGFuZy5jIGIvbGliZHdhcmYvZHdhcmZfc3JjbGFuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTQwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9zcmNsYW5nLmMKQEAgLTAsMCArMSwzMSBAQAorLyogUmV0dXJuIHNvdXJjZSBsYW5ndWFnZSBhc3NvY2lhdGVkIHdpdGggZGllLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfc3JjbGFuZyAoZGllLCByZXR1cm5fbGFuZywgZXJyb3IpCisgICAgIER3YXJmX0RpZSBkaWU7CisgICAgIER3YXJmX1Vuc2lnbmVkICpyZXR1cm5fbGFuZzsKKyAgICAgRHdhcmZfRXJyb3IgKmVycm9yOworeworICByZXR1cm4gX19saWJkd2FyZl9nZXRjb25zdGFudCAoZGllLCBEV19BVF9sYW5ndWFnZSwgcmV0dXJuX2xhbmcsIGVycm9yKTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX3NyY2xpbmVzLmMgYi9saWJkd2FyZi9kd2FyZl9zcmNsaW5lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NmI3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl9zcmNsaW5lcy5jCkBAIC0wLDAgKzEsNzQ1IEBACisvKiBSZXR1cm4gc291cmNlIGxpbmVzIG9mIGNvbXBpbGF0aW9uIHVuaXQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworc3RydWN0IGRpcmxpc3QKK3sKKyAgY2hhciAqZGlyOworICBzaXplX3QgbGVuOworICBzdHJ1Y3QgZGlybGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCBmaWxlbGlzdAoreworICBjaGFyICpuYW1lOworICBEd2FyZl9VbnNpZ25lZCBtdGltZTsKKyAgRHdhcmZfVW5zaWduZWQgbGVuZ3RoOworICBzdHJ1Y3QgZmlsZWxpc3QgKm5leHQ7Cit9OworCitzdHJ1Y3QgbGluZWxpc3QKK3sKKyAgRHdhcmZfTGluZSBsaW5lOworICBzdHJ1Y3QgbGluZWxpc3QgKm5leHQ7Cit9OworCisKKy8qIEFkZHMgYSBuZXcgbGluZSB0byB0aGUgbWF0cml4LiAgV2UgY2Fubm90IGRlZmludGUgYSBmdW5jdGlvbiBiZWNhdXNlCisgICB3ZSB3YW50IHRvIHVzZSBhbGxvY2EuICAqLworI2RlZmluZSBORVdfTElORShlbmRfc2VxKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgICAgLyogQWRkIHRoZSBuZXcgbGluZS4gICovCQkJCQkJICAgICAgXAorICAgICAgIG5ld19saW5lID0gKHN0cnVjdCBsaW5lbGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IGxpbmVsaXN0KSk7ICAgICAgXAorICAgICAgIG5ld19saW5lLT5saW5lID0gKER3YXJmX0xpbmUpIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgRHdhcmZfTGluZV9zKSk7ICAgXAorICAgICAgIGlmIChuZXdfbGluZSA9PSBOVUxMKQkJCQkJCSAgICAgIFwKKwkgewkJCQkJCQkJICAgICAgXAorCSAgIC8qIFhYWCBTaG91bGQgd2UgYm90aGVyIHRvIGZyZWUgdGhlIG1lbW9yeT8gICovCQkgICAgICBcCisJICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9OT01FTSk7CQkJICAgICAgXAorCSAgIHJldHVybiBEV19ETFZfRVJST1I7CQkJCQkJICAgICAgXAorCSB9CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgLyogU2V0IHRoZSBsaW5lIGluZm9ybWF0aW9uLiAgKi8JCQkJCSAgICAgIFwKKyAgICAgICBuZXdfbGluZS0+bGluZS0+YWRkciA9IGFkZHJlc3M7CQkJCQkgICAgICBcCisgICAgICAgbmV3X2xpbmUtPmxpbmUtPmZpbGUgPSBmaWxlOwkJCQkJICAgICAgXAorICAgICAgIG5ld19saW5lLT5saW5lLT5saW5lID0gbGluZTsJCQkJCSAgICAgIFwKKyAgICAgICBuZXdfbGluZS0+bGluZS0+Y29sdW1uID0gY29sdW1uOwkJCQkJICAgICAgXAorICAgICAgIG5ld19saW5lLT5saW5lLT5pc19zdG10ID0gaXNfc3RtdDsJCQkJICAgICAgXAorICAgICAgIG5ld19saW5lLT5saW5lLT5iYXNpY19ibG9jayA9IGJhc2ljX2Jsb2NrOwkJCSAgICAgIFwKKyAgICAgICBuZXdfbGluZS0+bGluZS0+ZW5kX3NlcXVlbmNlID0gZW5kX3NlcTsJCQkJICAgICAgXAorICAgICAgIG5ld19saW5lLT5saW5lLT5wcm9sb2d1ZV9lbmQgPSBwcm9sb2d1ZV9lbmQ7CQkJICAgICAgXAorICAgICAgIG5ld19saW5lLT5saW5lLT5lcGlsb2d1ZV9iZWdpbiA9IGVwaWxvZ3VlX2JlZ2luOwkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgICBuZXdfbGluZS0+bmV4dCA9IGxpbmVsaXN0OwkJCQkJICAgICAgXAorICAgICAgIGxpbmVsaXN0ID0gbmV3X2xpbmU7CQkJCQkJICAgICAgXAorICAgICAgICsrbmxpbmVsaXN0OwkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworaW50Citkd2FyZl9zcmNsaW5lcyAoZGllLCBsaW5lYnVmLCBsaW5lY291bnQsIGVycm9yKQorICAgICBEd2FyZl9EaWUgZGllOworICAgICBEd2FyZl9MaW5lICoqbGluZWJ1ZjsKKyAgICAgRHdhcmZfU2lnbmVkICpsaW5lY291bnQ7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgRHdhcmZfQ1VfSW5mbyBjdSA9IGRpZS0+Y3U7CisgIER3YXJmX0RlYnVnIGRiZyA9IGN1LT5kYmc7CisgIER3YXJmX0F0dHJpYnV0ZSBzdG10X2xpc3Q7CisgIER3YXJmX0F0dHJpYnV0ZSBjb21wX2Rpcl9hdHRyOworICBjaGFyICpjb21wX2RpcjsKKyAgRHdhcmZfVW5zaWduZWQgb2Zmc2V0OworICBEd2FyZl9TbWFsbCAqbGluZXA7CisgIER3YXJmX1NtYWxsICpsaW5lZW5kcDsKKyAgRHdhcmZfU21hbGwgKmhlYWRlcl9zdGFydDsKKyAgRHdhcmZfVW5zaWduZWQgaGVhZGVyX2xlbmd0aDsKKyAgRHdhcmZfRmlsZSBmaWxlczsKKyAgRHdhcmZfTGluZSAqbGluZXM7CisgIHVuc2lnbmVkIGludCB1bml0X2xlbmd0aDsKKyAgdW5zaWduZWQgaW50IHZlcnNpb247CisgIHVuc2lnbmVkIGludCBvcGNvZGVfYmFzZTsKKyAgRHdhcmZfU21hbGwgKnN0YW5kYXJkX29wY29kZV9sZW5ndGhzOworICB1bnNpZ25lZCBpbnQgbWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGg7CisgIHVuc2lnbmVkIGludCBkZWZhdWx0X2lzX3N0bXQ7CisgIGludCBsaW5lX2Jhc2U7CisgIHVuc2lnbmVkIGludCBsaW5lX3JhbmdlOworICBpbnQgbGVuZ3RoOworICBzdHJ1Y3QgZGlybGlzdCBjb21wX2Rpcl9lbGVtOworICBzdHJ1Y3QgZGlybGlzdCAqZGlybGlzdDsKKyAgdW5zaWduZWQgaW50IG5kaXJsaXN0OworICBzdHJ1Y3QgZGlybGlzdCAqKmRpcmFycmF5OworICBzdHJ1Y3QgZmlsZWxpc3QgKmZpbGVsaXN0OworICB1bnNpZ25lZCBpbnQgbmZpbGVsaXN0OworICBzdHJ1Y3QgZmlsZWxpc3QgbnVsbF9maWxlOworICBEd2FyZl9VbnNpZ25lZCBhZGRyZXNzOworICBzaXplX3QgZmlsZTsKKyAgc2l6ZV90IGxpbmU7CisgIHNpemVfdCBjb2x1bW47CisgIGludCBpc19zdG10OworICBpbnQgYmFzaWNfYmxvY2s7CisgIGludCBwcm9sb2d1ZV9lbmQ7CisgIGludCBlcGlsb2d1ZV9iZWdpbjsKKyAgc3RydWN0IGxpbmVsaXN0ICpsaW5lbGlzdDsKKyAgdW5zaWduZWQgaW50IG5saW5lbGlzdDsKKyAgaW50IHJlczsKKworICAvKiBUaGUgZGllIG11c3QgYmUgZm9yIGEgY29tcGlsYXRpb24gdW5pdC4gICovCisgIGlmICh1bmxpa2VseSAoZGllLT5hYmJyZXYtPnRhZyAhPSBEV19UQUdfY29tcGlsZV91bml0KSkKKyAgICB7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkaWUtPmN1LT5kYmcsIGVycm9yLCBEV19FX05PX0NVKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorCisgIC8qIFRoZSBkaWUgbXVzdCBoYXZlIGEgc3RhdGVtZW50IGxpc3QgYXNzb2NpYXRlZC4gICovCisgIHJlcyA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfc3RtdF9saXN0LCAmc3RtdF9saXN0LCBlcnJvcik7CisgIGlmICh1bmxpa2VseSAocmVzICE9IERXX0RMVl9PSykpCisgICAgcmV0dXJuIHJlczsKKworICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZGVidWdfbGluZSBzZWN0aW9uLiAgKi8KKyAgcmVzID0gZHdhcmZfZm9ybXVkYXRhIChzdG10X2xpc3QsICZvZmZzZXQsIGVycm9yKTsKKyAgaWYgKHVubGlrZWx5IChyZXMgIT0gRFdfRExWX09LKSkKKyAgICB7CisgICAgICBkd2FyZl9kZWFsbG9jIChkYmcsIHN0bXRfbGlzdCwgRFdfRExBX0FUVFIpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgLyogV2UgbmVlZCBhIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLworICBpZiAoZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfbGluZV0uYWRkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PX0RFQlVHX0xJTkUpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgbGluZXAgPSAoRHdhcmZfU21hbGwgKikgZGJnLT5zZWN0aW9uc1tJRFhfZGVidWdfbGluZV0uYWRkciArIG9mZnNldDsKKyAgbGluZWVuZHAgPSAoKER3YXJmX1NtYWxsICopIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2xpbmVdLmFkZHIKKwkgICAgICArIGRiZy0+c2VjdGlvbnNbSURYX2RlYnVnX2xpbmVdLnNpemUpOworCisgIC8qIFRlc3Qgd2hldGhlciBhdCBsZWFzdCB0aGUgZmlyc3QgNCBieXRlcyBhcmUgYXZhaWxhYmxlLiAgKi8KKyAgaWYgKHVubGlrZWx5IChsaW5lcCArIDQgPiBsaW5lZW5kcCkpCisgICAgeworICAgICAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAvKiBHZXQgdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeS4gICovCisgIHJlcyA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfY29tcF9kaXIsICZjb21wX2Rpcl9hdHRyLCBlcnJvcik7CisgIGlmICh1bmxpa2VseSAocmVzID09IERXX0RMVl9FUlJPUikKKyAgICAgIHx8IChyZXMgPT0gRFdfRExWX09LCisJICAmJiB1bmxpa2VseSAoZHdhcmZfZm9ybXN0cmluZyAoY29tcF9kaXJfYXR0ciwgJmNvbXBfZGlyLCBlcnJvcikKKwkJICAgICAgID09IERXX0RMVl9FUlJPUikpKQorICAgIHsKKyAgICAgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisgICAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisgIGVsc2UgaWYgKHJlcyA9PSBEV19ETFZfT0spCisgICAgZHdhcmZfZGVhbGxvYyAoZGJnLCBjb21wX2Rpcl9hdHRyLCBEV19ETEFfQVRUUik7CisgIGVsc2UKKyAgICBjb21wX2RpciA9IE5VTEw7CisKKyAgLyogUmVhZCB0aGUgdW5pdF9sZW5ndGguICAqLworICB1bml0X2xlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBsaW5lcCk7CisgIGxpbmVwICs9IDQ7CisgIGxlbmd0aCA9IDQ7CisgIGlmICh1bml0X2xlbmd0aCA9PSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgIGlmICh1bmxpa2VseSAobGluZXAgKyA4ID4gbGluZWVuZHApKQorCXsKKwkgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwl9CisKKyAgICAgIHVuaXRfbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGxpbmVwKTsKKyAgICAgIGxpbmVwICs9IDg7CisgICAgICBsZW5ndGggPSA4OworICAgIH0KKworICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgZW5vdWdoIHJvb20gaW4gdGhlIHNlY3Rpb24uICAqLworICBpZiAodW5saWtlbHkgKGxpbmVwICsgdW5pdF9sZW5ndGggPiBsaW5lZW5kcCkpCisgICAgeworICAgICAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKyAgbGluZWVuZHAgPSBsaW5lcCArIHVuaXRfbGVuZ3RoOworCisgIC8qIFRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGhlYWRlciBpcyB0aGUgdmVyc2lvbiBpZGVudGlmaWVyLiAgKi8KKyAgdmVyc2lvbiA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoZGJnLCBsaW5lcCk7CisgIGlmICh1bmxpa2VseSAodmVyc2lvbiAhPSBEV0FSRl9WRVJTSU9OKSkKKyAgICB7CisgICAgICBkd2FyZl9kZWFsbG9jIChkYmcsIHN0bXRfbGlzdCwgRFdfRExBX0FUVFIpOworICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9WRVJTSU9OX0VSUk9SKTsKKyAgICAgIHJldHVybiBEV19ETFZfRVJST1I7CisgICAgfQorICBsaW5lcCArPSAyOworCisgIC8qIE5leHQgY29tZXMgdGhlIGhlYWRlciBsZW5ndGguICAqLworICBpZiAobGVuZ3RoID09IDQpCisgICAgeworICAgICAgaGVhZGVyX2xlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBsaW5lcCk7CisgICAgICBsaW5lcCArPSA0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGhlYWRlcl9sZW5ndGggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgbGluZXApOworICAgICAgbGluZXAgKz0gODsKKyAgICB9CisgIGhlYWRlcl9zdGFydCA9IGxpbmVwOworCisgIC8qIE5leHQgdGhlIG1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoLiAgKi8KKyAgbWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGggPSAqbGluZXArKzsKKworICAvKiBUaGVuIHRoZSBmbGFnIGRldGVybWluaW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBpc19zdG10CisgICAgIHJlZ2lzdGVyLiAgKi8KKyAgZGVmYXVsdF9pc19zdG10ID0gKmxpbmVwKys7CisKKyAgLyogTm93IHRoZSBsaW5lIGJhc2UuICAqLworICBsaW5lX2Jhc2UgPSAqKChzaWduZWQgY2hhciAqKSBsaW5lcCkrKzsKKworICAvKiBBbmQgdGhlIGxpbmUgcmFuZ2UuICAqLworICBsaW5lX3JhbmdlID0gKmxpbmVwKys7CisKKyAgLyogVGhlIG9wY29kZSBiYXNlLiAgKi8KKyAgb3Bjb2RlX2Jhc2UgPSAqbGluZXArKzsKKworICAvKiBSZW1lbWJlciBhcnJheSB3aXRoIHRoZSBzdGFuZGFyZCBvcGNvZGUgbGVuZ3RoICgtMSB0byBhY2NvdW50IGZvcgorICAgICB0aGUgb3Bjb2RlIHdpdGggdmFsdWUgemVybyBub3QgYmVpbmcgbWVudGlvbmVkKS4gICovCisgIHN0YW5kYXJkX29wY29kZV9sZW5ndGhzID0gbGluZXAgLSAxOworICBsaW5lcCArPSBvcGNvZGVfYmFzZSAtIDE7CisKKyAgLyogRmlyc3QgY29tZXMgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMuICBBZGQgdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeQorICAgICBmaXJzdCBzaW5jZSB0aGUgaW5kZXggemVybyBpcyB1c2VkIGZvciBpdC4gICovCisgIGNvbXBfZGlyX2VsZW0uZGlyID0gY29tcF9kaXI7CisgIGNvbXBfZGlyX2VsZW0ubGVuID0gY29tcF9kaXIgPyBzdHJsZW4gKGNvbXBfZGlyKSA6IDA7CisgIGNvbXBfZGlyX2VsZW0ubmV4dCA9IE5VTEw7CisgIGRpcmxpc3QgPSAmY29tcF9kaXJfZWxlbTsKKyAgbmRpcmxpc3QgPSAxOworCisgIHdoaWxlICgqbGluZXAgIT0gMCkKKyAgICB7CisgICAgICBzdHJ1Y3QgZGlybGlzdCAqbmV3X2RpciA9IChzdHJ1Y3QgZGlybGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoKm5ld19kaXIpKTsKKworICAgICAgbmV3X2Rpci0+ZGlyID0gKGNoYXIgKikgbGluZXA7CisgICAgICBuZXdfZGlyLT5sZW4gPSBzdHJsZW4gKChjaGFyICopIGxpbmVwKTsKKyAgICAgIG5ld19kaXItPm5leHQgPSBkaXJsaXN0OworICAgICAgZGlybGlzdCA9IG5ld19kaXI7CisgICAgICArK25kaXJsaXN0OworICAgICAgbGluZXAgKz0gbmV3X2Rpci0+bGVuICsgMTsKKyAgICB9CisgIC8qIFNraXAgdGhlIGZpbmFsIE5VTCBieXRlLiAgKi8KKyAgKytsaW5lcDsKKworICAvKiBSZWFycmFuZ2UgdGhlIGxpc3QgaW4gYXJyYXkgZm9ybS4gICovCisgIGRpcmFycmF5ID0gKHN0cnVjdCBkaXJsaXN0ICoqKSBhbGxvY2EgKHNpemVvZiAoKmRpcmFycmF5KSk7CisgIHdoaWxlIChuZGlybGlzdC0tID4gMCkKKyAgICB7CisgICAgICBkaXJhcnJheVtuZGlybGlzdF0gPSBkaXJsaXN0OworICAgICAgZGlybGlzdCA9IGRpcmxpc3QtPm5leHQ7CisgICAgfQorCisgIGNvbXBfZGlyX2VsZW0uZGlyID0gY29tcF9kaXI7CisgIGNvbXBfZGlyX2VsZW0ubGVuID0gY29tcF9kaXIgPyBzdHJsZW4gKGNvbXBfZGlyKSA6IDA7CisgIGNvbXBfZGlyX2VsZW0ubmV4dCA9IE5VTEw7CisgIGRpcmxpc3QgPSAmY29tcF9kaXJfZWxlbTsKKyAgbmRpcmxpc3QgPSAxOworCisgIC8qIE5vdyByZWFkIHRoZSBmaWxlcy4gICovCisgIG51bGxfZmlsZS5uYW1lID0gIj8/PyI7CisgIG51bGxfZmlsZS5tdGltZSA9IDA7CisgIG51bGxfZmlsZS5sZW5ndGggPSAwOworICBudWxsX2ZpbGUubmV4dCA9IE5VTEw7CisgIGZpbGVsaXN0ID0gJm51bGxfZmlsZTsKKyAgbmZpbGVsaXN0ID0gMTsKKworICB3aGlsZSAoKmxpbmVwICE9IDApCisgICAgeworICAgICAgc3RydWN0IGZpbGVsaXN0ICpuZXdfZmlsZSA9CisJKHN0cnVjdCBmaWxlbGlzdCAqKSBhbGxvY2EgKHNpemVvZiAoKm5ld19maWxlKSk7CisgICAgICBjaGFyICpmbmFtZTsKKyAgICAgIHNpemVfdCBmbmFtZWxlbjsKKyAgICAgIER3YXJmX1Vuc2lnbmVkIGRpcmlkeDsKKworICAgICAgLyogRmlyc3QgY29tZXMgdGhlIGZpbGUgbmFtZS4gICovCisgICAgICBmbmFtZSA9IChjaGFyICopIGxpbmVwOworICAgICAgZm5hbWVsZW4gPSBzdHJsZW4gKGZuYW1lKTsKKyAgICAgIGxpbmVwICs9IGZuYW1lbGVuICsgMTsKKworICAgICAgLyogVGhlbiB0aGUgaW5kZXguICAqLworICAgICAgZ2V0X3VsZWIxMjggKGRpcmlkeCwgbGluZXApOworICAgICAgaWYgKHVubGlrZWx5IChkaXJpZHggPj0gbmRpcmxpc3QpKQorCXsKKwkgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRElSX0lEWCk7CisJICByZXR1cm4gRFdfRExWX0VSUk9SOworCX0KKworICAgICAgaWYgKCpmbmFtZSA9PSAnLycpCisJLyogSXQncyBhbiBhYnNvbHV0ZSBwYXRoLiAgKi8KKwluZXdfZmlsZS0+bmFtZSA9IHN0cmR1cCAoZm5hbWUpOworICAgICAgZWxzZQorCXsKKwkgIG5ld19maWxlLT5uYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJhcnJheVtkaXJpZHhdLT5sZW4gKyAxCisJCQkJCSAgICArIGZuYW1lbGVuICsgMSk7CisJICBpZiAobmV3X2ZpbGUtPm5hbWUgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGNoYXIgKmNwID0gbmV3X2ZpbGUtPm5hbWU7CisKKwkgICAgICBpZiAoZGlyYXJyYXlbZGlyaWR4XS0+ZGlyICE9IE5VTEwpCisJCS8qIFRoaXMgdmFsdWUgY291bGQgYmUgTlVMTCBpbiBjYXNlIHRoZSBEV19BVF9jb21wX2RpcgorCQkgICB3YXMgbm90IHByZXNlbnQuICBXZSBjYW5ub3QgZG8gbXVjaCBpbiB0aGlzIGNhc2UuCisJCSAgIFRoZSBlYXNpZXN0IHRoaW5nIGlzIHRvIGNvbnZlcnQgdGhlIHBhdGggaW4gYW4KKwkJICAgYWJzb2x1dGUgcGF0aC4gICovCisJCWNwID0gc3RwY3B5IChjcCwgZGlyYXJyYXlbZGlyaWR4XS0+ZGlyKTsKKwkgICAgICAqY3ArKyA9ICcvJzsKKwkgICAgICBzdHJjcHkgKGNwLCBmbmFtZSk7CisJICAgIH0KKwl9CisgICAgICBpZiAobmV3X2ZpbGUtPm5hbWUgPT0gTlVMTCkKKwl7CisJICAvKiBYWFggU2hvdWxkIHdlIGJvdGhlciB0byBmcmVlIGFsbCB0aGUgbWVtb3J5PyAgKi8KKwkgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKwkgIHJldHVybiBEV19ETFZfRVJST1I7CisJfQorCisgICAgICAvKiBOZXh0IGNvbWVzIHRoZSBtb2RpZmljYXRpb24gdGltZS4gICovCisgICAgICBnZXRfdWxlYjEyOCAobmV3X2ZpbGUtPm10aW1lLCBsaW5lcCk7CisKKyAgICAgIC8qIEZpbmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4gICovCisgICAgICBnZXRfdWxlYjEyOCAobmV3X2ZpbGUtPmxlbmd0aCwgbGluZXApOworCisgICAgICBuZXdfZmlsZS0+bmV4dCA9IGZpbGVsaXN0OworICAgICAgZmlsZWxpc3QgPSBuZXdfZmlsZTsKKyAgICAgICsrbmZpbGVsaXN0OworICAgIH0KKyAgKytsaW5lcDsKKworICAvKiBDb25zaXN0ZW5jeSBjaGVjay4gICovCisgIGlmICh1bmxpa2VseSAobGluZXAgIT0gaGVhZGVyX3N0YXJ0ICsgaGVhZGVyX2xlbmd0aCkpCisgICAgeworICAgICAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAvKiBXZSBhcmUgYWJvdXQgdG8gcHJvY2VzcyB0aGUgc3RhdGVtZW50IHByb2dyYW0uICBJbml0aWFsaXplIHRoZQorICAgICBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAoc2VlIDYuMi4yIGluIHRoZSB2Mi4xIHNwZWNpZmljYXRpb24pLiAgKi8KKyAgYWRkcmVzcyA9IDA7CisgIGZpbGUgPSAxOworICBsaW5lID0gMTsKKyAgY29sdW1uID0gMDsKKyAgaXNfc3RtdCA9IGRlZmF1bHRfaXNfc3RtdDsKKyAgYmFzaWNfYmxvY2sgPSAwOworICBwcm9sb2d1ZV9lbmQgPSAwOworICBlcGlsb2d1ZV9iZWdpbiA9IDA7CisKKyAgLyogUHJvY2VzcyB0aGUgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgbGluZWxpc3QgPSBOVUxMOworICBubGluZWxpc3QgPSAwOworICB3aGlsZSAobGluZXAgPCBsaW5lZW5kcCkKKyAgICB7CisgICAgICBzdHJ1Y3QgbGluZWxpc3QgKm5ld19saW5lOworICAgICAgdW5zaWduZWQgaW50IG9wY29kZTsKKyAgICAgIHVuc2lnbmVkIGludCB1MTI4OworICAgICAgaW50IHMxMjg7CisKKyAgICAgIC8qIFJlYWQgdGhlIG9wY29kZS4gICovCisgICAgICBvcGNvZGUgPSAqbGluZXArKzsKKworICAgICAgLyogSXMgdGhpcyBhIHNwZWNpYWwgb3Bjb2RlPyAgKi8KKyAgICAgIGlmIChsaWtlbHkgKG9wY29kZSA+PSBvcGNvZGVfYmFzZSkpCisJeworCSAgLyogWWVzLiAgSGFuZGxpbmcgdGhpcyBpcyBxdWl0ZSBlYXN5IHNpbmNlIHRoZSBvcGNvZGUgdmFsdWUKKwkgICAgIGlzIGNvbXB1dGVkIHdpdGgKKworCSAgICAgb3Bjb2RlID0gKGRlc2lyZWQgbGluZSBpbmNyZW1lbnQgLSBsaW5lX2Jhc2UpCisJCSAgICAgICsgKGxpbmVfcmFuZ2UgKiBhZGRyZXNzIGFkdmFuY2UpICsgb3Bjb2RlX2Jhc2UKKwkgICovCisJICBpbnQgbGluZV9pbmNyZW1lbnQgPSBsaW5lX2Jhc2UgKyAob3Bjb2RlIC0gb3Bjb2RlX2Jhc2UpICUgbGluZV9yYW5nZTsKKwkgIHVuc2lnbmVkIGludCBhZGRyZXNzX2luY3JlbWVudCA9IChtaW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aAorCQkJCQkgICAgKiAoKG9wY29kZSAtIG9wY29kZV9iYXNlKQorCQkJCQkgICAgICAgLyBsaW5lX3JhbmdlKSk7CisKKwkgIC8qIFBlcmZvcm0gdGhlIGluY3JlbWVudHMuICAqLworCSAgbGluZSArPSBsaW5lX2luY3JlbWVudDsKKwkgIGFkZHJlc3MgKz0gYWRkcmVzc19pbmNyZW1lbnQ7CisKKwkgIC8qIEFkZCBhIG5ldyBsaW5lIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgbWFjaGluZSB2YWx1ZXMuICAqLworCSAgTkVXX0xJTkUgKDApOworCisJICAvKiBSZXNldCB0aGUgZmxhZ3MuICAqLworCSAgYmFzaWNfYmxvY2sgPSAwOworCSAgcHJvbG9ndWVfZW5kID0gMDsKKwkgIGVwaWxvZ3VlX2JlZ2luID0gMDsKKwl9CisgICAgICBlbHNlIGlmIChvcGNvZGUgPT0gMCkKKwl7CisJICAvKiBUaGlzIGFuIGV4dGVuZGVkIG9wY29kZS4gICovCisJICB1bnNpZ25lZCBpbnQgbGVuOworCisJICAvKiBUaGUgbGVuZ3RoLiAgKi8KKwkgIGxlbiA9ICpsaW5lcCsrOworCisJICAvKiBUaGUgc3ViLW9wZWNvZGUuICAqLworCSAgb3Bjb2RlID0gKmxpbmVwKys7CisKKwkgIHN3aXRjaCAob3Bjb2RlKQorCSAgICB7CisJICAgIGNhc2UgRFdfTE5FX2VuZF9zZXF1ZW5jZToKKwkgICAgICAvKiBBZGQgYSBuZXcgbGluZSB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG1hY2hpbmUgdmFsdWVzLgorCQkgVGhlIGlzIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLiAgKi8KKwkgICAgICBORVdfTElORSAoMSk7CisKKwkgICAgICAvKiBSZXNldCB0aGUgcmVnaXN0ZXJzLiAgKi8KKwkgICAgICBhZGRyZXNzID0gMDsKKwkgICAgICBmaWxlID0gMTsKKwkgICAgICBsaW5lID0gMTsKKwkgICAgICBjb2x1bW4gPSAwOworCSAgICAgIGlzX3N0bXQgPSBkZWZhdWx0X2lzX3N0bXQ7CisJICAgICAgYmFzaWNfYmxvY2sgPSAwOworCSAgICAgIHByb2xvZ3VlX2VuZCA9IDA7CisJICAgICAgZXBpbG9ndWVfYmVnaW4gPSAwOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFdfTE5FX3NldF9hZGRyZXNzOgorCSAgICAgIGlmIChjdS0+YWRkcmVzc19zaXplID09IDQpCisJCWFkZHJlc3MgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgbGluZXApOworCSAgICAgIGVsc2UKKwkJYWRkcmVzcyA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCBsaW5lcCk7CisJICAgICAgbGluZXAgKz0gY3UtPmFkZHJlc3Nfc2l6ZTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERXX0xORV9kZWZpbmVfZmlsZToKKwkgICAgICB7CisJCXN0cnVjdCBmaWxlbGlzdCAqbmV3X2ZpbGU7CisJCWNoYXIgKmZuYW1lOworCQlzaXplX3QgZm5hbWVsZW47CisJCXVuc2lnbmVkIGludCBkaXJpZHg7CisJCUR3YXJmX1Vuc2lnbmVkIG10aW1lOworCQlEd2FyZl9VbnNpZ25lZCBsZW5ndGg7CisKKwkJZm5hbWUgPSAoY2hhciAqKSBsaW5lcDsKKwkJZm5hbWVsZW4gPSBzdHJsZW4gKGZuYW1lKTsKKwkJbGluZXAgKz0gZm5hbWVsZW4gKyAxOworCisJCWdldF91bGViMTI4IChkaXJpZHgsIGxpbmVwKTsKKwkJZ2V0X3VsZWIxMjggKG10aW1lLCBsaW5lcCk7CisJCWdldF91bGViMTI4IChsZW5ndGgsIGxpbmVwKTsKKworCQluZXdfZmlsZSA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgYWxsb2NhIChzaXplb2YgKCpuZXdfZmlsZSkpOworCQlpZiAoZm5hbWVbMF0gPT0gJy8nKQorCQkgIG5ld19maWxlLT5uYW1lID0gc3RyZHVwIChmbmFtZSk7CisJCWVsc2UKKwkJICB7CisKKwkJICAgIG5ld19maWxlLT5uYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJhcnJheVtkaXJpZHhdLT5sZW4gKyAxCisJCQkJCQkgICAgICArIGZuYW1lbGVuICsgMSk7CisJCSAgICBpZiAobmV3X2ZpbGUtPm5hbWUgIT0gTlVMTCkKKwkJICAgICAgeworCQkJY2hhciAqY3AgPSBuZXdfZmlsZS0+bmFtZTsKKworCQkJaWYgKGRpcmFycmF5W2RpcmlkeF0tPmRpciAhPSBOVUxMKQorCQkJICAvKiBUaGlzIHZhbHVlIGNvdWxkIGJlIE5VTEwgaW4gY2FzZSB0aGUKKwkJCSAgICAgRFdfQVRfY29tcF9kaXIgd2FzIG5vdCBwcmVzZW50LiAgV2UKKwkJCSAgICAgY2Fubm90IGRvIG11Y2ggaW4gdGhpcyBjYXNlLiAgVGhlIGVhc2llc3QKKwkJCSAgICAgdGhpbmcgaXMgdG8gY29udmVydCB0aGUgcGF0aCBpbiBhbgorCQkJICAgICBhYnNvbHV0ZSBwYXRoLiAgKi8KKwkJCSAgY3AgPSBzdHBjcHkgKGNwLCBkaXJhcnJheVtkaXJpZHhdLT5kaXIpOworCQkJKmNwKysgPSAnLyc7CisJCQlzdHJjcHkgKGNwLCBmbmFtZSk7CisJCSAgICAgIH0KKwkJICB9CisJCWlmIChuZXdfZmlsZS0+bmFtZSA9PSBOVUxMKQorCQkgIHsKKwkJICAgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisJCSAgICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX05PTUVNKTsKKwkJICAgIHJldHVybiBEV19ETFZfRVJST1I7CisJCSAgfQorCisJCW5ld19maWxlLT5tdGltZSA9IG10aW1lOworCQluZXdfZmlsZS0+bGVuZ3RoID0gbGVuZ3RoOworCQluZXdfZmlsZS0+bmV4dCA9IGZpbGVsaXN0OworCQlmaWxlbGlzdCA9IG5ld19maWxlOworCQkrK25maWxlbGlzdDsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICAvKiBVbmtub3duLCBpZ25vcmUgaXQuICAqLworCSAgICAgIGxpbmVwICs9IGxlbiAtIDE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChvcGNvZGUgPD0gRFdfTE5TX3NldF9lcGlsb2dfYmVnaW4pCisJeworCSAgLyogVGhpcyBpcyBhIGtub3duIHN0YW5kYXJkIG9wY29kZS4gICovCisJICBzd2l0Y2ggKG9wY29kZSkKKwkgICAgeworCSAgICBjYXNlIERXX0xOU19jb3B5OgorCSAgICAgIC8qIFRha2VzIG5vIGFyZ3VtZW50LiAgKi8KKwkgICAgICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMCkpCisJCXsKKwkJICAvKiBYWFggRnJlZSBtZW1vcnkuICAqLworCQkgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisJCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkJICByZXR1cm4gRFdfRExWX0VSUk9SOworCQl9CisKKwkgICAgICAvKiBBZGQgYSBuZXcgbGluZSB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG1hY2hpbmUgdmFsdWVzLiAgKi8KKwkgICAgICBORVdfTElORSAoMCk7CisKKwkgICAgICAvKiBSZXNldCB0aGUgZmxhZ3MuICAqLworCSAgICAgIGJhc2ljX2Jsb2NrID0gMDsKKwkgICAgICAvKiBYWFggV2hldGhlciB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyBhcmUgbmVjZXNzYXJ5IGlzCisJCSB1bmNsZWFyLiAgSSBndWVzcyB0aGUgY3VycmVudCB2Mi4xIHNwZWNpZmljYXRpb24gaGFzCisJCSBhIGJ1ZyBpbiB0aGF0IGl0IHNheXMgY2xlYXJpbmcgdGhlc2UgdHdvIHJlZ2lzdGVycyBpcworCQkgbm90IG5lY2Vzc2FyeS4gICovCisJICAgICAgcHJvbG9ndWVfZW5kID0gMDsKKwkgICAgICBlcGlsb2d1ZV9iZWdpbiA9IDA7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9wYzoKKwkgICAgICAvKiBUYWtlcyBvbmUgdWxlYjEyOCBwYXJhbWV0ZXIgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIGFkZHJlc3MuICAqLworCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKSkKKwkJeworCQkgIC8qIFhYWCBGcmVlIG1lbW9yeS4gICovCisJCSAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKwkJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgIHJldHVybiBEV19ETFZfRVJST1I7CisJCX0KKworCSAgICAgIGdldF91bGViMTI4ICh1MTI4LCBsaW5lcCk7CisJICAgICAgYWRkcmVzcyArPSBtaW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aCAqIHUxMjg7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOgorCSAgICAgIC8qIFRha2VzIG9uZSBzbGViMTI4IHBhcmFtZXRlciB3aGljaCBpcyBhZGRlZCB0byB0aGUgbGluZS4gICovCisJICAgICAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDEpKQorCQl7CisJCSAgLyogWFhYIEZyZWUgbWVtb3J5LiAgKi8KKwkJICBkd2FyZl9kZWFsbG9jIChkYmcsIHN0bXRfbGlzdCwgRFdfRExBX0FUVFIpOworCQkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkJfQorCisJICAgICAgZ2V0X3NsZWIxMjggKHMxMjgsIGxpbmVwKTsKKwkgICAgICBsaW5lICs9IHMxMjg7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6CisJICAgICAgLyogVGFrZXMgb25lIHVsZWIxMjggcGFyYW1ldGVyIHdoaWNoIGlzIHN0b3JlZCBpbiBmaWxlLiAgKi8KKwkgICAgICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMSkpCisJCXsKKwkJICAvKiBYWFggRnJlZSBtZW1vcnkuICAqLworCQkgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisJCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkJICByZXR1cm4gRFdfRExWX0VSUk9SOworCQl9CisKKwkgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXApOworCSAgICAgIGZpbGUgPSB1MTI4OworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFdfTE5TX3NldF9jb2x1bW46CisJICAgICAgLyogVGFrZXMgb25lIHVsZWIxMjggcGFyYW1ldGVyIHdoaWNoIGlzIHN0b3JlZCBpbiBjb2x1bW4uICAqLworCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKSkKKwkJeworCQkgIC8qIFhYWCBGcmVlIG1lbW9yeS4gICovCisJCSAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKwkJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgIHJldHVybiBEV19ETFZfRVJST1I7CisJCX0KKworCSAgICAgIGdldF91bGViMTI4ICh1MTI4LCBsaW5lcCk7CisJICAgICAgY29sdW1uID0gdTEyODsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERXX0xOU19uZWdhdGVfc3RtdDoKKwkgICAgICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCisJICAgICAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDApKQorCQl7CisJCSAgLyogWFhYIEZyZWUgbWVtb3J5LiAgKi8KKwkJICBkd2FyZl9kZWFsbG9jIChkYmcsIHN0bXRfbGlzdCwgRFdfRExBX0FUVFIpOworCQkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkJfQorCisJICAgICAgaXNfc3RtdCA9IDEgLSBpc19zdG10OworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFdfTE5TX3NldF9iYXNpY19ibG9jazoKKwkgICAgICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCisJICAgICAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDApKQorCQl7CisJCSAgLyogWFhYIEZyZWUgbWVtb3J5LiAgKi8KKwkJICBkd2FyZl9kZWFsbG9jIChkYmcsIHN0bXRfbGlzdCwgRFdfRExBX0FUVFIpOworCQkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkJfQorCisJICAgICAgYmFzaWNfYmxvY2sgPSAxOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYzoKKwkgICAgICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCisJICAgICAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDApKQorCQl7CisJCSAgLyogWFhYIEZyZWUgbWVtb3J5LiAgKi8KKwkJICBkd2FyZl9kZWFsbG9jIChkYmcsIHN0bXRfbGlzdCwgRFdfRExBX0FUVFIpOworCQkgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfSU5WQUxJRF9EV0FSRik7CisJCSAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKwkJfQorCisJICAgICAgYWRkcmVzcyArPSAobWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGgKKwkJCSAgKiAoKDI1NSAtIG9wY29kZV9iYXNlKSAvIGxpbmVfcmFuZ2UpKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOgorCSAgICAgIC8qIFRha2VzIG9uZSAxNiBiaXQgcGFyYW1ldGVyIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBhZGRyZXNzLiAgKi8KKwkgICAgICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMSkpCisJCXsKKwkJICAvKiBYWFggRnJlZSBtZW1vcnkuICAqLworCQkgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisJCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkJICByZXR1cm4gRFdfRExWX0VSUk9SOworCQl9CisKKwkgICAgICBhZGRyZXNzICs9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoZGJnLCBsaW5lcCk7CisJICAgICAgbGluZXAgKz0gMjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERXX0xOU19zZXRfcHJvbG9ndWVfZW5kOgorCSAgICAgIC8qIFRha2VzIG5vIGFyZ3VtZW50LiAgKi8KKwkgICAgICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMCkpCisJCXsKKwkJICAvKiBYWFggRnJlZSBtZW1vcnkuICAqLworCQkgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisJCSAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9JTlZBTElEX0RXQVJGKTsKKwkJICByZXR1cm4gRFdfRExWX0VSUk9SOworCQl9CisKKwkgICAgICBwcm9sb2d1ZV9lbmQgPSAxOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFdfTE5TX3NldF9lcGlsb2dfYmVnaW46CisJICAgICAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLworCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAwKSkKKwkJeworCQkgIC8qIFhYWCBGcmVlIG1lbW9yeS4gICovCisJCSAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKwkJICBfX2xpYmR3YXJmX2Vycm9yIChkYmcsIGVycm9yLCBEV19FX0lOVkFMSURfRFdBUkYpOworCQkgIHJldHVybiBEV19ETFZfRVJST1I7CisJCX0KKworCSAgICAgIGVwaWxvZ3VlX2JlZ2luID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGlzIGlzIGEgbmV3IG9wY29kZSB0aGUgZ2VuZXJhdG9yIGJ1dCBub3Qgd2Uga25vdyBhYm91dC4KKwkgICAgIFJlYWQgdGhlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIGl0IGJ1dCB0aGVuIGRpc2NhcmQKKwkgICAgIGV2ZXJ5dGhpbmcuICAqLworCSAgaW50IG47CisKKwkgIC8qIFJlYWQgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG9wY29kZS4gICovCisJICBmb3IgKG4gPSBzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdOyBuID4gMDsgLS1uKQorCSAgICB7CisJICAgICAgRHdhcmZfVW5zaWduZWQgdTEyODsKKwkgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXApOworCSAgICB9CisKKwkgIC8qIE5leHQgcm91bmQsIGlnbm9yZSB0aGlzIG9wY29kZS4gICovCisJICBjb250aW51ZTsKKwl9CisgICAgfQorCisgIC8qIFB1dCBhbGwgdGhlIGZpbGVzIGluIGFuIGFycmF5LiAgKi8KKyAgZmlsZXMgPSAoRHdhcmZfRmlsZSkgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBEd2FyZl9GaWxlX3MpCisJCQkgICAgICAgKyBuZmlsZWxpc3QgKiBzaXplb2YgKER3YXJmX0ZpbGVpbmZvKSk7CisgIGlmIChmaWxlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFhYWCBTaG91bGQgd2UgYm90aGVyIHRvIGZyZWUgYWxsIHRoZSBtZW1vcnk/ICAqLworICAgICAgZHdhcmZfZGVhbGxvYyAoZGJnLCBzdG10X2xpc3QsIERXX0RMQV9BVFRSKTsKKyAgICAgIF9fbGliZHdhcmZfZXJyb3IgKGRiZywgZXJyb3IsIERXX0VfTk9NRU0pOworICAgICAgcmV0dXJuIERXX0RMVl9FUlJPUjsKKyAgICB9CisKKyAgZmlsZXMtPm5maWxlcyA9IG5maWxlbGlzdDsKKyAgd2hpbGUgKG5maWxlbGlzdC0tID4gMCkKKyAgICB7CisgICAgICBmaWxlcy0+aW5mb1tuZmlsZWxpc3RdLm5hbWUgPSBmaWxlbGlzdC0+bmFtZTsKKyAgICAgIGZpbGVzLT5pbmZvW25maWxlbGlzdF0ubXRpbWUgPSBmaWxlbGlzdC0+bXRpbWU7CisgICAgICBmaWxlcy0+aW5mb1tuZmlsZWxpc3RdLmxlbmd0aCA9IGZpbGVsaXN0LT5sZW5ndGg7CisgICAgICBmaWxlbGlzdCA9IGZpbGVsaXN0LT5uZXh0OworICAgIH0KKworICAvKiBSZW1lbWJlciB0aGUgZGVidWdnaW5nIGRlc2NyaXB0b3IuICAqLworICBmaWxlcy0+ZGJnID0gZGJnOworCisgIC8qIE5vdyBwdXQgdGhlIGxpbmVzIGluIGFuIGFycmF5LiAgKi8KKyAgbGluZXMgPSAoRHdhcmZfTGluZSAqKSBtYWxsb2MgKG5saW5lbGlzdCAqIHNpemVvZiAoRHdhcmZfTGluZSkpOworICBpZiAobGluZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBkd2FyZl9kZWFsbG9jIChkYmcsIHN0bXRfbGlzdCwgRFdfRExBX0FUVFIpOworICAgICAgX19saWJkd2FyZl9lcnJvciAoZGJnLCBlcnJvciwgRFdfRV9OT01FTSk7CisgICAgICByZXR1cm4gRFdfRExWX0VSUk9SOworICAgIH0KKworICAqbGluZWJ1ZiA9IGxpbmVzOworICAqbGluZWNvdW50ID0gbmxpbmVsaXN0OworCisgIHdoaWxlIChubGluZWxpc3QtLSkKKyAgICB7CisgICAgICBsaW5lc1tubGluZWxpc3RdID0gbGluZWxpc3QtPmxpbmU7CisgICAgICBsaW5lbGlzdC0+bGluZS0+ZmlsZXMgPSBmaWxlczsKKyAgICAgIGxpbmVsaXN0ID0gbGluZWxpc3QtPm5leHQ7CisgICAgfQorCisgIGR3YXJmX2RlYWxsb2MgKGRiZywgc3RtdF9saXN0LCBEV19ETEFfQVRUUik7CisKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX3RhZy5jIGIvbGliZHdhcmYvZHdhcmZfdGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0ZDM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX3RhZy5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFJldHVybiB0YWcgb2YgZGllLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl90YWcgKGRpZSwgdGFndmFsLCBlcnJvcikKKyAgICAgRHdhcmZfRGllIGRpZTsKKyAgICAgRHdhcmZfSGFsZiAqdGFndmFsOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgICp0YWd2YWwgPSBkaWUtPmFiYnJldi0+dGFnOworICByZXR1cm4gRFdfRExWX09LOworfQpkaWZmIC0tZ2l0IGEvbGliZHdhcmYvZHdhcmZfd2hhdGF0dHIuYyBiL2xpYmR3YXJmL2R3YXJmX3doYXRhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4N2YyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2R3YXJmX3doYXRhdHRyLmMKQEAgLTAsMCArMSwzMCBAQAorLyogUmV0dXJuIGNvZGUgb2YgYXR0cmlidXRlLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZHdhcmZQLmg+CisKKworaW50Citkd2FyZl93aGF0YXR0ciAoYXR0ciwgcmV0dXJuX2F0dHIsIGVycm9yKQorICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKyAgICAgRHdhcmZfSGFsZiAqcmV0dXJuX2F0dHI7CisgICAgIER3YXJmX0Vycm9yICplcnJvcjsKK3sKKyAgKnJldHVybl9hdHRyID0gYXR0ci0+Y29kZTsKKyAgcmV0dXJuIERXX0RMVl9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYmR3YXJmL2R3YXJmX3doYXRmb3JtLmMgYi9saWJkd2FyZi9kd2FyZl93aGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjY3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9kd2FyZl93aGF0Zm9ybS5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFJldHVybiBmb3JtIG9mIGF0dHJpYnV0ZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmR3YXJmUC5oPgorCisKK2ludAorZHdhcmZfd2hhdGZvcm0gKGF0dHIsIHJldHVybl9mb3JtLCBlcnJvcikKKyAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgIER3YXJmX0hhbGYgKnJldHVybl9mb3JtOworICAgICBEd2FyZl9FcnJvciAqZXJyb3I7Cit7CisgICpyZXR1cm5fZm9ybSA9IGF0dHItPmZvcm07CisgIHJldHVybiBEV19ETFZfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJkd2FyZi9saWJkd2FyZi5oIGIvbGliZHdhcmYvbGliZHdhcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M5NThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdhcmYvbGliZHdhcmYuaApAQCAtMCwwICsxLDUxNCBAQAorLyogSW50ZXJmYWNlIGZvciBsaWJkd2FyZi4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9MSUJEV0FSRl9ICisjZGVmaW5lIF9MSUJEV0FSRl9IIDEKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBCYXNpYyBkYXRhIHR5cGVzLiAgKi8KKworLyogVXNlZCBmb3IgYm9vbGVhbiB2YWx1ZXMuICAqLwordHlwZWRlZiBpbnQgRHdhcmZfQm9vbDsKKworLyogTnVtZXJpYyB2YWx1ZXMgb2YgZGlmZmVyZW50IHNpemVzLiAgKi8KK3R5cGVkZWYgdWludDhfdCBEd2FyZl9TbWFsbDsKK3R5cGVkZWYgdWludDE2X3QgRHdhcmZfSGFsZjsKK3R5cGVkZWYgdWludDY0X3QgRHdhcmZfVW5zaWduZWQ7Cit0eXBlZGVmIGludDY0X3QgRHdhcmZfU2lnbmVkOworCisvKiBPZmZzZXRzIGluIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwordHlwZWRlZiB1aW50NjRfdCBEd2FyZl9PZmY7CisKKy8qIFByb2dyYW0gY291bnRlciB2YWx1ZSBpbiB0aGUgdGFyZ2V0IG9iamVjdCBmaWxlLiAgKi8KK3R5cGVkZWYgdWludDY0X3QgRHdhcmZfQWRkcjsKKworLyogQWRkcmVzcyBpbiB0aGUgaG9zdCBwcm9jZXNzLiAgKi8KK3R5cGVkZWYgdm9pZCAqRHdhcmZfUHRyOworCisKKy8qIExvY2F0aW9uIHJlY29yZC4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgRHdhcmZfU21hbGwgbHJfYXRvbTsJCS8qIE9wZXJhdGlvbiAqLworICAgIER3YXJmX1Vuc2lnbmVkIGxyX251bWJlcjsJCS8qIE9wZXJhbmQgKi8KKyAgICBEd2FyZl9VbnNpZ25lZCBscl9udW1iZXIyOwkJLyogUG9zc2libGUgc2Vjb25kIG9wZXJhbmQgKi8KKyAgICBEd2FyZl9VbnNpZ25lZCBscl9vZmZzZXQ7CQkvKiBPZmZzZXQgaW4gbG9jYXRpb24gZXhwcmVzc2lvbiAqLworICB9IER3YXJmX0xvYzsKKworCisvKiBMb2NhdGlvbiBkZXNjcmlwdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdAorICAgeworICAgICBEd2FyZl9BZGRyIGxkX2xvcGM7CQkvKiBCZWdpbm5pbmcgb2YgcmFuZ2UgKi8KKyAgICAgRHdhcmZfQWRkciBsZF9oaXBjOwkJLyogRW5kIG9mIHJhbmdlICovCisgICAgIER3YXJmX0hhbGYgbGRfY2VudHM7CQkvKiBOdW1iZXIgb2YgbG9jYXRpb24gcmVjb3JkcyAqLworICAgICBEd2FyZl9Mb2MgKmxkX3M7CQkJLyogQXJyYXkgb2YgbG9jYXRpb24gcmVjb3JkcyAqLworICB9IER3YXJmX0xvY2Rlc2M7CisKKworLyogRXJyb3IgaGFuZGxlciBmdW5jdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9FcnJvcl9zICpEd2FyZl9FcnJvcjsJLyogRm9yd2FyZCBkZWNsYXJhdGlvbi4gICovCit0eXBlZGVmIHZvaWQgKCpEd2FyZl9IYW5kbGVyKSAoRHdhcmZfRXJyb3IgKiwgRHdhcmZfUHRyKTsKKworLyogRGVzY3JpcHRvciBmb3IgYmxvY2sgb2YgdW5pbnRlcnByZXRlZCBkYXRhLiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBEd2FyZl9VbnNpZ25lZCBibF9sZW47CisgICAgRHdhcmZfUHRyIGJsX2RhdGE7CisgIH0gRHdhcmZfQmxvY2s7CisKKworLyogRGVzY3JpcHRvciBmb3IgbGliZHdhcmYgc2Vzc2lvbi4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9EZWJ1Z19zICpEd2FyZl9EZWJ1ZzsKKworLyogRGVzY3JpcHRvciBmb3IgRFdBUkYgRElFLiAgKi8KK3R5cGVkZWYgc3RydWN0IER3YXJmX0RpZV9zICpEd2FyZl9EaWU7CisKKy8qIERlc2NyaXB0b3IgZm9yIERXQVJGIGF0dHJpYnV0ZSBsaXN0LiAgKi8KK3R5cGVkZWYgc3RydWN0IER3YXJmX0F0dHJpYnV0ZV9zICpEd2FyZl9BdHRyaWJ1dGU7CisKKy8qIERlc2NyaXB0b3IgZm9yIHNvdXJjZSBsaW5lcy4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9MaW5lX3MgKkR3YXJmX0xpbmU7CisKKy8qIERlc2NyaXB0b3IgZm9yIGdsb2JhbCBuYW1lLiAgKi8KK3R5cGVkZWYgc3RydWN0IER3YXJmX0dsb2JhbF9zICpEd2FyZl9HbG9iYWw7CisKKy8qIERlc2NyaXB0b3IgZm9yIGFkZHJlc3MgcmFuZ2UuICAqLwordHlwZWRlZiBzdHJ1Y3QgRHdhcmZfQXJhbmdlX3MgKkR3YXJmX0FyYW5nZTsKKworLyogRGVzY3JpcHRvciBmb3IgY29tbW9uIGluZm9ybWF0aW9uIGVudHJ5LiAgKi8KK3R5cGVkZWYgc3RydWN0IER3YXJmX0NpZV9zICpEd2FyZl9DaWU7CisKKy8qIERlc2NyaXB0b3IgZm9yIGZyYW1lIGRlc2NyaXB0b3IgZW50cnkuICAqLwordHlwZWRlZiBzdHJ1Y3QgRHdhcmZfRmRlX3MgKkR3YXJmX0ZkZTsKKworLyogRGVzY3JpcHRvciBmb3IgYWJicmV2aWF0aW9ucy4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9BYmJyZXZfcyAqRHdhcmZfQWJicmV2OworCisKKy8qIFJldHVybiB2YWx1ZXMuICAqLworZW51bQorICB7CisgICAgRFdfRExWX05PX0VOVFJZID0gLTEsCS8qIE5vIGVycm9yLCBidXQgbm8gZW50cnkuICAqLworICAgIERXX0RMVl9PSyA9IDAsCQkvKiBTdWNjZXNzLiAgKi8KKyAgICBEV19ETFZfRVJST1IgPSAxLAkJLyogRmFpbHVyZS4gICovCisgIH07CisKKworLyogVmFsdWVzIGZvciBBQ0NFU1MgcGFyYW1ldGVyIG9mICdkd2FyZl9pbml0JyBhbmQgJ2R3YXJmX2VsZl9pbml0Jy4gICovCitlbnVtCisgIHsKKyAgICBEV19ETENfUkVBRCA9IDAsCQkvKiBSZWFkLW9ubHkgYWNjZXNzLiAgKi8KKyAgICBEV19ETENfV1JJVEUgPSAxLAkJLyogV3JpdGUtb25seSBhY2Nlc3MuICAqLworICAgIERXX0RMQ19SRFdSID0gMgkJLyogUmVhZC13cml0ZSBhY2Nlc3MuICAqLworICB9OworCisKKy8qIE9wZW4gZmlsZSBhc3NvY2lhdGVzIHdpdGggRkQgZm9yIHVzZSB3aXRoIHRoZSBvdGhlciBmdW5jdGlvbnMgb2YKKyAgIHRoaXMgbGlicmFyeS4gIFNldCB0aGUgZXJyb3IgaGFuZGxlciBhbmQgdGhlIHBhcmFtZXRlciBwYXNzZWQuICAqLworZXh0ZXJuIGludCBkd2FyZl9pbml0IChpbnQgZmQsIER3YXJmX1Vuc2lnbmVkIGFjY2VzcywKKwkJICAgICAgIER3YXJmX0hhbmRsZXIgZXJyaGFuZCwgRHdhcmZfUHRyIGVycmFyZywKKwkJICAgICAgIER3YXJmX0RlYnVnICpkYmcsIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogU2ltaWxhciB0byBgZHdhcmZfaW5pdCcgYnV0IGluc3RlYWQgb2YgYSBmaWxlIGRlc2NyaXB0b3Igb2YgRUxGCisgICBkZXNjcmlwdG9yIGlzIHBhc3NlZC4gICovCitleHRlcm4gaW50IGR3YXJmX2VsZl9pbml0IChFbGYgKmVsZiwgRHdhcmZfVW5zaWduZWQgYWNjZXNzLAorCQkJICAgRHdhcmZfSGFuZGxlciBlcnJoYW5kLCBEd2FyZl9QdHIgZXJyYXJnLAorCQkJICAgRHdhcmZfRGVidWcgKmRiZywgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gRUxGIGhhbmRsZS4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9lbGZfaW5pdCAoRHdhcmZfRGVidWcgZGJnLCBFbGYgKiplbGYsCisJCQkgICAgICAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBGcmVlIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGRlYnVnIGhhbmRsZS4gICovCitleHRlcm4gaW50IGR3YXJmX2ZpbmlzaCAoRHdhcmZfRGVidWcgZGJnLCBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgYW5kIGZpbmQgbmV3IGNvbXBpbGUgdW5pdCBoZWFkZXIuICAqLworZXh0ZXJuIGludCBkd2FyZl9uZXh0X2N1X2hlYWRlciAoRHdhcmZfRGVidWcgZGJnLAorCQkJCSBEd2FyZl9VbnNpZ25lZCAqY3VfaGVhZGVyX2xlbmd0aCwKKwkJCQkgRHdhcmZfSGFsZiAqdmVyc2lvbl9zdGFtcCwKKwkJCQkgRHdhcmZfVW5zaWduZWQgKmFiYnJldl9vZmZzZXQsCisJCQkJIER3YXJmX0hhbGYgKmFkZHJlc3Nfc2l6ZSwKKwkJCQkgRHdhcmZfVW5zaWduZWQgKm5leHRfY3VfaGVhZGVyLAorCQkJCSBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBzaWJsaW5nIG9mIGdpdmVuIERJRS4gICovCitleHRlcm4gaW50IGR3YXJmX3NpYmxpbmdvZiAoRHdhcmZfRGVidWcgZGJnLCBEd2FyZl9EaWUgZGllLAorCQkJICAgIER3YXJmX0RpZSAqcmV0dXJuX3N1YiwgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gY2hpbGQgb2YgRElFLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfY2hpbGQgKER3YXJmX0RpZSBkaWUsIER3YXJmX0RpZSAqcmV0dXJuX2tpZCwKKwkJCUR3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIERJRSBhdCBnaXZlbiBvZmZzZXQuICAqLworZXh0ZXJuIGludCBkd2FyZl9vZmZkaWUgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfT2ZmIG9mZnNldCwKKwkJCSBEd2FyZl9EaWUgKnJldHVybl9kaWUsIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworCisvKiBSZXR1cm4gdGFnIG9mIERJRS4gICovCitleHRlcm4gaW50IGR3YXJmX3RhZyAoRHdhcmZfRGllIGRpZSwgRHdhcmZfSGFsZiAqdGFndmFsLCBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBvZmZzZXQgb2YgRElFIGluIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICAqLworZXh0ZXJuIGludCBkd2FyZl9kaWVvZmZzZXQgKER3YXJmX0RpZSBkaWUsIER3YXJmX09mZiAqcmV0dXJuX29mZnNldCwKKwkJCSAgICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBvZmZzZXQgb2YgRElFIGluIGNvbXBpbGUgdW5pdCBkYXRhLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZGllX0NVX29mZnNldCAoRHdhcmZfRGllIGRpZSwgRHdhcmZfT2ZmICpyZXR1cm5fb2Zmc2V0LAorCQkJCUR3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIG5hbWUgYXR0cmlidXRlIG9mIERJRS4gICovCitleHRlcm4gaW50IGR3YXJmX2RpZW5hbWUgKER3YXJmX0RpZSBkaWUsIGNoYXIgKipyZXR1cm5fbmFtZSwKKwkJCSAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciBESUUuICAqLworZXh0ZXJuIGludCBkd2FyZl9hdHRybGlzdCAoRHdhcmZfRGllIGRpZSwgRHdhcmZfQXR0cmlidXRlICoqYXR0cmJ1ZiwKKwkJCSAgIER3YXJmX1NpZ25lZCAqYXR0cmNvdW50LCBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIERldGVybWluZSB3aGV0aGVyIERJRSBoYXMgYXR0cmlidXRlIHNwZWNpZmllZCBvZiBnaXZlbiB0eXBlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfaGFzYXR0ciAoRHdhcmZfRGllIGRpZSwgRHdhcmZfSGFsZiBhdHRyLAorCQkJICBEd2FyZl9Cb29sICpyZXR1cm5fYm9vbCwgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gRElFIGF0dHJpYnV0ZSB3aXRoIHNwZWNpZmllZCBvZiBnaXZlbiB0eXBlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfYXR0ciAoRHdhcmZfRGllIGRpZSwgRHdhcmZfSGFsZiBhdHRyLAorCQkgICAgICAgRHdhcmZfQXR0cmlidXRlICpyZXR1cm5fYXR0ciwgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gbG93IHByb2dyYW0gY291bnRlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggZGllLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfbG93cGMgKER3YXJmX0RpZSBkaWUsIER3YXJmX0FkZHIgKnJldHVybl9sb3dwYywKKwkJCUR3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIGhpZ2ggcHJvZ3JhbSBjb3VudGVyIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBkaWUuICAqLworZXh0ZXJuIGludCBkd2FyZl9oaWdocGMgKER3YXJmX0RpZSBkaWUsIER3YXJmX0FkZHIgKnJldHVybl9sb3dwYywKKwkJCSBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBieXRlIHNpemUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGRpZS4gICovCitleHRlcm4gaW50IGR3YXJmX2J5dGVzaXplIChEd2FyZl9EaWUgZGllLCBEd2FyZl9VbnNpZ25lZCAqcmV0dXJuX3NpemUsCisJCQkgICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBiaXQgc2l6ZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggZGllLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfYml0c2l6ZSAoRHdhcmZfRGllIGRpZSwgRHdhcmZfVW5zaWduZWQgKnJldHVybl9zaXplLAorCQkJICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBiaXQgb2Zmc2V0IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBkaWUuICAqLworZXh0ZXJuIGludCBkd2FyZl9iaXRvZmZzZXQgKER3YXJmX0RpZSBkaWUsIER3YXJmX1Vuc2lnbmVkICpyZXR1cm5fc2l6ZSwKKwkJCSAgICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBzb3VyY2UgbGFuZ3VhZ2UgYXNzb2NpYXRlZCB3aXRoIGRpZS4gICovCitleHRlcm4gaW50IGR3YXJmX3NyY2xhbmcgKER3YXJmX0RpZSBkaWUsIER3YXJmX1Vuc2lnbmVkICpyZXR1cm5fbGFuZywKKwkJCSAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gc291cmNlIGxhbmd1YWdlIGFzc29jaWF0ZWQgd2l0aCBkaWUuICAqLworZXh0ZXJuIGludCBkd2FyZl9hcnJheW9yZGVyIChEd2FyZl9EaWUgZGllLCBEd2FyZl9VbnNpZ25lZCAqcmV0dXJuX29yZGVyLAorCQkJICAgICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgYXR0cmlidXRlIGhhcyBnaXZlbiBmb3JtLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfaGFzZm9ybSAoRHdhcmZfQXR0cmlidXRlIGF0dHIsIER3YXJmX0hhbGYgZm9ybSwKKwkJCSAgRHdhcmZfQm9vbCAqcmV0dXJuX2hhc2Zvcm0sIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIGZvcm0gb2YgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfd2hhdGZvcm0gKER3YXJmX0F0dHJpYnV0ZSBhdHRyLCBEd2FyZl9IYWxmICpyZXR1cm5fZm9ybSwKKwkJCSAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIGNvZGUgb2YgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfd2hhdGF0dHIgKER3YXJmX0F0dHJpYnV0ZSBhdHRyLCBEd2FyZl9IYWxmICpyZXR1cm5fYXR0ciwKKwkJCSAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogIFJldHVybiBjb21waWxlLXVuaXQgcmVsYXRpdmUgb2Zmc2V0IG9mIHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggZm9ybS4gICovCitleHRlcm4gaW50IGR3YXJmX2Zvcm1yZWYgKER3YXJmX0F0dHJpYnV0ZSBhdHRyLCBEd2FyZl9PZmYgKnJldHVybl9vZmZzZXQsCisJCQkgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogIFJldHVybiAuZGVidWdfaW5mbyBzZWN0aW9uIGdsb2JhbCBvZmZzZXQgb2YgcmVmZXJlbmNlIGFzc29jaWF0ZWQKKyAgICB3aXRoIGZvcm0uICAqLworZXh0ZXJuIGludCBkd2FyZl9nbG9iYWxfZm9ybXJlZiAoRHdhcmZfQXR0cmlidXRlIGF0dHIsCisJCQkJIER3YXJmX09mZiAqcmV0dXJuX29mZnNldCwKKwkJCQkgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gYWRkcmVzcyByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuICAqLworZXh0ZXJuIGludCBkd2FyZl9mb3JtYWRkciAoRHdhcmZfQXR0cmlidXRlIGF0dHIsIER3YXJmX0FkZHIgKnJldHVybl9hZGRyLAorCQkJICAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gZmxhZyByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuICAqLworZXh0ZXJuIGludCBkd2FyZl9mb3JtZmxhZyAoRHdhcmZfQXR0cmlidXRlIGF0dHIsIER3YXJmX0Jvb2wgKnJldHVybl9ib29sLAorCQkJICAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gdW5zaWduZWQgY29uc3RhbnQgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZm9ybXVkYXRhIChEd2FyZl9BdHRyaWJ1dGUgYXR0ciwgRHdhcmZfVW5zaWduZWQgKnJldHVybl91dmFsLAorCQkJICAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIHNpZ25lZCBjb25zdGFudCByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuICAqLworZXh0ZXJuIGludCBkd2FyZl9mb3Jtc2RhdGEgKER3YXJmX0F0dHJpYnV0ZSBhdHRyLCBEd2FyZl9TaWduZWQgKnJldHVybl91dmFsLAorCQkJICAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIGJsb2NrIG9mIHVuaW50ZXJwcmV0ZWQgZGF0YSByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuICAqLworZXh0ZXJuIGludCBkd2FyZl9mb3JtYmxvY2sgKER3YXJmX0F0dHJpYnV0ZSBhdHRyLCBEd2FyZl9CbG9jayAqKnJldHVybl9ibG9jaywKKwkJCSAgICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZm9ybXN0cmluZyAoRHdhcmZfQXR0cmlidXRlIGF0dHIsIGNoYXIgKipyZXR1cm5fc3RyaW5nLAorCQkJICAgICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBsb2NhdGlvbiBleHByZXNzaW9uIGxpc3QuICAqLworZXh0ZXJuIGludCBkd2FyZl9sb2NsaXN0IChEd2FyZl9BdHRyaWJ1dGUgYXR0ciwgRHdhcmZfTG9jZGVzYyAqKmxsYnVmLAorCQkJICBEd2FyZl9TaWduZWQgKmxpc3RsZW4sIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworCisvKiBSZXR1cm4gc291cmNlIGxpbmVzIG9mIGNvbXBpbGF0aW9uIHVuaXQuICAqLworZXh0ZXJuIGludCBkd2FyZl9zcmNsaW5lcyAoRHdhcmZfRGllIGRpZSwgRHdhcmZfTGluZSAqKmxpbmVidWYsCisJCQkgICBEd2FyZl9TaWduZWQgKmxpbmVjb3VudCwgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gZmlsZXMgdXNlZCBpbiBjb21waWxhdGlvbiB1bml0LiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfc3JjZmlsZXMgKER3YXJmX0RpZSBkaWUsIGNoYXIgKioqc3JjZmlsZXMsCisJCQkgICBEd2FyZl9TaWduZWQgKnNyY2ZpbGVjb3VudCwgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBEZXRlcm1pbmUgd2hldGhlciBsaW5lIGlzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdGF0ZW1lbnQuICAqLworZXh0ZXJuIGludCBkd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQgKER3YXJmX0xpbmUgbGluZSwgRHdhcmZfQm9vbCAqcmV0dXJuX2Jvb2wsCisJCQkJICAgICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIERldGVybWluZSB3aGV0aGVyIGxpbmUgaXMgbWFya2VkIGFzIGVuZGluZyBhIHRleHQgc2VxdWVuY2UuICAqLworZXh0ZXJuIGludCBkd2FyZl9saW5lZW5kc2VxdWVuY2UgKER3YXJmX0xpbmUgbGluZSwgRHdhcmZfQm9vbCAqcmV0dXJuX2Jvb2wsCisJCQkJICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIFJldHVybiBzb3VyY2Ugc3RhdGVtZW50IGxpbmUgbnVtYmVyLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfbGluZW5vIChEd2FyZl9MaW5lIGxpbmUsIER3YXJmX1Vuc2lnbmVkICpyZXR1cm5fbGluZW5vLAorCQkJIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIGFkZHJlc3MgYXNzb2NpYXRlIHdpdGggbGluZS4gICovCitleHRlcm4gaW50IGR3YXJmX2xpbmVhZGRyIChEd2FyZl9MaW5lIGxpbmUsIER3YXJmX0FkZHIgKnJldHVybl9saW5lYWRkciwKKwkJCSAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIGNvbHVtbiBhdCB3aGljaCB0aGUgc3RhdGVtZW50IGJlZ2lucy4gICovCitleHRlcm4gaW50IGR3YXJmX2xpbmVvZmYgKER3YXJmX0xpbmUgbGluZSwgRHdhcmZfU2lnbmVkICpyZXR1cm5fbGluZW9mZiwKKwkJCSAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gc291cmNlIGZpbGUgZm9yIGxpbmUuICAqLworZXh0ZXJuIGludCBkd2FyZl9saW5lc3JjIChEd2FyZl9MaW5lIGxpbmUsIGNoYXIgKipyZXR1cm5fbGluZXNyYywKKwkJCSAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBEZXRlcm1pbmUgd2hldGhlciBsaW5lIGlzIG1hcmtlZCBhcyBiZWdpbm5pbmcgYSBiYXNpYyBibG9jay4gICovCitleHRlcm4gaW50IGR3YXJmX2xpbmVibG9jayAoRHdhcmZfTGluZSBsaW5lLCBEd2FyZl9Cb29sICpyZXR1cm5fYm9vbCwKKwkJCSAgICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIERldGVybWluZSB3aGV0aGVyIGxpbmUgaXMgbWFya2VkIGFzIGVuZGluZyB0aGUgcHJvbG9ndWUuICAqLworZXh0ZXJuIGludCBkd2FyZl9saW5lcHJvbG9ndWVlbmQgKER3YXJmX0xpbmUgbGluZSwgRHdhcmZfQm9vbCAqcmV0dXJuX2Jvb2wsCisJCQkJICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIERldGVybWluZSB3aGV0aGVyIGxpbmUgaXMgbWFya2VkIGFzIGJlZ2lubmluZyB0aGUgZXBpbG9ndWUuICAqLworZXh0ZXJuIGludCBkd2FyZl9saW5lZXBpbG9ndWViZWdpbiAoRHdhcmZfTGluZSBsaW5lLCBEd2FyZl9Cb29sICpyZXR1cm5fYm9vbCwKKwkJCQkgICAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisKKy8qIFJldHVybiBsaXN0IG9mIGdsb2JhbCBkZWZpbml0aW9ucy4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9nbG9iYWxzIChEd2FyZl9EZWJ1ZyBkYmcsIER3YXJmX0dsb2JhbCAqKmdsb2JhbHMsCisJCQkgICAgICBEd2FyZl9TaWduZWQgKnJldHVybl9jb3VudCwKKwkJCSAgICAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIG5hbWUgZm9yIGdsb2JhbCBkZWZpbml0aW9uLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2xvYm5hbWUgKER3YXJmX0dsb2JhbCBnbG9iYWwsIGNoYXIgKipyZXR1cm5fbmFtZSwKKwkJCSAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIERJRSBvZmZzZXQgZm9yIGdsb2JhbCBkZWZpbml0aW9uLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2xvYmFsX2RpZV9vZmZzZXQgKER3YXJmX0dsb2JhbCBnbG9iYWwsCisJCQkJICAgIER3YXJmX09mZiAqcmV0dXJuX29mZnNldCwKKwkJCQkgICAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gb2Zmc2V0IG9mIGhlYWRlciBvZiBjb21waWxlIHVuaXQgY29udGFpbmluZyB0aGUgZ2xvYmFsIGRlZmluaXRpb24uICovCitleHRlcm4gaW50IGR3YXJmX2dsb2JhbF9jdV9vZmZzZXQgKER3YXJmX0dsb2JhbCBnbG9iYWwsCisJCQkJICAgRHdhcmZfT2ZmICpyZXR1cm5fb2Zmc2V0LAorCQkJCSAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIG5hbWUsIERJRSBvZmZzZXQsIGFuZCBvZmZzZXQgb2YgdGhlIGNvbXBpbGUgdW5pdCBESUUgZm9yIHRoZQorICAgZ2xvYmFsIGRlZmluaXRpb24uICAqLworZXh0ZXJuIGludCBkd2FyZl9nbG9iYWxfbmFtZV9vZmZzZXRzIChEd2FyZl9HbG9iYWwgZ2xvYmFsLCBjaGFyICoqcmV0dXJuX25hbWUsCisJCQkJICAgICAgRHdhcmZfT2ZmICpkaWVfb2Zmc2V0LAorCQkJCSAgICAgIER3YXJmX09mZiAqY3Vfb2Zmc2V0LAorCQkJCSAgICAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworCisvKiBGaW5kIHN0YXJ0IG9mIG1hY3JvIHZhbHVlLiAgKi8KK2V4dGVybiBjaGFyICpkd2FyZl9maW5kX21hY3JvX3ZhbHVlX3N0YXJ0IChjaGFyICptYWNyb19zdHJpbmcpOworCisKKy8qIFJldHVybiBzdHJpbmcgZnJvbSBkZWJ1ZyBzdHJpbmcgc2VjdGlvbi4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9zdHIgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfT2ZmIG9mZnNldCwgY2hhciAqKnN0cmluZywKKwkJCSAgRHdhcmZfU2lnbmVkICpyZXR1cm5lZF9zdHJfbGVuLAorCQkJICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKworLyogUmV0dXJuIGxpc3QgYWRkcmVzcyByYW5nZXMuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRfYXJhbmdlcyAoRHdhcmZfRGVidWcgZGJnLCBEd2FyZl9BcmFuZ2UgKiphcmFuZ2VzLAorCQkJICAgICAgRHdhcmZfU2lnbmVkICpyZXR1cm5fY291bnQsCisJCQkgICAgICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIEZpbmQgbWF0Y2hpbmcgcmFuZ2UgZm9yIGFkZHJlc3MuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRfYXJhbmdlIChEd2FyZl9BcmFuZ2UgKmFyYW5nZXMsCisJCQkgICAgIER3YXJmX1Vuc2lnbmVkIGFyYW5nZV9jb3VudCwgRHdhcmZfQWRkciBhZGRyZXNzLAorCQkJICAgICBEd2FyZl9BcmFuZ2UgKnJldHVybl9hcmFuZ2UsCisJCQkgICAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogUmV0dXJuIG9mZnNldCBvZiBjb21waWxlIHVuaXQgRElFIGNvbnRhaW5pbmcgdGhlIHJhbmdlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2V0X2N1X2RpZV9vZmZzZXQgKER3YXJmX0FyYW5nZSBhcmFuZ2UsCisJCQkJICAgIER3YXJmX09mZiAqcmV0dXJuX29mZnNldCwKKwkJCQkgICAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBSZXR1cm4gc3RhcnQsIGxlbmd0aCwgYW5kIENVIERJRSBvZmZzZXQgb2YgcmFuZ2UuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRfYXJhbmdlX2luZm8gKER3YXJmX0FyYW5nZSBhcmFuZ2UsIER3YXJmX0FkZHIgKnN0YXJ0LAorCQkJCSAgRHdhcmZfVW5zaWduZWQgKmxlbmd0aCwKKwkJCQkgIER3YXJmX09mZiAqY3VfZGllX29mZnNldCwKKwkJCQkgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworCisvKiBGcmFtZSBkZXNjcmlwdG9yIGhhbmRsaW5nLiAgKi8KKworLyogR2V0IGZyYW1lIGRlc2NyaXB0aW9ucy4gIEdDQyB2ZXJzaW9uIHVzaW5nIC5laF9mcmFtZS4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9mZGVfbGlzdF9laCAoRHdhcmZfRGVidWcgZGJnLCBEd2FyZl9DaWUgKipjaWVfZGF0YSwKKwkJCQkgIER3YXJmX1NpZ25lZCAqY2llX2VsZW1lbnRfY291bnQsCisJCQkJICBEd2FyZl9GZGUgKipmZGVfZGF0YSwKKwkJCQkgIER3YXJmX1NpZ25lZCAqZmRlX2VsZW1lbnRfY291bnQsCisJCQkJICBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIEdldCBDSUUgb2YgRkRFLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2V0X2NpZV9vZl9mZGUgKER3YXJmX0ZkZSBmZGUsIER3YXJmX0NpZSAqcmV0dXJuX2NpZSwKKwkJCQkgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZ1bmN0aW9uIHJhbmdlLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2V0X2ZkZV9yYW5nZSAoRHdhcmZfRmRlIGZkZSwgRHdhcmZfQWRkciAqbG93X3BjLAorCQkJCUR3YXJmX1Vuc2lnbmVkICpmdW5jX2xlbmd0aCwKKwkJCQlEd2FyZl9QdHIgKmZkZV9ieXRlcywKKwkJCQlEd2FyZl9VbnNpZ25lZCAqZmRlX2J5dGVfbGVuZ3RoLAorCQkJCUR3YXJmX09mZiAqY2llX29mZnNldCwgRHdhcmZfU2lnbmVkICpjaWVfaW5kZXgsCisJCQkJRHdhcmZfT2ZmICpmZGVfb2Zmc2V0LCBEd2FyZl9FcnJvciAqZXJyZGVzYyk7CisKKy8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCBDSUUuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRfY2llX2luZm8gKER3YXJmX0NpZSBjaWUsIER3YXJmX1Vuc2lnbmVkICpieXRlc19pbl9jaWUsCisJCQkgICAgICAgRHdhcmZfU21hbGwgKnZlcnNpb24sIGNoYXIgKiphdWdtZW50ZXIsCisJCQkgICAgICAgRHdhcmZfVW5zaWduZWQgKmNvZGVfYWxpZ25tZW50X2ZhY3RvciwKKwkJCSAgICAgICBEd2FyZl9TaWduZWQgKmRhdGFfYWxpZ25tZW50X2ZhY3RvciwKKwkJCSAgICAgICBEd2FyZl9IYWxmICpyZXR1cm5fYWRkcmVzc19yZWdpc3RlciwKKwkJCSAgICAgICBEd2FyZl9QdHIgKmluaXRpYWxfaW5zdHJ1Y3Rpb25zLAorCQkJICAgICAgIER3YXJmX1Vuc2lnbmVkICppbml0aWFsX2luc3RydWN0aW9uc19sZW5ndGgsCisJCQkgICAgICAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBHZXQgZnJhbWUgY29uc3RydWN0aW9uIGluc3RydWN0aW9ucyBvZiBGREUuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRfZmRlX2luc3RyX2J5dGVzIChEd2FyZl9GZGUgZmRlLCBEd2FyZl9QdHIgKm91dGluc3RycywKKwkJCQkgICAgICBEd2FyZl9VbnNpZ25lZCAqb3V0bGVuLAorCQkJCSAgICAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogR2V0IG50aCBmcmFtZSBkZXNjcmlwdGlvbnMuICAqLworZXh0ZXJuIGludCBkd2FyZl9nZXRfZmRlX24gKER3YXJmX0ZkZSAqZmRlX2RhdGEsIER3YXJmX1Vuc2lnbmVkIGZkZV9pbmRleCwKKwkJCSAgICBEd2FyZl9GZGUgKnJldHVybmVkX2ZkZSwgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBGaW5kIEZERSBmb3IgZ2l2ZW4gYWRkcmVzcy4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9mZGVfYXRfcGMgKER3YXJmX0ZkZSAqZmRlX2RhdGEsIER3YXJmX0FkZHIgcGNfb2ZfaW50ZXJlc3QsCisJCQkJRHdhcmZfRmRlICpyZXR1cm5lZF9mZGUsIER3YXJmX0FkZHIgKmxvcGMsCisJCQkJRHdhcmZfQWRkciAqaGlwYywgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisKKy8qIFJldHVybiBsb2NhdGlvbiBsaXN0IGVudHJ5LiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2V0X2xvY2xpc3RfZW50cnkgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfVW5zaWduZWQgb2Zmc2V0LAorCQkJCSAgICBEd2FyZl9BZGRyICpoaXBjX29mZnNldCwKKwkJCQkgICAgRHdhcmZfQWRkciAqbG9wY19vZmZzZXQsIER3YXJmX1B0ciAqZGF0YSwKKwkJCQkgICAgRHdhcmZfVW5zaWduZWQgKmVudHJ5X2xlbiwKKwkJCQkgICAgRHdhcmZfVW5zaWduZWQgKm5leHRfZW50cnksCisJCQkJICAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworCisvKiBHZXQgYWJicmV2aWF0aW9uIHJlY29yZC4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9hYmJyZXYgKER3YXJmX0RlYnVnIGRiZywKKwkJCSAgICAgRHdhcmZfVW5zaWduZWQgb2Zmc2V0LAorCQkJICAgICBEd2FyZl9BYmJyZXYgKnJldHVybmVkX2FiYnJldiwKKwkJCSAgICAgRHdhcmZfVW5zaWduZWQgKmxlbmd0aCwKKwkJCSAgICAgRHdhcmZfVW5zaWduZWQgKmF0dHJfY291bnQsIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogR2V0IHRhZyBvZiBhYmJyZXZpYXRpb24gcmVjb3JkLiAgKi8KK2V4dGVybiBpbnQgZHdhcmZfZ2V0X2FiYnJldl90YWcgKER3YXJmX0FiYnJldiBhYmJyZXYsIER3YXJmX0hhbGYgKnJldHVybl90YWcsCisJCQkJIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogR2V0IGNvZGUgb2YgYWJicmV2aWF0aW9uIHJlY29yZC4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9hYmJyZXZfY29kZSAoRHdhcmZfQWJicmV2IGFiYnJldiwKKwkJCQkgIER3YXJmX1Vuc2lnbmVkICpyZXR1cm5fY29kZSwKKwkJCQkgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworLyogR2V0IGNoaWxkcmVuIGZsYWcgb2YgYWJicmV2aWF0aW9uIHJlY29yZC4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9hYmJyZXZfY2hpbGRyZW5fZmxhZyAoRHdhcmZfQWJicmV2IGFiYnJldiwKKwkJCQkJICAgRHdhcmZfU2lnbmVkICpyZXR1cm5fZmxhZywKKwkJCQkJICAgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisvKiBHZXQgYXR0cmlidXRlIGZyb20gYWJicmV2aWF0aW9uIHJlY29yZC4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9hYmJyZXZfZW50cnkgKER3YXJmX0FiYnJldiBhYmJyZXYsIER3YXJmX1NpZ25lZCBpZHgsCisJCQkJICAgRHdhcmZfSGFsZiAqYXR0cl9udW0sIER3YXJmX1NpZ25lZCAqZm9ybSwKKwkJCQkgICBEd2FyZl9PZmYgKm9mZnNldCwgRHdhcmZfRXJyb3IgKmVycmRlc2MpOworCisKKy8qIE1lbW9yeSBoYW5kbGluZy4gICovCisKKy8qIFZhbHVlcyBmb3IgQUxMT0NfVFlQRSBwYXJhbWV0ZXIgb2YgJ2R3YXJmX2RlYWxsb2MnLiAgKi8KK2VudW0KKyAgeworICAgIERXX0RMQV9OT05FID0gMCwKKyAgICBEV19ETEFfU1RSSU5HLAkJLyogY2hhciogKi8KKyAgICBEV19ETEFfTE9DLAkJCS8qIER3YXJmX0xvYyAqLworICAgIERXX0RMQV9MT0NERVNDLAkJLyogRHdhcmZfTG9jZGVzYyAqLworICAgIERXX0RMQV9FTExJU1QsCQkvKiBEd2FyZl9FbGxpc3QgKi8KKyAgICBEV19ETEFfQk9VTkRTLAkJLyogRHdhcmZfQm91bmRzICovCisgICAgRFdfRExBX0JMT0NLLAkJLyogRHdhcmZfQmxvY2sgKi8KKyAgICBEV19ETEFfREVCVUcsCQkvKiBEd2FyZl9EZWJ1ZyAqLworICAgIERXX0RMQV9ESUUsCQkJLyogRHdhcmZfRGllICovCisgICAgRFdfRExBX0xJTkUsCQkvKiBEd2FyZl9MaW5lICovCisgICAgRFdfRExBX0FUVFIsCQkvKiBEd2FyZl9BdHRyaWJ1dGUgKi8KKyAgICBEV19ETEFfVFlQRSwJCS8qIER3YXJmX1R5cGUgKi8KKyAgICBEV19ETEFfU1VCU0NSLAkJLyogRHdhcmZfU3Vic2NyICovCisgICAgRFdfRExBX0dMT0JBTCwJCS8qIER3YXJmX0dsb2JhbCAqLworICAgIERXX0RMQV9FUlJPUiwJCS8qIER3YXJmX0Vycm9yICovCisgICAgRFdfRExBX0xJU1QsCQkvKiBhIGxpc3QgKi8KKyAgICBEV19ETEFfTElORUJVRiwJCS8qIER3YXJmX0xpbmUqICovCisgICAgRFdfRExBX0FSQU5HRSwJCS8qIER3YXJmX0FyYW5nZSAqLworICAgIERXX0RMQV9BQkJSRVYsCQkvKiBEd2FyZl9BYmJyZXYgKi8KKyAgICBEV19ETEFfRlJBTUVfT1AsCQkvKiBEd2FyZl9GcmFtZV9PcCAqLworICAgIERXX0RMQV9DSUUsCQkJLyogRHdhcmZfQ2llICovCisgICAgRFdfRExBX0ZERSwJCQkvKiBEd2FyZl9GZGUgKi8KKyAgICBEV19ETEFfTE9DX0JMT0NLLAkJLyogRHdhcmZfTG9jIEJsb2NrICovCisgICAgRFdfRExBX0ZSQU1FX0JMT0NLLAkJLyogRHdhcmZfRnJhbWUgQmxvY2sgKi8KKyAgICBEV19ETEFfRlVOQywJCS8qIER3YXJmX0Z1bmMgKi8KKyAgICBEV19ETEFfVFlQRU5BTUUsCQkvKiBEd2FyZl9UeXBlICovCisgICAgRFdfRExBX1ZBUiwJCQkvKiBEd2FyZl9WYXIgKi8KKyAgICBEV19ETEFfV0VBSywJCS8qIER3YXJmX1dlYWsgKi8KKyAgICBEV19ETEFfQUREUiwJCS8qIER3YXJmX0FkZHIgc2l6ZWQgZW50cmllcyAqLworICB9OworCisvKiBEZWFsbG9jYXRlIG1lbW9yeS4gICovCitleHRlcm4gdm9pZCBkd2FyZl9kZWFsbG9jIChEd2FyZl9EZWJ1ZyBkYmcsIER3YXJmX1B0ciBzcGFjZSwKKwkJCSAgIER3YXJmX1Vuc2lnbmVkIGFsbG9jX3R5cGUpOworCisKKy8qIERldGVybWluZSBzaXplIG9mIGFkZHJlc3Mgb2YgdGhlIGJpbmFyeS4gICovCitleHRlcm4gaW50IGR3YXJmX2dldF9hZGRyZXNzX3NpemUgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfSGFsZiAqYWRkcl9zaXplLAorCQkJCSAgIER3YXJmX0Vycm9yICplcnJkZXNjKTsKKworCisvKiBSZXR1cm4gZXJyb3IgbnVtYmVyLiAgKi8KK2V4dGVybiBEd2FyZl9VbnNpZ25lZCBkd2FyZl9lcnJubyAoRHdhcmZfRXJyb3IgZXJyZGVzYyk7CisKKy8qIFJldHVybiBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBlcnJvci4gICovCitleHRlcm4gY29uc3QgY2hhciAqZHdhcmZfZXJybXNnIChEd2FyZl9FcnJvciBlcnJkZXNjKTsKKworCisvKiBTZXQgbmV3IGVycm9yIGhhbmRsZXIuICAqLworZXh0ZXJuIER3YXJmX0hhbmRsZXIgZHdhcmZfc2V0ZXJyaGFuZCAoRHdhcmZfRGVidWcgZGJnLCBEd2FyZl9IYW5kbGVyIGVycmhhbmQpOworCisvKiBTZXQgbmV3IGVycm9yIGhhbmRsZXIgYXJndW1lbnQuICAqLworZXh0ZXJuIER3YXJmX1B0ciBkd2FyZl9zZXRlcnJhcmcgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfUHRyIGVycmFyZyk7CisKKyNlbmRpZgkvKiBsaWJkd2FyZi5oICovCmRpZmYgLS1naXQgYS9saWJkd2FyZi9saWJkd2FyZi5tYXAgYi9saWJkd2FyZi9saWJkd2FyZi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwZTgwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL2xpYmR3YXJmLm1hcApAQCAtMCwwICsxLDgxIEBACitFTEZVVElMU18xLjAgeworICBnbG9iYWw6CisgICAgZHdhcmZfYXJyYXlvcmRlcjsKKyAgICBkd2FyZl9hdHRyOworICAgIGR3YXJmX2F0dHJsaXN0OworICAgIGR3YXJmX2JpdG9mZnNldDsKKyAgICBkd2FyZl9iaXRzaXplOworICAgIGR3YXJmX2J5dGVzaXplOworICAgIGR3YXJmX2NoaWxkOworICAgIGR3YXJmX2RlYWxsb2M7CisgICAgZHdhcmZfZGllX0NVX29mZnNldDsKKyAgICBkd2FyZl9kaWVuYW1lOworICAgIGR3YXJmX2RpZW9mZnNldDsKKyAgICBkd2FyZl9lbGZfaW5pdDsKKyAgICBkd2FyZl9lcnJtc2c7CisgICAgZHdhcmZfZXJybm87CisgICAgZHdhcmZfZmluZF9tYWNyb192YWx1ZV9zdGFydDsKKyAgICBkd2FyZl9maW5pc2g7CisgICAgZHdhcmZfZm9ybWFkZHI7CisgICAgZHdhcmZfZm9ybWJsb2NrOworICAgIGR3YXJmX2Zvcm1mbGFnOworICAgIGR3YXJmX2Zvcm1yZWY7CisgICAgZHdhcmZfZm9ybXNkYXRhOworICAgIGR3YXJmX2Zvcm1zdHJpbmc7CisgICAgZHdhcmZfZm9ybXVkYXRhOworICAgIGR3YXJmX2dldF9hYmJyZXY7CisgICAgZHdhcmZfZ2V0X2FiYnJldl9jaGlsZHJlbl9mbGFnOworICAgIGR3YXJmX2dldF9hYmJyZXZfY29kZTsKKyAgICBkd2FyZl9nZXRfYWJicmV2X2VudHJ5OworICAgIGR3YXJmX2dldF9hYmJyZXZfdGFnOworICAgIGR3YXJmX2dldF9hZGRyZXNzX3NpemU7CisgICAgZHdhcmZfZ2V0X2FyYW5nZTsKKyAgICBkd2FyZl9nZXRfYXJhbmdlX2luZm87CisgICAgZHdhcmZfZ2V0X2FyYW5nZXM7CisgICAgZHdhcmZfZ2V0X2NpZV9pbmZvOworICAgIGR3YXJmX2dldF9jaWVfb2ZfZmRlOworICAgIGR3YXJmX2dldF9jdV9kaWVfb2Zmc2V0OworICAgIGR3YXJmX2dldF9lbGZfaW5pdDsKKyAgICBkd2FyZl9nZXRfZmRlX2F0X3BjOworICAgIGR3YXJmX2dldF9mZGVfaW5zdHJfYnl0ZXM7CisgICAgZHdhcmZfZ2V0X2ZkZV9saXN0X2VoOworICAgIGR3YXJmX2dldF9mZGVfbjsKKyAgICBkd2FyZl9nZXRfZmRlX3JhbmdlOworICAgIGR3YXJmX2dldF9nbG9iYWxzOworICAgIGR3YXJmX2dldF9sb2NsaXN0X2VudHJ5OworICAgIGR3YXJmX2dldF9zdHI7CisgICAgZHdhcmZfZ2xvYmFsX2N1X29mZnNldDsKKyAgICBkd2FyZl9nbG9iYWxfZGllX29mZnNldDsKKyAgICBkd2FyZl9nbG9iYWxfZm9ybXJlZjsKKyAgICBkd2FyZl9nbG9iYWxfbmFtZV9vZmZzZXRzOworICAgIGR3YXJmX2dsb2JuYW1lOworICAgIGR3YXJmX2hhc2F0dHI7CisgICAgZHdhcmZfaGFzZm9ybTsKKyAgICBkd2FyZl9oaWdocGM7CisgICAgZHdhcmZfaW5pdDsKKyAgICBkd2FyZl9saW5lYWRkcjsKKyAgICBkd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQ7CisgICAgZHdhcmZfbGluZWJsb2NrOworICAgIGR3YXJmX2xpbmVlbmRzZXF1ZW5jZTsKKyAgICBkd2FyZl9saW5lZXBpbG9ndWViZWdpbjsKKyAgICBkd2FyZl9saW5lbm87CisgICAgZHdhcmZfbGluZW9mZjsKKyAgICBkd2FyZl9saW5lcHJvbG9ndWVlbmQ7CisgICAgZHdhcmZfbGluZXNyYzsKKyAgICBkd2FyZl9sb2NsaXN0OworICAgIGR3YXJmX2xvd3BjOworICAgIGR3YXJmX25leHRfY3VfaGVhZGVyOworICAgIGR3YXJmX29mZmRpZTsKKyAgICBkd2FyZl9zZXRlcnJhcmc7CisgICAgZHdhcmZfc2V0ZXJyaGFuZDsKKyAgICBkd2FyZl9zaWJsaW5nb2Y7CisgICAgZHdhcmZfc3JjZmlsZXM7CisgICAgZHdhcmZfc3JjbGFuZzsKKyAgICBkd2FyZl9zcmNsaW5lczsKKyAgICBkd2FyZl90YWc7CisgICAgZHdhcmZfd2hhdGF0dHI7CisgICAgZHdhcmZfd2hhdGZvcm07CisKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9saWJkd2FyZi9saWJkd2FyZlAuaCBiL2xpYmR3YXJmL2xpYmR3YXJmUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTYyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2FyZi9saWJkd2FyZlAuaApAQCAtMCwwICsxLDMxOSBAQAorLyogSW50ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIGxpYmR3YXJmLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9MSUJEV0FSRlBfSAorI2RlZmluZSBfTElCRFdBUkZQX0ggMQorCisjaW5jbHVkZSA8bGliZHdhcmYuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxkd2FyZl9hYmJyZXZfaGFzaC5oPgorCisKKy8qIFZlcnNpb24gb2YgdGhlIERXQVJGIHNwZWNpZmljYXRpb24gd2Ugc3VwcG9ydC4gICovCisjZGVmaW5lIERXQVJGX1ZFUlNJT04gMgorCisvKiBWZXJzaW9uIG9mIHRoZSBDSUUgZm9ybWF0LiAgKi8KKyNkZWZpbmUgQ0lFX1ZFUlNJT04gMQorCisvKiBTb21lIGFkZGl0aW9uYWwgYmFzaWMgdHlwZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgRHdhcmZfV29yZDsKKworCisvKiBWYWxpZCBpbmRlY2VzIGZvciB0aGUgc2VjdGlvbiBkYXRhLiAgKi8KK2VudW0KKyAgeworICAgIElEWF9kZWJ1Z19pbmZvID0gMCwKKyAgICBJRFhfZGVidWdfYWJicmV2LAorICAgIElEWF9kZWJ1Z19hcmFuZ2VzLAorICAgIElEWF9kZWJ1Z19saW5lLAorICAgIElEWF9kZWJ1Z19mcmFtZSwKKyAgICBJRFhfZWhfZnJhbWUsCisgICAgSURYX2RlYnVnX2xvYywKKyAgICBJRFhfZGVidWdfcHVibmFtZXMsCisgICAgSURYX2RlYnVnX3N0ciwKKyAgICBJRFhfZGVidWdfZnVuY25hbWVzLAorICAgIElEWF9kZWJ1Z190eXBlbmFtZXMsCisgICAgSURYX2RlYnVnX3Zhcm5hbWVzLAorICAgIElEWF9kZWJ1Z193ZWFrbmFtZXMsCisgICAgSURYX2RlYnVnX21hY2luZm8sCisgICAgSURYX2xhc3QKKyAgfTsKKworCisvKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBkZWJ1Z2dpbmcgc3RhdGUuICAqLworc3RydWN0IER3YXJmX0RlYnVnX3MKKyAgeworI2lmZGVmIERXQVJGX0RFQlVHCisgICAgaW50IG1lbXRhZzsKKyNlbmRpZgorCisgICAgRHdhcmZfSGFuZGxlciBkYmdfZXJyaGFuZDsKKyAgICBEd2FyZl9QdHIgZGJnX2VycmFyZzsKKworICAgIEVsZiAqZWxmOworICAgIGludCBvdGhlcl9ieXRlX29yZGVyOworCisgICAgRHdhcmZfVW5zaWduZWQgYWNjZXNzOworCisgICAgLyogVGhlIHNlY3Rpb24gZGF0YS4gICovCisgICAgc3RydWN0CisgICAgeworICAgICAgRHdhcmZfU21hbGwgKmFkZHI7CisgICAgICBEd2FyZl9VbnNpZ25lZCBzaXplOworICAgIH0gc2VjdGlvbnNbSURYX2xhc3RdOworCisgICAgLyogQ29tcGlsYXRpb24gdW5pdCBoYW5kbGluZy4gIFRvIGVuYWJsZSBlZmZpY2llbnQgc2VhcmNoaW5nIHdlCisgICAgICAga2VlcCB0cmFjayBvZiB0aGUgdW5pdCB3ZSBhbHJlYWR5IGZvdW5kLiAgKi8KKyAgICBzdHJ1Y3QgRHdhcmZfQ1VfSW5mb19zCisgICAgeworICAgICAgLyogVGhpcyBpcyB0aGUgaW5mb3JtYXRpb24gdGhlICdkd2FyZl9uZXh0X2N1X2hlYWRlcicgZnVuY3Rpb24KKwkgaXMgc3VwcG9zZWQgdG8gcmV0dXJuLiAgKi8KKyAgICAgIER3YXJmX1Vuc2lnbmVkIGhlYWRlcl9sZW5ndGg7CisgICAgICBEd2FyZl9VbnNpZ25lZCBsZW5ndGg7CisgICAgICBEd2FyZl9VbnNpZ25lZCBhYmJyZXZfb2Zmc2V0OworICAgICAgRHdhcmZfSGFsZiB2ZXJzaW9uX3N0YW1wOworICAgICAgRHdhcmZfSGFsZiBhZGRyZXNzX3NpemU7CisKKyAgICAgIER3YXJmX1Vuc2lnbmVkIG9mZnNldDsJCS8qIEluIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICAqLworCisgICAgICAvKiBVc2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gMzItYml0IGFuZCA2NC1iaXQgRFdBUkYuICAqLworICAgICAgRHdhcmZfSGFsZiBvZmZzZXRfc2l6ZTsKKworICAgICAgLyogSGFzaCB0YWJsZSBmb3IgdGhlIGFiYnJldmlhdGlvbnMuICAqLworICAgICAgRHdhcmZfQWJicmV2X0hhc2ggYWJicmV2X2hhc2g7CisgICAgICBEd2FyZl9VbnNpZ25lZCBsYXN0X2FiYnJldl9vZmZzZXQ7CisKKyAgICAgIER3YXJmX0RlYnVnIGRiZzsKKworICAgICAgc3RydWN0IER3YXJmX0NVX0luZm9fcyAqbmV4dDsKKyAgICB9ICpjdV9saXN0OworICAgIHN0cnVjdCBEd2FyZl9DVV9JbmZvX3MgKmN1X2xpc3RfY3VycmVudDsKKyAgICBzdHJ1Y3QgRHdhcmZfQ1VfSW5mb19zICpjdV9saXN0X3RhaWw7CisKKyAgICBEd2FyZl9VbnNpZ25lZCBjaWVfY250OworICAgIER3YXJmX1Vuc2lnbmVkIGZkZV9jbnQ7CisgIH07Cit0eXBlZGVmIHN0cnVjdCBEd2FyZl9DVV9JbmZvX3MgKkR3YXJmX0NVX0luZm87CisKKworLyogTWVtb3J5IGFjY2VzcyBtYWNyb3MuICBXZSBoYXZlIHRvIGRlZmluZSBpdCBoZXJlIHNpbmNlIGNvZGUgaW4gdGhlCisgICBoZWFkZXIgbmVlZHMgdG8ga25vdyB0aGUgc3RydWN0dXJlIG9mIER3YXJmX0RlYnVnLiAgKi8KKyNpbmNsdWRlICJtZW1vcnktYWNjZXNzLmgiCisKKworLyogRFdBUkYgZGllIHJlcHJlc2VudGF0aW9uLiAgKi8KK3N0cnVjdCBEd2FyZl9EaWVfcworICB7CisjaWZkZWYgRFdBUkZfREVCVUcKKyAgICBpbnQgbWVtdGFnOworI2VuZGlmCisKKyAgICBEd2FyZl9TbWFsbCAqYWRkcjsKKyAgICBEd2FyZl9BYmJyZXYgYWJicmV2OworICAgIER3YXJmX0NVX0luZm8gY3U7CisgIH07CisKKworLyogQWJicmV2aWF0aW9uIGxpc3QuICAqLworc3RydWN0IER3YXJmX0FiYnJldl9zCisgIHsKKyAgICBEd2FyZl9VbnNpZ25lZCBjb2RlOwkvKiBUaGUgY29kZS4gICovCisgICAgRHdhcmZfSGFsZiB0YWc7CQkvKiBUaGUgdGFnLiAgKi8KKyAgICBEd2FyZl9TbWFsbCAqYXR0cnA7CQkvKiBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiBhdHRyaWJ1dGVzLiAgKi8KKyAgICBEd2FyZl9VbnNpZ25lZCBhdHRyY250OwkvKiBOdW1iZXIgb2YgYXR0cmlidXRlcy4gICovCisgICAgaW50IGhhc19jaGlsZHJlbjsJCS8qIE5vbnplcm8gb2YgYWJicmV2aWF0aW9uIGhhcyBjaGlsZHJlbi4gICovCisgICAgRHdhcmZfVW5zaWduZWQgb2Zmc2V0OwkvKiBPZmZzZXQgaW4gdGhlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4gICovCisgIH07CisKKworLyogQXR0cmlidXRlIGxpc3QuICAqLworc3RydWN0IER3YXJmX0F0dHJpYnV0ZV9zCisgIHsKKyAgICBEd2FyZl9IYWxmIGNvZGU7CQkvKiBEV0FSRiBhdHRyaWJ1dGUgY29kZS4gICovCisgICAgRHdhcmZfSGFsZiBmb3JtOwkJLyogRFdBUkYgZm9ybS4gICovCisgICAgRHdhcmZfU21hbGwgKnZhbHA7CisgICAgRHdhcmZfQ1VfSW5mbyBjdTsKKyAgfTsKKworCisvKiBTdHJ1Y3R1cmUgZm9yIGVycm9yIHZhbHVlcy4gICovCitzdHJ1Y3QgRHdhcmZfRXJyb3JfcworICB7CisgICAgdW5zaWduZWQgaW50IGRlX2Vycm9yOworICB9OworCisKKy8qIEZpbGVzIGluIGxpbmUgaW5mb3JtYXRpb24gcmVjb3Jkcy4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9GaWxlX3MKKyAgeworICAgIER3YXJmX0RlYnVnIGRiZzsKKyAgICB1bnNpZ25lZCBpbnQgbmZpbGVzOworICAgIHN0cnVjdCBEd2FyZl9GaWxlaW5mb19zCisgICAgeworICAgICAgY2hhciAqbmFtZTsKKyAgICAgIER3YXJmX1Vuc2lnbmVkIG10aW1lOworICAgICAgRHdhcmZfVW5zaWduZWQgbGVuZ3RoOworICAgIH0gaW5mb1swXTsKKyAgfSAqRHdhcmZfRmlsZTsKK3R5cGVkZWYgc3RydWN0IER3YXJmX0ZpbGVpbmZvX3MgRHdhcmZfRmlsZWluZm87CisKKworLyogUmVwcmVzZW50YXRpb24gb2YgYSByb3cgaW4gdGhlIGxpbmUgdGFibGUuICAqLworc3RydWN0IER3YXJmX0xpbmVfcworICB7CisgICAgRHdhcmZfQWRkciBhZGRyOworICAgIHVuc2lnbmVkIGludCBmaWxlOworICAgIGludCBsaW5lOworICAgIHVuc2lnbmVkIHNob3J0IGludCBjb2x1bW47CisgICAgdW5zaWduZWQgaW50IGlzX3N0bXQ6MTsKKyAgICB1bnNpZ25lZCBpbnQgYmFzaWNfYmxvY2s6MTsKKyAgICB1bnNpZ25lZCBpbnQgZW5kX3NlcXVlbmNlOjE7CisgICAgdW5zaWduZWQgaW50IHByb2xvZ3VlX2VuZDoxOworICAgIHVuc2lnbmVkIGludCBlcGlsb2d1ZV9iZWdpbjoxOworCisgICAgRHdhcmZfRmlsZSBmaWxlczsKKyAgfTsKKworCisvKiBBZGRpdGlvbmFsLCBzaGFyZWQgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIER3YXJmX0dsb2JhbCBoYW5kbGluZy4gICovCit0eXBlZGVmIHN0cnVjdCBEd2FyZl9HbG9iYWxfSW5mb19zCisgIHsKKyAgICBEd2FyZl9EZWJ1ZyBkYmc7CisgICAgRHdhcmZfVW5zaWduZWQgb2Zmc2V0OworICB9ICpEd2FyZl9HbG9iYWxfSW5mbzsKKworLyogUmVwcmVzZW50YXRpb24gb2YgYSBnbG9iYWwgbmFtZSBlbnRyeS4gICovCitzdHJ1Y3QgRHdhcmZfR2xvYmFsX3MKKyAgeworICAgIER3YXJmX1Vuc2lnbmVkIG9mZnNldDsKKyAgICBjaGFyICpuYW1lOworICAgIER3YXJmX0dsb2JhbF9JbmZvIGluZm87CisgIH07CisKKworLyogQWRkaXRpb25hbCwgc2hhcmVkIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciBEd2FyZl9BcmFuZ2UgaGFuZGxpbmcuICAqLwordHlwZWRlZiBzdHJ1Y3QgRHdhcmZfQXJhbmdlX0luZm9fcworICB7CisgICAgRHdhcmZfRGVidWcgZGJnOworICAgIER3YXJmX1Vuc2lnbmVkIG9mZnNldDsKKyAgfSAqRHdhcmZfQXJhbmdlX0luZm87CisKKy8qIFJlcHJlc2VudGF0aW9uIG9mIGFuIGFkZHJlc3MgcmFuZ2UgZW50cnkuICAqLworc3RydWN0IER3YXJmX0FyYW5nZV9zCisgIHsKKyAgICBEd2FyZl9BZGRyIGFkZHJlc3M7CisgICAgRHdhcmZfVW5zaWduZWQgbGVuZ3RoOworICAgIER3YXJmX0FyYW5nZV9JbmZvIGluZm87CisgIH07CisKKworLyogUmVwcmVzZW50YXRpb24gb2YgYSBjb21tb24gaW5mb3JtYXRpb24gZW50cnkuICAqLworc3RydWN0IER3YXJmX0NpZV9zCisgIHsKKyAgICBEd2FyZl9EZWJ1ZyBkYmc7CisgICAgRHdhcmZfVW5zaWduZWQgbGVuZ3RoOworICAgIGNoYXIgKmF1Z21lbnRhdGlvbjsKKyAgICBEd2FyZl9VbnNpZ25lZCBjb2RlX2FsaWdubWVudF9mYWN0b3I7CisgICAgRHdhcmZfU2lnbmVkIGRhdGFfYWxpZ25tZW50X2ZhY3RvcjsKKyAgICBEd2FyZl9TbWFsbCAqaW5pdGlhbF9pbnN0cnVjdGlvbnM7CisgICAgRHdhcmZfVW5zaWduZWQgaW5pdGlhbF9pbnN0cnVjdGlvbnNfbGVuZ3RoOworICAgIER3YXJmX1NtYWxsIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyOworICAgIER3YXJmX1Vuc2lnbmVkIG9mZnNldDsKKyAgICBEd2FyZl9TaWduZWQgaW5kZXg7CisgIH07CisKKworLyogUmVwcmVzZW50YXRpb24gb2YgYSBmcmFtZSBkZXNjcmlwdG9yIGVudHJ5LiAgKi8KK3N0cnVjdCBEd2FyZl9GZGVfcworICB7CisgICAgRHdhcmZfQ2llIGNpZTsKKyAgICBEd2FyZl9BZGRyIGluaXRpYWxfbG9jYXRpb247CisgICAgRHdhcmZfVW5zaWduZWQgYWRkcmVzc19yYW5nZTsKKyAgICBEd2FyZl9TbWFsbCAqaW5zdHJ1Y3Rpb25zOworICAgIER3YXJmX1Vuc2lnbmVkIGluc3RydWN0aW9uc19sZW5ndGg7CisgICAgRHdhcmZfVW5zaWduZWQgb2Zmc2V0OworICAgIER3YXJmX1NtYWxsICpmZGVfYnl0ZXM7CisgICAgRHdhcmZfVW5zaWduZWQgZmRlX2J5dGVfbGVuZ3RoOworICB9OworCisKKy8qIEludGVybmFsIGVycm9yIHZhbHVlcy4gICovCitlbnVtCisgIHsKKyAgICBEV19FX05PRVJST1IgPSAwLAorICAgIERXX0VfSU5WQUxJRF9BQ0NFU1MsCisgICAgRFdfRV9OT19SRUdGSUxFLAorICAgIERXX0VfSU9fRVJST1IsCisgICAgRFdfRV9OT01FTSwKKyAgICBEV19FX05PRUxGLAorICAgIERXX0VfR0VURUhEUl9FUlJPUiwKKyAgICBEV19FX0lOVkFMSURfRUxGLAorICAgIERXX0VfSU5WQUxJRF9EV0FSRiwKKyAgICBEV19FX05PX0RXQVJGLAorICAgIERXX0VfTk9fQ1UsCisgICAgRFdfRV8xU1RfTk9fQ1UsCisgICAgRFdfRV9JTlZBTElEX09GRlNFVCwKKyAgICBEV19FX0lOVkFMSURfUkVGRVJFTkNFLAorICAgIERXX0VfTk9fUkVGRVJFTkNFLAorICAgIERXX0VfTk9fQUREUiwKKyAgICBEV19FX05PX0ZMQUcsCisgICAgRFdfRV9OT19DT05TVEFOVCwKKyAgICBEV19FX05PX0JMT0NLLAorICAgIERXX0VfTk9fU1RSSU5HLAorICAgIERXX0VfV1JPTkdfQVRUUiwKKyAgICBEV19FX05PX0RBVEEsCisgICAgRFdfRV9OT19ERUJVR19MSU5FLAorICAgIERXX0VfVkVSU0lPTl9FUlJPUiwKKyAgICBEV19FX0lOVkFMSURfRElSX0lEWCwKKyAgICBEV19FX0lOVkFMSURfQUREUiwKKyAgICBEV19FX05PX0FCQlIsCisgIH07CisKKworLyogSGFuZGxlIGVycm9yIGFjY29yZGluZyB0byB1c2VyJ3Mgd2lzaGVzLiAgKi8KK2V4dGVybiB2b2lkIF9fbGliZHdhcmZfZXJyb3IgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfRXJyb3IgKmVyciwgaW50IGVycnZhbCkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisKKworLyogRmluZCBDVSBhdCBnaXZlbiBvZmZzZXQuICAqLworZXh0ZXJuIGludCBfX2xpYmR3YXJmX2dldF9jdV9hdF9vZmZzZXQgKER3YXJmX0RlYnVnIGRiZywgRHdhcmZfVW5zaWduZWQgb2Zmc2V0LAorCQkJCQlEd2FyZl9DVV9JbmZvICpyZXN1bHRfY3UsCisJCQkJCUR3YXJmX0Vycm9yICplcnIpIGludGVybmFsX2Z1bmN0aW9uOworCisvKiBGaW5kIGFiYnJldmlhdGlvbi4gICovCitleHRlcm4gRHdhcmZfQWJicmV2IF9fbGliZHdhcmZfZ2V0X2FiYnJldiAoRHdhcmZfRGVidWcgZGJnLAorCQkJCQkgICBEd2FyZl9DVV9JbmZvIGN1LAorCQkJCQkgICBEd2FyZl9Xb3JkIGNvZGUsCisJCQkJCSAgIER3YXJmX0Vycm9yICplcnIpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworCisvKiBHZXQgY29uc3RhbnQgdHlwZSBhdHRyaWJ1dGUgdmFsdWUuICAqLworZXh0ZXJuIGludCBfX2xpYmR3YXJmX2dldGNvbnN0YW50IChEd2FyZl9EaWUgZGllLCBEd2FyZl9IYWxmIG5hbWUsCisJCQkJICAgRHdhcmZfVW5zaWduZWQgKnJldHVybl9zaXplLAorCQkJCSAgIER3YXJmX0Vycm9yICplcnIpIGludGVybmFsX2Z1bmN0aW9uOworCisvKiBEZXRlcm1pbmUgbGVuZ3RoIG9mIGZvcm0gcGFyYW1ldGVycy4gICovCitleHRlcm4gaW50IF9fbGliZHdhcmZfZm9ybV92YWxfbGVuIChEd2FyZl9EZWJ1ZyBkYmcsIER3YXJmX0NVX0luZm8gY3UsCisJCQkJICAgIER3YXJmX1dvcmQgZm9ybSwgRHdhcmZfU21hbGwgKnZhbHAsCisJCQkJICAgIHNpemVfdCAqbGVuLCBEd2FyZl9FcnJvciAqZXJyKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKworCisvKiBnZXR0ZXh0IGhlbHBlciBtYWNyb3MuICAqLworI2RlZmluZSBfKFN0cikgZGdldHRleHQgKCJsaWJkd2FyZiIsIFN0cikKKyNkZWZpbmUgTl8oU3RyKSBTdHIKKworI2VuZGlmCS8qIGxpYmR3YXJmUC5oICovCmRpZmYgLS1naXQgYS9saWJkd2FyZi9tZW1vcnktYWNjZXNzLmggYi9saWJkd2FyZi9tZW1vcnktYWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkNTJiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3YXJmL21lbW9yeS1hY2Nlc3MuaApAQCAtMCwwICsxLDIwNyBAQAorLyogVW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25hbGl0eS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBfTUVNT1JZX0FDQ0VTU19ICisjZGVmaW5lIF9NRU1PUllfQUNDRVNTX0ggMQorCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisvKiBOdW1iZXIgZGVjb2RpbmcgbWFjcm9zLiAgU2VlIDcuNiBWYXJpYWJsZSBMZW5ndGggRGF0YS4gICovCisjZGVmaW5lIGdldF91bGViMTI4KHZhciwgYWRkcikgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIER3YXJmX1NtYWxsIF9fYiA9ICphZGRyKys7CQkJCQkJICAgICAgXAorICAgIHZhciA9IF9fYiAmIDB4N2Y7CQkJCQkJCSAgICAgIFwKKyAgICBpZiAoX19iICYgMHg4MCkJCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlfX2IgPSAqYWRkcisrOwkJCQkJCQkgICAgICBcCisJdmFyIHw9IChfX2IgJiAweDdmKSA8PCA3OwkJCQkJICAgICAgXAorCWlmIChfX2IgJiAweDgwKQkJCQkJCQkgICAgICBcCisJICB7CQkJCQkJCQkgICAgICBcCisJICAgIF9fYiA9ICphZGRyKys7CQkJCQkJICAgICAgXAorCSAgICB2YXIgfD0gKF9fYiAmIDB4N2YpIDw8IDE0OwkJCQkJICAgICAgXAorCSAgICBpZiAoX19iICYgMHg4MCkJCQkJCQkgICAgICBcCisJICAgICAgewkJCQkJCQkJICAgICAgXAorCQlfX2IgPSAqYWRkcisrOwkJCQkJCSAgICAgIFwKKwkJdmFyIHw9IChfX2IgJiAweDdmKSA8PCAyMTsJCQkJICAgICAgXAorCQlpZiAoX19iICYgMHg4MCkJCQkJCQkgICAgICBcCisJCSAgLyogT3RoZXIgaW1wbGVtZW50YXRpb24gc2V0IFZBTFVFIHRvIFVJTlRfTUFYIGluIHRoaXMJICAgICAgXAorCQkgICAgIGNhc2UuICBTbyB3ZSBiZXR0ZXIgZG8gdGhpcyBhcyB3ZWxsLiAgKi8JCSAgICAgIFwKKwkJICB2YXIgPSBVSU5UX01BWDsJCQkJCSAgICAgIFwKKwkgICAgICB9CQkJCQkJCQkgICAgICBcCisJICB9CQkJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKiBUaGUgc2lnbmVkIGNhc2UgaXMgYSBiaWcgbW9yZSBjb21wbGljYXRlZC4gICovCisjZGVmaW5lIGdldF9zbGViMTI4KHZhciwgYWRkcikgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIER3YXJmX1NtYWxsIF9fYiA9ICphZGRyKys7CQkJCQkJICAgICAgXAorICAgIGludDMyX3QgX19yZXMgPSBfX2IgJiAweDdmOwkJCQkJCSAgICAgIFwKKyAgICBpZiAoKF9fYiAmIDB4ODApID09IDApCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlpZiAoX19iICYgMHg0MCkJCQkJCQkJICAgICAgXAorCSAgX19yZXMgfD0gMHhmZmZmZmY4MDsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJX19iID0gKmFkZHIrKzsJCQkJCQkJICAgICAgXAorCV9fcmVzIHw9IChfX2IgJiAweDdmKSA8PCA3OwkJCQkJICAgICAgXAorCWlmICgoX19iICYgMHg4MCkgPT0gMCkJCQkJCQkgICAgICBcCisJICB7CQkJCQkJCQkgICAgICBcCisJICAgIGlmIChfX2IgJiAweDQwKQkJCQkJCSAgICAgIFwKKwkgICAgICBfX3JlcyB8PSAweGZmZmZjMDAwOwkJCQkJICAgICAgXAorCSAgfQkJCQkJCQkJICAgICAgXAorCWVsc2UJCQkJCQkJCSAgICAgIFwKKwkgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgX19iID0gKmFkZHIrKzsJCQkJCQkgICAgICBcCisJICAgIF9fcmVzIHw9IChfX2IgJiAweDdmKSA8PCAxNDsJCQkJICAgICAgXAorCSAgICBpZiAoKF9fYiAmIDB4ODApID09IDApCQkJCQkgICAgICBcCisJICAgICAgewkJCQkJCQkJICAgICAgXAorCQlpZiAoX19iICYgMHg0MCkJCQkJCQkgICAgICBcCisJCSAgX19yZXMgfD0gMHhmZmUwMDAwMDsJCQkJCSAgICAgIFwKKwkgICAgICB9CQkJCQkJCQkgICAgICBcCisJICAgIGVsc2UJCQkJCQkJICAgICAgXAorCSAgICAgIHsJCQkJCQkJCSAgICAgIFwKKwkJX19iID0gKmFkZHIrKzsJCQkJCQkgICAgICBcCisJCV9fcmVzIHw9IChfX2IgJiAweDdmKSA8PCAyMTsJCQkJICAgICAgXAorCQlpZiAoKF9fYiAmIDB4ODApID09IDApCQkJCQkgICAgICBcCisJCSAgewkJCQkJCQkgICAgICBcCisJCSAgICBpZiAoX19iICYgMHg0MCkJCQkJCSAgICAgIFwKKwkJICAgICAgX19yZXMgfD0gMHhmMDAwMDAwMDsJCQkJICAgICAgXAorCQkgIH0JCQkJCQkJICAgICAgXAorCQllbHNlCQkJCQkJCSAgICAgIFwKKwkJICAvKiBPdGhlciBpbXBsZW1lbnRhdGlvbiBzZXQgVkFMVUUgdG8gSU5UX01BWCBpbiB0aGlzCSAgICAgIFwKKwkJICAgICBjYXNlLiAgU28gd2UgYmV0dGVyIGRvIHRoaXMgYXMgd2VsbC4gICovCQkgICAgICBcCisJCSAgX19yZXMgPSBJTlRfTUFYOwkJCQkJICAgICAgXAorCSAgICAgIH0JCQkJCQkJCSAgICAgIFwKKwkgIH0JCQkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgdmFyID0gX19yZXM7CQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBXZSB1c2Ugc2ltcGxlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zIGluIGNhc2UgdGhlIGhhcmR3YXJlIGFsbG93cyBpdC4KKyAgIFRoZSBjYWxsZXIgaGFzIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFsaWFzIHByb2JsZW1zLiAgKi8KKyNpZiBBTExPV19VTkFMSUdORUQKKworIyBkZWZpbmUgcmVhZF8ydWJ5dGVfdW5hbGlnbmVkKERiZywgQWRkcikgXAorICAoKERiZyktPm90aGVyX2J5dGVfb3JkZXIJCQkJCQkgICAgICBcCisgICA/IGJzd2FwXzE2ICgqKCh1aW50MTZfdCAqKSAoQWRkcikpKQkJCQkJICAgICAgXAorICAgOiAqKCh1aW50MTZfdCAqKSAoQWRkcikpKQorIyBkZWZpbmUgcmVhZF8yc2J5dGVfdW5hbGlnbmVkKERiZywgQWRkcikgXAorICAoKERiZyktPm90aGVyX2J5dGVfb3JkZXIJCQkJCQkgICAgICBcCisgICA/IChpbnQxNl90KSBic3dhcF8xNiAoKigoaW50MTZfdCAqKSAoQWRkcikpKQkJCQkgICAgICBcCisgICA6ICooKGludDE2X3QgKikgKEFkZHIpKSkKKworIyBkZWZpbmUgcmVhZF80dWJ5dGVfdW5hbGlnbmVkX25vbmN2dChBZGRyKSBcCisgICAqKCh1aW50MzJfdCAqKSAoQWRkcikpCisjIGRlZmluZSByZWFkXzR1Ynl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCisgICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcgkJCQkJCSAgICAgIFwKKyAgID8gYnN3YXBfMzIgKCooKHVpbnQzMl90ICopIChBZGRyKSkpCQkJCQkgICAgICBcCisgICA6ICooKHVpbnQzMl90ICopIChBZGRyKSkpCisjIGRlZmluZSByZWFkXzRzYnl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCisgICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcgkJCQkJCSAgICAgIFwKKyAgID8gKGludDMyX3QpIGJzd2FwXzMyICgqKChpbnQzMl90ICopIChBZGRyKSkpCQkJCSAgICAgIFwKKyAgIDogKigoaW50MzJfdCAqKSAoQWRkcikpKQorCisjIGRlZmluZSByZWFkXzh1Ynl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCisgICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcgkJCQkJCSAgICAgIFwKKyAgID8gYnN3YXBfNjQgKCooKHVpbnQ2NF90ICopIChBZGRyKSkpCQkJCQkgICAgICBcCisgICA6ICooKHVpbnQ2NF90ICopIChBZGRyKSkpCisjIGRlZmluZSByZWFkXzhzYnl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCisgICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcgkJCQkJCSAgICAgIFwKKyAgID8gKGludDY0X3QpIGJzd2FwXzY0ICgqKChpbnQ2NF90ICopIChBZGRyKSkpCQkJCSAgICAgIFwKKyAgIDogKigoaW50NjRfdCAqKSAoQWRkcikpKQorCisjZWxzZQorCisjIGlmIF9fR05VQ19fCisKK3VuaW9uIHVuYWxpZ25lZAorICB7CisgICAgdm9pZCAqcDsKKyAgICB1aW50MTZfdCB1MjsKKyAgICB1aW50MzJfdCB1NDsKKyAgICB1aW50NjRfdCB1ODsKKyAgICBpbnQxNl90IHMyOworICAgIGludDMyX3QgczQ7CisgICAgaW50NjRfdCBzODsKKyAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK3JlYWRfMnVieXRlX3VuYWxpZ25lZCAoRHdhcmZfRGVidWcgZGJnLCB2b2lkICpwKQoreworICB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKKyAgaWYgKGRiZy0+b3RoZXJfYnl0ZV9vcmRlcikKKyAgICByZXR1cm4gYnN3YXBfMTYgKHVwLT51Mik7CisgIHJldHVybiB1cC0+dTI7Cit9CitzdGF0aWMgaW5saW5lIGludDE2X3QKK3JlYWRfMnNieXRlX3VuYWxpZ25lZCAoRHdhcmZfRGVidWcgZGJnLCB2b2lkICpwKQoreworICB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKKyAgaWYgKGRiZy0+b3RoZXJfYnl0ZV9vcmRlcikKKyAgICByZXR1cm4gKGludDE2X3QpIGJzd2FwXzE2ICh1cC0+dTIpOworICByZXR1cm4gdXAtPnMyOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CityZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0ICh2b2lkICpwKQoreworICB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKKyAgcmV0dXJuIHVwLT51NDsKK30KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK3JlYWRfNHVieXRlX3VuYWxpZ25lZCAoRHdhcmZfRGVidWcgZGJnLCB2b2lkICpwKQoreworICB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKKyAgaWYgKGRiZy0+b3RoZXJfYnl0ZV9vcmRlcikKKyAgICByZXR1cm4gYnN3YXBfMzIgKHVwLT51NCk7CisgIHJldHVybiB1cC0+dTQ7Cit9CitzdGF0aWMgaW5saW5lIGludDMyX3QKK3JlYWRfNHNieXRlX3VuYWxpZ25lZCAoRHdhcmZfRGVidWcgZGJnLCB2b2lkICpwKQoreworICB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKKyAgaWYgKGRiZy0+b3RoZXJfYnl0ZV9vcmRlcikKKyAgICByZXR1cm4gKGludDMyX3QpIGJzd2FwXzMyICh1cC0+dTQpOworICByZXR1cm4gdXAtPnM0OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90CityZWFkXzh1Ynl0ZV91bmFsaWduZWQgKER3YXJmX0RlYnVnIGRiZywgdm9pZCAqcCkKK3sKKyAgdW5pb24gdW5hbGlnbmVkICp1cCA9IHA7CisgIGlmIChkYmctPm90aGVyX2J5dGVfb3JkZXIpCisgICAgcmV0dXJuIGJzd2FwXzY0ICh1cC0+dTgpOworICByZXR1cm4gdXAtPnU4OworfQorc3RhdGljIGlubGluZSBpbnQ2NF90CityZWFkXzhzYnl0ZV91bmFsaWduZWQgKER3YXJmX0RlYnVnIGRiZywgdm9pZCAqcCkKK3sKKyAgdW5pb24gdW5hbGlnbmVkICp1cCA9IHA7CisgIGlmIChkYmctPm90aGVyX2J5dGVfb3JkZXIpCisgICAgcmV0dXJuIChpbnQ2NF90KSBic3dhcF82NCAodXAtPnU4KTsKKyAgcmV0dXJuIHVwLT5zODsKK30KKworIyBlbHNlCisjICBlcnJvciAiVE9ETyIKKyMgZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZgkvKiBtZW1vcnktYWNjZXNzLmggKi8KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvLmN2c2lnbm9yZSBiL2xpYmR3ZmwvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg0NWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK01ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9saWJkd2ZsL0NoYW5nZUxvZyBiL2xpYmR3ZmwvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Yjg3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2ZsL0NoYW5nZUxvZwpAQCAtMCwwICsxLDEzIEBACisyMDA1LTA3LTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IEZpeCBydWxlcyB0byBhbGxvdyBidWlsZGluZyB3aXRoIG11ZGZsYXAuCisKKzIwMDUtMDctMjEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChub2luc3RfSEVBREVSUyk6IEFkZCBsb2MyYy5jLgorCisJKiB0ZXN0Mi5jIChtYWluKTogQ2hlY2sgc3NjYW5mIHJlc3VsdCB0byBxdWlldCB3YXJuaW5nLgorCisyMDA1LTA3LTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgorCisJKiBsaWJkd2ZsLWJyYW5jaCBtZXJnZWQsIGNyZWF0aW5nIHRoaXMgZGlyZWNvdHJ5LgpkaWZmIC0tZ2l0IGEvbGliZHdmbC9NYWtlZmlsZS5hbSBiL2xpYmR3ZmwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0NTA3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3ZmwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMTQgQEAKKyMjIE1ha2VmaWxlLmFtIGZvciBsaWJkd2ZsIGxpYnJhcnkgc3ViZGlyZWN0b3J5IGluIGVsZnV0aWxzLgorIyMKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCisjIworIyMgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyMjCisjIyBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisjIyBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisjIworIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisjIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyMjIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyMjIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorIyMgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4KKyMjCitERUZTID0gLURfR05VX1NPVVJDRSAtREhBVkVfQ09ORklHX0gKK2lmIE1VREZMQVAKK0FNX0NGTEFHUyA9IC1mbXVkZmxhcAorZWxzZQorQU1fQ0ZMQUdTID0KK2VuZGlmCitBTV9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvciAtV3NoYWRvdyAtV3VudXNlZCAtV2Zvcm1hdD0yIC1XZXh0cmEgLXN0ZD1nbnU5OQorSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkkKHNyY2RpcikvLi4vbGliZWxmIC1JJChzcmNkaXIpLy4uL2xpYmVibCBcCisJICAgLUkkKHNyY2RpcikvLi4vbGliZHcgLUkuLiAtSSQoc3JjZGlyKS8uLi9saWIKK1ZFUlNJT04gPSAxCisKK25vaW5zdF9QUk9HUkFNUyA9IHB0ZXN0IHRlc3QyCisKK3Rlc3QyX1NPVVJDRVMgPSB0ZXN0Mi5jIGxvYzJjLmMKKworbGliX0xJQlJBUklFUyA9IGxpYmR3ZmwuYQoraWYgIU1VREZMQVAKK25vaW5zdF9MSUJSQVJJRVMgPSBsaWJkd2ZsX3BpYy5hCitub2luc3RfUFJPR1JBTVMgKz0gJChub2luc3RfTElCUkFSSUVTOl9waWMuYT0uc28pCitlbmRpZgorCitldWluY2x1ZGVkaXIgPSAke2luY2x1ZGVkaXJ9L2VsZnV0aWxzCitldWluY2x1ZGVfSEVBREVSUyA9IGxpYmR3ZmwuaAorCitsaWJkd2ZsX2FfU09VUkNFUyA9IGR3ZmxfYmVnaW4uYyBkd2ZsX2VuZC5jIGR3ZmxfZXJyb3IuYyBcCisJCSAgICBkd2ZsX21vZHVsZS5jIGR3ZmxfcmVwb3J0X2VsZi5jIHJlbG9jYXRlLmMgXAorCQkgICAgZHdmbF9tb2R1bGVfaW5mby5jICBkd2ZsX2dldG1vZHVsZXMuYyBcCisJCSAgICBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIGR3ZmxfZ2V0ZHdhcmYuYyBcCisJCSAgICBhcmdwLXN0ZC5jIGZpbmQtZGVidWdpbmZvLmMgXAorCQkgICAgbGludXgta2VybmVsLW1vZHVsZXMuYyBsaW51eC1wcm9jLW1hcHMuYyBcCisJCSAgICBkd2ZsX2FkZHJtb2R1bGUuYyBkd2ZsX2FkZHJkd2FyZi5jIFwKKwkJICAgIGN1LmMgZHdmbF9tb2R1bGVfbmV4dGN1LmMgZHdmbF9uZXh0Y3UuYyBkd2ZsX2N1bW9kdWxlLmMgXAorCQkgICAgZHdmbF9tb2R1bGVfYWRkcmRpZS5jIGR3ZmxfYWRkcmRpZS5jIFwKKwkJICAgIGxpbmVzLmMgZHdmbF9saW5laW5mby5jIGR3ZmxfbGluZW1vZHVsZS5jIFwKKwkJICAgIGR3ZmxfbW9kdWxlX2dldHNyYy5jIGR3ZmxfZ2V0c3JjLmMgXAorCQkgICAgZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUuYyBcCisJCSAgICBlbGYtZnJvbS1tZW1vcnkuYworCisKK2lmIE1VREZMQVAKK2xpYmR3ZmwgPSBsaWJkd2ZsLmEgJChsaWJkdykgJChsaWJlYmwpICQobGliZWxmKSAkKGxpYmV1KQorbGliZHcgPSAuLi9saWJkdy9saWJkdy5hCitsaWJlbGYgPSAuLi9saWJlbGYvbGliZWxmLmEKK2xpYm11ZGZsYXAgPSAtbG11ZGZsYXAKK2Vsc2UKK2xpYmR3ZmwgPSBsaWJkd2ZsLnNvCitsaWJkdyA9IC4uL2xpYmR3L2xpYmR3LnNvCitsaWJlbGYgPSAuLi9saWJlbGYvbGliZWxmLnNvCitlbmRpZgorbGliZWJsID0gLi4vbGliZWJsL2xpYmVibC5hCitsaWJldSA9IC4uL2xpYi9saWJldS5hCisKKworaWYgIU1VREZMQVAKK2xpYmR3ZmxfcGljX2FfU09VUkNFUyA9CithbV9saWJkd2ZsX3BpY19hX09CSkVDVFMgPSAkKGxpYmR3ZmxfYV9TT1VSQ0VTOi5jPS5vcykKKworbGliZHdmbF9zb19TT1VSQ0VTID0KK2xpYmR3ZmxfTElCUyA9ICQobGliZXUpICQobGliZHcpICQobGliZWJsKSAkKGxpYmVsZikKK2xpYmR3Zmxfc29fTERBREQgPSAtbGRsCitsaWJkd2ZsLnNvOiBsaWJkd2ZsX3BpYy5hICQoc3JjZGlyKS9saWJkd2ZsLm1hcCAkKGxpYmR3ZmxfTElCUykKKwkkKENDKSAtc2hhcmVkIC1vICRAIC1XbCwtLXdob2xlLWFyY2hpdmUsJDwsLS1uby13aG9sZS1hcmNoaXZlIFwKKwkgICAgICAtV2wsLS12ZXJzaW9uLXNjcmlwdCwkKHNyY2RpcikvbGliZHdmbC5tYXAsLS1uby11bmRlZmluZWQgXAorCSAgICAgIC1XbCwtLXNvbmFtZSwkQC4kKFZFUlNJT04pLC16LGRlZnMgXAorCSAgICAgICQobGliZHdmbF9MSUJTKSAkKGxpYmR3Zmxfc29fTERBREQpCisJaWYgcmVhZGVsZiAtZCAkQCB8IGZncmVwIC1xIFRFWFRSRUw7IHRoZW4gZXhpdCAxOyBmaQorCWxuIC1mcyAkQCAkQC4kKFZFUlNJT04pCisKKworJS5vczogJS5jICUubworCWlmICQoQ09NUElMRSkgLWMgLW8gJEAgLWZwaWMgLURQSUMgLURTSEFSRUQgLU1UICRAIC1NRCAtTVAgXAorCSAgIC1NRiAiJChERVBESVIpLyQqLlRwbyIgYHRlc3QgLWYgJyQ8JyB8fCBlY2hvICckKHNyY2RpcikvJ2AkPDsgXAorCXRoZW4gY2F0ICIkKERFUERJUikvJCouVHBvIiA+PiAiJChERVBESVIpLyQqLlBvIjsgXAorCSAgICAgcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBcCisJZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgXAorCWZpCisKK2luc3RhbGw6IGluc3RhbGwtYW0gbGliZHdmbC5zbworCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKQorCSQoSU5TVEFMTF9QUk9HUkFNKSBsaWJkd2ZsLnNvICQoREVTVERJUikkKGxpYmRpcikvbGliZHdmbC0kKFBBQ0tBR0VfVkVSU0lPTikuc28KKwlsbiAtZnMgbGliZHdmbC0kKFBBQ0tBR0VfVkVSU0lPTikuc28gJChERVNURElSKSQobGliZGlyKS9saWJkd2ZsLnNvLiQoVkVSU0lPTikKKwlsbiAtZnMgbGliZHdmbC5zby4kKFZFUlNJT04pICQoREVTVERJUikkKGxpYmRpcikvbGliZHdmbC5zbworCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZHdmbC0kKFBBQ0tBR0VfVkVSU0lPTikuc28KKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmR3Zmwuc28uJChWRVJTSU9OKQorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZHdmbC5zbworCXJtZGlyIC0taWdub3JlLWZhaWwtb24tbm9uLWVtcHR5ICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2VsZnV0aWxzCitlbmRpZgorCitub2luc3RfSEVBREVSUyA9IGxpYmR3ZmxQLmggbG9jMmMuaAorCitFWFRSQV9ESVNUID0gbGliZHdmbC5tYXAKKworQ0xFQU5GSUxFUyA9ICQoYW1fbGliZHdmbF9waWNfYV9PQkpFQ1RTKQorCitwdGVzdF9MREFERCA9ICQobGliZHdmbCkgJChsaWJkdykgJChsaWJtdWRmbGFwKQordGVzdDJfTERBREQgPSAkKGxpYmR3ZmwpICQobGliZHcpICQobGlibXVkZmxhcCkKZGlmZiAtLWdpdCBhL2xpYmR3ZmwvYXJncC1zdGQuYyBiL2xpYmR3ZmwvYXJncC1zdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmRkY2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9hcmdwLXN0ZC5jCkBAIC0wLDAgKzEsMTY0IEBACisvKiBTdGFuZGFyZCBhcmdwIGFyZ3VtZW50IHBhcnNlcnMgZm9yIHRvb2xzIHVzaW5nIGxpYmR3ZmwuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisjaW5jbHVkZSA8YXJncC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpYmludGwuaD4KKworLyogZ2V0dGV4dCBoZWxwZXIgbWFjcm9zLiAgKi8KKyNkZWZpbmUgXyhTdHIpIGRnZXR0ZXh0ICgiZWxmdXRpbHMiLCBTdHIpCisKKworI2RlZmluZSBPUFRfREVCVUdJTkZPIDB4MTAwCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KK3sKKyAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiSW5wdXQgU2VsZWN0aW9uOiIpLCAwIH0sCisgIHsgImV4ZWN1dGFibGUiLCAnZScsICJGSUxFIiwgMCwgTl8oIkZpbmQgYWRkcmVzc2VzIGluIEZJTEUiKSwgMCB9LAorICB7ICJwaWQiLCAncCcsICJQSUQiLCAwLAorICAgIE5fKCJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgaW50byBwcm9jZXNzIFBJRCIpLCAwIH0sCisgIHsgImtlcm5lbCIsICdrJywgTlVMTCwgMCwgTl8oIkZpbmQgYWRkcmVzc2VzIGluIHRoZSBydW5uaW5nIGtlcm5lbCIpLCAwIH0sCisgIHsgImRlYnVnaW5mby1wYXRoIiwgT1BUX0RFQlVHSU5GTywgIlBBVEgiLCAwLAorICAgIE5fKCJTZWFyY2ggcGF0aCBmb3Igc2VwYXJhdGUgZGVidWdpbmZvIGZpbGVzIiksIDAgfSwKKyAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KK307CisKK3N0YXRpYyBjaGFyICpkZWJ1Z2luZm9fcGF0aDsKKworc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIHByb2NfY2FsbGJhY2tzID0KKyAgeworICAgIC5maW5kX2RlYnVnaW5mbyA9IElOVFVTRShkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvKSwKKyAgICAuZGVidWdpbmZvX3BhdGggPSAmZGVidWdpbmZvX3BhdGgsCisKKyAgICAuZmluZF9lbGYgPSBJTlRVU0UoZHdmbF9saW51eF9wcm9jX2ZpbmRfZWxmKSwKKyAgfTsKKworc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIGtlcm5lbF9jYWxsYmFja3MgPQorICB7CisgICAgLmZpbmRfZGVidWdpbmZvID0gSU5UVVNFKGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8pLAorICAgIC5kZWJ1Z2luZm9fcGF0aCA9ICZkZWJ1Z2luZm9fcGF0aCwKKworICAgIC5maW5kX2VsZiA9IElOVFVTRShkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZiksCisgICAgLnNlY3Rpb25fYWRkcmVzcyA9IElOVFVTRShkd2ZsX2xpbnV4X2tlcm5lbF9tb2R1bGVfc2VjdGlvbl9hZGRyZXNzKSwKKyAgfTsKKworc3RhdGljIGVycm9yX3QKK3BhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpCit7CisgIGlubGluZSB2b2lkIGZhaWx1cmUgKGludCBlcnJudW0sIGNvbnN0IGNoYXIgKm1zZykKKyAgICB7CisgICAgICBpZiAoZXJybnVtID09IC0xKQorCWFyZ3BfZmFpbHVyZSAoc3RhdGUsIEVYSVRfRkFJTFVSRSwgMCwgIiVzOiAlcyIsCisJCSAgICAgIG1zZywgSU5UVVNFKGR3ZmxfZXJybXNnKSAoLTEpKTsKKyAgICAgIGVsc2UKKwlhcmdwX2ZhaWx1cmUgKHN0YXRlLCBFWElUX0ZBSUxVUkUsIGVycm51bSwgIiVzIiwgbXNnKTsKKyAgICB9CisgIGlubGluZSBlcnJvcl90IGZhaWwgKGludCBlcnJudW0sIGNvbnN0IGNoYXIgKm1zZykKKyAgICB7CisgICAgICBmYWlsdXJlIChlcnJudW0sIG1zZyk7CisgICAgICByZXR1cm4gZXJybnVtID09IC0xID8gRUlPIDogZXJybnVtOworICAgIH0KKworICBzd2l0Y2ggKGtleSkKKyAgICB7CisgICAgY2FzZSBPUFRfREVCVUdJTkZPOgorICAgICAgZGVidWdpbmZvX3BhdGggPSBhcmc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2UnOgorICAgICAgaWYgKHN0YXRlLT5ob29rID09IE5VTEwpCisJeworCSAgRHdmbCAqZHdmbCA9IElOVFVTRShkd2ZsX2JlZ2luKSAoJnByb2NfY2FsbGJhY2tzKTsKKwkgIGlmIChJTlRVU0UoZHdmbF9yZXBvcnRfZWxmKSAoZHdmbCwgIiIsIGFyZywgLTEsIDApID09IE5VTEwpCisJICAgIHJldHVybiBmYWlsICgtMSwgYXJnKTsKKwkgIHN0YXRlLT5ob29rID0gZHdmbDsKKwl9CisgICAgICBlbHNlCisJeworCXRvb21hbnk6CisJICBhcmdwX2Vycm9yIChzdGF0ZSwgIiVzIiwgXygib25seSBvbmUgLWUsIC1wLCBvciAtayBvcHRpb24gYWxsb3dlZCIpKTsKKwkgIHJldHVybiBFSU5WQUw7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdwJzoKKyAgICAgIGlmIChzdGF0ZS0+aG9vayA9PSBOVUxMKQorCXsKKwkgIER3ZmwgKmR3ZmwgPSBJTlRVU0UoZHdmbF9iZWdpbikgKCZwcm9jX2NhbGxiYWNrcyk7CisJICBpbnQgcmVzdWx0ID0gSU5UVVNFKGR3ZmxfbGludXhfcHJvY19yZXBvcnQpIChkd2ZsLCBhdG9pIChhcmcpKTsKKwkgIGlmIChyZXN1bHQgIT0gMCkKKwkgICAgcmV0dXJuIGZhaWwgKHJlc3VsdCwgYXJnKTsKKwkgIHN0YXRlLT5ob29rID0gZHdmbDsKKwl9CisgICAgICBlbHNlCisJZ290byB0b29tYW55OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdrJzoKKyAgICAgIGlmIChzdGF0ZS0+aG9vayA9PSBOVUxMKQorCXsKKwkgIER3ZmwgKmR3ZmwgPSBJTlRVU0UoZHdmbF9iZWdpbikgKCZrZXJuZWxfY2FsbGJhY2tzKTsKKwkgIGludCByZXN1bHQgPSBJTlRVU0UoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X2tlcm5lbCkgKGR3ZmwpOworCSAgaWYgKHJlc3VsdCAhPSAwKQorCSAgICByZXR1cm4gZmFpbCAocmVzdWx0LCBfKCJjYW5ub3QgbG9hZCBrZXJuZWwgc3ltYm9scyIpKTsKKwkgIHJlc3VsdCA9IElOVFVTRShkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfbW9kdWxlcykgKGR3ZmwpOworCSAgaWYgKHJlc3VsdCAhPSAwKQorCSAgICAvKiBOb24tZmF0YWwgdG8gaGF2ZSBubyBtb2R1bGVzIHNpbmNlIHdlIGRvIGhhdmUgdGhlIGtlcm5lbC4gICovCisJICAgIGZhaWx1cmUgKHJlc3VsdCwgXygiY2Fubm90IGZpbmQga2VybmVsIG1vZHVsZXMiKSk7CisJICBzdGF0ZS0+aG9vayA9IGR3Zmw7CisJfQorICAgICAgZWxzZQorCWdvdG8gdG9vbWFueTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBUkdQX0tFWV9TVUNDRVNTOgorICAgICAgeworCUR3ZmwgKmR3ZmwgPSBzdGF0ZS0+aG9vazsKKworCWlmIChkd2ZsID09IE5VTEwpCisJICB7CisJICAgIC8qIERlZmF1bHQgaWYgbm8gLWUsIC1wLCBvciAtaywgaXMgIi1lIGEub3V0Ii4gICovCisJICAgIGFyZyA9ICJhLm91dCI7CisJICAgIGR3ZmwgPSBJTlRVU0UoZHdmbF9iZWdpbikgKCZwcm9jX2NhbGxiYWNrcyk7CisJICAgIGlmIChJTlRVU0UoZHdmbF9yZXBvcnRfZWxmKSAoZHdmbCwgIiIsIGFyZywgLTEsIDApID09IE5VTEwpCisJICAgICAgcmV0dXJuIGZhaWwgKC0xLCBhcmcpOworCSAgICBzdGF0ZS0+aG9vayA9IGR3Zmw7CisJICB9CisKKwkvKiBPbmUgb2YgdGhlIHRocmVlIGZsYXZvcnMgaGFzIGRvbmUgZHdmbF9iZWdpbiBhbmQgc29tZSByZXBvcnRpbmcKKwkgICBpZiB3ZSBnb3QgaGVyZS4gIFRpZSB1cCB0aGUgRHdmbCBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIgb2YKKwkgICBhcmdwX3BhcnNlLiAgKi8KKworCWludCByZXN1bHQgPSBJTlRVU0UoZHdmbF9yZXBvcnRfZW5kKSAoZHdmbCwgTlVMTCwgTlVMTCk7CisJYXNzZXJ0IChyZXN1bHQgPT0gMCk7CisKKwkqKER3ZmwgKiopIHN0YXRlLT5pbnB1dCA9IGR3Zmw7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKKyAgICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3AgbGliZHdmbF9hcmdwID0KKyAgeyAub3B0aW9ucyA9IG9wdGlvbnMsIC5wYXJzZXIgPSBwYXJzZV9vcHQgfTsKKworY29uc3Qgc3RydWN0IGFyZ3AgKgorZHdmbF9zdGFuZGFyZF9hcmdwICh2b2lkKQoreworICByZXR1cm4gJmxpYmR3ZmxfYXJncDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvY3UuYyBiL2xpYmR3ZmwvY3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDIwNzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9jdS5jCkBAIC0wLDAgKzEsMjc1IEBACisvKiBLZWVwaW5nIHRyYWNrIG9mIERXQVJGIGNvbXBpbGF0aW9uIHVuaXRzIGluIGxpYmR3ZmwuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisjaW5jbHVkZSAiLi4vbGliZHcvbGliZHdQLmgiCisjaW5jbHVkZSAiLi4vbGliZHcvbWVtb3J5LWFjY2Vzcy5oIgorI2luY2x1ZGUgPHNlYXJjaC5oPgorCisKK3N0YXRpYyBpbmxpbmUgRHdhcmZfQXJhbmdlICoKK2R3YXIgKER3ZmxfTW9kdWxlICptb2QsIHVuc2lnbmVkIGludCBpZHgpCit7CisgIHJldHVybiAmbW9kLT5kdy0+YXJhbmdlcy0+aW5mb1ttb2QtPmFyYW5nZXNbaWR4XS5hcmFuZ2VdOworfQorCisKK3N0YXRpYyBEd2ZsX0Vycm9yCithZGRyYXJhbmdlIChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9BZGRyIGFkZHIsIHN0cnVjdCBkd2ZsX2FyYW5nZSAqKmFyYW5nZSkKK3sKKyAgaWYgKG1vZC0+YXJhbmdlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIER3YXJmX0FyYW5nZXMgKmR3YXJhbmdlczsKKyAgICAgIGlmIChkd2FyZl9nZXRhcmFuZ2VzIChtb2QtPmR3LCAmZHdhcmFuZ2VzLCBOVUxMKSAhPSAwKQorCXJldHVybiBEV0ZMX0VfTElCRFc7CisKKyAgICAgIHN0cnVjdCBkd2ZsX2FyYW5nZSAqYXJhbmdlcyA9IG1hbGxvYyAoZHdhcmFuZ2VzLT5uYXJhbmdlcworCQkJCQkgICAgKiBzaXplb2YgKmFyYW5nZXMpOworICAgICAgaWYgKHVubGlrZWx5IChhcmFuZ2VzID09IE5VTEwpKQorCXJldHVybiBEV0ZMX0VfTk9NRU07CisKKyAgICAgIC8qIGxpYmR3IGhhcyBzb3J0ZWQgaXRzIGxpc3QgYnkgYWRkcmVzcywgd2hpY2ggaXMgaG93IHdlIHdhbnQgaXQuCisJIEJ1dCB0aGUgc29ydGVkIGxpc3QgaXMgZnVsbCBvZiBub3QtcXVpdGUtY29udGlndW91cyBydW5zIHBvaW50aW5nCisJIHRvIHRoZSBzYW1lIENVLiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbGl0dGxlIGdhcHMgaW5zaWRlIHRoZQorCSBtb2R1bGUsIHdlJ2xsIGNvbnNpZGVyIHRoZW0gcGFydCBvZiB0aGUgc3Vycm91bmRpbmcgQ1UgYW55d2F5LgorCSBDb2xsZWN0IG91ciBvd24gYXJyYXkgd2l0aCBqdXN0IG9uZSByZWNvcmQgZm9yIGVhY2ggcnVuIG9mIHJhbmdlcworCSBwb2ludGluZyB0byBvbmUgQ1UuICAqLworCisgICAgICBzaXplX3QgbmFyYW5nZXMgPSAwOworICAgICAgRHdhcmZfT2ZmIGxhc3RjdSA9IDA7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGR3YXJhbmdlcy0+bmFyYW5nZXM7ICsraSkKKwlpZiAoaSA9PSAwIHx8IGR3YXJhbmdlcy0+aW5mb1tpXS5vZmZzZXQgIT0gbGFzdGN1KQorCSAgeworCSAgICBhcmFuZ2VzW25hcmFuZ2VzXS5hcmFuZ2UgPSBpOworCSAgICBhcmFuZ2VzW25hcmFuZ2VzXS5jdSA9IE5VTEw7CisJICAgICsrbmFyYW5nZXM7CisJICAgIGxhc3RjdSA9IGR3YXJhbmdlcy0+aW5mb1tpXS5vZmZzZXQ7CisJICB9CisKKyAgICAgIC8qIFN0b3JlIHRoZSBmaW5hbCBhcnJheSwgd2hpY2ggaXMgcHJvYmFibHkgbXVjaCBzbWFsbGVyIHRoYW4gYmVmb3JlLiAgKi8KKyAgICAgIG1vZC0+bmFyYW5nZXMgPSBuYXJhbmdlczsKKyAgICAgIG1vZC0+YXJhbmdlcyA9IChyZWFsbG9jIChhcmFuZ2VzLCBuYXJhbmdlcyAqIHNpemVvZiBhcmFuZ2VzWzBdKQorCQkgICAgICA/OiBhcmFuZ2VzKTsKKyAgICAgIG1vZC0+bGF6eWN1ICs9IG5hcmFuZ2VzOworICAgIH0KKworICAvKiBUaGUgYWRkcmVzcyBtdXN0IGJlIGluc2lkZSB0aGUgbW9kdWxlIHRvIGJlZ2luIHdpdGguICAqLworICBhZGRyIC09IG1vZC0+ZGVidWcuYmlhczsKKworICAvKiBUaGUgcmFuZ2VzIGFyZSBzb3J0ZWQgYnkgYWRkcmVzcywgc28gd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoLiAgKi8KKyAgc2l6ZV90IGwgPSAwLCB1ID0gbW9kLT5uYXJhbmdlczsKKyAgd2hpbGUgKGwgPCB1KQorICAgIHsKKyAgICAgIHNpemVfdCBpZHggPSAobCArIHUpIC8gMjsKKyAgICAgIER3YXJmX0FkZHIgc3RhcnQgPSBkd2FyIChtb2QsIGlkeCktPmFkZHI7CisgICAgICBpZiAoYWRkciA8IHN0YXJ0KQorCXsKKwkgIHUgPSBpZHg7CisJICBjb250aW51ZTsKKwl9CisgICAgICBlbHNlIGlmIChhZGRyID4gc3RhcnQpCisJeworCSAgaWYgKGlkeCArIDEgPCBtb2QtPm5hcmFuZ2VzKQorCSAgICB7CisJICAgICAgaWYgKGFkZHIgPj0gZHdhciAobW9kLCBpZHggKyAxKS0+YWRkcikKKwkJeworCQkgIGwgPSBpZHggKyAxOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEl0IG1pZ2h0IGJlIGluIHRoZSBsYXN0IHJhbmdlLiAgKi8KKwkgICAgICBjb25zdCBEd2FyZl9BcmFuZ2UgKmxhc3QKKwkJPSAmbW9kLT5kdy0+YXJhbmdlcy0+aW5mb1ttb2QtPmR3LT5hcmFuZ2VzLT5uYXJhbmdlcyAtIDFdOworCSAgICAgIGlmIChhZGRyID4gbGFzdC0+YWRkciArIGxhc3QtPmxlbmd0aCkKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgICphcmFuZ2UgPSAmbW9kLT5hcmFuZ2VzW2lkeF07CisgICAgICByZXR1cm4gRFdGTF9FX05PRVJST1I7CisgICAgfQorCisgIHJldHVybiBEV0ZMX0VfQUREUl9PVVRPRlJBTkdFOworfQorCisKK3N0YXRpYyB2b2lkCitub2ZyZWUgKHZvaWQgKmFyZykKK3sKKyAgc3RydWN0IGR3ZmxfY3UgKmN1ID0gYXJnOworICBpZiAoY3UgPT0gKHZvaWQgKikgLTFsKQorICAgIHJldHVybjsKKworICBhc3NlcnQgKGN1LT5tb2QtPmxhenljdSA9PSAwKTsKK30KKworLyogT25lIHJlYXNvbiBmZXdlciB0byBrZWVwIHRoZSBsYXp5IGxvb2t1cCB0YWJsZSBmb3IgQ1VzLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbGVzc19sYXp5IChEd2ZsX01vZHVsZSAqbW9kKQoreworICBpZiAoLS1tb2QtPmxhenljdSA+IDApCisgICAgcmV0dXJuOworCisgIC8qIFdlIGtub3cgYWJvdXQgYWxsIHRoZSBDVXMgbm93LCB3ZSBkb24ndCBuZWVkIHRoaXMgdGFibGUuICAqLworICB0ZGVzdHJveSAobW9kLT5sYXp5X2N1X3Jvb3QsIG5vZnJlZSk7CisgIG1vZC0+bGF6eV9jdV9yb290ID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBEd2FyZl9PZmYKK2N1ZGllX29mZnNldCAoY29uc3Qgc3RydWN0IGR3ZmxfY3UgKmN1KQoreworICByZXR1cm4gY3UtPmRpZS5jdS0+c3RhcnQgKyAzICogY3UtPmRpZS5jdS0+b2Zmc2V0X3NpemUgLSA0ICsgMzsKK30KKworc3RhdGljIGludAorY29tcGFyZV9jdWtleSAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgcmV0dXJuIGN1ZGllX29mZnNldCAoYSkgLSBjdWRpZV9vZmZzZXQgKGIpOworfQorCisvKiBJbnRlcm4gdGhlIENVIGlmIG5lY2Vzc2FyeS4gICovCitzdGF0aWMgRHdmbF9FcnJvcgoraW50ZXJuX2N1IChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9PZmYgY3VvZmYsIHN0cnVjdCBkd2ZsX2N1ICoqcmVzdWx0KQoreworICBzdHJ1Y3QgRHdhcmZfQ1UgZHdrZXk7CisgIHN0cnVjdCBkd2ZsX2N1IGtleTsKKyAga2V5LmRpZS5jdSA9ICZkd2tleTsKKyAgZHdrZXkub2Zmc2V0X3NpemUgPSAwOworICBkd2tleS5zdGFydCA9IGN1b2ZmIC0gKDMgKiAwIC0gNCArIDMpOworICBzdHJ1Y3QgZHdmbF9jdSAqKmZvdW5kID0gdHNlYXJjaCAoJmtleSwgJm1vZC0+bGF6eV9jdV9yb290LCAmY29tcGFyZV9jdWtleSk7CisgIGlmICh1bmxpa2VseSAoZm91bmQgPT0gTlVMTCkpCisgICAgcmV0dXJuIERXRkxfRV9OT01FTTsKKworICBpZiAoKmZvdW5kID09ICZrZXkgfHwgKmZvdW5kID09IE5VTEwpCisgICAgeworICAgICAgaWYgKHVubGlrZWx5IChjdW9mZiArIDQgPj0gbW9kLT5kdy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX3NpemUpKQorCXsKKwkgIC8qIFRoaXMgaXMgdGhlIEVPRiBtYXJrZXIuICBOb3cgd2UgaGF2ZSBpbnRlcm5lZCBhbGwgdGhlIENVcy4KKwkgICAgIE9uZSBpbmNyZW1lbnQgaW4gTU9ELT5sYXp5Y3UgY291bnRzIG5vdCBoYXZpbmcgaGl0IEVPRiB5ZXQuICAqLworCSAgKmZvdW5kID0gKHZvaWQgKikgLTFsOworCSAgbGVzc19sYXp5IChtb2QpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGlzIGlzIGEgbmV3IGVudHJ5LCBtZWFuaW5nIHdlIGhhdmVuJ3QgbG9va2VkIGF0IHRoaXMgQ1UuICAqLworCisJICAqZm91bmQgPSBOVUxMOworCisJICBzdHJ1Y3QgZHdmbF9jdSAqY3UgPSBtYWxsb2MgKHNpemVvZiAqY3UpOworCSAgaWYgKHVubGlrZWx5IChjdSA9PSBOVUxMKSkKKwkgICAgcmV0dXJuIERXRkxfRV9OT01FTTsKKworCSAgY3UtPm1vZCA9IG1vZDsKKwkgIGN1LT5uZXh0ID0gTlVMTDsKKwkgIGN1LT5saW5lcyA9IE5VTEw7CisKKwkgIC8qIFhYWCB1c2Ugbm9uLXNlYXJjaGluZyBsb29rdXAgKi8KKwkgIER3YXJmX0RpZSAqZGllID0gZHdhcmZfb2ZmZGllIChtb2QtPmR3LCBjdW9mZiwgJmN1LT5kaWUpOworCSAgaWYgKGRpZSA9PSBOVUxMKQorCSAgICByZXR1cm4gRFdGTF9FX0xJQkRXOworCSAgYXNzZXJ0IChkaWUgPT0gJmN1LT5kaWUpOworCisJICBzdHJ1Y3QgZHdmbF9jdSAqKm5ld3ZlYyA9IHJlYWxsb2MgKG1vZC0+Y3UsICgobW9kLT5uY3UgKyAxKQorCQkJCQkJICAgICAgICogc2l6ZW9mIChtb2QtPmN1WzBdKSkpOworCSAgaWYgKG5ld3ZlYyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZnJlZSAoY3UpOworCSAgICAgIHJldHVybiBEV0ZMX0VfTk9NRU07CisJICAgIH0KKwkgIG1vZC0+Y3UgPSBuZXd2ZWM7CisKKwkgIG1vZC0+Y3VbbW9kLT5uY3UrK10gPSBjdTsKKwkgIGlmIChjdS0+ZGllLmN1LT5zdGFydCA9PSAwKQorCSAgICBtb2QtPmZpcnN0X2N1ID0gY3U7CisKKwkgICpmb3VuZCA9IGN1OworCX0KKyAgICB9CisKKyAgKnJlc3VsdCA9ICpmb3VuZDsKKyAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOworfQorCisKKy8qIFRyYXZlcnNlIGFsbCB0aGUgQ1VzIGluIHRoZSBtb2R1bGUuICAqLworCitEd2ZsX0Vycm9yCitpbnRlcm5hbF9mdW5jdGlvbl9kZWYKK19fbGliZHdmbF9uZXh0Y3UgKER3ZmxfTW9kdWxlICptb2QsIHN0cnVjdCBkd2ZsX2N1ICpsYXN0Y3UsCisJCSAgc3RydWN0IGR3ZmxfY3UgKipjdSkKK3sKKyAgRHdhcmZfT2ZmIGN1b2ZmOworICBzdHJ1Y3QgZHdmbF9jdSAqKm5leHRwOworCisgIGlmIChsYXN0Y3UgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTdGFydCB0aGUgdHJhdmVyc2FsLiAgKi8KKyAgICAgIGN1b2ZmID0gMDsKKyAgICAgIG5leHRwID0gJm1vZC0+Zmlyc3RfY3U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQ29udGludWUgZm9sbG93aW5nIExBU1RDVS4gICovCisgICAgICBjdW9mZiA9IGxhc3RjdS0+ZGllLmN1LT5lbmQ7CisgICAgICBuZXh0cCA9ICZsYXN0Y3UtPm5leHQ7CisgICAgfQorCisgIGlmICgqbmV4dHAgPT0gTlVMTCkKKyAgICB7CisgICAgICBzaXplX3QgY3VoZHJzejsKKyAgICAgIER3YXJmX09mZiBuZXh0b2ZmOworICAgICAgaWYgKGR3YXJmX25leHRjdSAobW9kLT5kdywgY3VvZmYsICZuZXh0b2ZmLCAmY3VoZHJzeiwKKwkJCU5VTEwsIE5VTEwsIE5VTEwpICE9IDApCisJcmV0dXJuIERXRkxfRV9MSUJEVzsKKworICAgICAgRHdmbF9FcnJvciByZXN1bHQgPSBpbnRlcm5fY3UgKG1vZCwgY3VvZmYgKyBjdWhkcnN6LCBuZXh0cCk7CisgICAgICBpZiAocmVzdWx0ICE9IERXRkxfRV9OT0VSUk9SKQorCXJldHVybiByZXN1bHQ7CisKKyAgICAgIGlmICgoKm5leHRwKS0+bmV4dCA9PSBOVUxMICYmIG5leHRvZmYgPT0gKER3YXJmX09mZikgLTFsKQorCSgqbmV4dHApLT5uZXh0ID0gKHZvaWQgKikgLTFsOworICAgIH0KKworICAqY3UgPSAqbmV4dHAgPT0gKHZvaWQgKikgLTFsID8gTlVMTCA6ICpuZXh0cDsKKyAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOworfQorCisKKy8qIEludGVybiB0aGUgQ1UgYXJhbmdlIHBvaW50cyB0bywgaWYgbmVjZXNzYXJ5LiAgKi8KKworc3RhdGljIER3ZmxfRXJyb3IKK2FyYW5nZWN1IChEd2ZsX01vZHVsZSAqbW9kLCBzdHJ1Y3QgZHdmbF9hcmFuZ2UgKmFyYW5nZSwgc3RydWN0IGR3ZmxfY3UgKipjdSkKK3sKKyAgaWYgKGFyYW5nZS0+Y3UgPT0gTlVMTCkKKyAgICB7CisgICAgICBjb25zdCBEd2FyZl9BcmFuZ2UgKmR3YXJhbmdlID0gJm1vZC0+ZHctPmFyYW5nZXMtPmluZm9bYXJhbmdlLT5hcmFuZ2VdOworICAgICAgRHdmbF9FcnJvciByZXN1bHQgPSBpbnRlcm5fY3UgKG1vZCwgZHdhcmFuZ2UtPm9mZnNldCwgJmFyYW5nZS0+Y3UpOworICAgICAgaWYgKHJlc3VsdCAhPSBEV0ZMX0VfTk9FUlJPUikKKwlyZXR1cm4gcmVzdWx0OworICAgICAgYXNzZXJ0IChhcmFuZ2UtPmN1ICE9IE5VTEwgJiYgYXJhbmdlLT5jdSAhPSAodm9pZCAqKSAtMWwpOworICAgICAgbGVzc19sYXp5IChtb2QpOwkJLyogRWFjaCBhcmFuZ2Ugd2l0aCBudWxsIC0+Y3UgY291bnRzIG9uY2UuICAqLworICAgIH0KKworICAqY3UgPSBhcmFuZ2UtPmN1OworICByZXR1cm4gRFdGTF9FX05PRVJST1I7Cit9CisKK0R3ZmxfRXJyb3IKK2ludGVybmFsX2Z1bmN0aW9uX2RlZgorX19saWJkd2ZsX2FkZHJjdSAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciBhZGRyLCBzdHJ1Y3QgZHdmbF9jdSAqKmN1KQoreworICBzdHJ1Y3QgZHdmbF9hcmFuZ2UgKmFyYW5nZTsKKyAgcmV0dXJuIGFkZHJhcmFuZ2UgKG1vZCwgYWRkciwgJmFyYW5nZSkgPzogYXJhbmdlY3UgKG1vZCwgYXJhbmdlLCBjdSk7Cit9CmRpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfYWRkcmRpZS5jIGIvbGliZHdmbC9kd2ZsX2FkZHJkaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWJhOWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX2FkZHJkaWUuYwpAQCAtMCwwICsxLDIxIEBACisvKiBGZXRjaCBDVSBESUUgZnJvbSBhZGRyZXNzLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlICJsaWJkd2ZsUC5oIgorCitEd2FyZl9EaWUgKgorZHdmbF9hZGRyZGllIChEd2ZsICpkd2ZsLCBEd2FyZl9BZGRyIGFkZHIsIER3YXJmX0FkZHIgKmJpYXMpCit7CisgIHJldHVybiBJTlRVU0UoZHdmbF9tb2R1bGVfYWRkcmRpZSkgKElOVFVTRShkd2ZsX2FkZHJtb2R1bGUpIChkd2ZsLCBhZGRyKSwKKwkJCQkgICAgICBhZGRyLCBiaWFzKTsKK30KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvZHdmbF9hZGRyZHdhcmYuYyBiL2xpYmR3ZmwvZHdmbF9hZGRyZHdhcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2VhZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX2FkZHJkd2FyZi5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIEZldGNoIGxpYmR3IGhhbmRsZSBmcm9tIGFkZHJlc3MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisKK0R3YXJmICoKK2R3ZmxfYWRkcmR3YXJmIChEd2ZsICpkd2ZsLCBEd2FyZl9BZGRyIGFkZHJlc3MsIER3YXJmX0FkZHIgKmJpYXMpCit7CisgIHJldHVybiBJTlRVU0UoZHdmbF9tb2R1bGVfZ2V0ZHdhcmYpIChJTlRVU0UoZHdmbF9hZGRybW9kdWxlKSAoZHdmbCwgYWRkcmVzcyksCisJCQkJICAgICAgIGJpYXMpOworfQorSU5UREVGIChkd2ZsX2FkZHJkd2FyZikKZGlmZiAtLWdpdCBhL2xpYmR3ZmwvZHdmbF9hZGRybW9kdWxlLmMgYi9saWJkd2ZsL2R3ZmxfYWRkcm1vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWFiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2ZsL2R3ZmxfYWRkcm1vZHVsZS5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIEZpbmQgbW9kdWxlIGNvbnRhaW5pbmcgYWRkcmVzcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKworRHdmbF9Nb2R1bGUgKgorZHdmbF9hZGRybW9kdWxlIChEd2ZsICpkd2ZsLCBEd2FyZl9BZGRyIGFkZHJlc3MpCit7CisgIGlmIChkd2ZsID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogRG8gYmluYXJ5IHNlYXJjaCBvbiB0aGUgYXJyYXkgaW5kZXhlZCBieSBtb2R1bGUgbG9hZCBhZGRyZXNzLiAgKi8KKyAgc2l6ZV90IGwgPSAwLCB1ID0gZHdmbC0+bm1vZHVsZXM7CisgIHdoaWxlIChsIDwgdSkKKyAgICB7CisgICAgICBzaXplX3QgaWR4ID0gKGwgKyB1KSAvIDI7CisgICAgICBEd2ZsX01vZHVsZSAqbSA9IGR3ZmwtPm1vZHVsZXNbaWR4XTsKKyAgICAgIGlmIChhZGRyZXNzIDwgbS0+bG93X2FkZHIpCisJdSA9IGlkeDsKKyAgICAgIGVsc2UgaWYgKGFkZHJlc3MgPj0gbS0+aGlnaF9hZGRyKQorCWwgPSBpZHggKyAxOworICAgICAgZWxzZQorCXJldHVybiBtOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KK0lOVERFRiAoZHdmbF9hZGRybW9kdWxlKQpkaWZmIC0tZ2l0IGEvbGliZHdmbC9kd2ZsX2JlZ2luLmMgYi9saWJkd2ZsL2R3ZmxfYmVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzEzMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX2JlZ2luLmMKQEAgLTAsMCArMSwzMyBAQAorLyogU2V0IHVwIGEgc2Vzc2lvbiB1c2luZyBsaWJkd2ZsLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlICJsaWJkd2ZsUC5oIgorCitEd2ZsICoKK2R3ZmxfYmVnaW4gKGNvbnN0IER3ZmxfQ2FsbGJhY2tzICpjYWxsYmFja3MpCit7CisgIGlmIChlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCkgPT0gRVZfTk9ORSkKKyAgICB7CisgICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFTEYpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIER3ZmwgKmR3ZmwgPSBjYWxsb2MgKDEsIHNpemVvZiAqZHdmbCk7CisgIGlmIChkd2ZsID09IE5VTEwpCisgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOworICBlbHNlCisgICAgZHdmbC0+Y2FsbGJhY2tzID0gY2FsbGJhY2tzOworCisgIHJldHVybiBkd2ZsOworfQorSU5UREVGIChkd2ZsX2JlZ2luKQpkaWZmIC0tZ2l0IGEvbGliZHdmbC9kd2ZsX2N1bW9kdWxlLmMgYi9saWJkd2ZsL2R3ZmxfY3Vtb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI1YzBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX2N1bW9kdWxlLmMKQEAgLTAsMCArMSwyMSBAQAorLyogRmluZCB0aGUgbW9kdWxlIGZvciBhIENVIERJRSBwcmV2aW91c2x5IHJldHVybmVkIGJ5IGxpYmR3ZmwuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisKK0R3ZmxfTW9kdWxlICoKK2R3ZmxfY3Vtb2R1bGUgKER3YXJmX0RpZSAqY3VkaWUpCit7CisgIHN0cnVjdCBkd2ZsX2N1ICpjdSA9IChzdHJ1Y3QgZHdmbF9jdSAqKSBjdWRpZTsKKyAgcmV0dXJuIGN1LT5tb2Q7Cit9CmRpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfZW5kLmMgYi9saWJkd2ZsL2R3ZmxfZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4MzZkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3ZmwvZHdmbF9lbmQuYwpAQCAtMCwwICsxLDI2IEBACisvKiBGaW5pc2ggYSBzZXNzaW9uIHVzaW5nIGxpYmR3ZmwuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisKK3ZvaWQKK2R3ZmxfZW5kIChEd2ZsICpkd2ZsKQoreworICBpZiAoZHdmbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZHdmbC0+bm1vZHVsZXM7ICsraSkKKwlpZiAoZHdmbC0+bW9kdWxlc1tpXSAhPSBOVUxMKQorCSAgX19saWJkd2ZsX21vZHVsZV9mcmVlIChkd2ZsLT5tb2R1bGVzW2ldKTsKKyAgICAgIGZyZWUgKGR3ZmwtPm1vZHVsZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvZHdmbF9lcnJvci5jIGIvbGliZHdmbC9kd2ZsX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkMWE1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3ZmwvZHdmbF9lcnJvci5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiBFcnJvciBoYW5kbGluZyBpbiBsaWJkd2ZsLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJsaWJkd2ZsUC5oIgorCisKKyNpZmRlZiBVU0VfVExTCisvKiBUaGUgZXJyb3IgbnVtYmVyLiAgKi8KK3N0YXRpYyBfX3RocmVhZCBpbnQgZ2xvYmFsX2Vycm9yOworI2Vsc2UKKy8qIFRoaXMgaXMgdGhlIGtleSBmb3IgdGhlIHRocmVhZCBzcGVjaWZpYyBtZW1vcnkuICAqLworc3RhdGljIHRsc19rZXlfdCBrZXk7CisKKy8qIFRoZSBlcnJvciBudW1iZXIuICBVc2VkIGluIG5vbi10aHJlYWRlZCBwcm9ncmFtcy4gICovCitzdGF0aWMgaW50IGdsb2JhbF9lcnJvcjsKK3N0YXRpYyBib29sIHRocmVhZGVkOworLyogV2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCitvbmNlX2RlZmluZSAoc3RhdGljLCBvbmNlKTsKKworLyogVGhlIGluaXRpYWxpemF0aW9uIGFuZCBkZXN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworc3RhdGljIHZvaWQgaW5pdCAodm9pZCk7CitzdGF0aWMgdm9pZCBmcmVlX2tleV9tZW0gKHZvaWQgKm1lbSk7CisjZW5kaWYJLyogVExTICovCisKKworaW50Citkd2ZsX2Vycm5vICh2b2lkKQoreworICBpbnQgcmVzdWx0OworCisjaWZuZGVmIFVTRV9UTFMKKyAgLyogSWYgd2UgaGF2ZSBub3QgeWV0IGluaXRpYWxpemVkIHRoZSBidWZmZXIgZG8gaXQgbm93LiAgKi8KKyAgb25jZV9leGVjdXRlIChvbmNlLCBpbml0KTsKKworICBpZiAodGhyZWFkZWQpCisgICAgeworICAgICAgLyogV2UgZG8gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRhdGEuICBJdCBpcyBvbmx5IGEgd29yZC4KKwkgV2UgY2FuIHN0b3JlIGl0IGluIHBsYWNlIG9mIHRoZSBwb2ludGVyLiAgKi8KKyAgICAgIHJlc3VsdCA9IChpbnRwdHJfdCkgZ2V0c3BlY2lmaWMgKGtleSk7CisKKyAgICAgIHNldHNwZWNpZmljIChrZXksICh2b2lkICopIChpbnRwdHJfdCkgRFdGTF9FX05PRVJST1IpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisjZW5kaWYJLyogVExTICovCisKKyAgcmVzdWx0ID0gZ2xvYmFsX2Vycm9yOworICBnbG9iYWxfZXJyb3IgPSBEV0ZMX0VfTk9FUlJPUjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1zZ3RhYmxlCit7CisjZGVmaW5lIERXRkxfRVJST1IobmFtZSwgdGV4dCkgY2hhciBtc2dfIyNuYW1lW3NpemVvZiB0ZXh0XTsKKyAgRFdGTF9FUlJPUlMKKyN1bmRlZglEV0ZMX0VSUk9SCit9IG1zZ3RhYmxlID0KKyAgeworI2RlZmluZSBEV0ZMX0VSUk9SKG5hbWUsIHRleHQpIHRleHQsCisgIERXRkxfRVJST1JTCisjdW5kZWYJRFdGTF9FUlJPUgorICB9OworI2RlZmluZSBtc2dzdHIgKCZtc2d0YWJsZS5tc2dfTk9FUlJPUlswXSkKKworc3RhdGljIGNvbnN0IHVpbnRfZmFzdDE2X3QgbXNnaWR4W10gPQoreworI2RlZmluZSBEV0ZMX0VSUk9SKG5hbWUsIHRleHQpIFwKKyAgW0RXRkxfRV8jI25hbWVdID0gb2Zmc2V0b2YgKHN0cnVjdCBtc2d0YWJsZSwgbXNnXyMjbmFtZSksCisgIERXRkxfRVJST1JTCisjdW5kZWYJRFdGTF9FUlJPUgorfTsKKyNkZWZpbmUgbm1zZ2lkeCAoc2l6ZW9mIG1zZ2lkeCAvIHNpemVvZiBtc2dpZHhbMF0pCisKKworc3RhdGljIGlubGluZSBpbnQKK2Nhbm9uaWNhbGl6ZSAoRHdmbF9FcnJvciBlcnJvcikKK3sKKyAgdW5zaWduZWQgaW50IHZhbHVlOworCisgIHN3aXRjaCAoZXJyb3IpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICB2YWx1ZSA9IGVycm9yOworICAgICAgaWYgKCh2YWx1ZSAmfiAweGZmZmYpICE9IDApCisJYnJlYWs7CisgICAgICBhc3NlcnQgKHZhbHVlIDwgbm1zZ2lkeCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXRkxfRV9FUlJOTzoKKyAgICAgIHZhbHVlID0gRFdGTF9FIChFUlJOTywgZXJybm8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV0ZMX0VfTElCRUxGOgorICAgICAgdmFsdWUgPSBEV0ZMX0UgKExJQkVMRiwgZWxmX2Vycm5vICgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdGTF9FX0xJQkRXOgorICAgICAgdmFsdWUgPSBEV0ZMX0UgKExJQkRXLCBkd2FyZl9lcnJubyAoKSk7CisgICAgICBicmVhazsKKyNpZiAwCisgICAgRFdGTF9FX0xJQkVCTDoKKyAgICAgIHZhbHVlID0gRFdGTF9FIChMSUJFQkwsIGVibF9lcnJubyAoKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisKK2ludAoraW50ZXJuYWxfZnVuY3Rpb25fZGVmCitfX2xpYmR3ZmxfY2Fub25fZXJyb3IgKER3ZmxfRXJyb3IgZXJyb3IpCit7CisgIHJldHVybiBjYW5vbmljYWxpemUgKGVycm9yKTsKK30KKwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb25fZGVmCitfX2xpYmR3Zmxfc2V0ZXJybm8gKER3ZmxfRXJyb3IgZXJyb3IpCit7CisgIGludCB2YWx1ZSA9IGNhbm9uaWNhbGl6ZSAoZXJyb3IpOworCisjaWZuZGVmIFVTRV9UTFMKKyAgLyogSWYgd2UgaGF2ZSBub3QgeWV0IGluaXRpYWxpemVkIHRoZSBidWZmZXIgZG8gaXQgbm93LiAgKi8KKyAgb25jZV9leGVjdXRlIChvbmNlLCBpbml0KTsKKworICBpZiAodGhyZWFkZWQpCisgICAgLyogV2UgZG8gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRhdGEuICBJdCBpcyBvbmx5IGEgd29yZC4KKyAgICAgICBXZSBjYW4gc3RvcmUgaXQgaW4gcGxhY2Ugb2YgdGhlIHBvaW50ZXIuICAqLworICAgIHNldHNwZWNpZmljIChrZXksICh2b2lkICopIChpbnRwdHJfdCkgdmFsdWUpOworI2VuZGlmCS8qIFRMUyAqLworCisgIGdsb2JhbF9lcnJvciA9IHZhbHVlOworfQorCisKK2NvbnN0IGNoYXIgKgorZHdmbF9lcnJtc2cgKGVycm9yKQorICAgICBpbnQgZXJyb3I7Cit7CisgIGlmIChlcnJvciA9PSAwIHx8IGVycm9yID09IC0xKQorICAgIHsKKyAgICAgIGludCBsYXN0X2Vycm9yOworCisjaWZuZGVmIFVTRV9UTFMKKyAgICAgIC8qIElmIHdlIGhhdmUgbm90IHlldCBpbml0aWFsaXplZCB0aGUgYnVmZmVyIGRvIGl0IG5vdy4gICovCisgICAgICBvbmNlX2V4ZWN1dGUgKG9uY2UsIGluaXQpOworCisgICAgICBpZiAodGhyZWFkZWQpCisJLyogV2UgZG8gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRhdGEuICBJdCBpcyBvbmx5IGEgd29yZC4KKwkgICBXZSBjYW4gc3RvcmUgaXQgaW4gcGxhY2Ugb2YgdGhlIHBvaW50ZXIuICAqLworCWxhc3RfZXJyb3IgPSAoaW50cHRyX3QpIGdldHNwZWNpZmljIChrZXkpOworICAgICAgZWxzZQorI2VuZGlmCS8qIFRMUyAqLworCWxhc3RfZXJyb3IgPSBnbG9iYWxfZXJyb3I7CisKKyAgICAgIGlmIChlcnJvciA9PSAwICYmIGxhc3RfZXJyb3IgPT0gMCkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgZXJyb3IgPSBsYXN0X2Vycm9yOworICAgICAgZ2xvYmFsX2Vycm9yID0gRFdGTF9FX05PRVJST1I7CisgICAgfQorCisgIHN3aXRjaCAoZXJyb3IgJn4gMHhmZmZmKQorICAgIHsKKyAgICBjYXNlIE9USEVSX0VSUk9SIChFUlJOTyk6CisgICAgICByZXR1cm4gc3RyZXJyb3JfciAoZXJyb3IgJiAweGZmZmYsICJiYWQiLCAwKTsKKyAgICBjYXNlIE9USEVSX0VSUk9SIChMSUJFTEYpOgorICAgICAgcmV0dXJuIGVsZl9lcnJtc2cgKGVycm9yICYgMHhmZmZmKTsKKyAgICBjYXNlIE9USEVSX0VSUk9SIChMSUJEVyk6CisgICAgICByZXR1cm4gZHdhcmZfZXJybXNnIChlcnJvciAmIDB4ZmZmZik7CisjaWYgMAorICAgIGNhc2UgT1RIRVJfRVJST1IgKExJQkVCTCk6CisgICAgICByZXR1cm4gZWJsX2Vycm1zZyAoZXJyb3IgJiAweGZmZmYpOworI2VuZGlmCisgICAgfQorCisgIHJldHVybiBfKCZtc2dzdHJbbXNnaWR4Wyh1bnNpZ25lZCBpbnQpIGVycm9yIDwgbm1zZ2lkeAorCQkJICA/IGVycm9yIDogRFdGTF9FX1VOS05PV05fRVJST1JdXSk7Cit9CitJTlRERUYgKGR3ZmxfZXJybXNnKQorCisKKyNpZm5kZWYgVVNFX1RMUworLyogRnJlZSB0aGUgdGhyZWFkIHNwZWNpZmljIGRhdGEsIHRoaXMgaXMgZG9uZSBpZiBhIHRocmVhZCB0ZXJtaW5hdGVzLiAgKi8KK3N0YXRpYyB2b2lkCitmcmVlX2tleV9tZW0gKHZvaWQgKm1lbSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHNldHNwZWNpZmljIChrZXksIE5VTEwpOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIGtleSBmb3IgdGhlIGdsb2JhbCB2YXJpYWJsZS4gICovCitzdGF0aWMgdm9pZAoraW5pdCAodm9pZCkKK3sKKyAgLy8gWFhYIFNjcmV3IHlvdSwgZ2NjNCwgdGhlIHVudXNlZCBmdW5jdGlvbiBhdHRyaWJ1dGUgZG9lcyBub3Qgd29yay4KKyAgX19hc20gKCIiIDo6ICJyIiAoZnJlZV9rZXlfbWVtKSk7CisKKyAgaWYgKGtleV9jcmVhdGUgKCZrZXksIGZyZWVfa2V5X21lbSkgPT0gMCkKKyAgICAvKiBDcmVhdGluZyB0aGUga2V5IHN1Y2NlZWRlZC4gICovCisgICAgdGhyZWFkZWQgPSB0cnVlOworfQorI2VuZGlmCS8qIFRMUyAqLwpkaWZmIC0tZ2l0IGEvbGliZHdmbC9kd2ZsX2dldGR3YXJmLmMgYi9saWJkd2ZsL2R3ZmxfZ2V0ZHdhcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWU0OWRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX2dldGR3YXJmLmMKQEAgLTAsMCArMSw0MCBAQAorLyogSXRlcmF0ZSB0aHJvdWdoIG1vZHVsZXMgdG8gZmV0Y2ggRHdhcmYgaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisKK3B0cmRpZmZfdAorZHdmbF9nZXRkd2FyZiAoRHdmbCAqZHdmbCwKKwkgICAgICAgaW50ICgqY2FsbGJhY2spIChEd2ZsX01vZHVsZSAqLCB2b2lkICoqLAorCQkJCWNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKKwkJCQlEd2FyZiAqLCBEd2FyZl9BZGRyLCB2b2lkICopLAorCSAgICAgICB2b2lkICphcmcsCisJICAgICAgIHB0cmRpZmZfdCBvZmZzZXQpCit7CisgIGlmIChkd2ZsID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGlmICgoc2l6ZV90KSBvZmZzZXQgPiBkd2ZsLT5ubW9kdWxlcykKKyAgICByZXR1cm4gLTE7CisKKyAgd2hpbGUgKChzaXplX3QpIG9mZnNldCA8IGR3ZmwtPm5tb2R1bGVzKQorICAgIHsKKyAgICAgIER3ZmxfTW9kdWxlICptb2QgPSBkd2ZsLT5tb2R1bGVzW29mZnNldCsrXTsKKyAgICAgIER3YXJmX0FkZHIgYmlhcyA9IDA7CisgICAgICBEd2FyZiAqZHcgPSBJTlRVU0UoZHdmbF9tb2R1bGVfZ2V0ZHdhcmYpIChtb2QsICZiaWFzKTsKKyAgICAgIGlmICgoKmNhbGxiYWNrKSAoTU9EQ0JfQVJHUyAobW9kKSwgZHcsIGJpYXMsIGFyZykgIT0gRFdBUkZfQ0JfT0spCisJcmV0dXJuIG9mZnNldDsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfZ2V0bW9kdWxlcy5jIGIvbGliZHdmbC9kd2ZsX2dldG1vZHVsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmMxNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX2dldG1vZHVsZXMuYwpAQCAtMCwwICsxLDM3IEBACisvKiBJdGVyYXRlIHRocm91Z2ggbW9kdWxlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKworcHRyZGlmZl90Citkd2ZsX2dldG1vZHVsZXMgKER3ZmwgKmR3ZmwsCisJCSBpbnQgKCpjYWxsYmFjaykgKER3ZmxfTW9kdWxlICosIHZvaWQgKiosCisJCQkJICBjb25zdCBjaGFyICosIER3YXJmX0FkZHIsIHZvaWQgKiksCisJCSB2b2lkICphcmcsCisJCSBwdHJkaWZmX3Qgb2Zmc2V0KQoreworICBpZiAoZHdmbCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBpZiAoKHNpemVfdCkgb2Zmc2V0ID4gZHdmbC0+bm1vZHVsZXMpCisgICAgcmV0dXJuIC0xOworCisgIHdoaWxlICgoc2l6ZV90KSBvZmZzZXQgPCBkd2ZsLT5ubW9kdWxlcykKKyAgICB7CisgICAgICBEd2ZsX01vZHVsZSAqbW9kID0gZHdmbC0+bW9kdWxlc1tvZmZzZXQrK107CisgICAgICBpZiAoKCpjYWxsYmFjaykgKE1PRENCX0FSR1MgKG1vZCksIGFyZykgIT0gRFdBUkZfQ0JfT0spCisJcmV0dXJuIG9mZnNldDsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfZ2V0c3JjLmMgYi9saWJkd2ZsL2R3ZmxfZ2V0c3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlYjYzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3ZmwvZHdmbF9nZXRzcmMuYwpAQCAtMCwwICsxLDIxIEBACisvKiBGaW5kIHNvdXJjZSBsb2NhdGlvbiBmb3IgUEMgYWRkcmVzcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKworRHdmbF9MaW5lICoKK2R3ZmxfZ2V0c3JjIChEd2ZsICpkd2ZsLCBEd2FyZl9BZGRyIGFkZHIpCit7CisgIHJldHVybiBJTlRVU0UoZHdmbF9tb2R1bGVfZ2V0c3JjKSAoSU5UVVNFKGR3ZmxfYWRkcm1vZHVsZSkgKGR3ZmwsIGFkZHIpLAorCQkJCSAgICAgYWRkcik7Cit9CmRpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfbGluZWluZm8uYyBiL2xpYmR3ZmwvZHdmbF9saW5laW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzFlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2ZsL2R3ZmxfbGluZWluZm8uYwpAQCAtMCwwICsxLDQwIEBACisvKiBHZXQgaW5mb3JtYXRpb24gZnJvbSBhIHNvdXJjZSBsaW5lIHJlY29yZCByZXR1cm5lZCBieSBsaWJkd2ZsLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlICJsaWJkd2ZsUC5oIgorI2luY2x1ZGUgIi4uL2xpYmR3L2xpYmR3UC5oIgorCitleHRlcm4gY29uc3QgY2hhciAqCitkd2ZsX2xpbmVpbmZvIChEd2ZsX0xpbmUgKmxpbmUsIER3YXJmX0FkZHIgKmFkZHIsIGludCAqbGluZXAsIGludCAqY29scCwKKwkgICAgICAgRHdhcmZfV29yZCAqbXRpbWUsIER3YXJmX1dvcmQgKmxlbmd0aCkKK3sKKyAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzdHJ1Y3QgZHdmbF9jdSAqY3UgPSBkd2ZsX2xpbmVjdSAobGluZSk7CisgIGNvbnN0IER3YXJmX0xpbmUgKmluZm8gPSAmY3UtPmRpZS5jdS0+bGluZXMtPmluZm9bbGluZS0+aWR4XTsKKworICBpZiAoYWRkciAhPSBOVUxMKQorICAgICphZGRyID0gaW5mby0+YWRkciAtIGN1LT5tb2QtPmRlYnVnLmJpYXM7CisgIGlmIChsaW5lcCAhPSBOVUxMKQorICAgICpsaW5lcCA9IGluZm8tPmxpbmU7CisgIGlmIChjb2xwICE9IE5VTEwpCisgICAgKmNvbHAgPSBpbmZvLT5jb2x1bW47CisKKyAgc3RydWN0IER3YXJmX0ZpbGVpbmZvX3MgKmZpbGUgPSAmaW5mby0+ZmlsZXMtPmluZm9baW5mby0+ZmlsZV07CisgIGlmIChtdGltZSAhPSBOVUxMKQorICAgICptdGltZSA9IGZpbGUtPm10aW1lOworICBpZiAobGVuZ3RoICE9IE5VTEwpCisgICAgKmxlbmd0aCA9IGZpbGUtPmxlbmd0aDsKKyAgcmV0dXJuIGZpbGUtPm5hbWU7Cit9CmRpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfbGluZW1vZHVsZS5jIGIvbGliZHdmbC9kd2ZsX2xpbmVtb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzNkYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX2xpbmVtb2R1bGUuYwpAQCAtMCwwICsxLDIzIEBACisvKiBGZXRjaCB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgYSBzb3VyY2UgbGluZSByZWNvcmQgcmV0dXJuZWQgYnkgbGliZHdmbC4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKworRHdmbF9Nb2R1bGUgKgorZHdmbF9saW5lbW9kdWxlIChEd2ZsX0xpbmUgKmxpbmUpCit7CisgIGlmIChsaW5lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIGR3ZmxfbGluZWN1IChsaW5lKS0+bW9kOworfQpkaWZmIC0tZ2l0IGEvbGliZHdmbC9kd2ZsX21vZHVsZS5jIGIvbGliZHdmbC9kd2ZsX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZDlmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2ZsL2R3ZmxfbW9kdWxlLmMKQEAgLTAsMCArMSwxODggQEAKKy8qIE1haW50ZW5hbmNlIG9mIG1vZHVsZSBsaXN0IGluIGxpYmR3ZmwuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisjaW5jbHVkZSA8c2VhcmNoLmg+CisKK3N0YXRpYyB2b2lkCitmcmVlX2N1IChzdHJ1Y3QgZHdmbF9jdSAqY3UpCit7CisgIGlmIChjdS0+bGluZXMgIT0gTlVMTCkKKyAgICBmcmVlIChjdS0+bGluZXMpOworICBmcmVlIChjdSk7Cit9CisKK3N0YXRpYyB2b2lkCitub2ZyZWUgKHZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7Cit9CisKK3ZvaWQKK2ludGVybmFsX2Z1bmN0aW9uX2RlZgorX19saWJkd2ZsX21vZHVsZV9mcmVlIChEd2ZsX01vZHVsZSAqbW9kKQoreworICBpZiAobW9kLT5sYXp5X2N1X3Jvb3QgIT0gTlVMTCkKKyAgICB0ZGVzdHJveSAobW9kLT5sYXp5X2N1X3Jvb3QsIG5vZnJlZSk7CisKKyAgaWYgKG1vZC0+YXJhbmdlcyAhPSBOVUxMKQorICAgIGZyZWUgKG1vZC0+YXJhbmdlcyk7CisKKyAgaWYgKG1vZC0+Y3UgIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1vZC0+bmN1OyArK2kpCisJZnJlZV9jdSAobW9kLT5jdVtpXSk7CisgICAgICBmcmVlIChtb2QtPmN1KTsKKyAgICB9CisKKyAgaWYgKG1vZC0+ZHcgIT0gTlVMTCkKKyAgICBkd2FyZl9lbmQgKG1vZC0+ZHcpOworCisgIGlmIChtb2QtPmVibCAhPSBOVUxMKQorICAgIGVibF9jbG9zZWJhY2tlbmQgKG1vZC0+ZWJsKTsKKworICBpZiAobW9kLT5kZWJ1Zy5lbGYgIT0gbW9kLT5tYWluLmVsZiAmJiBtb2QtPmRlYnVnLmVsZiAhPSBOVUxMKQorICAgIGVsZl9lbmQgKG1vZC0+ZGVidWcuZWxmKTsKKyAgaWYgKG1vZC0+bWFpbi5lbGYgIT0gTlVMTCkKKyAgICBlbGZfZW5kIChtb2QtPm1haW4uZWxmKTsKKworICBmcmVlIChtb2QtPm5hbWUpOworfQorCit2b2lkCitkd2ZsX3JlcG9ydF9iZWdpbiAoRHdmbCAqZHdmbCkKK3sKKyAgZm9yIChEd2ZsX01vZHVsZSAqbSA9IGR3ZmwtPm1vZHVsZWxpc3Q7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCisgICAgbS0+Z2MgPSB0cnVlOworCisgIGlmIChkd2ZsLT5tb2R1bGVzICE9IE5VTEwpCisgICAgZnJlZSAoZHdmbC0+bW9kdWxlcyk7CisgIGR3ZmwtPm1vZHVsZXMgPSBOVUxMOworICBkd2ZsLT5ubW9kdWxlcyA9IDA7Cit9CitJTlRERUYgKGR3ZmxfcmVwb3J0X2JlZ2luKQorCisvKiBSZXBvcnQgdGhhdCBhIG1vZHVsZSBjYWxsZWQgTkFNRSBwYW5zIGFkZHJlc3NlcyBbU1RBUlQsIEVORCkuCisgICBSZXR1cm5zIHRoZSBtb2R1bGUgaGFuZGxlLCBlaXRoZXIgZXhpc3Rpbmcgb3IgbmV3bHkgYWxsb2NhdGVkLAorICAgb3IgcmV0dXJucyBhIG51bGwgcG9pbnRlciBmb3IgYW4gYWxsb2NhdGlvbiBlcnJvci4gICovCitEd2ZsX01vZHVsZSAqCitkd2ZsX3JlcG9ydF9tb2R1bGUgKER3ZmwgKmR3ZmwsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICBHRWxmX0FkZHIgc3RhcnQsIEdFbGZfQWRkciBlbmQpCit7CisgIER3ZmxfTW9kdWxlICoqdGFpbHAgPSAmZHdmbC0+bW9kdWxlbGlzdCwgKipwcmV2cCA9IHRhaWxwOworICBmb3IgKER3ZmxfTW9kdWxlICptID0gKnByZXZwOyBtICE9IE5VTEw7IG0gPSAqKHByZXZwID0gJm0tPm5leHQpKQorICAgIHsKKyAgICAgIGlmIChtLT5sb3dfYWRkciA9PSBzdGFydCAmJiBtLT5oaWdoX2FkZHIgPT0gZW5kCisJICAmJiAhc3RyY21wIChtLT5uYW1lLCBuYW1lKSkKKwl7CisJICAvKiBUaGlzIG1vZHVsZSBpcyBzdGlsbCBoZXJlLiAgTW92ZSBpdCB0byB0aGUgcGxhY2UgaW4gdGhlIGxpc3QKKwkgICAgIGFmdGVyIHRoZSBsYXN0IG1vZHVsZSBhbHJlYWR5IHJlcG9ydGVkLiAgKi8KKworCSAgKnByZXZwID0gbS0+bmV4dDsKKwkgIG0tPm5leHQgPSAqdGFpbHA7CisJICBtLT5nYyA9IGZhbHNlOworCSAgKnRhaWxwID0gbTsKKwkgIHJldHVybiBtOworCX0KKworICAgICAgaWYgKCEgbS0+Z2MpCisJdGFpbHAgPSAmbS0+bmV4dDsKKyAgICB9CisKKyAgRHdmbF9Nb2R1bGUgKm1vZCA9IGNhbGxvYyAoMSwgc2l6ZW9mICptb2QpOworICBpZiAobW9kID09IE5VTEwpCisgICAgZ290byBub21lbTsKKworICBtb2QtPm5hbWUgPSBzdHJkdXAgKG5hbWUpOworICBpZiAobW9kLT5uYW1lID09IE5VTEwpCisgICAgeworICAgICAgZnJlZSAobW9kKTsKKyAgICBub21lbToKKyAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBtb2QtPmxvd19hZGRyID0gc3RhcnQ7CisgIG1vZC0+aGlnaF9hZGRyID0gZW5kOworICBtb2QtPmR3ZmwgPSBkd2ZsOworCisgIG1vZC0+bmV4dCA9ICp0YWlscDsKKyAgKnRhaWxwID0gbW9kOworICArK2R3ZmwtPm5tb2R1bGVzOworCisgIHJldHVybiBtb2Q7Cit9CitJTlRERUYgKGR3ZmxfcmVwb3J0X21vZHVsZSkKKworc3RhdGljIGludAorY29tcGFyZV9tb2R1bGVzIChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICBEd2ZsX01vZHVsZSAqY29uc3QgKnAxID0gYSwgKmNvbnN0ICpwMiA9IGI7CisgIGNvbnN0IER3ZmxfTW9kdWxlICptMSA9ICpwMSwgKm0yID0gKnAyOworICBpZiAobTEgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChtMiA9PSBOVUxMKQorICAgIHJldHVybiAxOworICByZXR1cm4gKEdFbGZfU3h3b3JkKSAobTEtPmxvd19hZGRyIC0gbTItPmxvd19hZGRyKTsKK30KKworCisvKiBGaW5pc2ggcmVwb3J0aW5nIHRoZSBjdXJyZW50IHNldCBvZiBtb2R1bGVzIHRvIHRoZSBsaWJyYXJ5LgorICAgSWYgUkVNT1ZFRCBpcyBub3QgbnVsbCwgaXQncyBjYWxsZWQgZm9yIGVhY2ggbW9kdWxlIHRoYXQKKyAgIGV4aXN0ZWQgYmVmb3JlIGJ1dCB3YXMgbm90IGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHJlcG9ydC4KKyAgIFJldHVybnMgYSBub256ZXJvIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBjYWxsYmFjay4KKyAgIERXRkwgY2Fubm90IGJlIHVzZWQgdW50aWwgdGhpcyBmdW5jdGlvbiBoYXMgcmV0dXJuZWQgemVyby4gICovCitpbnQgZHdmbF9yZXBvcnRfZW5kIChEd2ZsICpkd2ZsLAorCQkgICAgIGludCAoKnJlbW92ZWQpIChEd2ZsX01vZHVsZSAqLCB2b2lkICosCisJCQkJICAgICBjb25zdCBjaGFyICosIER3YXJmX0FkZHIsCisJCQkJICAgICB2b2lkICphcmcpLAorCQkgICAgIHZvaWQgKmFyZykKK3sKKyAgYXNzZXJ0IChkd2ZsLT5tb2R1bGVzID09IE5VTEwpOworCisgIER3ZmxfTW9kdWxlICoqdGFpbHAgPSAmZHdmbC0+bW9kdWxlbGlzdDsKKyAgd2hpbGUgKCp0YWlscCAhPSBOVUxMKQorICAgIHsKKyAgICAgIER3ZmxfTW9kdWxlICptID0gKnRhaWxwOworICAgICAgaWYgKG0tPmdjICYmIHJlbW92ZWQgIT0gTlVMTCkKKwl7CisJICBpbnQgcmVzdWx0ID0gKCpyZW1vdmVkKSAoTU9EQ0JfQVJHUyAobSksIGFyZyk7CisJICBpZiAocmVzdWx0ICE9IDApCisJICAgIHJldHVybiByZXN1bHQ7CisJfQorICAgICAgaWYgKG0tPmdjKQorCXsKKwkgICp0YWlscCA9IG0tPm5leHQ7CisJICBfX2xpYmR3ZmxfbW9kdWxlX2ZyZWUgKG0pOworCX0KKyAgICAgIGVsc2UKKwl0YWlscCA9ICZtLT5uZXh0OworICAgIH0KKworICBkd2ZsLT5tb2R1bGVzID0gbWFsbG9jIChkd2ZsLT5ubW9kdWxlcyAqIHNpemVvZiBkd2ZsLT5tb2R1bGVzWzBdKTsKKyAgaWYgKGR3ZmwtPm1vZHVsZXMgPT0gTlVMTCAmJiBkd2ZsLT5ubW9kdWxlcyAhPSAwKQorICAgIHJldHVybiAtMTsKKworICBzaXplX3QgaSA9IDA7CisgIGZvciAoRHdmbF9Nb2R1bGUgKm0gPSBkd2ZsLT5tb2R1bGVsaXN0OyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQorICAgIHsKKyAgICAgIGFzc2VydCAoISBtLT5nYyk7CisgICAgICBkd2ZsLT5tb2R1bGVzW2krK10gPSBtOworICAgIH0KKyAgYXNzZXJ0IChpID09IGR3ZmwtPm5tb2R1bGVzKTsKKworICBxc29ydCAoZHdmbC0+bW9kdWxlcywgZHdmbC0+bm1vZHVsZXMsIHNpemVvZiBkd2ZsLT5tb2R1bGVzWzBdLAorCSAmY29tcGFyZV9tb2R1bGVzKTsKKworICByZXR1cm4gMDsKK30KK0lOVERFRiAoZHdmbF9yZXBvcnRfZW5kKQpkaWZmIC0tZ2l0IGEvbGliZHdmbC9kd2ZsX21vZHVsZV9hZGRyZGllLmMgYi9saWJkd2ZsL2R3ZmxfbW9kdWxlX2FkZHJkaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWUyZGZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX21vZHVsZV9hZGRyZGllLmMKQEAgLTAsMCArMSwzMCBAQAorLyogRmV0Y2ggdGhlIENVIERJRSBmb3IgYSBQQyBhZGRyZXNzIGluIGEgZ2l2ZW4gbW9kdWxlLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlICJsaWJkd2ZsUC5oIgorCitEd2FyZl9EaWUgKgorZHdmbF9tb2R1bGVfYWRkcmRpZSAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9BZGRyICpiaWFzKQoreworICBpZiAoSU5UVVNFKGR3ZmxfbW9kdWxlX2dldGR3YXJmKSAobW9kLCBiaWFzKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0cnVjdCBkd2ZsX2N1ICpjdTsKKyAgRHdmbF9FcnJvciBlcnJvciA9IF9fbGliZHdmbF9hZGRyY3UgKG1vZCwgYWRkciwgJmN1KTsKKyAgaWYgKGxpa2VseSAoZXJyb3IgPT0gRFdGTF9FX05PRVJST1IpKQorICAgIHJldHVybiAmY3UtPmRpZTsKKworICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKKyAgcmV0dXJuIE5VTEw7Cit9CitJTlRERUYgKGR3ZmxfbW9kdWxlX2FkZHJkaWUpCmRpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldGR3YXJmLmMgYi9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldGR3YXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjZjhmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYwpAQCAtMCwwICsxLDQ4MCBAQAorLyogRmluZCBkZWJ1Z2dpbmcgYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgYSBtb2R1bGUgaW4gbGliZHdmbC4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIi4uL2xpYmR3L2xpYmR3UC5oIgkvKiBEV0FSRl9FXyogdmFsdWVzIGFyZSBoZXJlLiAgKi8KKworCisvKiBPcGVuIGxpYmVsZiBGSUxFLT5mZCBhbmQgY29tcHV0ZSB0aGUgbG9hZCBiYXNlIG9mIEVMRiBhcyBsb2FkZWQgaW4gTU9ELgorICAgV2hlbiB3ZSByZXR1cm4gc3VjY2VzcywgRklMRS0+ZWxmIGFuZCBGSUxFLT5iaWFzIGFyZSBzZXQgdXAuICAqLworc3RhdGljIGlubGluZSBEd2ZsX0Vycm9yCitvcGVuX2VsZiAoRHdmbF9Nb2R1bGUgKm1vZCwgc3RydWN0IGR3ZmxfZmlsZSAqZmlsZSkKK3sKKyAgaWYgKGZpbGUtPmVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChmaWxlLT5mZCA8IDApCisJcmV0dXJuIENCRkFJTDsKKworICAgICAgZmlsZS0+ZWxmID0gZWxmX2JlZ2luIChmaWxlLT5mZCwgRUxGX0NfUkVBRF9NTUFQX1BSSVZBVEUsIE5VTEwpOworICAgIH0KKworICBHRWxmX0VoZHIgZWhkcl9tZW0sICplaGRyID0gZ2VsZl9nZXRlaGRyIChmaWxlLT5lbGYsICZlaGRyX21lbSk7CisgIGlmIChlaGRyID09IE5VTEwpCisgICAgcmV0dXJuIERXRkxfRSAoTElCRUxGLCBlbGZfZXJybm8gKCkpOworCisgIG1vZC0+aXNyZWwgPSBlaGRyLT5lX3R5cGUgPT0gRVRfUkVMOworCisgIGZpbGUtPmJpYXMgPSAwOworICBmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBlaGRyLT5lX3BobnVtOyArK2kpCisgICAgeworICAgICAgR0VsZl9QaGRyIHBoX21lbTsKKyAgICAgIEdFbGZfUGhkciAqcGggPSBnZWxmX2dldHBoZHIgKGZpbGUtPmVsZiwgaSwgJnBoX21lbSk7CisgICAgICBpZiAocGggPT0gTlVMTCkKKwlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKKyAgICAgIGlmIChwaC0+cF90eXBlID09IFBUX0xPQUQpCisJeworCSAgZmlsZS0+YmlhcyA9ICgobW9kLT5sb3dfYWRkciAmIC1waC0+cF9hbGlnbikKKwkJCS0gKHBoLT5wX3ZhZGRyICYgLXBoLT5wX2FsaWduKSk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKK30KKworLyogRmluZCB0aGUgbWFpbiBFTEYgZmlsZSBmb3IgdGhpcyBtb2R1bGUgYW5kIG9wZW4gbGliZWxmIG9uIGl0LgorICAgV2hlbiB3ZSByZXR1cm4gc3VjY2VzcywgTU9ELT5tYWluLmVsZiBhbmQgTU9ELT5tYWluLmJpYXMgYXJlIHNldCB1cC4gICovCitzdGF0aWMgdm9pZAorZmluZF9maWxlIChEd2ZsX01vZHVsZSAqbW9kKQoreworICBpZiAobW9kLT5tYWluLmVsZiAhPSBOVUxMCS8qIEFscmVhZHkgZG9uZS4gICovCisgICAgICB8fCBtb2QtPmVsZmVyciAhPSBEV0ZMX0VfTk9FUlJPUikJLyogQ2FjaGVkIGZhaWx1cmUuICAqLworICAgIHJldHVybjsKKworICBtb2QtPm1haW4uZmQgPSAoKm1vZC0+ZHdmbC0+Y2FsbGJhY2tzLT5maW5kX2VsZikgKE1PRENCX0FSR1MgKG1vZCksCisJCQkJCQkgICAgJm1vZC0+bWFpbi5uYW1lLAorCQkJCQkJICAgICZtb2QtPm1haW4uZWxmKTsKKyAgbW9kLT5lbGZlcnIgPSBvcGVuX2VsZiAobW9kLCAmbW9kLT5tYWluKTsKK30KKworLyogRmluZCB0aGUgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUgZm9yIHRoaXMgbW9kdWxlIGFuZCBvcGVuIGxpYmVsZiBvbiBpdC4KKyAgIFdoZW4gd2UgcmV0dXJuIHN1Y2Nlc3MsIE1PRC0+ZGVidWcgaXMgc2V0IHVwLiAgKi8KK3N0YXRpYyBEd2ZsX0Vycm9yCitmaW5kX2RlYnVnaW5mbyAoRHdmbF9Nb2R1bGUgKm1vZCkKK3sKKyAgc2l6ZV90IHNoc3RybmR4OworICBpZiAoZWxmX2dldHNoc3RybmR4IChtb2QtPm1haW4uZWxmLCAmc2hzdHJuZHgpIDwgMCkKKyAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKKworICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChtb2QtPm1haW4uZWxmLCAwKTsKKyAgaWYgKHNjbiA9PSBOVUxMKQorICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOworICBkbworICAgIHsKKyAgICAgIEdFbGZfU2hkciBzaGRyX21lbSwgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKyAgICAgIGlmIChzaGRyID09IE5VTEwpCisJcmV0dXJuIERXRkxfRV9MSUJFTEY7CisKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBlbGZfc3RycHRyIChtb2QtPm1haW4uZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKQorCXJldHVybiBEV0ZMX0VfTElCRUxGOworCisgICAgICBpZiAoIXN0cmNtcCAobmFtZSwgIi5nbnVfZGVidWdsaW5rIikpCisJYnJlYWs7CisKKyAgICAgIHNjbiA9IGVsZl9uZXh0c2NuIChtb2QtPm1haW4uZWxmLCBzY24pOworICAgIH0gd2hpbGUgKHNjbiAhPSBOVUxMKTsKKworICBjb25zdCBjaGFyICpkZWJ1Z2xpbmtfZmlsZSA9IE5VTEw7CisgIEdFbGZfV29yZCBkZWJ1Z2xpbmtfY3JjID0gMDsKKyAgaWYgKHNjbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEZvdW5kIHRoZSAuZ251X2RlYnVnbGluayBzZWN0aW9uLiAgRXh0cmFjdCBpdHMgY29udGVudHMuICAqLworICAgICAgRWxmX0RhdGEgKnJhd2RhdGEgPSBlbGZfcmF3ZGF0YSAoc2NuLCBOVUxMKTsKKyAgICAgIGlmIChyYXdkYXRhID09IE5VTEwpCisJcmV0dXJuIERXRkxfRV9MSUJFTEY7CisKKyAgICAgIEVsZl9EYXRhIGNyY2RhdGEgPQorCXsKKwkgIC5kX3R5cGUgPSBFTEZfVF9XT1JELAorCSAgLmRfYnVmID0gJmRlYnVnbGlua19jcmMsCisJICAuZF9zaXplID0gc2l6ZW9mIGRlYnVnbGlua19jcmMsCisJICAuZF92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKKwl9OworICAgICAgRWxmX0RhdGEgY29udiA9CisJeworCSAgLmRfdHlwZSA9IEVMRl9UX1dPUkQsCisJICAuZF9idWYgPSByYXdkYXRhLT5kX2J1ZiArIHJhd2RhdGEtPmRfc2l6ZSAtIHNpemVvZiBkZWJ1Z2xpbmtfY3JjLAorCSAgLmRfc2l6ZSA9IHNpemVvZiBkZWJ1Z2xpbmtfY3JjLAorCSAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCisJfTsKKworICAgICAgR0VsZl9FaGRyIGVoZHJfbWVtOworICAgICAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChtb2QtPm1haW4uZWxmLCAmZWhkcl9tZW0pOworICAgICAgaWYgKGVoZHIgPT0gTlVMTCkKKwlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKKworICAgICAgRWxmX0RhdGEgKmQgPSBnZWxmX3hsYXRldG9tIChtb2QtPm1haW4uZWxmLCAmY3JjZGF0YSwgJmNvbnYsCisJCQkJICAgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSk7CisgICAgICBpZiAoZCA9PSBOVUxMKQorCXJldHVybiBEV0ZMX0VfTElCRUxGOworICAgICAgYXNzZXJ0IChkID09ICZjcmNkYXRhKTsKKworICAgICAgZGVidWdsaW5rX2ZpbGUgPSByYXdkYXRhLT5kX2J1ZjsKKyAgICB9CisKKyAgbW9kLT5kZWJ1Zy5mZCA9ICgqbW9kLT5kd2ZsLT5jYWxsYmFja3MtPmZpbmRfZGVidWdpbmZvKSAoTU9EQ0JfQVJHUyAobW9kKSwKKwkJCQkJCQkgICBtb2QtPm1haW4ubmFtZSwKKwkJCQkJCQkgICBkZWJ1Z2xpbmtfZmlsZSwKKwkJCQkJCQkgICBkZWJ1Z2xpbmtfY3JjLAorCQkJCQkJCSAgICZtb2QtPmRlYnVnLm5hbWUpOworICByZXR1cm4gb3Blbl9lbGYgKG1vZCwgJm1vZC0+ZGVidWcpOworfQorCisKKy8qIFRyeSB0byBmaW5kIGEgc3ltYm9sIHRhYmxlIGluIEZJTEUuICAqLworc3RhdGljIER3ZmxfRXJyb3IKK2xvYWRfc3ltdGFiIChzdHJ1Y3QgZHdmbF9maWxlICpmaWxlLCBzdHJ1Y3QgZHdmbF9maWxlICoqc3ltZmlsZSwKKwkgICAgIEVsZl9TY24gKipzeW1zY24sIEVsZl9TY24gKip4bmR4c2NuLAorCSAgICAgc2l6ZV90ICpzeW1lbnRzLCBHRWxmX1dvcmQgKnN0cnNobmR4KQoreworICBFbGZfU2NuICpzY24gPSBOVUxMOworICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChmaWxlLT5lbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtLCAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworICAgICAgaWYgKHNoZHIgIT0gTlVMTCkKKwlzd2l0Y2ggKHNoZHItPnNoX3R5cGUpCisJICB7CisJICBjYXNlIFNIVF9TWU1UQUI6CisJICAgICpzeW1zY24gPSBzY247CisJICAgICpzeW1maWxlID0gZmlsZTsKKwkgICAgKnN0cnNobmR4ID0gc2hkci0+c2hfbGluazsKKwkgICAgKnN5bWVudHMgPSBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKKwkgICAgaWYgKCpzeW1zY24gIT0gTlVMTCAmJiAqeG5keHNjbiAhPSBOVUxMKQorCSAgICAgIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU0hUX0RZTlNZTToKKwkgICAgLyogVXNlIHRoaXMgaWYgbmVlZCBiZSwgYnV0IGtlZXAgbG9va2luZyBmb3IgU0hUX1NZTVRBQi4gICovCisJICAgICpzeW1zY24gPSBzY247CisJICAgICpzeW1maWxlID0gZmlsZTsKKwkgICAgKnN0cnNobmR4ID0gc2hkci0+c2hfbGluazsKKwkgICAgKnN5bWVudHMgPSBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU0hUX1NZTVRBQl9TSE5EWDoKKwkgICAgKnhuZHhzY24gPSBzY247CisJICAgIGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICBicmVhazsKKwkgIH0KKyAgICB9CisgIHJldHVybiBEV0ZMX0VfTk9fU1lNVEFCOworfQorCisvKiBUcnkgdG8gZmluZCBhIHN5bWJvbCB0YWJsZSBpbiBlaXRoZXIgTU9ELT5tYWluLmVsZiBvciBNT0QtPmRlYnVnLmVsZi4gICovCitzdGF0aWMgdm9pZAorZmluZF9zeW10YWIgKER3ZmxfTW9kdWxlICptb2QpCit7CisgIGlmIChtb2QtPnN5bWRhdGEgIT0gTlVMTAkvKiBBbHJlYWR5IGRvbmUuICAqLworICAgICAgfHwgbW9kLT5zeW1lcnIgIT0gRFdGTF9FX05PRVJST1IpIC8qIENhY2hlZCBwcmV2aW91cyBmYWlsdXJlLiAgKi8KKyAgICByZXR1cm47CisKKyAgZmluZF9maWxlIChtb2QpOworICBtb2QtPnN5bWVyciA9IG1vZC0+ZWxmZXJyOworICBpZiAobW9kLT5zeW1lcnIgIT0gRFdGTF9FX05PRVJST1IpCisgICAgcmV0dXJuOworCisgIC8qIEZpcnN0IHNlZSBpZiB0aGUgbWFpbiBFTEYgZmlsZSBoYXMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisgIEVsZl9TY24gKnN5bXNjbiA9IE5VTEwsICp4bmR4c2NuID0gTlVMTDsKKyAgR0VsZl9Xb3JkIHN0cnNobmR4OworICBtb2QtPnN5bWVyciA9IGxvYWRfc3ltdGFiICgmbW9kLT5tYWluLCAmbW9kLT5zeW1maWxlLCAmc3ltc2NuLAorCQkJICAgICAmeG5keHNjbiwgJm1vZC0+c3ltZW50cywgJnN0cnNobmR4KTsKKyAgc3dpdGNoIChtb2QtPnN5bWVycikKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgRFdGTF9FX05PRVJST1I6CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdGTF9FX05PX1NZTVRBQjoKKyAgICAgIC8qIE5vdyB3ZSBoYXZlIHRvIGxvb2sgZm9yIGEgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUuICAqLworICAgICAgbW9kLT5zeW1lcnIgPSBmaW5kX2RlYnVnaW5mbyAobW9kKTsKKyAgICAgIHN3aXRjaCAobW9kLT5zeW1lcnIpCisJeworCWRlZmF1bHQ6CisJICByZXR1cm47CisKKwljYXNlIERXRkxfRV9OT0VSUk9SOgorCSAgbW9kLT5zeW1lcnIgPSBsb2FkX3N5bXRhYiAoJm1vZC0+ZGVidWcsICZtb2QtPnN5bWZpbGUsICZzeW1zY24sCisJCQkJICAgICAmeG5keHNjbiwgJm1vZC0+c3ltZW50cywgJnN0cnNobmR4KTsKKwkgIGJyZWFrOworCisJY2FzZSBEV0ZMX0VfQ0I6CQkvKiBUaGUgZmluZF9kZWJ1Z2luZm8gaG9vayBmYWlsZWQuICAqLworCSAgbW9kLT5zeW1lcnIgPSBEV0ZMX0VfTk9fU1lNVEFCOworCSAgYnJlYWs7CisJfQorCisgICAgICBzd2l0Y2ggKG1vZC0+c3ltZXJyKQorCXsKKwlkZWZhdWx0OgorCSAgcmV0dXJuOworCisJY2FzZSBEV0ZMX0VfTk9FUlJPUjoKKwkgIGJyZWFrOworCisJY2FzZSBEV0ZMX0VfTk9fU1lNVEFCOgorCSAgaWYgKHN5bXNjbiA9PSBOVUxMKQorCSAgICByZXR1cm47CisJICAvKiBXZSBzdGlsbCBoYXZlIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCisJICBtb2QtPnN5bWVyciA9IERXRkxfRV9OT0VSUk9SOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIFRoaXMgZG9lcyBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAgKi8KKyAgaWYgKGVsZl9zdHJwdHIgKG1vZC0+c3ltZmlsZS0+ZWxmLCBzdHJzaG5keCwgMCkgPT0gTlVMTCkKKyAgICB7CisgICAgZWxmZXJyOgorICAgICAgbW9kLT5zeW1lcnIgPSBEV0ZMX0UgKExJQkVMRiwgZWxmX2Vycm5vICgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogQ2FjaGUgdGhlIGRhdGE7IE1PRC0+c3ltZW50cyB3YXMgc2V0IGFib3ZlLiAgKi8KKworICBtb2QtPnN5bXN0cmRhdGEgPSBlbGZfcmF3ZGF0YSAoZWxmX2dldHNjbiAobW9kLT5zeW1maWxlLT5lbGYsIHN0cnNobmR4KSwKKwkJCQkgTlVMTCk7CisgIGlmIChtb2QtPnN5bXN0cmRhdGEgPT0gTlVMTCkKKyAgICBnb3RvIGVsZmVycjsKKworICBpZiAoeG5keHNjbiA9PSBOVUxMKQorICAgIG1vZC0+c3lteG5keGRhdGEgPSBOVUxMOworICBlbHNlCisgICAgeworICAgICAgbW9kLT5zeW14bmR4ZGF0YSA9IGVsZl9yYXdkYXRhICh4bmR4c2NuLCBOVUxMKTsKKyAgICAgIGlmIChtb2QtPnN5bXhuZHhkYXRhID09IE5VTEwpCisJZ290byBlbGZlcnI7CisgICAgfQorCisgIG1vZC0+c3ltZGF0YSA9IGVsZl9yYXdkYXRhIChzeW1zY24sIE5VTEwpOworICBpZiAobW9kLT5zeW1kYXRhID09IE5VTEwpCisgICAgZ290byBlbGZlcnI7Cit9CisKKworLyogVHJ5IHRvIHN0YXJ0IHVwIGxpYmR3IG9uIERFQlVHRklMRS4gICovCitzdGF0aWMgRHdmbF9FcnJvcgorbG9hZF9kdyAoRHdmbF9Nb2R1bGUgKm1vZCwgRWxmICpkZWJ1Z2ZpbGUpCit7CisgIGlmIChtb2QtPmlzcmVsKQorICAgIHsKKyAgICAgIGNvbnN0IER3ZmxfQ2FsbGJhY2tzICpjb25zdCBjYiA9IG1vZC0+ZHdmbC0+Y2FsbGJhY2tzOworCisgICAgICAvKiBUaGUgZGVidWdnaW5nIHNlY3Rpb25zIGhhdmUgdG8gYmUgcmVsb2NhdGVkLiAgKi8KKyAgICAgIGlmIChjYi0+c2VjdGlvbl9hZGRyZXNzID09IE5VTEwpCisJcmV0dXJuIERXRkxfRV9OT1JFTDsKKworICAgICAgaWYgKG1vZC0+ZWJsID09IE5VTEwpCisJeworCSAgbW9kLT5lYmwgPSBlYmxfb3BlbmJhY2tlbmQgKG1vZC0+bWFpbi5lbGYpOworCSAgaWYgKG1vZC0+ZWJsID09IE5VTEwpCisJICAgIHJldHVybiBEV0ZMX0VfTElCRUJMOworCX0KKworICAgICAgZmluZF9zeW10YWIgKG1vZCk7CisgICAgICBEd2ZsX0Vycm9yIHJlc3VsdCA9IG1vZC0+c3ltZXJyOworICAgICAgaWYgKHJlc3VsdCA9PSBEV0ZMX0VfTk9FUlJPUikKKwlyZXN1bHQgPSBfX2xpYmR3ZmxfcmVsb2NhdGUgKG1vZCk7CisgICAgICBpZiAocmVzdWx0ICE9IERXRkxfRV9OT0VSUk9SKQorCXJldHVybiByZXN1bHQ7CisgICAgfQorCisgIG1vZC0+ZHcgPSBkd2FyZl9iZWdpbl9lbGYgKGRlYnVnZmlsZSwgRFdBUkZfQ19SRUFELCBOVUxMKTsKKyAgaWYgKG1vZC0+ZHcgPT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgZXJyID0gZHdhcmZfZXJybm8gKCk7CisgICAgICByZXR1cm4gZXJyID09IERXQVJGX0VfTk9fRFdBUkYgPyBEV0ZMX0VfTk9fRFdBUkYgOiBEV0ZMX0UgKExJQkRXLCBlcnIpOworICAgIH0KKworICAvKiBVbnRpbCB3ZSBoYXZlIGl0ZXJhdGVkIHRocm91Z2ggYWxsIENVJ3MsIHdlIG1pZ2h0IGRvIGxhenkgbG9va3Vwcy4gICovCisgIG1vZC0+bGF6eWN1ID0gMTsKKworICByZXR1cm4gRFdGTF9FX05PRVJST1I7Cit9CisKKy8qIFRyeSB0byBzdGFydCB1cCBsaWJkdyBvbiBlaXRoZXIgdGhlIG1haW4gZmlsZSBvciB0aGUgZGVidWdpbmZvIGZpbGUuICAqLworc3RhdGljIHZvaWQKK2ZpbmRfZHcgKER3ZmxfTW9kdWxlICptb2QpCit7CisgIGlmIChtb2QtPmR3ICE9IE5VTEwJCS8qIEFscmVhZHkgZG9uZS4gICovCisgICAgICB8fCBtb2QtPmR3ZXJyICE9IERXRkxfRV9OT0VSUk9SKSAvKiBDYWNoZWQgcHJldmlvdXMgZmFpbHVyZS4gICovCisgICAgcmV0dXJuOworCisgIGZpbmRfZmlsZSAobW9kKTsKKyAgbW9kLT5kd2VyciA9IG1vZC0+ZWxmZXJyOworICBpZiAobW9kLT5kd2VyciAhPSBEV0ZMX0VfTk9FUlJPUikKKyAgICByZXR1cm47CisKKyAgLyogRmlyc3Qgc2VlIGlmIHRoZSBtYWluIEVMRiBmaWxlIGhhcyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgbW9kLT5kd2VyciA9IGxvYWRfZHcgKG1vZCwgbW9kLT5tYWluLmVsZik7CisgIHN3aXRjaCAobW9kLT5kd2VycikKKyAgICB7CisgICAgY2FzZSBEV0ZMX0VfTk9FUlJPUjoKKyAgICAgIG1vZC0+ZGVidWcuZWxmID0gbW9kLT5tYWluLmVsZjsKKyAgICAgIG1vZC0+ZGVidWcuYmlhcyA9IG1vZC0+bWFpbi5iaWFzOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBEV0ZMX0VfTk9fRFdBUkY6CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGNhbm9uaWNhbGl6ZTsKKyAgICB9CisKKyAgLyogTm93IHdlIGhhdmUgdG8gbG9vayBmb3IgYSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZS4gICovCisgIG1vZC0+ZHdlcnIgPSBmaW5kX2RlYnVnaW5mbyAobW9kKTsKKyAgc3dpdGNoIChtb2QtPmR3ZXJyKQorICAgIHsKKyAgICBjYXNlIERXRkxfRV9OT0VSUk9SOgorICAgICAgbW9kLT5kd2VyciA9IGxvYWRfZHcgKG1vZCwgbW9kLT5kZWJ1Zy5lbGYpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXRkxfRV9DQjoJCS8qIFRoZSBmaW5kX2RlYnVnaW5mbyBob29rIGZhaWxlZC4gICovCisgICAgICBtb2QtPmR3ZXJyID0gRFdGTF9FX05PX0RXQVJGOworICAgICAgcmV0dXJuOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworIGNhbm9uaWNhbGl6ZToKKyAgbW9kLT5kd2VyciA9IF9fbGliZHdmbF9jYW5vbl9lcnJvciAobW9kLT5kd2Vycik7Cit9CisKKworRWxmICoKK2R3ZmxfbW9kdWxlX2dldGVsZiAoRHdmbF9Nb2R1bGUgKm1vZCwgR0VsZl9BZGRyICpsb2FkYmFzZSkKK3sKKyAgaWYgKG1vZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGZpbmRfZmlsZSAobW9kKTsKKyAgaWYgKG1vZC0+ZWxmZXJyID09IERXRkxfRV9OT0VSUk9SKQorICAgIHsKKyAgICAgICpsb2FkYmFzZSA9IG1vZC0+bWFpbi5iaWFzOworICAgICAgcmV0dXJuIG1vZC0+bWFpbi5lbGY7CisgICAgfQorCisgIF9fbGliZHdmbF9zZXRlcnJubyAobW9kLT5lbGZlcnIpOworICByZXR1cm4gTlVMTDsKK30KK0lOVERFRiAoZHdmbF9tb2R1bGVfZ2V0ZWxmKQorCisKK0R3YXJmICoKK2R3ZmxfbW9kdWxlX2dldGR3YXJmIChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9BZGRyICpiaWFzKQoreworICBpZiAobW9kID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZmluZF9kdyAobW9kKTsKKyAgaWYgKG1vZC0+ZHdlcnIgPT0gRFdGTF9FX05PRVJST1IpCisgICAgeworICAgICAgKmJpYXMgPSBtb2QtPmRlYnVnLmJpYXM7CisgICAgICByZXR1cm4gbW9kLT5kdzsKKyAgICB9CisKKyAgX19saWJkd2ZsX3NldGVycm5vIChtb2QtPmR3ZXJyKTsKKyAgcmV0dXJuIE5VTEw7Cit9CitJTlRERUYgKGR3ZmxfbW9kdWxlX2dldGR3YXJmKQorCisKK2NvbnN0IGNoYXIgKgorZHdmbF9tb2R1bGVfYWRkcm5hbWUgKER3ZmxfTW9kdWxlICptb2QsIEdFbGZfQWRkciBhZGRyKQoreworICBpZiAobW9kID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZmluZF9zeW10YWIgKG1vZCk7CisgIGlmIChtb2QtPnN5bWVyciAhPSBEV0ZMX0VfTk9FUlJPUikKKyAgICB7CisgICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKG1vZC0+c3ltZXJyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBhZGRyIC09IG1vZC0+c3ltZmlsZS0+YmlhczsKKworICAvKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBmb3IgYSBtYXRjaGluZyBzeW1ib2wuICAqLworICBzaXplX3Qgc3ltc2hzdHJuZHggPSBTSE5fVU5ERUY7CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbW9kLT5zeW1lbnRzOyArK2kpCisgICAgeworICAgICAgR0VsZl9TeW0gc3ltX21lbTsKKyAgICAgIEdFbGZfV29yZCBzaG5keDsKKyAgICAgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bXNobmR4IChtb2QtPnN5bWRhdGEsIG1vZC0+c3lteG5keGRhdGEsCisJCQkJCWksICZzeW1fbWVtLCAmc2huZHgpOworICAgICAgaWYgKHN5bSAhPSBOVUxMKQorCXsKKwkgIEdFbGZfQWRkciBzeW1hZGRyID0gc3ltLT5zdF92YWx1ZTsKKworCSAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1hJTkRFWCkKKwkgICAgc2huZHggPSBzeW0tPnN0X3NobmR4OworCisJICBpZiAobW9kLT5pc3JlbCkKKwkgICAgLyogSW4gYW4gRVRfUkVMIGZpbGUsIHRoZSBzeW1ib2wgdGFibGUgdmFsdWVzIGFyZSByZWxhdGl2ZQorCSAgICAgICB0byB0aGUgc2VjdGlvbiwgbm90IHRvIHRoZSBtb2R1bGUncyBsb2FkIGJhc2UuICAqLworCSAgICBzd2l0Y2ggKHNobmR4KQorCSAgICAgIHsKKwkgICAgICBjYXNlIFNITl9VTkRFRjoJLyogVW5kZWZpbmVkIHN5bWJvbCBjYW4ndCBtYXRjaCBhbiBhZGRyZXNzLiAgKi8KKwkgICAgICBjYXNlIFNITl9DT01NT046CS8qIE5vciBjYW4gYSBjb21tb24gZGVmbi4gICovCisJCWNvbnRpbnVlOworCisJICAgICAgY2FzZSBTSE5fQUJTOgkvKiBTeW1ib2wgdmFsdWUgaXMgYWxyZWFkeSBhYnNvbHV0ZS4gICovCisJCWJyZWFrOworCisJICAgICAgZGVmYXVsdDoKKwkJeworCQkgIER3ZmxfRXJyb3IgcmVzdWx0ID0gRFdGTF9FX0xJQkVMRjsKKwkJICBpZiAobGlrZWx5IChzeW1zaHN0cm5keCAhPSBTSE5fVU5ERUYpCisJCSAgICAgIHx8IGVsZl9nZXRzaHN0cm5keCAobW9kLT5zeW1maWxlLT5lbGYsCisJCQkJCSAgJnN5bXNoc3RybmR4KSA9PSAwKQorCQkgICAgcmVzdWx0ID0gX19saWJkd2ZsX3JlbG9jYXRlX3ZhbHVlIChtb2QsIHN5bXNoc3RybmR4LAorCQkJCQkJICAgICAgIHNobmR4LCAmc3ltYWRkcik7CisJCSAgaWYgKHVubGlrZWx5IChyZXN1bHQgIT0gRFdGTF9FX05PRVJST1IpKQorCQkgICAgeworCQkgICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKHJlc3VsdCk7CisJCSAgICAgIHJldHVybiBOVUxMOworCQkgICAgfQorCQkgIGJyZWFrOworCQl9CisJICAgICAgfQorCisJICBpZiAoc3ltYWRkciA8PSBhZGRyICYmIGFkZHIgPCBzeW1hZGRyICsgc3ltLT5zdF9zaXplKQorCSAgICB7CisJICAgICAgaWYgKHVubGlrZWx5IChzeW0tPnN0X25hbWUgPj0gbW9kLT5zeW1zdHJkYXRhLT5kX3NpemUpKQorCQl7CisJCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfQkFEU1RST0ZGKTsKKwkJICByZXR1cm4gTlVMTDsKKwkJfQorCSAgICAgIHJldHVybiAoY29uc3QgY2hhciAqKSBtb2QtPnN5bXN0cmRhdGEtPmRfYnVmICsgc3ltLT5zdF9uYW1lOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0c3JjLmMgYi9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzQxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldHNyYy5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEZpbmQgc291cmNlIGxvY2F0aW9uIGZvciBQQyBhZGRyZXNzIGluIG1vZHVsZS4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKyNpbmNsdWRlICIuLi9saWJkdy9saWJkd1AuaCIKKworRHdmbF9MaW5lICoKK2R3ZmxfbW9kdWxlX2dldHNyYyAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciBhZGRyKQoreworICBEd2FyZl9BZGRyIGJpYXM7CisgIGlmIChJTlRVU0UoZHdmbF9tb2R1bGVfZ2V0ZHdhcmYpIChtb2QsICZiaWFzKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0cnVjdCBkd2ZsX2N1ICpjdTsKKyAgRHdmbF9FcnJvciBlcnJvciA9IF9fbGliZHdmbF9hZGRyY3UgKG1vZCwgYWRkciwgJmN1KTsKKyAgaWYgKGxpa2VseSAoZXJyb3IgPT0gRFdGTF9FX05PRVJST1IpKQorICAgIGVycm9yID0gX19saWJkd2ZsX2N1X2dldHNyY2xpbmVzIChjdSk7CisgIGlmIChsaWtlbHkgKGVycm9yID09IERXRkxfRV9OT0VSUk9SKSkKKyAgICB7CisgICAgICAvKiBUaGUgbGluZXMgYXJlIHNvcnRlZCBieSBhZGRyZXNzLCBzbyB3ZSBjYW4gdXNlIGJpbmFyeSBzZWFyY2guICAqLworICAgICAgc2l6ZV90IGwgPSAwLCB1ID0gY3UtPmRpZS5jdS0+bGluZXMtPm5saW5lczsKKyAgICAgIHdoaWxlIChsIDwgdSkKKwl7CisJICBzaXplX3QgaWR4ID0gKGwgKyB1KSAvIDI7CisJICBpZiAoYWRkciA8IGN1LT5kaWUuY3UtPmxpbmVzLT5pbmZvW2lkeF0uYWRkcikKKwkgICAgdSA9IGlkeDsKKwkgIGVsc2UgaWYgKGFkZHIgPiBjdS0+ZGllLmN1LT5saW5lcy0+aW5mb1tpZHhdLmFkZHIpCisJICAgIGwgPSBpZHggKyAxOworCSAgZWxzZQorCSAgICByZXR1cm4gJmN1LT5saW5lcy0+aWR4W2lkeF07CisJfQorCisgICAgICBpZiAoY3UtPmRpZS5jdS0+bGluZXMtPm5saW5lcyA+IDApCisJYXNzZXJ0IChjdS0+ZGllLmN1LT5saW5lcy0+aW5mbworCQlbY3UtPmRpZS5jdS0+bGluZXMtPm5saW5lcyAtIDFdLmVuZF9zZXF1ZW5jZSk7CisKKyAgICAgIC8qIElmIG5vbmUgd2VyZSBlcXVhbCwgdGhlIGNsb3Nlc3Qgb25lIGJlbG93IGlzIHdoYXQgd2Ugd2FudC4KKwkgV2UgbmV2ZXIgd2FudCB0aGUgbGFzdCBvbmUsIGJlY2F1c2UgaXQncyB0aGUgZW5kLXNlcXVlbmNlCisJIG1hcmtlciB3aXRoIGFuIGFkZHJlc3MgYXQgdGhlIGhpZ2ggYm91bmQgb2YgdGhlIENVJ3MgY29kZS4gICovCisgICAgICBpZiAodSA+IDAgJiYgdSA8IGN1LT5kaWUuY3UtPmxpbmVzLT5ubGluZXMKKwkgICYmIGFkZHIgPiBjdS0+ZGllLmN1LT5saW5lcy0+aW5mb1t1IC0gMV0uYWRkcikKKwlyZXR1cm4gJmN1LT5saW5lcy0+aWR4W3UgLSAxXTsKKworICAgICAgZXJyb3IgPSBEV0ZMX0VfQUREUl9PVVRPRlJBTkdFOworICAgIH0KKworICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKKyAgcmV0dXJuIE5VTEw7Cit9CitJTlRERUYgKGR3ZmxfbW9kdWxlX2dldHNyYykKZGlmZiAtLWdpdCBhL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUuYyBiL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWY1N2VkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX21vZHVsZV9nZXRzcmNfZmlsZS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKiBGaW5kIG1hdGNoaW5nIHNvdXJjZSBsb2NhdGlvbnMgaW4gYSBtb2R1bGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisjaW5jbHVkZSAiLi4vbGliZHcvbGliZHdQLmgiCisKKworaW50Citkd2ZsX21vZHVsZV9nZXRzcmNfZmlsZSAoRHdmbF9Nb2R1bGUgKm1vZCwKKwkJCSBjb25zdCBjaGFyICpmbmFtZSwgaW50IGxpbmVubywgaW50IGNvbHVtbiwKKwkJCSBEd2ZsX0xpbmUgKioqc3Jjc3AsIHNpemVfdCAqbnNyY3MpCit7CisgIGlmIChtb2QgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgYm9vbCBpc19iYXNlbmFtZSA9IHN0cmNociAoZm5hbWUsICcvJykgPT0gTlVMTDsKKworICBzaXplX3QgbWF4X21hdGNoID0gKm5zcmNzID86IH4wdTsKKyAgc2l6ZV90IGFjdF9tYXRjaCA9ICpuc3JjczsKKyAgc2l6ZV90IGN1cl9tYXRjaCA9IDA7CisgIER3ZmxfTGluZSAqKm1hdGNoID0gKm5zcmNzID09IDAgPyBOVUxMIDogKnNyY3NwOworCisgIHN0cnVjdCBkd2ZsX2N1ICpjdSA9IE5VTEw7CisgIER3ZmxfRXJyb3IgZXJyb3I7CisgIHdoaWxlICgoZXJyb3IgPSBfX2xpYmR3ZmxfbmV4dGN1IChtb2QsIGN1LCAmY3UpKSA9PSBEV0ZMX0VfTk9FUlJPUgorCSAmJiBjdSAhPSBOVUxMCisJICYmIChlcnJvciA9IF9fbGliZHdmbF9jdV9nZXRzcmNsaW5lcyAoY3UpKSA9PSBEV0ZMX0VfTk9FUlJPUikKKyAgICB7CisgICAgICBpbmxpbmUgY29uc3QgY2hhciAqZHdhcmZfbGluZV9maWxlIChjb25zdCBEd2FyZl9MaW5lICpsaW5lKQorCXsKKwkgIHJldHVybiBsaW5lLT5maWxlcy0+aW5mb1tsaW5lLT5maWxlXS5uYW1lOworCX0KKyAgICAgIGlubGluZSBEd2FyZl9MaW5lICpkd2ZsX2xpbmUgKGNvbnN0IER3ZmxfTGluZSAqbGluZSkKKwl7CisJICByZXR1cm4gJmR3ZmxfbGluZWN1IChsaW5lKS0+ZGllLmN1LT5saW5lcy0+aW5mb1tsaW5lLT5pZHhdOworCX0KKyAgICAgIGlubGluZSBjb25zdCBjaGFyICpkd2ZsX2xpbmVfZmlsZSAoY29uc3QgRHdmbF9MaW5lICpsaW5lKQorCXsKKwkgIHJldHVybiBkd2FyZl9saW5lX2ZpbGUgKGR3ZmxfbGluZSAobGluZSkpOworCX0KKworICAgICAgLyogU2VhcmNoIHRocm91Z2ggYWxsIHRoZSBsaW5lIG51bWJlciByZWNvcmRzIGZvciBhIG1hdGNoaW5nCisJIGZpbGUgYW5kIGxpbmUvY29sdW1uIG51bWJlci4gIElmIGFueSBvZiB0aGUgbnVtYmVycyBpcyB6ZXJvLAorCSBubyBtYXRjaCBpcyBwZXJmb3JtZWQuICAqLworICAgICAgY29uc3QgY2hhciAqbGFzdGZpbGUgPSBOVUxMOworICAgICAgYm9vbCBsYXN0bWF0Y2ggPSBmYWxzZTsKKyAgICAgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IGN1LT5kaWUuY3UtPmxpbmVzLT5ubGluZXM7ICsrY250KQorCXsKKwkgIER3YXJmX0xpbmUgKmxpbmUgPSAmY3UtPmRpZS5jdS0+bGluZXMtPmluZm9bY250XTsKKworCSAgaWYgKHVubGlrZWx5IChsaW5lLT5maWxlID49IGxpbmUtPmZpbGVzLT5uZmlsZXMpKQorCSAgICB7CisJICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0UgKExJQkRXLCBEV0FSRl9FX0lOVkFMSURfRFdBUkYpKTsKKwkgICAgICByZXR1cm4gLTE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2FyZl9saW5lX2ZpbGUgKGxpbmUpOworCSAgICAgIGlmIChmaWxlICE9IGxhc3RmaWxlKQorCQl7CisJCSAgLyogTWF0Y2ggdGhlIG5hbWUgd2l0aCB0aGUgbmFtZSB0aGUgdXNlciBwcm92aWRlZC4gICovCisJCSAgbGFzdGZpbGUgPSBmaWxlOworCQkgIGxhc3RtYXRjaCA9ICFzdHJjbXAgKGlzX2Jhc2VuYW1lID8gYmFzZW5hbWUgKGZpbGUpIDogZmlsZSwKKwkJCQkgICAgICAgZm5hbWUpOworCQl9CisJICAgIH0KKwkgIGlmICghbGFzdG1hdGNoKQorCSAgICBjb250aW51ZTsKKworCSAgLyogU2VlIHdoZXRoZXIgbGluZSBhbmQgcG9zc2libHkgY29sdW1uIG1hdGNoLiAgKi8KKwkgIGlmIChsaW5lbm8gIT0gMAorCSAgICAgICYmIChsaW5lbm8gPiBsaW5lLT5saW5lCisJCSAgfHwgKGNvbHVtbiAhPSAwICYmIGNvbHVtbiA+IGxpbmUtPmNvbHVtbikpKQorCSAgICAvKiBDYW5ub3QgbWF0Y2guICAqLworCSAgICBjb250aW51ZTsKKworCSAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyB0aGUgYmVzdCBtYXRjaCBzbyBmYXIuICAqLworCSAgc2l6ZV90IGlubmVyOworCSAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgY3VyX21hdGNoOyArK2lubmVyKQorCSAgICBpZiAoZHdmbF9saW5lX2ZpbGUgKG1hdGNoW2lubmVyXSkgPT0gZHdhcmZfbGluZV9maWxlIChsaW5lKSkKKwkgICAgICBicmVhazsKKwkgIGlmIChpbm5lciA8IGN1cl9tYXRjaAorCSAgICAgICYmIChkd2ZsX2xpbmUgKG1hdGNoW2lubmVyXSktPmxpbmUgIT0gbGluZS0+bGluZQorCQkgIHx8IGR3ZmxfbGluZSAobWF0Y2hbaW5uZXJdKS0+bGluZSAhPSBsaW5lbm8KKwkJICB8fCAoY29sdW1uICE9IDAKKwkJICAgICAgJiYgKGR3ZmxfbGluZSAobWF0Y2hbaW5uZXJdKS0+Y29sdW1uICE9IGxpbmUtPmNvbHVtbgorCQkJICB8fCBkd2ZsX2xpbmUgKG1hdGNoW2lubmVyXSktPmNvbHVtbiAhPSBjb2x1bW4pKSkpCisJICAgIHsKKwkgICAgICAvKiBXZSBrbm93IGFib3V0IHRoaXMgZmlsZSBhbHJlYWR5LiAgSWYgdGhpcyBpcyBhIGJldHRlcgorCQkgbWF0Y2ggZm9yIHRoZSBsaW5lIG51bWJlciwgdXNlIGl0LiAgKi8KKwkgICAgICBpZiAoZHdmbF9saW5lIChtYXRjaFtpbm5lcl0pLT5saW5lID49IGxpbmUtPmxpbmUKKwkJICAmJiAoZHdmbF9saW5lIChtYXRjaFtpbm5lcl0pLT5saW5lICE9IGxpbmUtPmxpbmUKKwkJICAgICAgfHwgZHdmbF9saW5lIChtYXRjaFtpbm5lcl0pLT5jb2x1bW4gPj0gbGluZS0+Y29sdW1uKSkKKwkJLyogVXNlIHRoZSBuZXcgbGluZS4gIE90aGVyd2lzZSB0aGUgb2xkIG9uZS4gICovCisJCW1hdGNoW2lubmVyXSA9ICZjdS0+bGluZXMtPmlkeFtjbnRdOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGlmIChjdXJfbWF0Y2ggPCBtYXhfbWF0Y2gpCisJICAgIHsKKwkgICAgICBpZiAoY3VyX21hdGNoID09IGFjdF9tYXRjaCkKKwkJeworCQkgIC8qIEVubGFyZ2UgdGhlIGFycmF5IGZvciB0aGUgcmVzdWx0cy4gICovCisJCSAgYWN0X21hdGNoICs9IDEwOworCQkgIER3ZmxfTGluZSAqKm5ld3AgPSByZWFsbG9jIChtYXRjaCwKKwkJCQkJICAgICAgYWN0X21hdGNoCisJCQkJCSAgICAgICogc2l6ZW9mIChEd2ZsX0xpbmUgKikpOworCQkgIGlmIChuZXdwID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGZyZWUgKG1hdGNoKTsKKwkJICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOworCQkgICAgICByZXR1cm4gLTE7CisJCSAgICB9CisJCSAgbWF0Y2ggPSBuZXdwOworCQl9CisKKwkgICAgICBtYXRjaFtjdXJfbWF0Y2grK10gPSAmY3UtPmxpbmVzLT5pZHhbY250XTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGN1cl9tYXRjaCA+IDApCisgICAgeworICAgICAgYXNzZXJ0ICgqbnNyY3MgPT0gMCB8fCAqc3Jjc3AgPT0gbWF0Y2gpOworCisgICAgICAqbnNyY3MgPSBjdXJfbWF0Y2g7CisgICAgICAqc3Jjc3AgPSBtYXRjaDsKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PX01BVENIKTsKKyAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvbGliZHdmbC9kd2ZsX21vZHVsZV9pbmZvLmMgYi9saWJkd2ZsL2R3ZmxfbW9kdWxlX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGMyN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX21vZHVsZV9pbmZvLmMKQEAgLTAsMCArMSw0NCBAQAorLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgbW9kdWxlLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlICJsaWJkd2ZsUC5oIgorCitjb25zdCBjaGFyICoKK2R3ZmxfbW9kdWxlX2luZm8gKER3ZmxfTW9kdWxlICptb2QsIHZvaWQgKioqdXNlcmRhdGEsCisJCSAgRHdhcmZfQWRkciAqc3RhcnQsIER3YXJmX0FkZHIgKmVuZCwKKwkJICBEd2FyZl9BZGRyICpkd2JpYXMsIER3YXJmX0FkZHIgKnN5bWJpYXMsCisJCSAgY29uc3QgY2hhciAqKm1haW5maWxlLCBjb25zdCBjaGFyICoqZGVidWdmaWxlKQoreworICBpZiAobW9kID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVzZXJkYXRhKQorICAgICp1c2VyZGF0YSA9ICZtb2QtPnVzZXJkYXRhOworICBpZiAoc3RhcnQpCisgICAgKnN0YXJ0ID0gbW9kLT5sb3dfYWRkcjsKKyAgaWYgKGVuZCkKKyAgICAqZW5kID0gbW9kLT5oaWdoX2FkZHI7CisKKyAgaWYgKGR3YmlhcykKKyAgICAqZHdiaWFzID0gbW9kLT5kZWJ1Zy5lbGYgPT0gTlVMTCA/IChEd2FyZl9BZGRyKSAtMSA6IG1vZC0+ZGVidWcuYmlhczsKKyAgaWYgKHN5bWJpYXMpCisgICAgKnN5bWJpYXMgPSBtb2QtPnN5bWZpbGUgPT0gTlVMTCA/IChEd2FyZl9BZGRyKSAtMSA6IG1vZC0+c3ltZmlsZS0+YmlhczsKKworICBpZiAobWFpbmZpbGUpCisgICAgKm1haW5maWxlID0gbW9kLT5tYWluLm5hbWU7CisKKyAgaWYgKGRlYnVnZmlsZSkKKyAgICAqZGVidWdmaWxlID0gbW9kLT5kZWJ1Zy5uYW1lOworCisgIHJldHVybiBtb2QtPm5hbWU7Cit9CmRpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfbW9kdWxlX25leHRjdS5jIGIvbGliZHdmbC9kd2ZsX21vZHVsZV9uZXh0Y3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDg5MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX21vZHVsZV9uZXh0Y3UuYwpAQCAtMCwwICsxLDI5IEBACisvKiBJdGVyYXRlIHRocm91Z2ggRFdBUkYgY29tcGlsYXRpb24gdW5pdHMgaW4gYSBtb2R1bGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisKK0R3YXJmX0RpZSAqCitkd2ZsX21vZHVsZV9uZXh0Y3UgKER3ZmxfTW9kdWxlICptb2QsIER3YXJmX0RpZSAqbGFzdGN1LCBEd2FyZl9BZGRyICpiaWFzKQoreworICBpZiAoSU5UVVNFKGR3ZmxfbW9kdWxlX2dldGR3YXJmKSAobW9kLCBiaWFzKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0cnVjdCBkd2ZsX2N1ICpjdTsKKyAgRHdmbF9FcnJvciBlcnJvciA9IF9fbGliZHdmbF9uZXh0Y3UgKG1vZCwgKHN0cnVjdCBkd2ZsX2N1ICopIGxhc3RjdSwgJmN1KTsKKyAgaWYgKGxpa2VseSAoZXJyb3IgPT0gRFdGTF9FX05PRVJST1IpKQorICAgIHJldHVybiAmY3UtPmRpZTsJCS8qIFNhbWUgYXMgYSBjYXN0LCBzbyBvayBmb3IgbnVsbCB0b28uICAqLworCisgIF9fbGliZHdmbF9zZXRlcnJubyAoZXJyb3IpOworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvZHdmbF9uZXh0Y3UuYyBiL2xpYmR3ZmwvZHdmbF9uZXh0Y3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTU2NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX25leHRjdS5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIEl0ZXJhdGUgdGhyb3VnaCBEV0FSRiBjb21waWxhdGlvbiB1bml0cyBhY3Jvc3MgYWxsIG1vZHVsZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgImxpYmR3ZmxQLmgiCisKK0R3YXJmX0RpZSAqCitkd2ZsX25leHRjdSAoRHdmbCAqZHdmbCwgRHdhcmZfRGllICpsYXN0Y3UsIER3YXJmX0FkZHIgKmJpYXMpCit7CisgIGlmIChkd2ZsID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc3RydWN0IGR3ZmxfY3UgKmN1ID0gKHN0cnVjdCBkd2ZsX2N1ICopIGxhc3RjdTsKKyAgRHdmbF9Nb2R1bGUgKm1vZDsKKworICBpZiAoY3UgPT0gTlVMTCkKKyAgICB7CisgICAgICBtb2QgPSBkd2ZsLT5tb2R1bGVsaXN0OworICAgICAgZ290byBuZXh0bW9kOworICAgIH0KKyAgZWxzZQorICAgIG1vZCA9IGN1LT5tb2Q7CisKKyAgRHdmbF9FcnJvciBlcnJvcjsKKyAgd2hpbGUgKChlcnJvciA9IF9fbGliZHdmbF9uZXh0Y3UgKG1vZCwgY3UsICZjdSkpID09IERXRkxfRV9OT0VSUk9SKQorICAgIHsKKyAgICAgIGlmIChjdSAhPSBOVUxMKQorCXsKKwkgICpiaWFzID0gbW9kLT5kZWJ1Zy5iaWFzOworCSAgcmV0dXJuICZjdS0+ZGllOworCX0KKworICAgICAgbW9kID0gbW9kLT5uZXh0OworCisgICAgbmV4dG1vZDoKKyAgICAgIGlmIChtb2QgPT0gTlVMTCB8fCBJTlRVU0UoZHdmbF9tb2R1bGVfZ2V0ZHdhcmYpIChtb2QsIGJpYXMpID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9fbGliZHdmbF9zZXRlcnJubyAoZXJyb3IpOworICByZXR1cm4gTlVMTDsKK30KK0lOVERFRiAoZHdmbF9uZXh0Y3UpCmRpZmYgLS1naXQgYS9saWJkd2ZsL2R3ZmxfcmVwb3J0X2VsZi5jIGIvbGliZHdmbC9kd2ZsX3JlcG9ydF9lbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWM5ZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9kd2ZsX3JlcG9ydF9lbGYuYwpAQCAtMCwwICsxLDExNyBAQAorLyogUmVwb3J0IGEgbW9kdWxlIHRvIGxpYmR3ZmwgYmFzZWQgb24gRUxGIHByb2dyYW0gaGVhZGVycy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKK0R3ZmxfTW9kdWxlICoKK2R3ZmxfcmVwb3J0X2VsZiAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwKKwkJIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGZkLCBHRWxmX0FkZHIgYmFzZSkKK3sKKyAgYm9vbCBjbG9zZWZkID0gZmFsc2U7CisKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBmZCA9IG9wZW42NCAoZmlsZV9uYW1lLCBPX1JET05MWSk7CisgICAgICBpZiAoZmQgPCAwKQorCXsKKwkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0VSUk5PKTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICAgIGNsb3NlZmQgPSB0cnVlOworICAgIH0KKworICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQURfTU1BUF9QUklWQVRFLCBOVUxMKTsKKworICBHRWxmX0VoZHIgZWhkcl9tZW0sICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7CisgIGlmIChlaGRyID09IE5VTEwpCisgICAgeworICAgIGVsZl9lcnJvcjoKKyAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0xJQkVMRik7CisgICAgICBpZiAoY2xvc2VmZCkKKwljbG9zZSAoZmQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIEdFbGZfQWRkciBzdGFydCA9IDAsIGVuZCA9IDA7CisgIGZvciAodWludF9mYXN0MTZfdCBpID0gMDsgaSA8IGVoZHItPmVfcGhudW07ICsraSkKKyAgICB7CisgICAgICBHRWxmX1BoZHIgcGhkcl9tZW0sICpwaCA9IGdlbGZfZ2V0cGhkciAoZWxmLCBpLCAmcGhkcl9tZW0pOworICAgICAgaWYgKHBoID09IE5VTEwpCisJZ290byBlbGZfZXJyb3I7CisgICAgICBpZiAocGgtPnBfdHlwZSA9PSBQVF9MT0FEKQorCXsKKwkgIHN0YXJ0ID0gYmFzZSArIChwaC0+cF92YWRkciAmIC1waC0+cF9hbGlnbik7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGZvciAodWludF9mYXN0MTZfdCBpID0gZWhkci0+ZV9waG51bTsgaS0tID4gMDspCisgICAgeworICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtLCAqcGggPSBnZWxmX2dldHBoZHIgKGVsZiwgaSwgJnBoZHJfbWVtKTsKKyAgICAgIGlmIChwaCA9PSBOVUxMKQorCWdvdG8gZWxmX2Vycm9yOworICAgICAgaWYgKHBoLT5wX3R5cGUgPT0gUFRfTE9BRCkKKwl7CisJICBlbmQgPSBiYXNlICsgKHBoLT5wX3ZhZGRyICsgcGgtPnBfbWVtc3opOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoZW5kID09IDApCisgICAgeworICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9fUEhEUik7CisgICAgICBpZiAoY2xvc2VmZCkKKwljbG9zZSAoZmQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIER3ZmxfTW9kdWxlICptID0gSU5UVVNFKGR3ZmxfcmVwb3J0X21vZHVsZSkgKGR3ZmwsIG5hbWUsCisJCQkJCSAgICAgICBiYXNlICsgc3RhcnQsIGJhc2UgKyBlbmQpOworICBpZiAobSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChtLT5tYWluLm5hbWUgPT0gTlVMTCkKKwl7CisJICBtLT5tYWluLm5hbWUgPSBzdHJkdXAgKGZpbGVfbmFtZSk7CisJICBtLT5tYWluLmZkID0gZmQ7CisJfQorICAgICAgZWxzZSBpZiAoKGZkID49IDAgJiYgbS0+bWFpbi5mZCAhPSBmZCkKKwkgICAgICAgfHwgc3RyY21wIChtLT5tYWluLm5hbWUsIGZpbGVfbmFtZSkpCisJeworCSAgZWxmX2VuZCAoZWxmKTsKKwlvdmVybGFwOgorCSAgaWYgKGNsb3NlZmQpCisJICAgIGNsb3NlIChmZCk7CisJICBtLT5nYyA9IHRydWU7CisJICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9PVkVSTEFQKTsKKwkgIG0gPSBOVUxMOworCX0KKworICAgICAgLyogUHJlaW5zdGFsbCB0aGUgb3BlbiBFTEYgaGFuZGxlIGZvciB0aGUgbW9kdWxlLiAgKi8KKyAgICAgIGlmIChtLT5tYWluLmVsZiA9PSBOVUxMKQorCXsKKwkgIG0tPm1haW4uZWxmID0gZWxmOworCSAgbS0+bWFpbi5iaWFzID0gYmFzZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZWxmX2VuZCAoZWxmKTsKKwkgIGlmIChtLT5tYWluLmJpYXMgIT0gYmFzZSkKKwkgICAgZ290byBvdmVybGFwOworCX0KKyAgICB9CisgIHJldHVybiBtOworfQorSU5UREVGIChkd2ZsX3JlcG9ydF9lbGYpCmRpZmYgLS1naXQgYS9saWJkd2ZsL2VsZi1mcm9tLW1lbW9yeS5jIGIvbGliZHdmbC9lbGYtZnJvbS1tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTc1YWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9lbGYtZnJvbS1tZW1vcnkuYwpAQCAtMCwwICsxLDMyOCBAQAorLyogUmVjb25zdHJ1Y3QgYW4gRUxGIGZpbGUgYnkgcmVhZGluZyB0aGUgc2VnbWVudHMgb3V0IG9mIHJlbW90ZSBtZW1vcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgIi4uL2xpYmVsZi9saWJlbGZQLmgiCisjdW5kZWYgXworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKworI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIFJlY29uc3RydWN0IGFuIEVMRiBmaWxlIGJ5IHJlYWRpbmcgdGhlIHNlZ21lbnRzIG91dCBvZiByZW1vdGUgbWVtb3J5CisgICBiYXNlZCBvbiB0aGUgRUxGIGZpbGUgaGVhZGVyIGF0IEVIRFJfVk1BIGFuZCB0aGUgRUxGIHByb2dyYW0gaGVhZGVycyBpdAorICAgcG9pbnRzIHRvLiAgSWYgbm90IG51bGwsICpMT0FEQkFTRVAgaXMgZmlsbGVkIGluIHdpdGggdGhlIGRpZmZlcmVuY2UKKyAgIGJldHdlZW4gdGhlIGFkZHJlc3NlcyBmcm9tIHdoaWNoIHRoZSBzZWdtZW50cyB3ZXJlIHJlYWQsIGFuZCB0aGUKKyAgIGFkZHJlc3NlcyB0aGUgZmlsZSBoZWFkZXJzIHB1dCB0aGVtIGF0LgorCisgICBUaGUgZnVuY3Rpb24gUkVBRF9NRU1PUlkgaXMgY2FsbGVkIHRvIGNvcHkgYXQgbGVhc3QgTUlOUkVBRCBhbmQgYXQgbW9zdAorICAgTUFYUkVBRCBieXRlcyBmcm9tIHRoZSByZW1vdGUgbWVtb3J5IGF0IHRhcmdldCBhZGRyZXNzIEFERFJFU1MgaW50byB0aGUKKyAgIGxvY2FsIGJ1ZmZlciBhdCBEQVRBOyBpdCBzaG91bGQgcmV0dXJuIC0xIGZvciBlcnJvcnMgKHdpdGggY29kZSBpbgorICAgYGVycm5vJyksIDAgaWYgaXQgZmFpbGVkIHRvIHJlYWQgYXQgbGVhc3QgTUlOUkVBRCBieXRlcyBkdWUgdG8gRU9GLCBvcgorICAgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGlmID49IE1JTlJFQUQuICBBUkcgaXMgcGFzc2VkIHRocm91Z2guICAqLworCitFbGYgKgorZWxmX2Zyb21fcmVtb3RlX21lbW9yeSAoR0VsZl9BZGRyIGVoZHJfdm1hLAorCQkJR0VsZl9BZGRyICpsb2FkYmFzZXAsCisJCQlzc2l6ZV90ICgqcmVhZF9tZW1vcnkpICh2b2lkICphcmcsIHZvaWQgKmRhdGEsCisJCQkJCQlHRWxmX0FkZHIgYWRkcmVzcywKKwkJCQkJCXNpemVfdCBtaW5yZWFkLAorCQkJCQkJc2l6ZV90IG1heHJlYWQpLAorCQkJdm9pZCAqYXJnKQoreworICAvKiBGaXJzdCByZWFkIGluIHRoZSBmaWxlIGhlYWRlciBhbmQgY2hlY2sgaXRzIHNhbml0eS4gICovCisKKyAgY29uc3Qgc2l6ZV90IGluaXRpYWxfYnVmc2l6ZSA9IDI1NjsKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gbWFsbG9jIChpbml0aWFsX2J1ZnNpemUpOworICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgeworICAgIG5vX21lbW9yeToKKyAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzc2l6ZV90IG5yZWFkID0gKCpyZWFkX21lbW9yeSkgKGFyZywgYnVmZmVyLCBlaGRyX3ZtYSwKKwkJCQkgIHNpemVvZiAoRWxmMzJfRWhkciksIGluaXRpYWxfYnVmc2l6ZSk7CisgIGlmIChucmVhZCA8PSAwKQorICAgIHsKKyAgICByZWFkX2Vycm9yOgorICAgICAgZnJlZSAoYnVmZmVyKTsKKyAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAobnJlYWQgPCAwID8gRFdGTF9FX0VSUk5PIDogRFdGTF9FX1RSVU5DQVRFRCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKG1lbWNtcCAoYnVmZmVyLCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCisgICAgeworICAgIGJhZF9lbGY6CisgICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9CQURFTEYpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIEV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgZnJvbSB0aGUgZmlsZSBoZWFkZXIuICAqLworCisgIHVuaW9uCisgIHsKKyAgICBFbGYzMl9FaGRyIGUzMjsKKyAgICBFbGY2NF9FaGRyIGU2NDsKKyAgfSBlaGRyOworICBFbGZfRGF0YSB4bGF0ZWZyb20gPQorICAgIHsKKyAgICAgIC5kX3R5cGUgPSBFTEZfVF9FSERSLAorICAgICAgLmRfYnVmID0gYnVmZmVyLAorICAgICAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCisgICAgfTsKKyAgRWxmX0RhdGEgeGxhdGV0byA9CisgICAgeworICAgICAgLmRfdHlwZSA9IEVMRl9UX0VIRFIsCisgICAgICAuZF9idWYgPSAmZWhkciwKKyAgICAgIC5kX3NpemUgPSBzaXplb2YgZWhkciwKKyAgICAgIC5kX3ZlcnNpb24gPSBFVl9DVVJSRU5ULAorICAgIH07CisKKyAgR0VsZl9PZmYgcGhvZmY7CisgIHVpbnRfZmFzdDE2X3QgcGhudW07CisgIHVpbnRfZmFzdDE2X3QgcGhlbnRzaXplOworICBHRWxmX09mZiBzaGRyc19lbmQ7CisKKyAgc3dpdGNoIChidWZmZXJbRUlfQ0xBU1NdKQorICAgIHsKKyAgICBjYXNlIEVMRkNMQVNTMzI6CisgICAgICB4bGF0ZWZyb20uZF9zaXplID0gc2l6ZW9mIChFbGYzMl9FaGRyKTsKKyAgICAgIGlmIChlbGYzMl94bGF0ZXRvbSAoJnhsYXRldG8sICZ4bGF0ZWZyb20sIGJ1ZmZlcltFSV9EQVRBXSkgPT0gTlVMTCkKKwl7CisJbGliZWxmX2Vycm9yOgorCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTElCRUxGKTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICAgIHBob2ZmID0gZWhkci5lMzIuZV9waG9mZjsKKyAgICAgIHBobnVtID0gZWhkci5lMzIuZV9waG51bTsKKyAgICAgIHBoZW50c2l6ZSA9IGVoZHIuZTMyLmVfcGhlbnRzaXplOworICAgICAgaWYgKHBoZW50c2l6ZSAhPSBzaXplb2YgKEVsZjMyX1BoZHIpIHx8IHBobnVtID09IDApCisJZ290byBiYWRfZWxmOworICAgICAgc2hkcnNfZW5kID0gZWhkci5lMzIuZV9zaG9mZiArIGVoZHIuZTMyLmVfc2hudW0gKiBlaGRyLmUzMi5lX3NoZW50c2l6ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEZDTEFTUzY0OgorICAgICAgeGxhdGVmcm9tLmRfc2l6ZSA9IHNpemVvZiAoRWxmNjRfRWhkcik7CisgICAgICBpZiAoZWxmMzJfeGxhdGV0b20gKCZ4bGF0ZXRvLCAmeGxhdGVmcm9tLCBidWZmZXJbRUlfREFUQV0pID09IE5VTEwpCisJZ290byBsaWJlbGZfZXJyb3I7CisgICAgICBwaG9mZiA9IGVoZHIuZTY0LmVfcGhvZmY7CisgICAgICBwaG51bSA9IGVoZHIuZTY0LmVfcGhudW07CisgICAgICBwaGVudHNpemUgPSBlaGRyLmU2NC5lX3BoZW50c2l6ZTsKKyAgICAgIGlmIChwaGVudHNpemUgIT0gc2l6ZW9mIChFbGY2NF9QaGRyKSB8fCBwaG51bSA9PSAwKQorCWdvdG8gYmFkX2VsZjsKKyAgICAgIHNoZHJzX2VuZCA9IGVoZHIuZTY0LmVfc2hvZmYgKyBlaGRyLmU2NC5lX3NobnVtICogZWhkci5lNjQuZV9zaGVudHNpemU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGJhZF9lbGY7CisgICAgfQorCisKKyAgLyogVGhlIGZpbGUgaGVhZGVyIHRlbGxzIHdoZXJlIHRvIGZpbmQgdGhlIHByb2dyYW0gaGVhZGVycy4KKyAgICAgVGhlc2UgYXJlIHdoYXQgd2UgdXNlIHRvIGFjdHVhbGx5IGNob29zZSB3aGF0IHRvIHJlYWQuICAqLworCisgIHhsYXRlZnJvbS5kX3R5cGUgPSB4bGF0ZXRvLmRfdHlwZSA9IEVMRl9UX1BIRFI7CisgIHhsYXRlZnJvbS5kX3NpemUgPSBwaG51bSAqIHBoZW50c2l6ZTsKKworICBpZiAoKHNpemVfdCkgbnJlYWQgPj0gcGhvZmYgKyBwaG51bSAqIHBoZW50c2l6ZSkKKyAgICAvKiBXZSBhbHJlYWR5IGhhdmUgYWxsIHRoZSBwaGRycyBmcm9tIHRoZSBpbml0aWFsIHJlYWQuICAqLworICAgIHhsYXRlZnJvbS5kX2J1ZiA9IGJ1ZmZlciArIHBob2ZmOworICBlbHNlCisgICAgeworICAgICAgLyogUmVhZCBpbiB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KKworICAgICAgaWYgKGluaXRpYWxfYnVmc2l6ZSA8IHBobnVtICogcGhlbnRzaXplKQorCXsKKwkgIHVuc2lnbmVkIGNoYXIgKm5ld2J1ZiA9IHJlYWxsb2MgKGJ1ZmZlciwgcGhudW0gKiBwaGVudHNpemUpOworCSAgaWYgKG5ld2J1ZiA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZnJlZSAoYnVmZmVyKTsKKwkgICAgICBnb3RvIG5vX21lbW9yeTsKKwkgICAgfQorCSAgYnVmZmVyID0gbmV3YnVmOworCX0KKyAgICAgIG5yZWFkID0gKCpyZWFkX21lbW9yeSkgKGFyZywgYnVmZmVyLCBlaGRyX3ZtYSArIHBob2ZmLAorCQkJICAgICAgcGhudW0gKiBwaGVudHNpemUsIHBobnVtICogcGhlbnRzaXplKTsKKyAgICAgIGlmIChucmVhZCA8PSAwKQorCWdvdG8gcmVhZF9lcnJvcjsKKworICAgICAgeGxhdGVmcm9tLmRfYnVmID0gYnVmZmVyOworICAgIH0KKworICB1bmlvbgorICB7CisgICAgRWxmMzJfUGhkciBwMzJbcGhudW1dOworICAgIEVsZjY0X1BoZHIgcDY0W3BobnVtXTsKKyAgfSBwaGRyczsKKworICB4bGF0ZXRvLmRfYnVmID0gJnBoZHJzOworICB4bGF0ZXRvLmRfc2l6ZSA9IHNpemVvZiBwaGRyczsKKworICAvKiBTY2FuIGZvciBQVF9MT0FEIHNlZ21lbnRzIHRvIGZpbmQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpbGUgaW1hZ2UuICAqLworICBzaXplX3QgY29udGVudHNfc2l6ZSA9IDA7CisgIEdFbGZfT2ZmIHNlZ21lbnRzX2VuZCA9IDA7CisgIEdFbGZfQWRkciBsb2FkYmFzZSA9IGVoZHJfdm1hOworICBzd2l0Y2ggKGVoZHIuZTMyLmVfaWRlbnRbRUlfQ0xBU1NdKQorICAgIHsKKyAgICAgIGlubGluZSB2b2lkIGhhbmRsZV9zZWdtZW50IChHRWxmX0FkZHIgdmFkZHIsIEdFbGZfT2ZmIG9mZnNldCwKKwkJCQkgIEdFbGZfWHdvcmQgZmlsZXN6LCBHRWxmX1h3b3JkIGFsaWduKQorCXsKKwkgIEdFbGZfT2ZmIHNlZ21lbnRfZW5kID0gKChvZmZzZXQgKyBmaWxlc3ogKyBhbGlnbiAtIDEpICYgLWFsaWduKTsKKworCSAgaWYgKHNlZ21lbnRfZW5kID4gKEdFbGZfT2ZmKSBjb250ZW50c19zaXplKQorCSAgICBjb250ZW50c19zaXplID0gc2VnbWVudF9lbmQ7CisKKwkgIGlmICgob2Zmc2V0ICYgLWFsaWduKSA9PSAwICYmIGxvYWRiYXNlID09IGVoZHJfdm1hKQorCSAgICBsb2FkYmFzZSA9IGVoZHJfdm1hIC0gKHZhZGRyICYgLWFsaWduKTsKKworCSAgc2VnbWVudHNfZW5kID0gb2Zmc2V0ICsgZmlsZXN6OworCX0KKworICAgIGNhc2UgRUxGQ0xBU1MzMjoKKyAgICAgIGlmIChlbGYzMl94bGF0ZXRvbSAoJnhsYXRldG8sICZ4bGF0ZWZyb20sCisJCQkgIGVoZHIuZTMyLmVfaWRlbnRbRUlfREFUQV0pID09IE5VTEwpCisJZ290byBsaWJlbGZfZXJyb3I7CisgICAgICBmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQorCWlmIChwaGRycy5wMzJbaV0ucF90eXBlID09IFBUX0xPQUQpCisJICBoYW5kbGVfc2VnbWVudCAocGhkcnMucDMyW2ldLnBfdmFkZHIsIHBoZHJzLnAzMltpXS5wX29mZnNldCwKKwkJCSAgcGhkcnMucDMyW2ldLnBfZmlsZXN6LCBwaGRycy5wMzJbaV0ucF9hbGlnbik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxGQ0xBU1M2NDoKKyAgICAgIGlmIChlbGYzMl94bGF0ZXRvbSAoJnhsYXRldG8sICZ4bGF0ZWZyb20sCisJCQkgIGVoZHIuZTMyLmVfaWRlbnRbRUlfREFUQV0pID09IE5VTEwpCisJZ290byBsaWJlbGZfZXJyb3I7CisgICAgICBmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQorCWlmIChwaGRycy5wMzJbaV0ucF90eXBlID09IFBUX0xPQUQpCisJICBoYW5kbGVfc2VnbWVudCAocGhkcnMucDY0W2ldLnBfdmFkZHIsIHBoZHJzLnA2NFtpXS5wX29mZnNldCwKKwkJCSAgcGhkcnMucDY0W2ldLnBfZmlsZXN6LCBwaGRycy5wNjRbaV0ucF9hbGlnbik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBUcmltIHRoZSBsYXN0IHNlZ21lbnQgc28gd2UgZG9uJ3QgYm90aGVyIHdpdGggemVyb3MgaW4gdGhlIGxhc3QgcGFnZQorICAgICB0aGF0IGFyZSBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIEhvd2V2ZXIsIGlmIHRoZSBleHRyYSBiaXQgaW4gdGhhdAorICAgICBwYWdlIGluY2x1ZGVzIHRoZSBzZWN0aW9uIGhlYWRlcnMsIGtlZXAgdGhlbS4gICovCisgIGlmICgoR0VsZl9PZmYpIGNvbnRlbnRzX3NpemUgPiBzZWdtZW50c19lbmQKKyAgICAgICYmIChHRWxmX09mZikgY29udGVudHNfc2l6ZSA+PSBzaGRyc19lbmQpCisgICAgeworICAgICAgY29udGVudHNfc2l6ZSA9IHNlZ21lbnRzX2VuZDsKKyAgICAgIGlmICgoR0VsZl9PZmYpIGNvbnRlbnRzX3NpemUgPCBzaGRyc19lbmQpCisJY29udGVudHNfc2l6ZSA9IHNoZHJzX2VuZDsKKyAgICB9CisgIGVsc2UKKyAgICBjb250ZW50c19zaXplID0gc2VnbWVudHNfZW5kOworCisgIGZyZWUgKGJ1ZmZlcik7CisKKyAgLyogTm93IHdlIGtub3cgdGhlIHNpemUgb2YgdGhlIHdob2xlIGltYWdlIHdlIHdhbnQgcmVhZCBpbi4gICovCisgIGJ1ZmZlciA9IGNhbGxvYyAoMSwgY29udGVudHNfc2l6ZSk7CisgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgICBnb3RvIG5vX21lbW9yeTsKKworICBzd2l0Y2ggKGVoZHIuZTMyLmVfaWRlbnRbRUlfQ0xBU1NdKQorICAgIHsKKyAgICAgIGlubGluZSBib29sIGhhbmRsZV9zZWdtZW50IChHRWxmX0FkZHIgdmFkZHIsIEdFbGZfT2ZmIG9mZnNldCwKKwkJCQkgIEdFbGZfWHdvcmQgZmlsZXN6LCBHRWxmX1h3b3JkIGFsaWduKQorCXsKKwkgIEdFbGZfT2ZmIHN0YXJ0ID0gb2Zmc2V0ICYgLWFsaWduOworCSAgR0VsZl9PZmYgZW5kID0gKG9mZnNldCArIGZpbGVzeiArIGFsaWduIC0gMSkgJiAtYWxpZ247CisJICBpZiAoZW5kID4gKEdFbGZfT2ZmKSBjb250ZW50c19zaXplKQorCSAgICBlbmQgPSBjb250ZW50c19zaXplOworCSAgbnJlYWQgPSAoKnJlYWRfbWVtb3J5KSAoYXJnLCBidWZmZXIgKyBzdGFydCwKKwkJCQkgIChsb2FkYmFzZSArIHZhZGRyKSAmIC1hbGlnbiwKKwkJCQkgIGVuZCAtIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisJICByZXR1cm4gbnJlYWQgPD0gMDsKKwl9CisKKyAgICBjYXNlIEVMRkNMQVNTMzI6CisgICAgICBmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQorCWlmIChwaGRycy5wMzJbaV0ucF90eXBlID09IFBUX0xPQUQpCisJICBpZiAoaGFuZGxlX3NlZ21lbnQgKHBoZHJzLnAzMltpXS5wX3ZhZGRyLCBwaGRycy5wMzJbaV0ucF9vZmZzZXQsCisJCQkgICAgICBwaGRycy5wMzJbaV0ucF9maWxlc3osIHBoZHJzLnAzMltpXS5wX2FsaWduKSkKKwkgICAgZ290byByZWFkX2Vycm9yOworCisgICAgICAvKiBJZiB0aGUgc2VnbWVudHMgdmlzaWJsZSBpbiBtZW1vcnkgZGlkbid0IGluY2x1ZGUgdGhlIHNlY3Rpb24KKwkgaGVhZGVycywgdGhlbiBjbGVhciB0aGVtIGZyb20gdGhlIGZpbGUgaGVhZGVyLiAgKi8KKyAgICAgIGlmIChjb250ZW50c19zaXplIDwgc2hkcnNfZW5kKQorCXsKKwkgIGVoZHIuZTMyLmVfc2hvZmYgPSAwOworCSAgZWhkci5lMzIuZV9zaG51bSA9IDA7CisJICBlaGRyLmUzMi5lX3Noc3RybmR4ID0gMDsKKwl9CisKKyAgICAgIC8qIFRoaXMgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gaW4gdGhlIGZpcnN0IFBUX0xPQUQgc2VnbWVudC4gIEJ1dCBpdAorCSBjb25jZWl2YWJseSBjb3VsZCBiZSBtaXNzaW5nLCBhbmQgd2UgbWlnaHQgaGF2ZSBqdXN0IGNoYW5nZWQgaXQuICAqLworICAgICAgeGxhdGVmcm9tLmRfdHlwZSA9IHhsYXRldG8uZF90eXBlID0gRUxGX1RfRUhEUjsKKyAgICAgIHhsYXRlZnJvbS5kX3NpemUgPSB4bGF0ZXRvLmRfc2l6ZSA9IHNpemVvZiBlaGRyLmUzMjsKKyAgICAgIHhsYXRlZnJvbS5kX2J1ZiA9ICZlaGRyLmUzMjsKKyAgICAgIHhsYXRldG8uZF9idWYgPSBidWZmZXI7CisgICAgICBpZiAoZWxmMzJfeGxhdGV0b2YgKCZ4bGF0ZXRvLCAmeGxhdGVmcm9tLAorCQkJICBlaGRyLmUzMi5lX2lkZW50W0VJX0RBVEFdKSA9PSBOVUxMKQorCWdvdG8gbGliZWxmX2Vycm9yOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRkNMQVNTNjQ6CisgICAgICBmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQorCWlmIChwaGRycy5wMzJbaV0ucF90eXBlID09IFBUX0xPQUQpCisJICBpZiAoaGFuZGxlX3NlZ21lbnQgKHBoZHJzLnA2NFtpXS5wX3ZhZGRyLCBwaGRycy5wNjRbaV0ucF9vZmZzZXQsCisJCQkgICAgICBwaGRycy5wNjRbaV0ucF9maWxlc3osIHBoZHJzLnA2NFtpXS5wX2FsaWduKSkKKwkgICAgZ290byByZWFkX2Vycm9yOworCisgICAgICAvKiBJZiB0aGUgc2VnbWVudHMgdmlzaWJsZSBpbiBtZW1vcnkgZGlkbid0IGluY2x1ZGUgdGhlIHNlY3Rpb24KKwkgaGVhZGVycywgdGhlbiBjbGVhciB0aGVtIGZyb20gdGhlIGZpbGUgaGVhZGVyLiAgKi8KKyAgICAgIGlmIChjb250ZW50c19zaXplIDwgc2hkcnNfZW5kKQorCXsKKwkgIGVoZHIuZTY0LmVfc2hvZmYgPSAwOworCSAgZWhkci5lNjQuZV9zaG51bSA9IDA7CisJICBlaGRyLmU2NC5lX3Noc3RybmR4ID0gMDsKKwl9CisKKyAgICAgIC8qIFRoaXMgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gaW4gdGhlIGZpcnN0IFBUX0xPQUQgc2VnbWVudC4gIEJ1dCBpdAorCSBjb25jZWl2YWJseSBjb3VsZCBiZSBtaXNzaW5nLCBhbmQgd2UgbWlnaHQgaGF2ZSBqdXN0IGNoYW5nZWQgaXQuICAqLworICAgICAgeGxhdGVmcm9tLmRfdHlwZSA9IHhsYXRldG8uZF90eXBlID0gRUxGX1RfRUhEUjsKKyAgICAgIHhsYXRlZnJvbS5kX3NpemUgPSB4bGF0ZXRvLmRfc2l6ZSA9IHNpemVvZiBlaGRyLmU2NDsKKyAgICAgIHhsYXRlZnJvbS5kX2J1ZiA9ICZlaGRyLmU2NDsKKyAgICAgIHhsYXRldG8uZF9idWYgPSBidWZmZXI7CisgICAgICBpZiAoZWxmMzJfeGxhdGV0b2YgKCZ4bGF0ZXRvLCAmeGxhdGVmcm9tLAorCQkJICBlaGRyLmU2NC5lX2lkZW50W0VJX0RBVEFdKSA9PSBOVUxMKQorCWdvdG8gbGliZWxmX2Vycm9yOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogTm93IHdlIGhhdmUgdGhlIGltYWdlLiAgT3BlbiBsaWJlbGYgb24gaXQuICAqLworCisgIEVsZiAqZWxmID0gZWxmX21lbW9yeSAoKGNoYXIgKikgYnVmZmVyLCBjb250ZW50c19zaXplKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGJ1ZmZlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZWxmLT5mbGFncyB8PSBFTEZfRl9NQUxMT0NFRDsKKyAgaWYgKGxvYWRiYXNlcCAhPSBOVUxMKQorICAgICpsb2FkYmFzZXAgPSBsb2FkYmFzZTsKKyAgcmV0dXJuIGVsZjsKK30KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvZmluZC1kZWJ1Z2luZm8uYyBiL2xpYmR3ZmwvZmluZC1kZWJ1Z2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWU2NDBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9maW5kLWRlYnVnaW5mby5jCkBAIC0wLDAgKzEsMTU3IEBACisvKiBTdGFuZGFyZCBmaW5kX2RlYnVnaW5mbyBjYWxsYmFjayBmb3IgbGliZHdmbC4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAic3lzdGVtLmgiCisKKworI2RlZmluZSBERUZBVUxUX0RFQlVHSU5GT19QQVRIICI6LmRlYnVnOi91c3IvbGliL2RlYnVnIgorCisKKy8qIFRyeSB0byBvcGVuNjQgW0RJUi9dW1NVQkRJUi9dREVCVUdMSU5LLCByZXR1cm4gZmlsZSBkZXNjcmlwdG9yIG9yIC0xLgorICAgT24gc3VjY2VzcywgKkRFQlVHSU5GT19GSUxFX05BTUUgaGFzIHRoZSBtYWxsb2MnZCBuYW1lIG9mIHRoZSBvcGVuIGZpbGUuICAqLworc3RhdGljIGludAordHJ5X29wZW4gKGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqc3ViZGlyLCBjb25zdCBjaGFyICpkZWJ1Z2xpbmssCisJICBjaGFyICoqZGVidWdpbmZvX2ZpbGVfbmFtZSkKK3sKKyAgY2hhciAqZm5hbWUgPSBOVUxMOworICBpZiAoZGlyID09IE5VTEwgJiYgc3ViZGlyID09IE5VTEwpCisgICAgZm5hbWUgPSBzdHJkdXAgKGRlYnVnbGluayk7CisgIGVsc2UgaWYgKHN1YmRpciA9PSBOVUxMKQorICAgIGFzcHJpbnRmICgmZm5hbWUsICIlcy8lcyIsIGRpciwgZGVidWdsaW5rKTsKKyAgZWxzZSBpZiAoZGlyID09IE5VTEwpCisgICAgYXNwcmludGYgKCZmbmFtZSwgIiVzLyVzIiwgc3ViZGlyLCBkZWJ1Z2xpbmspOworICBlbHNlCisgICAgYXNwcmludGYgKCZmbmFtZSwgIiVzLyVzLyVzIiwgZGlyLCBzdWJkaXIsIGRlYnVnbGluayk7CisKKyAgaWYgKGZuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGludCBmZCA9IG9wZW42NCAoZm5hbWUsIE9fUkRPTkxZKTsKKyAgaWYgKGZkIDwgMCkKKyAgICBmcmVlIChmbmFtZSk7CisgIGVsc2UKKyAgICAqZGVidWdpbmZvX2ZpbGVfbmFtZSA9IGZuYW1lOworCisgIHJldHVybiBmZDsKK30KKworLyogUmV0dXJuIHRydWUgaWZmIHRoZSBGRCdzIGNvbnRlbnRzIENSQyBtYXRjaGVzIERFQlVHTElOS19DUkMuICAqLworc3RhdGljIGlubGluZSBib29sCitjaGVja19jcmMgKGludCBmZCwgR0VsZl9Xb3JkIGRlYnVnbGlua19jcmMpCit7CisgIHVpbnQzMl90IGZpbGVfY3JjOworICByZXR1cm4gY3JjMzJfZmlsZSAoZmQsICZmaWxlX2NyYykgPT0gMCAmJiBmaWxlX2NyYyA9PSBkZWJ1Z2xpbmtfY3JjOworfQorCitpbnQKK2R3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8gKER3ZmxfTW9kdWxlICptb2QgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgICAgdm9pZCAqKnVzZXJkYXRhIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm1vZG5hbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgICAgR0VsZl9BZGRyIGJhc2UgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lLAorCQkJICAgICAgY29uc3QgY2hhciAqZGVidWdsaW5rX2ZpbGUsCisJCQkgICAgICBHRWxmX1dvcmQgZGVidWdsaW5rX2NyYywKKwkJCSAgICAgIGNoYXIgKipkZWJ1Z2luZm9fZmlsZV9uYW1lKQoreworICBib29sIGNhbmNoZWNrID0gdHJ1ZTsKKworICBjb25zdCBjaGFyICpmaWxlX2Jhc2VuYW1lID0gZmlsZV9uYW1lID09IE5VTEwgPyBOVUxMIDogYmFzZW5hbWUgKGZpbGVfbmFtZSk7CisgIGlmIChkZWJ1Z2xpbmtfZmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChmaWxlX2Jhc2VuYW1lID09IE5VTEwpCisJeworCSAgZXJybm8gPSAwOworCSAgcmV0dXJuIC0xOworCX0KKworICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZmlsZV9iYXNlbmFtZSk7CisgICAgICBjaGFyICpsb2NhbG5hbWUgPSBhbGxvY2EgKGxlbiArIHNpemVvZiAiLmRlYnVnIik7CisgICAgICBtZW1jcHkgKGxvY2FsbmFtZSwgZmlsZV9iYXNlbmFtZSwgbGVuKTsKKyAgICAgIG1lbWNweSAoJmxvY2FsbmFtZVtsZW5dLCAiLmRlYnVnIiwgc2l6ZW9mICIuZGVidWciKTsKKyAgICAgIGRlYnVnbGlua19maWxlID0gbG9jYWxuYW1lOworICAgICAgY2FuY2hlY2sgPSBmYWxzZTsKKyAgICB9CisKKyAgLyogTG9vayBmb3IgYSBmaWxlIG5hbWVkIERFQlVHTElOS19GSUxFIGluIHRoZSBkaXJlY3RvcmllcworICAgICBpbmRpY2F0ZWQgYnkgdGhlIGRlYnVnIGRpcmVjdG9yeSBwYXRoIHNldHRpbmcuICAqLworCisgIGNvbnN0IER3ZmxfQ2FsbGJhY2tzICpjb25zdCBjYiA9IG1vZC0+ZHdmbC0+Y2FsbGJhY2tzOworICBjaGFyICpwYXRoID0gc3RyZHVwYSAoKGNiLT5kZWJ1Z2luZm9fcGF0aCA/ICpjYi0+ZGVidWdpbmZvX3BhdGggOiBOVUxMKQorCQkJPzogREVGQVVMVF9ERUJVR0lORk9fUEFUSCk7CisKKyAgLyogQSBsZWFkaW5nIC0gb3IgKyBpbiB0aGUgd2hvbGUgcGF0aCBzZXRzIHdoZXRoZXIgdG8gY2hlY2sgZmlsZSBDUkNzLiAgKi8KKyAgYm9vbCBkZWZjaGVjayA9IHRydWU7CisgIGlmIChwYXRoWzBdID09ICctJyB8fCBwYXRoWzBdID09ICcrJykKKyAgICB7CisgICAgICBkZWZjaGVjayA9IHBhdGhbMF0gPT0gJysnOworICAgICAgKytwYXRoOworICAgIH0KKworICBjaGFyICpmaWxlX2Rpcm5hbWUgPSAoZmlsZV9iYXNlbmFtZSA9PSBmaWxlX25hbWUgPyBOVUxMCisJCQk6IHN0cm5kdXBhIChmaWxlX25hbWUsIGZpbGVfYmFzZW5hbWUgLSAxIC0gZmlsZV9uYW1lKSk7CisgIGNoYXIgKnA7CisgIHdoaWxlICgocCA9IHN0cnNlcCAoJnBhdGgsICI6IikpICE9IE5VTEwpCisgICAgeworICAgICAgLyogQSBsZWFkaW5nIC0gb3IgKyBzYXlzIHdoZXRoZXIgdG8gY2hlY2sgZmlsZSBDUkNzIGZvciB0aGlzIGVsZW1lbnQuICAqLworICAgICAgYm9vbCBjaGVjayA9IGRlZmNoZWNrOworICAgICAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCisJY2hlY2sgPSAqcCsrID09ICcrJzsKKyAgICAgIGNoZWNrID0gY2hlY2sgJiYgY2FuY2hlY2s7CisKKyAgICAgIGNvbnN0IGNoYXIgKmRpciwgKnN1YmRpcjsKKyAgICAgIHN3aXRjaCAocFswXSkKKwl7CisJY2FzZSAnXDAnOgorCSAgLyogQW4gZW1wdHkgZW50cnkgc2F5cyB0byB0cnkgdGhlIG1haW4gZmlsZSdzIGRpcmVjdG9yeS4gICovCisJICBkaXIgPSBmaWxlX2Rpcm5hbWU7CisJICBzdWJkaXIgPSBOVUxMOworCSAgYnJlYWs7CisJY2FzZSAnLyc6CisJICAvKiBBbiBhYnNvbHV0ZSBwYXRoIHNheXMgdG8gbG9vayB0aGVyZSBmb3IgYSBzdWJkaXJlY3RvcnkKKwkgICAgIG5hbWVkIGJ5IHRoZSBtYWluIGZpbGUncyBhYnNvbHV0ZSBkaXJlY3RvcnkuCisJICAgICBUaGlzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGEgcmVsYXRpdmUgZmlsZSBuYW1lLiAgKi8KKwkgIGlmIChmaWxlX2Rpcm5hbWUgPT0gTlVMTCB8fCBmaWxlX2Rpcm5hbWVbMF0gIT0gJy8nKQorCSAgICBjb250aW51ZTsKKwkgIGRpciA9IHA7CisJICBzdWJkaXIgPSBmaWxlX2Rpcm5hbWUgKyAxOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIC8qIEEgcmVsYXRpdmUgcGF0aCBzYXlzIHRvIHRyeSBhIHN1YmRpcmVjdG9yeSBvZiB0aGF0IG5hbWUKKwkgICAgIGluIHRoZSBtYWluIGZpbGUncyBkaXJlY3RvcnkuICAqLworCSAgZGlyID0gZmlsZV9kaXJuYW1lOworCSAgc3ViZGlyID0gcDsKKwkgIGJyZWFrOworCX0KKworICAgICAgY2hhciAqZm5hbWU7CisgICAgICBpbnQgZmQgPSB0cnlfb3BlbiAoZGlyLCBzdWJkaXIsIGRlYnVnbGlua19maWxlLCAmZm5hbWUpOworICAgICAgaWYgKGZkIDwgMCkKKwljb250aW51ZTsKKyAgICAgIGlmICghY2hlY2sgfHwgY2hlY2tfY3JjIChmZCwgZGVidWdsaW5rX2NyYykpCisJeworCSAgKmRlYnVnaW5mb19maWxlX25hbWUgPSBmbmFtZTsKKwkgIHJldHVybiBmZDsKKwl9CisgICAgICBmcmVlIChmbmFtZSk7CisgICAgICBjbG9zZSAoZmQpOworICAgIH0KKworICAvKiBObyBkaWNlLiAgKi8KKyAgZXJybm8gPSAwOworICByZXR1cm4gLTE7Cit9CitJTlRERUYgKGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8pCmRpZmYgLS1naXQgYS9saWJkd2ZsL2xpYmR3ZmwuaCBiL2xpYmR3ZmwvbGliZHdmbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjlmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2ZsL2xpYmR3ZmwuaApAQCAtMCwwICsxLDI2MiBAQAorLyogSW50ZXJmYWNlcyBmb3IgbGliZHdmbC4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9MSUJEV0ZMX0gKKyNkZWZpbmUgX0xJQkRXRkxfSAkxCisKKyNpbmNsdWRlIDxsaWJkdy5oPgorCisvKiBIYW5kbGUgZm9yIGEgc2Vzc2lvbiB1c2luZyB0aGUgbGlicmFyeS4gICovCit0eXBlZGVmIHN0cnVjdCBEd2ZsIER3Zmw7CisKKy8qIEhhbmRsZSBmb3IgYSBtb2R1bGUuICAqLwordHlwZWRlZiBzdHJ1Y3QgRHdmbF9Nb2R1bGUgRHdmbF9Nb2R1bGU7CisKKy8qIEhhbmRsZSBkZXNjcmliaW5nIGEgbGluZSByZWNvcmQuICAqLwordHlwZWRlZiBzdHJ1Y3QgRHdmbF9MaW5lIER3ZmxfTGluZTsKKworLyogQ2FsbGJhY2tzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCAoKmZpbmRfZWxmKSAoRHdmbF9Nb2R1bGUgKm1vZCwgdm9pZCAqKnVzZXJkYXRhLAorCQkgICBjb25zdCBjaGFyICptb2RuYW1lLCBEd2FyZl9BZGRyIGJhc2UsCisJCSAgIGNoYXIgKipmaWxlX25hbWUsIEVsZiAqKmVsZnApOworCisgIGludCAoKmZpbmRfZGVidWdpbmZvKSAoRHdmbF9Nb2R1bGUgKm1vZCwgdm9pZCAqKnVzZXJkYXRhLAorCQkJIGNvbnN0IGNoYXIgKm1vZG5hbWUsIER3YXJmX0FkZHIgYmFzZSwKKwkJCSBjb25zdCBjaGFyICpmaWxlX25hbWUsCisJCQkgY29uc3QgY2hhciAqZGVidWdsaW5rX2ZpbGUsIEdFbGZfV29yZCBkZWJ1Z2xpbmtfY3JjLAorCQkJIGNoYXIgKipkZWJ1Z2luZm9fZmlsZV9uYW1lKTsKKworICAvKiBGaWxsICpBRERSIHdpdGggdGhlIGxvYWRlZCBhZGRyZXNzIG9mIHRoZQorICAgICBzZWN0aW9uIGNhbGxlZCBTRUNOQU1FIGluIHRoZSBnaXZlbiBtb2R1bGUuICAqLworICBpbnQgKCpzZWN0aW9uX2FkZHJlc3MpIChEd2ZsX01vZHVsZSAqbW9kLCB2b2lkICoqdXNlcmRhdGEsCisJCQkgIGNvbnN0IGNoYXIgKm1vZG5hbWUsIER3YXJmX0FkZHIgYmFzZSwKKwkJCSAgY29uc3QgY2hhciAqc2VjbmFtZSwgRHdhcmZfQWRkciAqYWRkcik7CisKKyAgY2hhciAqKmRlYnVnaW5mb19wYXRoOwkvKiBTZWUgZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mby4gICovCit9IER3ZmxfQ2FsbGJhY2tzOworCisKKy8qIFN0YXJ0IGEgbmV3IHNlc3Npb24gd2l0aCB0aGUgbGlicmFyeS4gICovCitEd2ZsICpkd2ZsX2JlZ2luIChjb25zdCBEd2ZsX0NhbGxiYWNrcyAqY2FsbGJhY2tzKTsKKworLyogRW5kIGEgc2Vzc2lvbi4gICovCit2b2lkIGR3ZmxfZW5kIChEd2ZsICopOworCisvKiBSZXR1cm4gZXJyb3IgY29kZSBvZiBsYXN0IGZhaWxpbmcgZnVuY3Rpb24gY2FsbC4gIFRoaXMgdmFsdWUgaXMga2VwdAorICAgc2VwYXJhdGVseSBmb3IgZWFjaCB0aHJlYWQuICAqLworZXh0ZXJuIGludCBkd2ZsX2Vycm5vICh2b2lkKTsKKworLyogUmV0dXJuIGVycm9yIHN0cmluZyBmb3IgRVJST1IuICBJZiBFUlJPUiBpcyB6ZXJvLCByZXR1cm4gZXJyb3Igc3RyaW5nCisgICBmb3IgbW9zdCByZWNlbnQgZXJyb3Igb3IgTlVMTCBpZiBub25lIG9jY3VycmVkLiAgSWYgRVJST1IgaXMgLTEgdGhlCisgICBiZWhhdmlvdXIgaXMgc2ltaWxhciB0byB0aGUgbGFzdCBjYXNlIGV4Y2VwdCB0aGF0IG5vdCBOVUxMIGJ1dCBhIGxlZ2FsCisgICBzdHJpbmcgaXMgcmV0dXJuZWQuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmR3ZmxfZXJybXNnIChpbnQgZXJyKTsKKworCisvKiBTdGFydCByZXBvcnRpbmcgdGhlIGN1cnJlbnQgc2V0IG9mIG1vZHVsZXMgdG8gdGhlIGxpYnJhcnkuICBObyBjYWxscyBidXQKKyAgIGR3ZmxfcmVwb3J0X21vZHVsZSBjYW4gYmUgbWFkZSBvbiBEV0ZMIHVudGlsIGR3ZmxfcmVwb3J0X2VuZCBpcyBjYWxsZWQuICAqLworZXh0ZXJuIHZvaWQgZHdmbF9yZXBvcnRfYmVnaW4gKER3ZmwgKmR3ZmwpOworCisvKiBSZXBvcnQgdGhhdCBhIG1vZHVsZSBjYWxsZWQgTkFNRSBzcGFucyBhZGRyZXNzZXMgW1NUQVJULCBFTkQpLgorICAgUmV0dXJucyB0aGUgbW9kdWxlIGhhbmRsZSwgZWl0aGVyIGV4aXN0aW5nIG9yIG5ld2x5IGFsbG9jYXRlZCwKKyAgIG9yIHJldHVybnMgYSBudWxsIHBvaW50ZXIgZm9yIGFuIGFsbG9jYXRpb24gZXJyb3IuICAqLworZXh0ZXJuIER3ZmxfTW9kdWxlICpkd2ZsX3JlcG9ydF9tb2R1bGUgKER3ZmwgKmR3ZmwsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCUR3YXJmX0FkZHIgc3RhcnQsIER3YXJmX0FkZHIgZW5kKTsKKworLyogUmVwb3J0IGEgbW9kdWxlIHdpdGggc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgY29tcHV0ZWQgZnJvbSB0aGUgRUxGCisgICBwcm9ncmFtIGhlYWRlcnMgaW4gdGhlIGdpdmVuIGZpbGUsIHBsdXMgQkFTRS4gIEZEIG1heSBiZSAtMSB0byBvcGVuCisgICBGSUxFX05BTUUuICBPbiBzdWNjZXNzLCBGRCBpcyBjb25zdW1lZCBieSB0aGUgbGlicmFyeSwgYW5kIHRoZQorICAgYGZpbmRfZWxmJyBjYWxsYmFjayB3aWxsIG5vdCBiZSB1c2VkIGZvciB0aGlzIG1vZHVsZS4gICovCitleHRlcm4gRHdmbF9Nb2R1bGUgKmR3ZmxfcmVwb3J0X2VsZiAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGZkLAorCQkJCSAgICAgR0VsZl9BZGRyIGJhc2UpOworCisvKiBGaW5pc2ggcmVwb3J0aW5nIHRoZSBjdXJyZW50IHNldCBvZiBtb2R1bGVzIHRvIHRoZSBsaWJyYXJ5LgorICAgSWYgUkVNT1ZFRCBpcyBub3QgbnVsbCwgaXQncyBjYWxsZWQgZm9yIGVhY2ggbW9kdWxlIHRoYXQKKyAgIGV4aXN0ZWQgYmVmb3JlIGJ1dCB3YXMgbm90IGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHJlcG9ydC4KKyAgIFJldHVybnMgYSBub256ZXJvIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBjYWxsYmFjay4KKyAgIFRoZSBjYWxsYmFjayBtYXkgY2FsbCBkd2ZsX3JlcG9ydF9tb2R1bGU7IGRvaW5nIHNvIHdpdGggdGhlCisgICBkZXRhaWxzIG9mIHRoZSBtb2R1bGUgYmVpbmcgcmVtb3ZlZCBwcmV2ZW50cyBpdHMgcmVtb3ZhbC4KKyAgIERXRkwgY2Fubm90IGJlIHVzZWQgdW50aWwgdGhpcyBmdW5jdGlvbiBoYXMgcmV0dXJuZWQgemVyby4gICovCitleHRlcm4gaW50IGR3ZmxfcmVwb3J0X2VuZCAoRHdmbCAqZHdmbCwKKwkJCSAgICBpbnQgKCpyZW1vdmVkKSAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqLAorCQkJCQkgICAgY29uc3QgY2hhciAqLCBEd2FyZl9BZGRyLAorCQkJCQkgICAgdm9pZCAqYXJnKSwKKwkJCSAgICB2b2lkICphcmcpOworCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgYW5kIGZvciBlYWNoIG5vbi1udWxsIGFyZ3VtZW50IHN0b3JlCisgICBpbnRlcmVzdGluZyBkZXRhaWxzOiAqVVNFUkRBVEEgaXMgYSBsb2NhdGlvbiBmb3Igc3RvcmluZyB5b3VyIG93bgorICAgcG9pbnRlciwgKipVU0VSREFUQSBpcyBpbml0aWFsbHkgbnVsbDsgKlNUQVJUIGFuZCAqRU5EIGdpdmUgdGhlIGFkZHJlc3MKKyAgIHJhbmdlIGNvdmVyZWQgYnkgdGhlIG1vZHVsZTsgKkRXQklBUyBpcyB0aGUgYWRkcmVzcyBiaWFzIGZvciBkZWJ1Z2dpbmcKKyAgIGluZm9ybWF0aW9uLCBhbmQgKlNZTUJJQVMgZm9yIHN5bWJvbCB0YWJsZSBlbnRyaWVzIChlaXRoZXIgaXMgLTEgaWYgbm90CisgICB5ZXQgYWNjZXNzZWQpOyAqTUFJTkZJTEUgaXMgdGhlIG5hbWUgb2YgdGhlIEVMRiBmaWxlLCBhbmQgKkRFQlVHRklMRSB0aGUKKyAgIG5hbWUgb2YgdGhlIGRlYnVnaW5mbyBmaWxlIChtaWdodCBiZSBlcXVhbCB0byAqTUFJTkZJTEU7IGVpdGhlciBpcyBudWxsCisgICBpZiBub3QgeWV0IGFjY2Vzc2VkKS4gICovCitleHRlcm4gY29uc3QgY2hhciAqZHdmbF9tb2R1bGVfaW5mbyAoRHdmbF9Nb2R1bGUgKm1vZCwgdm9pZCAqKip1c2VyZGF0YSwKKwkJCQkgICAgIER3YXJmX0FkZHIgKnN0YXJ0LCBEd2FyZl9BZGRyICplbmQsCisJCQkJICAgICBEd2FyZl9BZGRyICpkd2JpYXMsIER3YXJmX0FkZHIgKnN5bWJpYXMsCisJCQkJICAgICBjb25zdCBjaGFyICoqbWFpbmZpbGUsCisJCQkJICAgICBjb25zdCBjaGFyICoqZGVidWdmaWxlKTsKKworLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBtb2R1bGVzLCBzdGFydGluZyB0aGUgd2FsayB3aXRoIE9GRlNFVCA9PSAwLgorICAgQ2FsbHMgKkNBTExCQUNLIGZvciBlYWNoIG1vZHVsZSBhcyBsb25nIGFzIGl0IHJldHVybnMgRFdBUkZfQ0JfT0suCisgICBXaGVuICpDQUxMQkFDSyByZXR1cm5zIGFub3RoZXIgdmFsdWUsIHRoZSB3YWxrIHN0b3BzIGFuZCB0aGUKKyAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcGFzc2VkIGFzIE9GRlNFVCB0byByZXN1bWUgaXQuICBSZXR1cm5zIDAgd2hlbgorICAgdGhlcmUgYXJlIG5vIG1vcmUgbW9kdWxlcywgb3IgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gcHRyZGlmZl90IGR3ZmxfZ2V0bW9kdWxlcyAoRHdmbCAqZHdmbCwKKwkJCQkgIGludCAoKmNhbGxiYWNrKSAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqKiwKKwkJCQkJCSAgIGNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKKwkJCQkJCSAgIHZvaWQgKmFyZyksCisJCQkJICB2b2lkICphcmcsCisJCQkJICBwdHJkaWZmX3Qgb2Zmc2V0KTsKKworCisvKioqIFN0YW5kYXJkIGNhbGxiYWNrcyAqKiovCisKKy8qIFN0YW5kYXJkIGZpbmRfZGVidWdpbmZvIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgVGhpcyBpcyBjb250cm9sbGVkIGJ5IGEgc3RyaW5nIHNwZWNpZnlpbmcgZGlyZWN0b3JpZXMgdG8gbG9vayBpbi4KKyAgIElmIGBkZWJ1Z2luZm9fcGF0aCcgaXMgc2V0IGluIHRoZSBEd2ZsX0NhbGxiYWNrcyBzdHJ1Y3R1cmUKKyAgIGFuZCB0aGUgY2hhciAqIGl0IHBvaW50cyB0byBpcyBub3QgbnVsbCwgdGhhdCBzdXBwbGllcyB0aGUgc3RyaW5nLgorICAgT3RoZXJ3aXNlIGEgZGVmYXVsdCBwYXRoIGlzIHVzZWQuCisKKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBpcyArIG9yIC0gdGhhdCBzYXlzIHRvIGNoZWNrIG9yIHRvCisgICBpZ25vcmUgKHJlc3BlY3RpdmVseSkgdGhlIENSQzMyIGNoZWNrc3VtIGZyb20gdGhlIC5nbnVfZGVidWdsaW5rCisgICBzZWN0aW9uLiAgVGhlIGRlZmF1bHQgaXMgdG8gY2hlY2sgaXQuICBUaGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgaXMKKyAgIGNvbXBvc2VkIG9mIGVsZW1lbnRzIHNlcGFyYXRlZCBieSBjb2xvbnMuICBFYWNoIGVsZW1lbnQgY2FuIHN0YXJ0IHdpdGggKworICAgb3IgLSB0byBvdmVycmlkZSB0aGUgZ2xvYmFsIGNoZWNrc3VtIGJlaGF2aW9yLiAgSWYgdGhlIHJlbWFpbmRlciBvZiB0aGUKKyAgIGVsZW1lbnQgaXMgZW1wdHksIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbWFpbiBmaWxlIGlzIHRyaWVkOyBpZgorICAgaXQncyBhbiBhYnNvbHV0ZSBwYXRoIG5hbWUsIHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgcGF0aCBjb250YWluaW5nIHRoZQorICAgbWFpbiBmaWxlIGlzIHRha2VuIGFzIGEgc3ViZGlyZWN0b3J5IG9mIHRoaXMgcGF0aDsgYSByZWxhdGl2ZSBwYXRoIG5hbWUKKyAgIGlzIHRha2VuIGFzIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbWFpbiBmaWxlLgorICAgSGVuY2UgZm9yIC9iaW4vbHMsIHN0cmluZyAiOi5kZWJ1ZzovdXNyL2xpYi9kZWJ1ZyIgc2F5cyB0byBsb29rIGluIC9iaW4sCisgICB0aGVuIC9iaW4vLmRlYnVnLCB0aGVuIC91c3IvbGliL2RlYnVnL2JpbiwgZm9yIHRoZSBmaWxlIG5hbWUgaW4gdGhlCisgICAuZ251X2RlYnVnbGluayBzZWN0aW9uIChvciAibHMuZGVidWciIGlmIG5vbmUgd2FzIGZvdW5kKS4gICovCisKK2V4dGVybiBpbnQgZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqKiwKKwkJCQkJIGNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKKwkJCQkJIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJCQkgR0VsZl9Xb3JkLCBjaGFyICoqKTsKKworCisvKiBDYWxsYmFja3MgZm9yIHdvcmtpbmcgd2l0aCBrZXJuZWwgbW9kdWxlcyBpbiB0aGUgcnVubmluZyBMaW51eCBrZXJuZWwuICAqLworZXh0ZXJuIGludCBkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZiAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqKiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqLCBEd2FyZl9BZGRyLAorCQkJCSAgICAgICBjaGFyICoqLCBFbGYgKiopOworZXh0ZXJuIGludCBkd2ZsX2xpbnV4X2tlcm5lbF9tb2R1bGVfc2VjdGlvbl9hZGRyZXNzIChEd2ZsX01vZHVsZSAqLCB2b2lkICoqLAorCQkJCQkJICAgICBjb25zdCBjaGFyICosIER3YXJmX0FkZHIsCisJCQkJCQkgICAgIGNvbnN0IGNoYXIgKiwKKwkJCQkJCSAgICAgRHdhcmZfQWRkciAqYWRkcik7CisKKy8qIENhbGwgZHdmbF9yZXBvcnRfZWxmIGZvciB0aGUgcnVubmluZyBMaW51eCBrZXJuZWwuCisgICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLTEgaWYgZHdmbF9yZXBvcnRfbW9kdWxlIGZhaWxlZCwKKyAgIG9yIGFuIGVycm5vIGNvZGUgaWYgb3BlbmluZyB0aGUga2VybmVsIGJpbmFyeSBmYWlsZWQuICAqLworZXh0ZXJuIGludCBkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfa2VybmVsIChEd2ZsICpkd2ZsKTsKKworLyogQ2FsbCBkd2ZsX3JlcG9ydF9tb2R1bGUgZm9yIGVhY2gga2VybmVsIG1vZHVsZSBpbiB0aGUgcnVubmluZyBMaW51eCBrZXJuZWwuCisgICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLTEgaWYgZHdmbF9yZXBvcnRfbW9kdWxlIGZhaWxlZCwKKyAgIG9yIGFuIGVycm5vIGNvZGUgaWYgcmVhZGluZyB0aGUgbGlzdCBvZiBtb2R1bGVzIGZhaWxlZC4gICovCitleHRlcm4gaW50IGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9tb2R1bGVzIChEd2ZsICpkd2ZsKTsKKworCisvKiBDYWxsIGR3ZmxfcmVwb3J0X21vZHVsZSBmb3IgZWFjaCBmaWxlIG1hcHBlZCBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlIG9mIFBJRC4KKyAgIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtMSBpZiBkd2ZsX3JlcG9ydF9tb2R1bGUgZmFpbGVkLAorICAgb3IgYW4gZXJybm8gY29kZSBpZiBvcGVuaW5nIHRoZSBrZXJuZWwgYmluYXJ5IGZhaWxlZC4gICovCitpbnQgZHdmbF9saW51eF9wcm9jX3JlcG9ydCAoRHdmbCAqZHdmbCwgcGlkX3QgcGlkKTsKKworLyogVHJpdmlhbCBmaW5kX2VsZiBjYWxsYmFjayBmb3IgdXNlIHdpdGggZHdmbF9saW51eF9wcm9jX3JlcG9ydC4KKyAgIFRoaXMgdXNlcyB0aGUgbW9kdWxlIG5hbWUgYXMgYSBmaWxlIG5hbWUgZGlyZWN0bHkgYW5kIHRyaWVzIHRvIG9wZW4gaXQKKyAgIGlmIGl0IGJlZ2luIHdpdGggYSBzbGFzaCwgb3IgaGFuZGxlcyB0aGUgbWFnaWMgc3RyaW5nICJbdmRzb10iLiAgKi8KK2ludCBkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGYgKER3ZmxfTW9kdWxlICptb2QsIHZvaWQgKip1c2VyZGF0YSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCBEd2FyZl9BZGRyIGJhc2UsCisJCQkgICAgICBjaGFyICoqZmlsZV9uYW1lLCBFbGYgKiopOworCisvKiBTdGFuZGFyZCBhcmd1bWVudCBwYXJzaW5nIGZvciB1c2luZyBhIHN0YW5kYXJkIGNhbGxiYWNrIHNldC4gICovCitzdHJ1Y3QgYXJncDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXJncCAqZHdmbF9zdGFuZGFyZF9hcmdwICh2b2lkKSBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKTsKKworCisvKioqIER3YXJmIGFjY2VzcyBmdW5jdGlvbnMgKioqLworCisvKiBGaW5kIHRoZSBtb2R1bGUgY29udGFpbmluZyB0aGUgZ2l2ZW4gYWRkcmVzcy4gICovCitleHRlcm4gRHdmbF9Nb2R1bGUgKmR3ZmxfYWRkcm1vZHVsZSAoRHdmbCAqZHdmbCwgRHdhcmZfQWRkciBhZGRyZXNzKTsKKworLyogRmV0Y2ggdGhlIG1vZHVsZSBtYWluIEVMRiBmaWxlICh3aGVyZSB0aGUgYWxsb2NhdGVkIHNlY3Rpb25zCisgICBhcmUgZm91bmQpIGZvciB1c2Ugd2l0aCBsaWJlbGYuICBJZiBzdWNjZXNzZnVsLCBmaWxscyBpbiAqQklBUworICAgd2l0aCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFkZHJlc3NlcyB3aXRoaW4gdGhlIGxvYWRlZCBtb2R1bGUKKyAgIGFuZCB0aG9zZSBpbiBzeW1ib2wgdGFibGVzIG9yIER3YXJmIGluZm9ybWF0aW9uIHJlZmVycmluZyB0byBpdC4gICovCitleHRlcm4gRWxmICpkd2ZsX21vZHVsZV9nZXRlbGYgKER3ZmxfTW9kdWxlICosIEdFbGZfQWRkciAqYmlhcyk7CisKKy8qIEZldGNoIHRoZSBtb2R1bGUncyBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgdXNlIHdpdGggbGliZHcuCisgICBJZiBzdWNjZXNzZnVsLCBmaWxscyBpbiAqQklBUyB3aXRoIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgIGFkZHJlc3NlcyB3aXRoaW4gdGhlIGxvYWRlZCBtb2R1bGUgYW5kIHRob3NlICB0byB1c2Ugd2l0aCBsaWJkdy4gICovCitleHRlcm4gRHdhcmYgKmR3ZmxfbW9kdWxlX2dldGR3YXJmIChEd2ZsX01vZHVsZSAqLCBEd2FyZl9BZGRyICpiaWFzKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOworCisvKiBHZXQgdGhlIGxpYmR3IGhhbmRsZSBmb3IgZWFjaCBtb2R1bGUuICAqLworZXh0ZXJuIHB0cmRpZmZfdCBkd2ZsX2dldGR3YXJmIChEd2ZsICosCisJCQkJaW50ICgqY2FsbGJhY2spIChEd2ZsX01vZHVsZSAqLCB2b2lkICoqLAorCQkJCQkJIGNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKKwkJCQkJCSBEd2FyZiAqLCBEd2FyZl9BZGRyLCB2b2lkICopLAorCQkJCXZvaWQgKmFyZywgcHRyZGlmZl90IG9mZnNldCk7CisKKy8qIExvb2sgdXAgdGhlIG1vZHVsZSBjb250YWluaW5nIEFERFIgYW5kIHJldHVybiBpdHMgZGVidWdnaW5nIGluZm9ybWF0aW9uLAorICAgbG9hZGluZyBpdCBpZiBuZWNlc3NhcnkuICAqLworZXh0ZXJuIER3YXJmICpkd2ZsX2FkZHJkd2FyZiAoRHdmbCAqZHdmbCwgRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9BZGRyICpiaWFzKQorICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDMpOworCisKKy8qIEZpbmQgdGhlIENVIGNvbnRhaW5pbmcgQUREUiBhbmQgcmV0dXJuIGl0cyBESUUuICAqLworZXh0ZXJuIER3YXJmX0RpZSAqZHdmbF9hZGRyZGllIChEd2ZsICpkd2ZsLCBEd2FyZl9BZGRyIGFkZHIsIER3YXJmX0FkZHIgKmJpYXMpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7CitleHRlcm4gRHdhcmZfRGllICpkd2ZsX21vZHVsZV9hZGRyZGllIChEd2ZsX01vZHVsZSAqbW9kLAorCQkJCSAgICAgICBEd2FyZl9BZGRyIGFkZHIsIER3YXJmX0FkZHIgKmJpYXMpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7CisKKy8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgQ1VzLCBzdGFydCB3aXRoIG51bGwgZm9yIExBU1RDVS4gICovCitleHRlcm4gRHdhcmZfRGllICpkd2ZsX25leHRjdSAoRHdmbCAqZHdmbCwgRHdhcmZfRGllICpsYXN0Y3UsIER3YXJmX0FkZHIgKmJpYXMpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7CitleHRlcm4gRHdhcmZfRGllICpkd2ZsX21vZHVsZV9uZXh0Y3UgKER3ZmxfTW9kdWxlICptb2QsCisJCQkJICAgICAgRHdhcmZfRGllICpsYXN0Y3UsIER3YXJmX0FkZHIgKmJpYXMpCisgICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7CisKKy8qIFJldHVybiB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIENVIERJRS4gICovCitleHRlcm4gRHdmbF9Nb2R1bGUgKmR3ZmxfY3Vtb2R1bGUgKER3YXJmX0RpZSAqY3VkaWUpOworCisKKy8qIEdldCBzb3VyY2UgZm9yIGFkZHJlc3MuICAqLworZXh0ZXJuIER3ZmxfTGluZSAqZHdmbF9tb2R1bGVfZ2V0c3JjIChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9BZGRyIGFkZHIpOworZXh0ZXJuIER3ZmxfTGluZSAqZHdmbF9nZXRzcmMgKER3ZmwgKmR3ZmwsIER3YXJmX0FkZHIgYWRkcik7CisKKy8qIEdldCBhZGRyZXNzIGZvciBzb3VyY2UuICAqLworZXh0ZXJuIGludCBkd2ZsX21vZHVsZV9nZXRzcmNfZmlsZSAoRHdmbF9Nb2R1bGUgKm1vZCwKKwkJCQkgICAgY29uc3QgY2hhciAqZm5hbWUsIGludCBsaW5lbm8sIGludCBjb2x1bW4sCisJCQkJICAgIER3ZmxfTGluZSAqKipzcmNzcCwgc2l6ZV90ICpuc3Jjcyk7CisKKy8qIFJldHVybiB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgdGhpcyBsaW5lIHJlY29yZC4gICovCitleHRlcm4gRHdmbF9Nb2R1bGUgKmR3ZmxfbGluZW1vZHVsZSAoRHdmbF9MaW5lICpsaW5lKTsKKworLyogUmV0dXJuIHRoZSBzb3VyY2UgZmlsZSBuYW1lIGFuZCBmaWxsIGluIG90aGVyIGluZm9ybWF0aW9uLgorICAgQXJndW1lbnRzIG1heSBiZSBudWxsIGZvciB1bm5lZWRlZCBmaWVsZHMuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmR3ZmxfbGluZWluZm8gKER3ZmxfTGluZSAqbGluZSwgRHdhcmZfQWRkciAqYWRkciwKKwkJCQkgIGludCAqbGluZXAsIGludCAqY29scCwKKwkJCQkgIER3YXJmX1dvcmQgKm10aW1lLCBEd2FyZl9Xb3JkICpsZW5ndGgpOworCisKKy8qIEZpbmQgdGhlIHN5bWJvbCB0aGF0IEFERFJFU1MgbGllcyBpbnNpZGUsIGFuZCByZXR1cm4gaXRzIG5hbWUuICAqLworY29uc3QgY2hhciAqZHdmbF9tb2R1bGVfYWRkcm5hbWUgKER3ZmxfTW9kdWxlICptb2QsIEdFbGZfQWRkciBhZGRyZXNzKTsKKworCisKKyNlbmRpZgkvKiBsaWJkd2ZsLmggKi8KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvbGliZHdmbC5tYXAgYi9saWJkd2ZsL2xpYmR3ZmwubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjNkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2ZsL2xpYmR3ZmwubWFwCkBAIC0wLDAgKzEsMzkgQEAKK0VMRlVUSUxTXzEuMCB7CisgIGdsb2JhbDoKKyAgICBkd2ZsX2FkZHJkaWU7CisgICAgZHdmbF9hZGRyZHdhcmY7CisgICAgZHdmbF9hZGRybW9kdWxlOworICAgIGR3ZmxfYmVnaW47CisgICAgZHdmbF9lbmQ7CisgICAgZHdmbF9lcnJtc2c7CisgICAgZHdmbF9lcnJubzsKKyAgICBkd2ZsX2dldGR3YXJmOworICAgIGR3ZmxfZ2V0c3JjOworICAgIGR3ZmxfbGluZWN1OworICAgIGR3ZmxfbGluZWluZm87CisgICAgZHdmbF9saW5lbW9kdWxlOworICAgIGR3ZmxfbGludXhfa2VybmVsX2ZpbmRfZWxmOworICAgIGR3ZmxfbGludXhfa2VybmVsX21vZHVsZV9zZWN0aW9uX2FkZHJlc3M7CisgICAgZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X2tlcm5lbDsKKyAgICBkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfbW9kdWxlczsKKyAgICBkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGY7CisgICAgZHdmbF9saW51eF9wcm9jX3JlcG9ydDsKKyAgICBkd2ZsX21vZHVsZV9hZGRyZGllOworICAgIGR3ZmxfbW9kdWxlX2FkZHJuYW1lOworICAgIGR3ZmxfbW9kdWxlX2dldGR3YXJmOworICAgIGR3ZmxfbW9kdWxlX2dldGVsZjsKKyAgICBkd2ZsX21vZHVsZV9nZXRzcmM7CisgICAgZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGU7CisgICAgZHdmbF9tb2R1bGVfaW5mbzsKKyAgICBkd2ZsX21vZHVsZV9uZXh0Y3U7CisgICAgZHdmbF9uZXh0Y3U7CisgICAgZHdmbF9yZXBvcnRfYmVnaW47CisgICAgZHdmbF9yZXBvcnRfZWxmOworICAgIGR3ZmxfcmVwb3J0X2VuZDsKKyAgICBkd2ZsX3JlcG9ydF9tb2R1bGU7CisgICAgZHdmbF9zdGFuZGFyZF9hcmdwOworICAgIGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm87CisKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9saWJkd2ZsL2xpYmR3ZmxQLmggYi9saWJkd2ZsL2xpYmR3ZmxQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmNmJhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3ZmwvbGliZHdmbFAuaApAQCAtMCwwICsxLDIzNyBAQAorLyogSW50ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIGxpYmR3ZmwuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBfTElCRFdGTFBfSAorI2RlZmluZSBfTElCRFdGTFBfSAkxCisKKyNpZm5kZWYgUEFDS0FHRQorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpYmR3ZmwuaD4KKyNpbmNsdWRlIDxsaWJlYmwuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogZ2V0dGV4dCBoZWxwZXIgbWFjcm9zLiAgKi8KKyNkZWZpbmUgXyhTdHIpIGRnZXR0ZXh0ICgiZWxmdXRpbHMiLCBTdHIpCisKKyNkZWZpbmUgRFdGTF9FUlJPUlMJCQkJCQkJICAgICAgXAorICBEV0ZMX0VSUk9SIChOT0VSUk9SLCBOXygibm8gZXJyb3IiKSkJCQkJCSAgICAgIFwKKyAgRFdGTF9FUlJPUiAoVU5LTk9XTl9FUlJPUiwgTl8oInVua25vd24gZXJyb3IiKSkJCQkgICAgICBcCisgIERXRkxfRVJST1IgKE5PTUVNLCBOXygib3V0IG9mIG1lbW9yeSIpKQkJCQkgICAgICBcCisgIERXRkxfRVJST1IgKEVSUk5PLCBOXygiU2VlIGVycm5vIikpCQkJCQkgICAgICBcCisgIERXRkxfRVJST1IgKExJQkVMRiwgTl8oIlNlZSBlbGZfZXJybm8iKSkJCQkJICAgICAgXAorICBEV0ZMX0VSUk9SIChMSUJEVywgTl8oIlNlZSBkd2FyZl9lcnJubyIpKQkJCQkgICAgICBcCisgIERXRkxfRVJST1IgKExJQkVCTCwgTl8oIlNlZSBlYmxfZXJybm8gKFhYWCBtaXNzaW5nKSIpKQkJICAgICAgXAorICBEV0ZMX0VSUk9SIChOT1JFTCwgTl8oIkNhbGxiYWNrcyBtaXNzaW5nIGZvciBFVF9SRUwgZmlsZSIpKQkJICAgICAgXAorICBEV0ZMX0VSUk9SIChCQURSRUxUWVBFLCBOXygiVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIikpCQkgICAgICBcCisgIERXRkxfRVJST1IgKEJBRFJFTE9GRiwgTl8oInJfb2Zmc2V0IGlzIGJvZ3VzIikpCQkJICAgICAgXAorICBEV0ZMX0VSUk9SIChCQURTVFJPRkYsIE5fKCJvZmZzZXQgb3V0IG9mIHJhbmdlIikpCQkJICAgICAgXAorICBEV0ZMX0VSUk9SIChSRUxVTkRFRiwgTl8oInJlbG9jYXRpb24gcmVmZXJzIHRvIHVuZGVmaW5lZCBzeW1ib2wiKSkJICAgICAgXAorICBEV0ZMX0VSUk9SIChDQiwgTl8oIkNhbGxiYWNrIHJldHVybmVkIGZhaWx1cmUiKSkJCQkgICAgICBcCisgIERXRkxfRVJST1IgKE5PX0RXQVJGLCBOXygiTm8gRFdBUkYgaW5mb3JtYXRpb24gZm91bmQiKSkJCSAgICAgIFwKKyAgRFdGTF9FUlJPUiAoTk9fU1lNVEFCLCBOXygiTm8gc3ltYm9sIHRhYmxlIGZvdW5kIikpCQkJICAgICAgXAorICBEV0ZMX0VSUk9SIChOT19QSERSLCBOXygiTm8gRUxGIHByb2dyYW0gaGVhZGVycyIpKQkJCSAgICAgIFwKKyAgRFdGTF9FUlJPUiAoT1ZFUkxBUCwgTl8oImFkZHJlc3MgcmFuZ2Ugb3ZlcmxhcHMgYW4gZXhpc3RpbmcgbW9kdWxlIikpCSAgICAgIFwKKyAgRFdGTF9FUlJPUiAoQUREUl9PVVRPRlJBTkdFLCBOXygiYWRkcmVzcyBvdXQgb2YgcmFuZ2UiKSkJCSAgICAgIFwKKyAgRFdGTF9FUlJPUiAoTk9fTUFUQ0gsIE5fKCJubyBtYXRjaGluZyBhZGRyZXNzIHJhbmdlIikpCQkgICAgICBcCisgIERXRkxfRVJST1IgKFRSVU5DQVRFRCwgTl8oImltYWdlIHRydW5jYXRlZCIpKQkJCQkgICAgICBcCisgIERXRkxfRVJST1IgKEJBREVMRiwgTl8oIm5vdCBhIHZhbGlkIEVMRiBmaWxlIikpCisKKyNkZWZpbmUgRFdGTF9FUlJPUihuYW1lLCB0ZXh0KSBEV0ZMX0VfIyNuYW1lLAordHlwZWRlZiBlbnVtIHsgRFdGTF9FUlJPUlMgRFdGTF9FX05VTSB9IER3ZmxfRXJyb3I7CisjdW5kZWYJRFdGTF9FUlJPUgorCisjZGVmaW5lIE9USEVSX0VSUk9SKG5hbWUpCSgodW5zaWduZWQgaW50KSBEV0ZMX0VfIyNuYW1lIDw8IDE2KQorI2RlZmluZSBEV0ZMX0UobmFtZSwgZXJybm8pCShPVEhFUl9FUlJPUiAobmFtZSkgfCAoZXJybm8pKQorCitleHRlcm4gaW50IF9fbGliZHdmbF9jYW5vbl9lcnJvciAoRHdmbF9FcnJvciBlcnJvcikgaW50ZXJuYWxfZnVuY3Rpb247CitleHRlcm4gdm9pZCBfX2xpYmR3Zmxfc2V0ZXJybm8gKER3ZmxfRXJyb3IgZXJyb3IpIGludGVybmFsX2Z1bmN0aW9uOworCitzdHJ1Y3QgRHdmbAoreworICBjb25zdCBEd2ZsX0NhbGxiYWNrcyAqY2FsbGJhY2tzOworCisgIER3ZmxfTW9kdWxlICptb2R1bGVsaXN0OyAgICAvKiBMaXN0IGluIG9yZGVyIHVzZWQgYnkgZnVsbCB0cmF2ZXJzYWxzLiAgKi8KKworICBEd2ZsX01vZHVsZSAqKm1vZHVsZXM7CisgIHNpemVfdCBubW9kdWxlczsKK307CisKK3N0cnVjdCBkd2ZsX2ZpbGUKK3sKKyAgY2hhciAqbmFtZTsKKyAgaW50IGZkOworCisgIEVsZiAqZWxmOworICBHRWxmX0FkZHIgYmlhczsJCS8qIEFjdHVhbCBsb2FkIGFkZHJlc3MgLSBwX3ZhZGRyLiAgKi8KK307CisKK3N0cnVjdCBEd2ZsX01vZHVsZQoreworICBEd2ZsICpkd2ZsOworICBzdHJ1Y3QgRHdmbF9Nb2R1bGUgKm5leHQ7CS8qIExpbmsgb24gRHdmbC5tb2R1ZWxpc3QuICAqLworCisgIHZvaWQgKnVzZXJkYXRhOworCisgIGNoYXIgKm5hbWU7CQkJLyogSXRlcmF0b3IgbmFtZSBmb3IgdGhpcyBtb2R1bGUuICAqLworICBHRWxmX0FkZHIgbG93X2FkZHIsIGhpZ2hfYWRkcjsKKworICBzdHJ1Y3QgZHdmbF9maWxlIG1haW4sIGRlYnVnOworICBFYmwgKmVibDsKKyAgYm9vbCBpc3JlbDsJCQkvKiBUcnVlIGlmZiB0aGlzIGlzIGFuIEVUX1JFTCBmaWxlLiAgKi8KKyAgRHdmbF9FcnJvciBlbGZlcnI7CQkvKiBQcmV2aW91cyBmYWlsdXJlIHRvIG9wZW4gbWFpbiBmaWxlLiAgKi8KKworICBzdHJ1Y3QgZHdmbF9maWxlICpzeW1maWxlOwkvKiBFaXRoZXIgbWFpbiBvciBkZWJ1Zy4gICovCisgIEVsZl9EYXRhICpzeW1kYXRhOwkJLyogRGF0YSBpbiB0aGUgRUxGIHN5bWJvbCB0YWJsZSBzZWN0aW9uLiAgKi8KKyAgc2l6ZV90IHN5bWVudHM7CQkvKiBzaF9zaXplIC8gc2hfZW50c2l6ZSBvZiB0aGF0IHNlY3Rpb24uICAqLworICBjb25zdCBFbGZfRGF0YSAqc3ltc3RyZGF0YTsJLyogRGF0YSBmb3IgaXRzIHN0cmluZyB0YWJsZS4gICovCisgIEVsZl9EYXRhICpzeW14bmR4ZGF0YTsJLyogRGF0YSBpbiB0aGUgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZS4gKi8KKyAgRHdmbF9FcnJvciBzeW1lcnI7CQkvKiBQcmV2aW91cyBmYWlsdXJlIHRvIGxvYWQgc3ltYm9scy4gICovCisKKyAgRHdhcmYgKmR3OwkJCS8qIGxpYmR3IGhhbmRsZSBmb3IgaXRzIGRlYnVnZ2luZyBpbmZvLiAgKi8KKyAgRHdmbF9FcnJvciBkd2VycjsJCS8qIFByZXZpb3VzIGZhaWx1cmUgdG8gbG9hZCBpbmZvLiAgKi8KKworICAvKiBLbm93biBDVSdzIGluIHRoaXMgbW9kdWxlLiAgKi8KKyAgc3RydWN0IGR3ZmxfY3UgKmZpcnN0X2N1LCAqKmN1OworICB1bnNpZ25lZCBpbnQgbmN1OworCisgIHZvaWQgKmxhenlfY3Vfcm9vdDsJCS8qIFRhYmxlIGluZGV4ZWQgYnkgRHdhcmZfT2ZmIG9mIENVLiAgKi8KKyAgdW5zaWduZWQgaW50IGxhenljdTsJCS8qIFBvc3NpYmxlIHVzZXJzLCBkZWxldGVkIHdoZW4gbm9uZSBsZWZ0LiAgKi8KKworICBzdHJ1Y3QgZHdmbF9hcmFuZ2UgKmFyYW5nZXM7CS8qIE1hcHBpbmcgb2YgYWRkcmVzc2VzIGluIG1vZHVsZSB0byBDVXMuICAqLworICB1bnNpZ25lZCBpbnQgbmFyYW5nZXM7CisKKyAgYm9vbCBnYzsJCQkvKiBNYXJrL3N3ZWVwIGZsYWcuICAqLworfTsKKworCisKKy8qIEluZm9ybWF0aW9uIGNhY2hlZCBhYm91dCBlYWNoIENVIGluIER3ZmxfTW9kdWxlLmR3LiAgKi8KK3N0cnVjdCBkd2ZsX2N1Cit7CisgIC8qIFRoaXMgY2FjaGVzIGxpYmR3IGluZm9ybWF0aW9uIGFib3V0IHRoZSBDVS4gIEl0J3MgYWxzbyB0aGUKKyAgICAgYWRkcmVzcyBwYXNzZWQgYmFjayB0byB1c2Vycywgc28gd2UgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlCisgICAgIGZhY3QgdGhhdCBpdCdzIHBsYWNlZCBmaXJzdCB0byBjYXN0IGJhY2suICAqLworICBEd2FyZl9EaWUgZGllOworCisgIER3ZmxfTW9kdWxlICptb2Q7CQkvKiBQb2ludGVyIGJhY2sgdG8gY29udGFpbmluZyBtb2R1bGUuICAqLworCisgIHN0cnVjdCBkd2ZsX2N1ICpuZXh0OwkJLyogQ1UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGluIHRoZSBmaWxlLiAgKi8KKworICBzdHJ1Y3QgRHdmbF9MaW5lcyAqbGluZXM7Cit9OworCitzdHJ1Y3QgRHdmbF9MaW5lcworeworICBzdHJ1Y3QgZHdmbF9jdSAqY3U7CisKKyAgLyogVGhpcyBpcyB3aGF0IHRoZSBvcGFxdWUgRHdmbF9MaW5lICogcG9pbnRlcnMgd2UgcGFzcyB0byB1c2VycyBhcmUuCisgICAgIFdlIG5lZWQgdG8gcmVjb3ZlciBwb2ludGVycyB0byBvdXIgc3RydWN0IGR3ZmxfY3UgYW5kIGEgcmVjb3JkIGluCisgICAgIGxpYmR3J3MgRHdhcmZfTGluZSB0YWJsZS4gIFRvIG1pbmltaXplIHRoZSBtZW1vcnkgdXNlZCBpbiBhZGRpdGlvbgorICAgICB0byBsaWJkdydzIER3YXJmX0xpbmVzIGJ1ZmZlciwgd2UganVzdCBwb2ludCB0byBvdXIgb3duIGluZGV4IGluCisgICAgIHRoaXMgdGFibGUsIGFuZCBoYXZlIG9uZSBwb2ludGVyIGJhY2sgdG8gdGhlIENVLiAgVGhlIGluZGljZXMgaGVyZQorICAgICBtYXRjaCB0aG9zZSBpbiBsaWJkdydzIER3YXJmX0NVLmxpbmVzLT5pbmZvIHRhYmxlLiAgKi8KKyAgc3RydWN0IER3ZmxfTGluZQorICB7CisgICAgdW5zaWduZWQgaW50IGlkeDsJCS8qIE15IGluZGV4IGluIHRoZSBkd2ZsX2N1LmxpbmVzIHRhYmxlLiAgKi8KKyAgfSBpZHhbMF07Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkd2ZsX2N1ICoKK2R3ZmxfbGluZWN1IChjb25zdCBEd2ZsX0xpbmUgKmxpbmUpCit7CisgIGNvbnN0IHN0cnVjdCBEd2ZsX0xpbmVzICpsaW5lcyA9ICgoY29uc3Qgdm9pZCAqKSBsaW5lCisJCQkJICAgIC0gb2Zmc2V0b2YgKHN0cnVjdCBEd2ZsX0xpbmVzLAorCQkJCQkJaWR4W2xpbmUtPmlkeF0pKTsKKyAgcmV0dXJuIGxpbmVzLT5jdTsKK30KKworLyogVGhpcyBkZXNjcmliZXMgYSBjb250aWd1b3VzIGFkZHJlc3MgcmFuZ2UgdGhhdCBsaWVzIGluIGEgc2luZ2xlIENVLgorICAgV2UgY29uZGVuc2UgcnVucyBvZiBEd2FyZl9BcmFuZ2UgZW50cmllcyBmb3IgdGhlIHNhbWUgQ1UgaW50byB0aGlzLiAgKi8KK3N0cnVjdCBkd2ZsX2FyYW5nZQoreworICBzdHJ1Y3QgZHdmbF9jdSAqY3U7CisgIHNpemVfdCBhcmFuZ2U7CQkvKiBJbmRleCBpbiBEd2FyZl9BcmFuZ2VzLiAgKi8KK307CisKKworCisKK2V4dGVybiB2b2lkIF9fbGliZHdmbF9tb2R1bGVfZnJlZSAoRHdmbF9Nb2R1bGUgKm1vZCkgaW50ZXJuYWxfZnVuY3Rpb247CisKKworLyogUHJvY2VzcyByZWxvY2F0aW9ucyBpbiBkZWJ1Z2dpbmcgc2VjdGlvbnMgaW4gYW4gRVRfUkVMIGZpbGUuCisgICBNT0QtPmRlYnVnLmVsZiBtdXN0IGJlIG9wZW5lZCB3aXRoIEVMRl9DX1JFQURfTU1BUF9QUklWQVRFIG9yIEVMRl9DX1JFQUQsCisgICB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlbG9jYXRlIHRoZSBkYXRhIGluIHBsYWNlIChvciBFTEZfQ19SRFdSIG9yCisgICBFTEZfQ19SRFdSX01NQVAgaWYgeW91IGludGVuZCB0byBtb2RpZnkgdGhlIEVsZiBmaWxlIG9uIGRpc2spLiAgQWZ0ZXIKKyAgIHRoaXMsIGR3YXJmX2JlZ2luX2VsZiBvbiBNT0QtPmRlYnVnLmVsZiB3aWxsIHJlYWQgdGhlIHJlbG9jYXRlZCBkYXRhLiAgKi8KK2V4dGVybiBEd2ZsX0Vycm9yIF9fbGliZHdmbF9yZWxvY2F0ZSAoRHdmbF9Nb2R1bGUgKikgaW50ZXJuYWxfZnVuY3Rpb247CisKKy8qIEFkanVzdCAqVkFMVUUgZnJvbSBzZWN0aW9uLXJlbGF0aXZlIHRvIGFic29sdXRlLgorICAgTU9ELT5kd2ZsLT5jYWxsYmFja3MtPnNlY3Rpb25fYWRkcmVzcyBpcyBjYWxsZWQgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwKKyAgIGFkZHJlc3Mgb2YgYSBsb2FkZWQgc2VjdGlvbi4gICovCitleHRlcm4gRHdmbF9FcnJvciBfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUgKER3ZmxfTW9kdWxlICptb2QsCisJCQkJCSAgICBzaXplX3QgbV9zaHN0cm5keCwKKwkJCQkJICAgIEVsZjMyX1dvcmQgc2huZHgsCisJCQkJCSAgICBHRWxmX0FkZHIgKnZhbHVlKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKworLyogSXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgQ1UncyBpbiB0aGUgbW9kdWxlLiAgU3RhcnQgYnkgcGFzc2luZyBhIG51bGwKKyAgIExBU1RDVSwgYW5kIHRoZW4gcGFzcyB0aGUgbGFzdCAqQ1UgcmV0dXJuZWQuICBTdWNjZXNzIHJldHVybiB3aXRoIG51bGwKKyAgICpDVSBubyBtb3JlIENVcy4gICovCitleHRlcm4gRHdmbF9FcnJvciBfX2xpYmR3ZmxfbmV4dGN1IChEd2ZsX01vZHVsZSAqbW9kLCBzdHJ1Y3QgZHdmbF9jdSAqbGFzdGN1LAorCQkJCSAgICBzdHJ1Y3QgZHdmbF9jdSAqKmN1KSBpbnRlcm5hbF9mdW5jdGlvbjsKKworLyogRmluZCB0aGUgQ1UgYnkgYWRkcmVzcy4gICovCitleHRlcm4gRHdmbF9FcnJvciBfX2xpYmR3ZmxfYWRkcmN1IChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9BZGRyIGFkZHIsCisJCQkJICAgIHN0cnVjdCBkd2ZsX2N1ICoqY3UpIGludGVybmFsX2Z1bmN0aW9uOworCisvKiBFbnN1cmUgdGhhdCBDVS0+bGluZXMgKGFuZCBDVS0+Y3UtPmxpbmVzKSBpcyBzZXQgdXAuICAqLworZXh0ZXJuIER3ZmxfRXJyb3IgX19saWJkd2ZsX2N1X2dldHNyY2xpbmVzIChzdHJ1Y3QgZHdmbF9jdSAqY3UpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworCisKKworCisvKiBBdm9pZCBQTFQgZW50cmllcy4gICovCitJTlRERUNMIChkd2ZsX2JlZ2luKQorSU5UREVDTCAoZHdmbF9lcnJtc2cpCitJTlRERUNMIChkd2ZsX2FkZHJtb2R1bGUpCitJTlRERUNMIChkd2ZsX2FkZHJkd2FyZikKK0lOVERFQ0wgKGR3ZmxfYWRkcmRpZSkKK0lOVERFQ0wgKGR3ZmxfbW9kdWxlX2FkZHJkaWUpCitJTlRERUNMIChkd2ZsX21vZHVsZV9nZXRkd2FyZikKK0lOVERFQ0wgKGR3ZmxfbW9kdWxlX2dldGVsZikKK0lOVERFQ0wgKGR3ZmxfbW9kdWxlX2dldHNyYykKK0lOVERFQ0wgKGR3ZmxfcmVwb3J0X2VsZikKK0lOVERFQ0wgKGR3ZmxfcmVwb3J0X2JlZ2luKQorSU5UREVDTCAoZHdmbF9yZXBvcnRfbW9kdWxlKQorSU5UREVDTCAoZHdmbF9yZXBvcnRfZW5kKQorSU5UREVDTCAoZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbykKK0lOVERFQ0wgKGR3ZmxfbGludXhfa2VybmVsX2ZpbmRfZWxmKQorSU5UREVDTCAoZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcykKK0lOVERFQ0wgKGR3ZmxfbGludXhfcHJvY19yZXBvcnQpCitJTlRERUNMIChkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGYpCitJTlRERUNMIChkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfa2VybmVsKQorSU5UREVDTCAoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X21vZHVsZXMpCisKKy8qIExlYWRpbmcgYXJndW1lbnRzIHN0YW5kYXJkIHRvIGNhbGxiYWNrcyBwYXNzZWQgYSBEd2ZsX01vZHVsZS4gICovCisjZGVmaW5lIE1PRENCX0FSR1MobW9kKQkobW9kKSwgJihtb2QpLT51c2VyZGF0YSwgKG1vZCktPm5hbWUsIChtb2QpLT5sb3dfYWRkcgorI2RlZmluZSBDQkZBSUwJCShlcnJubyA/IERXRkxfRSAoRVJSTk8sIGVycm5vKSA6IERXRkxfRV9DQik7CisKKworI2VuZGlmCS8qIGxpYmR3ZmxQLmggKi8KZGlmZiAtLWdpdCBhL2xpYmR3ZmwvbGluZXMuYyBiL2xpYmR3ZmwvbGluZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWI0YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9saW5lcy5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIEZldGNoIHNvdXJjZSBsaW5lIGluZm8gZm9yIENVLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlICJsaWJkd2ZsUC5oIgorI2luY2x1ZGUgIi4uL2xpYmR3L2xpYmR3UC5oIgorCitEd2ZsX0Vycm9yCitpbnRlcm5hbF9mdW5jdGlvbl9kZWYKK19fbGliZHdmbF9jdV9nZXRzcmNsaW5lcyAoc3RydWN0IGR3ZmxfY3UgKmN1KQoreworICBpZiAoY3UtPmxpbmVzID09IE5VTEwpCisgICAgeworICAgICAgRHdhcmZfTGluZXMgKmxpbmVzOworICAgICAgc2l6ZV90IG5saW5lczsKKyAgICAgIGlmIChkd2FyZl9nZXRzcmNsaW5lcyAoJmN1LT5kaWUsICZsaW5lcywgJm5saW5lcykgIT0gMCkKKwlyZXR1cm4gRFdGTF9FX0xJQkRXOworCisgICAgICBjdS0+bGluZXMgPSBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3QgRHdmbF9MaW5lcywgaWR4W25saW5lc10pKTsKKyAgICAgIGlmIChjdS0+bGluZXMgPT0gTlVMTCkKKwlyZXR1cm4gRFdGTF9FX05PTUVNOworICAgICAgY3UtPmxpbmVzLT5jdSA9IGN1OworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBubGluZXM7ICsraSkKKwljdS0+bGluZXMtPmlkeFtpXS5pZHggPSBpOworICAgIH0KKworICByZXR1cm4gRFdGTF9FX05PRVJST1I7Cit9CmRpZmYgLS1naXQgYS9saWJkd2ZsL2xpbnV4LWtlcm5lbC1tb2R1bGVzLmMgYi9saWJkd2ZsL2xpbnV4LWtlcm5lbC1tb2R1bGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlNWNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3ZmwvbGludXgta2VybmVsLW1vZHVsZXMuYwpAQCAtMCwwICsxLDI0MyBAQAorLyogU3RhbmRhcmQgbGliZHdmbCBjYWxsYmFja3MgZm9yIGRlYnVnZ2luZyB0aGUgcnVubmluZyBMaW51eCBrZXJuZWwuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI3VuZGVmCV9GSUxFX09GRlNFVF9CSVRTCS8qIERvZXNuJ3QgamliZSB3aXRoIGZ0cy4gICovCisKKyNpbmNsdWRlICJsaWJkd2ZsUC5oIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmdHMuaD4KKworCisjZGVmaW5lIE1PRFVMRURJUkZNVAkiL2xpYi9tb2R1bGVzLyVzIgorCisjZGVmaW5lIE1PRFVMRUxJU1QJIi9wcm9jL21vZHVsZXMiCisjZGVmaW5lCVNFQ0FERFJGTVQJIi9zeXMvbW9kdWxlLyVzL3NlY3Rpb25zLyVzIgorCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCitrZXJuZWxfcmVsZWFzZSAodm9pZCkKK3sKKyAgLyogQ2FjaGUgdGhlIGB1bmFtZSAtcmAgc3RyaW5nIHdlJ2xsIHVzZS4gICovCisgIHN0YXRpYyBzdHJ1Y3QgdXRzbmFtZSB1dHNuYW1lOworICBpZiAodXRzbmFtZS5yZWxlYXNlWzBdID09ICdcMCcgJiYgdW5hbWUgKCZ1dHNuYW1lKSAhPSAwKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gdXRzbmFtZS5yZWxlYXNlOworfQorCisvKiBGaW5kIHRoZSBFTEYgZmlsZSBmb3IgdGhlIHJ1bm5pbmcga2VybmVsIGFuZCBkd2ZsX3JlcG9ydF9lbGYgaXQuICAqLworaW50Citkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfa2VybmVsIChEd2ZsICpkd2ZsKQoreworICBpZiAoZHdmbCA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBjb25zdCBjaGFyICpyZWxlYXNlID0ga2VybmVsX3JlbGVhc2UgKCk7CisgIGlmIChyZWxlYXNlID09IE5VTEwpCisgICAgcmV0dXJuIGVycm5vOworCisgIGNoYXIgKmZuYW1lID0gTlVMTDsKKyAgYXNwcmludGYgKCZmbmFtZSwgIi9ib290L3ZtbGludXgtJXMiLCByZWxlYXNlKTsKKyAgaWYgKGZuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBpbnQgZmQgPSBvcGVuNjQgKGZuYW1lLCBPX1JET05MWSk7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgZnJlZSAoZm5hbWUpOworICAgICAgZm5hbWUgPSBOVUxMOworICAgICAgYXNwcmludGYgKCZmbmFtZSwgIi91c3IvbGliL2RlYnVnIiBNT0RVTEVESVJGTVQgIi92bWxpbnV4IiwgcmVsZWFzZSk7CisgICAgICBpZiAoZm5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisgICAgICBmZCA9IG9wZW42NCAoZm5hbWUsIE9fUkRPTkxZKTsKKyAgICB9CisKKyAgaW50IHJlc3VsdCA9IDA7CisgIGlmIChmZCA8IDApCisgICAgcmVzdWx0ID0gZXJybm87CisgIGVsc2UgaWYgKElOVFVTRShkd2ZsX3JlcG9ydF9lbGYpIChkd2ZsLCAia2VybmVsIiwgZm5hbWUsIGZkLCAwKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNsb3NlIChmZCk7CisgICAgICByZXN1bHQgPSAtMTsKKyAgICB9CisKKyAgZnJlZSAoZm5hbWUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CitJTlRERUYgKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9rZXJuZWwpCisKKy8qIER3ZmxfQ2FsbGJhY2tzLmZpbmRfZWxmIGZvciB0aGUgcnVubmluZyBMaW51eCBrZXJuZWwgYW5kIGl0cyBtb2R1bGVzLiAgKi8KKworaW50Citkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZiAoRHdmbF9Nb2R1bGUgKm1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICAgdm9pZCAqKnVzZXJkYXRhIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKKwkJCSAgICBEd2FyZl9BZGRyIGJhc2UgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgIGNoYXIgKipmaWxlX25hbWUsCisJCQkgICAgRWxmICoqZWxmcCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGNvbnN0IGNoYXIgKnJlbGVhc2UgPSBrZXJuZWxfcmVsZWFzZSAoKTsKKyAgaWYgKHJlbGVhc2UgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogRG8gImZpbmQgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAgLW5hbWUgTU9EVUxFX05BTUUua28iLiAgKi8KKworICBjaGFyICptb2R1bGVzZGlyW10gPSB7IE5VTEwsIE5VTEwgfTsKKyAgYXNwcmludGYgKCZtb2R1bGVzZGlyWzBdLCBNT0RVTEVESVJGTVQgIi9rZXJuZWwiLCByZWxlYXNlKTsKKyAgaWYgKG1vZHVsZXNkaXJbMF0gPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgRlRTICpmdHMgPSBmdHNfb3BlbiAobW9kdWxlc2RpciwgRlRTX0xPR0lDQUwgfCBGVFNfTk9TVEFULCBOVUxMKTsKKyAgaWYgKGZ0cyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKG1vZHVsZXNkaXJbMF0pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBzaXplX3QgbmFtZWxlbiA9IHN0cmxlbiAobW9kdWxlX25hbWUpOworICBGVFNFTlQgKmY7CisgIGludCBlcnJvciA9IEVOT0VOVDsKKyAgd2hpbGUgKChmID0gZnRzX3JlYWQgKGZ0cykpICE9IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgPSBFTk9FTlQ7CisgICAgICBzd2l0Y2ggKGYtPmZ0c19pbmZvKQorCXsKKwljYXNlIEZUU19GOgorCWNhc2UgRlRTX05TT0s6CisJICAvKiBTZWUgaWYgdGhpcyBmaWxlIG5hbWUgaXMgIk1PRFVMRV9OQU1FLmtvIi4gICovCisJICBpZiAoZi0+ZnRzX25hbWVsZW4gPT0gbmFtZWxlbiArIDMKKwkgICAgICAmJiAhbWVtY21wIChmLT5mdHNfbmFtZSwgbW9kdWxlX25hbWUsIG5hbWVsZW4pCisJICAgICAgJiYgIW1lbWNtcCAoZi0+ZnRzX25hbWUgKyBuYW1lbGVuLCAiLmtvIiwgNCkpCisJICAgIHsKKwkgICAgICBpbnQgZmQgPSBvcGVuNjQgKGYtPmZ0c19hY2NwYXRoLCBPX1JET05MWSk7CisJICAgICAgKmZpbGVfbmFtZSA9IHN0cmR1cCAoZi0+ZnRzX3BhdGgpOworCSAgICAgIGZ0c19jbG9zZSAoZnRzKTsKKwkgICAgICBpZiAoZmQgPCAwKQorCQlmcmVlICgqZmlsZV9uYW1lKTsKKwkgICAgICBlbHNlIGlmICgqZmlsZV9uYW1lID09IE5VTEwpCisJCXsKKwkJICBjbG9zZSAoZmQpOworCQkgIGZkID0gLTE7CisJCX0KKwkgICAgICByZXR1cm4gZmQ7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBGVFNfRVJSOgorCWNhc2UgRlRTX0ROUjoKKwljYXNlIEZUU19OUzoKKwkgIGVycm9yID0gZi0+ZnRzX2Vycm5vOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KKworICBlcnJubyA9IGVycm9yOworICByZXR1cm4gLTE7Cit9CitJTlRERUYgKGR3ZmxfbGludXhfa2VybmVsX2ZpbmRfZWxmKQorCisvKiBEd2ZsX0NhbGxiYWNrcy5zZWN0aW9uX2FkZHJlc3MgZm9yIGtlcm5lbCBtb2R1bGVzIGluIHRoZSBydW5uaW5nIExpbnV4LgorICAgV2UgcmVhZCB0aGUgaW5mb3JtYXRpb24gZnJvbSAvc3lzL21vZHVsZSBkaXJlY3RseS4gICovCisKK2ludAorZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcworKER3ZmxfTW9kdWxlICptb2QgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisgY29uc3QgY2hhciAqbW9kbmFtZSwgRHdhcmZfQWRkciBiYXNlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKyBjb25zdCBjaGFyICpzZWNuYW1lLCBEd2FyZl9BZGRyICphZGRyKQoreworICBjaGFyICpzeXNmaWxlID0gTlVMTDsKKyAgYXNwcmludGYgKCZzeXNmaWxlLCBTRUNBRERSRk1ULCBtb2RuYW1lLCBzZWNuYW1lKTsKKyAgaWYgKHN5c2ZpbGUgPT0gTlVMTCkKKyAgICByZXR1cm4gRU5PTUVNOworCisgIEZJTEUgKmYgPSBmb3BlbiAoc3lzZmlsZSwgInIiKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UKQorCXsKKwkgIC8qIFRoZSAubW9kaW5mbyBhbmQgLmRhdGEucGVyY3B1IHNlY3Rpb25zIGFyZSBuZXZlciBrZXB0CisJICAgICBsb2FkZWQgaW4gdGhlIGtlcm5lbC4gIElmIHRoZSBrZXJuZWwgd2FzIGNvbXBpbGVkIHdpdGhvdXQKKwkgICAgIENPTkZJR19NT0RVTEVfVU5MT0FELCB0aGUgLmV4aXQuKiBzZWN0aW9ucyBhcmUgbm90CisJICAgICBhY3R1YWxseSBsb2FkZWQgYXQgYWxsLgorCisJICAgICBKdXN0IHJlbG9jYXRlIHRoZXNlIGJvZ3VzbHkgdG8gemVyby4gIFRoaXMgcGFydCBvZiB0aGUKKwkgICAgIGRlYnVnIGluZm9ybWF0aW9uIHdpbGwgbm90IGJlIG9mIGFueSB1c2UuICAqLworCisJICBpZiAoIXN0cmNtcCAoc2VjbmFtZSwgIi5tb2RpbmZvIikKKwkgICAgICB8fCAhc3RyY21wIChzZWNuYW1lLCAiLmRhdGEucGVyY3B1IikKKwkgICAgICB8fCAhc3RybmNtcCAoc2VjbmFtZSwgIi5leGl0IiwgNSkpCisJICAgIHsKKwkgICAgICAqYWRkciA9IDA7CisJICAgICAgcmV0dXJuIERXQVJGX0NCX09LOworCSAgICB9CisJfQorCisgICAgICByZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7CisgICAgfQorCisgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChmLCBGU0VUTE9DS0lOR19CWUNBTExFUik7CisKKyAgaW50IHJlc3VsdCA9IChmc2NhbmYgKGYsICIlIiBQUklpNjQgIlxuIiwgYWRkcikgPT0gMSA/IDAKKwkJOiBmZXJyb3JfdW5sb2NrZWQgKGYpID8gZXJybm8gOiBFTk9FWEVDKTsKKyAgZmNsb3NlIChmKTsKKworICBpZiAocmVzdWx0ID09IDApCisgICAgcmV0dXJuIERXQVJGX0NCX09LOworCisgIGVycm5vID0gcmVzdWx0OworICByZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Cit9CitJTlRERUYgKGR3ZmxfbGludXhfa2VybmVsX21vZHVsZV9zZWN0aW9uX2FkZHJlc3MpCisKK2ludAorZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X21vZHVsZXMgKER3ZmwgKmR3ZmwpCit7CisgIEZJTEUgKmYgPSBmb3BlbiAoTU9EVUxFTElTVCwgInIiKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICByZXR1cm4gZXJybm87CisKKyAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKGYsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKworICBpbnQgcmVzdWx0ID0gMDsKKyAgRHdhcmZfQWRkciBtb2RhZGRyOworICB1bnNpZ25lZCBsb25nIGludCBtb2RzejsKKyAgY2hhciBtb2RuYW1lWzEyOF07CisgIHdoaWxlIChmc2NhbmYgKGYsICIlMTI4cyAlbHUgJSpzICUqcyAlKnMgJSIgUFJJaTY0ICJcbiIsCisJCSBtb2RuYW1lLCAmbW9kc3osICZtb2RhZGRyKSA9PSAzKQorICAgIGlmIChJTlRVU0UoZHdmbF9yZXBvcnRfbW9kdWxlKSAoZHdmbCwgbW9kbmFtZSwKKwkJCQkgICAgbW9kYWRkciwgbW9kYWRkciArIG1vZHN6KSA9PSBOVUxMKQorICAgICAgeworCXJlc3VsdCA9IC0xOworCWJyZWFrOworICAgICAgfQorCisgIGlmIChyZXN1bHQgPT0gMCkKKyAgICByZXN1bHQgPSBmZXJyb3JfdW5sb2NrZWQgKGYpID8gZXJybm8gOiBmZW9mX3VubG9ja2VkIChmKSA/IDAgOiBFTk9FWEVDOworCisgIGZjbG9zZSAoZik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KK0lOVERFRiAoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X21vZHVsZXMpCmRpZmYgLS1naXQgYS9saWJkd2ZsL2xpbnV4LXByb2MtbWFwcy5jIGIvbGliZHdmbC9saW51eC1wcm9jLW1hcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjExYzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9saW51eC1wcm9jLW1hcHMuYwpAQCAtMCwwICsxLDI4NSBAQAorLyogU3RhbmRhcmQgbGliZHdmbCBjYWxsYmFja3MgZm9yIGRlYnVnZ2luZyBhIGxpdmUgTGludXggcHJvY2Vzcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSAibGliZHdmbFAuaCIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpb19leHQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworCisjZGVmaW5lIFBST0NNQVBTRk1UCSIvcHJvYy8lZC9tYXBzIgorI2RlZmluZSBQUk9DTUVNRk1UCSIvcHJvYy8lZC9tZW0iCisjZGVmaW5lIFBST0NBVVhWRk1UCSIvcHJvYy8lZC9hdXh2IgorCisKKy8qIFNlYXJjaCAvcHJvYy9QSUQvYXV4diBmb3IgdGhlIEFUX1NZU0lORk9fRUhEUiB0YWcuICAqLworCitzdGF0aWMgaW50CitmaW5kX3N5c2luZm9fZWhkciAocGlkX3QgcGlkLCBHRWxmX0FkZHIgKnN5c2luZm9fZWhkcikKK3sKKyAgY2hhciAqZm5hbWUgPSBOVUxMOworICBhc3ByaW50ZiAoJmZuYW1lLCBQUk9DQVVYVkZNVCwgcGlkKTsKKyAgaWYgKGZuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIEVOT01FTTsKKworICBpbnQgZmQgPSBvcGVuNjQgKGZuYW1lLCBPX1JET05MWSk7CisgIGZyZWUgKGZuYW1lKTsKKyAgaWYgKGZkIDwgMCkKKyAgICByZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IGVycm5vOworCisgIHNzaXplX3QgbnJlYWQ7CisgIGRvCisgICAgeworICAgICAgdW5pb24KKyAgICAgIHsKKwljaGFyIGJ1ZmZlcltzaXplb2YgKGxvbmcgaW50KSAqIDIgKiA2NF07CisJRWxmNjRfYXV4dl90IGE2NFtzaXplb2YgKGxvbmcgaW50KSAqIDIgKiA2NCAvIHNpemVvZiAoRWxmNjRfYXV4dl90KV07CisJRWxmMzJfYXV4dl90IGEzMltzaXplb2YgKGxvbmcgaW50KSAqIDIgKiAzMiAvIHNpemVvZiAoRWxmMzJfYXV4dl90KV07CisgICAgICB9IGQ7CisgICAgICBucmVhZCA9IHJlYWQgKGZkLCAmZCwgc2l6ZW9mIGQpOworICAgICAgaWYgKG5yZWFkID4gMCkKKwl7CisJICBzd2l0Y2ggKHNpemVvZiAobG9uZyBpbnQpKQorCSAgICB7CisJICAgIGNhc2UgNDoKKwkgICAgICBmb3IgKHNpemVfdCBpID0gMDsgKGNoYXIgKikgJmQuYTMyW2ldIDwgJmQuYnVmZmVyW25yZWFkXTsgKytpKQorCQlpZiAoZC5hMzJbaV0uYV90eXBlID09IEFUX1NZU0lORk9fRUhEUikKKwkJICB7CisJCSAgICAqc3lzaW5mb19laGRyID0gZC5hMzJbaV0uYV91bi5hX3ZhbDsKKwkJICAgIG5yZWFkID0gMDsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSA4OgorCSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyAoY2hhciAqKSAmZC5hNjRbaV0gPCAmZC5idWZmZXJbbnJlYWRdOyArK2kpCisJCWlmIChkLmE2NFtpXS5hX3R5cGUgPT0gQVRfU1lTSU5GT19FSERSKQorCQkgIHsKKwkJICAgICpzeXNpbmZvX2VoZHIgPSBkLmE2NFtpXS5hX3VuLmFfdmFsOworCQkgICAgbnJlYWQgPSAwOworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0ICgpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgd2hpbGUgKG5yZWFkID4gMCk7CisKKyAgY2xvc2UgKGZkKTsKKworICByZXR1cm4gbnJlYWQgPCAwID8gZXJybm8gOiAwOworfQorCitpbnQKK2R3ZmxfbGludXhfcHJvY19yZXBvcnQgKER3ZmwgKmR3ZmwsIHBpZF90IHBpZCkKK3sKKyAgaWYgKGR3ZmwgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogV2UnbGwgbm90aWNlIHRoZSBBVF9TWVNJTkZPX0VIRFIgYWRkcmVzcyBzcGVjaWFsbHkgd2hlbiB3ZSBoaXQgaXQuICAqLworICBHRWxmX0FkZHIgc3lzaW5mb19laGRyID0gMDsKKyAgaW50IHJlc3VsdCA9IGZpbmRfc3lzaW5mb19laGRyIChwaWQsICZzeXNpbmZvX2VoZHIpOworICBpZiAocmVzdWx0ICE9IDApCisgICAgcmV0dXJuIHJlc3VsdDsKKworICBjaGFyICpmbmFtZSA9IE5VTEw7CisgIGFzcHJpbnRmICgmZm5hbWUsIFBST0NNQVBTRk1ULCBwaWQpOworICBpZiAoZm5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gRU5PTUVNOworCisgIEZJTEUgKmYgPSBmb3BlbiAoZm5hbWUsICJyIik7CisgIGZyZWUgKGZuYW1lKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICByZXR1cm4gZXJybm87CisKKyAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKGYsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKworICB1bnNpZ25lZCBpbnQgbGFzdF9kbWFqb3IgPSAtMSwgbGFzdF9kbWlub3IgPSAtMTsKKyAgdWludDY0X3QgbGFzdF9pbm8gPSAtMTsKKyAgY2hhciAqbGFzdF9maWxlID0gTlVMTDsKKyAgRHdhcmZfQWRkciBsb3cgPSAwLCBoaWdoID0gMDsKKworICBpbmxpbmUgYm9vbCByZXBvcnQgKHZvaWQpCisgICAgeworICAgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQorCXsKKwkgIGlmIChJTlRVU0UoZHdmbF9yZXBvcnRfbW9kdWxlKSAoZHdmbCwgbGFzdF9maWxlLCBsb3csIGhpZ2gpID09IE5VTEwpCisJICAgIHsKKwkgICAgICBmcmVlIChsYXN0X2ZpbGUpOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJICBsYXN0X2ZpbGUgPSBOVUxMOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgY2hhciAqbGluZSA9IE5VTEw7CisgIHNpemVfdCBsaW5lc3o7CisgIHNzaXplX3QgbGVuOworICB3aGlsZSAoKGxlbiA9IGdldGxpbmUgKCZsaW5lLCAmbGluZXN6LCBmKSkgPiAwKQorICAgIHsKKyAgICAgIGlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpCisJbGluZVtsZW4gLSAxXSA9ICdcMCc7CisKKyAgICAgIER3YXJmX0FkZHIgc3RhcnQsIGVuZCwgb2Zmc2V0OworICAgICAgdW5zaWduZWQgaW50IGRtYWpvciwgZG1pbm9yOworICAgICAgdWludDY0X3QgaW5vOworICAgICAgaW50IG5yZWFkID0gLTE7CisgICAgICBpZiAoc3NjYW5mIChsaW5lLCAiJSIgUFJJeDY0ICItJSIgUFJJeDY0ICIgJSpzICUiIFBSSXg2NAorCQkgICIgJXg6JXggJSIgUFJJaTY0ICIgJW4iLAorCQkgICZzdGFydCwgJmVuZCwgJm9mZnNldCwgJmRtYWpvciwgJmRtaW5vciwgJmlubywgJm5yZWFkKSA8IDYKKwkgIHx8IG5yZWFkIDw9IDApCisJeworCSAgZnJlZSAobGluZSk7CisJICByZXR1cm4gRU5PRVhFQzsKKwl9CisKKyAgICAgIC8qIElmIHRoaXMgaXMgdGhlIHNwZWNpYWwgbWFwcGluZyBBVF9TWVNJTkZPX0VIRFIgcG9pbnRlZCB1cyBhdCwKKwkgcmVwb3J0IHRoZSBsYXN0IG9uZSBhbmQgdGhlbiB0aGlzIHNwZWNpYWwgb25lLiAgKi8KKyAgICAgIGlmIChzdGFydCA9PSBzeXNpbmZvX2VoZHIgJiYgc3RhcnQgIT0gMCkKKwl7CisJICBpZiAocmVwb3J0ICgpKQorCSAgICB7CisJICAgIGJhZF9yZXBvcnQ6CisJICAgICAgZnJlZSAobGluZSk7CisJICAgICAgZmNsb3NlIChmKTsKKwkgICAgICByZXR1cm4gLTE7CisJICAgIH0KKworCSAgbG93ID0gc3RhcnQ7CisJICBoaWdoID0gZW5kOworCSAgaWYgKGFzcHJpbnRmICgmbGFzdF9maWxlLCAiW3Zkc286ICVkXSIsIChpbnQpIHBpZCkgPCAwCisJICAgICAgfHwgcmVwb3J0ICgpKQorCSAgICBnb3RvIGJhZF9yZXBvcnQ7CisJfQorCisgICAgICBjaGFyICpmaWxlID0gbGluZSArIG5yZWFkICsgc3Ryc3BuIChsaW5lICsgbnJlYWQsICIgXHQiKTsKKyAgICAgIGlmIChmaWxlWzBdID09ICdcMCcgfHwgKGlubyA9PSAwICYmIGRtYWpvciA9PSAwICYmIGRtaW5vciA9PSAwKSkKKwkvKiBUaGlzIGxpbmUgZG9lc24ndCBpbmRpY2F0ZSBhIGZpbGUgbWFwcGluZy4gICovCisJY29udGludWU7CisKKyAgICAgIGlmIChsYXN0X2ZpbGUgIT0gTlVMTAorCSAgJiYgaW5vID09IGxhc3RfaW5vICYmIGRtYWpvciA9PSBsYXN0X2RtYWpvciAmJiBkbWlub3IgPT0gbGFzdF9kbWlub3IpCisJeworCSAgLyogVGhpcyBpcyBhbm90aGVyIHBvcnRpb24gb2YgdGhlIHNhbWUgZmlsZSdzIG1hcHBpbmcuICAqLworCSAgYXNzZXJ0ICghc3RyY21wIChsYXN0X2ZpbGUsIGZpbGUpKTsKKwkgIGhpZ2ggPSBlbmQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoaXMgaXMgYSBkaWZmZXJlbnQgZmlsZSBtYXBwaW5nLiAgUmVwb3J0IHRoZSBsYXN0IG9uZS4gICovCisJICBpZiAocmVwb3J0ICgpKQorCSAgICBnb3RvIGJhZF9yZXBvcnQ7CisJICBsb3cgPSBzdGFydDsKKwkgIGhpZ2ggPSBlbmQ7CisJICBsYXN0X2ZpbGUgPSBzdHJkdXAgKGZpbGUpOworCSAgbGFzdF9pbm8gPSBpbm87CisJICBsYXN0X2RtYWpvciA9IGRtYWpvcjsKKwkgIGxhc3RfZG1pbm9yID0gZG1pbm9yOworCX0KKyAgICB9CisgIGZyZWUgKGxpbmUpOworCisgIHJlc3VsdCA9IGZlcnJvcl91bmxvY2tlZCAoZikgPyBlcnJubyA6IGZlb2ZfdW5sb2NrZWQgKGYpID8gMCA6IEVOT0VYRUM7CisgIGZjbG9zZSAoZik7CisKKyAgLyogUmVwb3J0IHRoZSBmaW5hbCBvbmUuICAqLworICBib29sIGxvc2UgPSByZXBvcnQgKCk7CisKKyAgcmV0dXJuIHJlc3VsdCAhPSAwID8gcmVzdWx0IDogbG9zZSA/IC0xIDogMDsKK30KK0lOVERFRiAoZHdmbF9saW51eF9wcm9jX3JlcG9ydCkKKworCitzdGF0aWMgc3NpemVfdAorcmVhZF9wcm9jX21lbW9yeSAodm9pZCAqYXJnLCB2b2lkICpkYXRhLCBHRWxmX0FkZHIgYWRkcmVzcywKKwkJICBzaXplX3QgbWlucmVhZCwgc2l6ZV90IG1heHJlYWQpCit7CisgIGNvbnN0IGludCBmZCA9ICooY29uc3QgaW50ICopIGFyZzsKKyAgc3NpemVfdCBucmVhZCA9IHByZWFkNjQgKGZkLCBkYXRhLCBtYXhyZWFkLCAob2ZmNjRfdCkgYWRkcmVzcyk7CisgIGlmIChucmVhZCA+IDAgJiYgKHNpemVfdCkgbnJlYWQgPCBtaW5yZWFkKQorICAgIG5yZWFkID0gMDsKKyAgcmV0dXJuIG5yZWFkOworfQorCitleHRlcm4gRWxmICplbGZfZnJvbV9yZW1vdGVfbWVtb3J5IChHRWxmX0FkZHIgZWhkcl92bWEsCisJCQkJICAgIEdFbGZfQWRkciAqbG9hZGJhc2VwLAorCQkJCSAgICBzc2l6ZV90ICgqcmVhZF9tZW1vcnkpICh2b2lkICphcmcsCisJCQkJCQkJICAgIHZvaWQgKmRhdGEsCisJCQkJCQkJICAgIEdFbGZfQWRkciBhZGRyZXNzLAorCQkJCQkJCSAgICBzaXplX3QgbWlucmVhZCwKKwkJCQkJCQkgICAgc2l6ZV90IG1heHJlYWQpLAorCQkJCSAgICB2b2lkICphcmcpOworCisKKy8qIER3ZmxfQ2FsbGJhY2tzLmZpbmRfZWxmICovCisKK2ludAorZHdmbF9saW51eF9wcm9jX2ZpbmRfZWxmIChEd2ZsX01vZHVsZSAqbW9kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgdm9pZCAqKnVzZXJkYXRhIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIER3YXJmX0FkZHIgYmFzZSwKKwkJCSAgY2hhciAqKmZpbGVfbmFtZSwgRWxmICoqZWxmcCkKK3sKKyAgaWYgKG1vZHVsZV9uYW1lWzBdID09ICcvJykKKyAgICB7CisgICAgICBpbnQgZmQgPSBvcGVuNjQgKG1vZHVsZV9uYW1lLCBPX1JET05MWSk7CisgICAgICBpZiAoZmQgPj0gMCkKKwl7CisJICAqZmlsZV9uYW1lID0gc3RyZHVwIChtb2R1bGVfbmFtZSk7CisJICBpZiAoKmZpbGVfbmFtZSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgY2xvc2UgKGZkKTsKKwkgICAgICByZXR1cm4gRU5PTUVNOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIGZkOworICAgIH0KKworICBpbnQgcGlkOworICBpZiAoc3NjYW5mIChtb2R1bGVfbmFtZSwgIlt2ZHNvOiAlZF0iLCAmcGlkKSA9PSAxKQorICAgIHsKKyAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgaW4tbWVtb3J5IEVMRiBpbWFnZS4gICovCisKKyAgICAgIGNoYXIgKmZuYW1lID0gTlVMTDsKKyAgICAgIGFzcHJpbnRmICgmZm5hbWUsIFBST0NNRU1GTVQsIHBpZCk7CisgICAgICBpZiAoZm5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKyAgICAgIGludCBmZCA9IG9wZW42NCAoZm5hbWUsIE9fUkRPTkxZKTsKKyAgICAgIGZyZWUgKGZuYW1lKTsKKyAgICAgIGlmIChmZCA8IDApCisJcmV0dXJuIC0xOworCisgICAgICAqZWxmcCA9IGVsZl9mcm9tX3JlbW90ZV9tZW1vcnkgKGJhc2UsIE5VTEwsICZyZWFkX3Byb2NfbWVtb3J5LCAmZmQpOworCisgICAgICBjbG9zZSAoZmQpOworCisgICAgICAqZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgYWJvcnQgKCk7CisgIHJldHVybiAtMTsKK30KK0lOVERFRiAoZHdmbF9saW51eF9wcm9jX2ZpbmRfZWxmKQpkaWZmIC0tZ2l0IGEvbGliZHdmbC9sb2MyYy1ydW50aW1lLmggYi9saWJkd2ZsL2xvYzJjLXJ1bnRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjI3Zjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9sb2MyYy1ydW50aW1lLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qIHRhcmdldCBvcGVyYXRpb25zICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2RlZmluZSBpbnRwdHJfdCBsb25nCisjZGVmaW5lIHVpbnRwdHJfdCB1bnNpZ25lZCBsb25nCisKKworLyogVGhlc2UgdGhyZWUgbWFjcm8gZGVmaW5pdGlvbnMgYXJlIGdlbmVyaWMsIGp1c3Qgc2hvcnRoYW5kcworICAgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGNvZGUuICAqLworCisjZGVmaW5lIG9wX2Ficyh4KQkoeCA8IDAgPyAteCA6IHgpCisKKyNkZWZpbmUgZmV0Y2hfYml0ZmllbGQodGFyZ2V0LCBiYXNlLCBoaWdoZXJiaXRzLCBuYml0cykJCQkgICAgICBcCisgIHRhcmdldCA9ICgoKGJhc2UpID4+IChzaXplb2YgKGJhc2UpICogOCAtIChoaWdoZXJiaXRzKSAtIChuYml0cykpKQkgICAgICBcCisJICAgICYgKCgoX190eXBlb2YgKGJhc2UpKSAxIDw8IChuYml0cykpIC0gMSkpCisKKyNkZWZpbmUgc3RvcmVfYml0ZmllbGQodGFyZ2V0LCBiYXNlLCBoaWdoZXJiaXRzLCBuYml0cykJCQkgICAgICBcCisgIHRhcmdldCA9ICh0YXJnZXQJCQkJCQkJICAgICAgXAorCSAgICAmfiAoKCgoX190eXBlb2YgKGJhc2UpKSAxIDw8IChuYml0cykpIC0gMSkJCQkgICAgICBcCisJCTw8IChzaXplb2YgKGJhc2UpICogOCAtIChoaWdoZXJiaXRzKSAtIChuYml0cykpKQkgICAgICBcCisJICAgIHwgKChfX3R5cGVvZiAoYmFzZSkpICh2YWx1ZSkJCQkJICAgICAgXAorCSAgICAgICA8PCAoc2l6ZW9mIChiYXNlKSAqIDggLSAoaGlnaGVyYml0cykgLSAobmJpdHMpKSkpCisKKworLyogVGhlc2Ugb3BlcmF0aW9ucyBhcmUgdGFyZ2V0LXNwZWNpZmljLiAgKi8KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIGZldGNoX3JlZ2lzdGVyKHJlZ25vKSAoKGludHB0cl90KSByZWdzLT5kd2FyZl9yZWdpc3Rlcl8jI3JlZ25vKQorCisjaWYgZGVmaW5lZCBfX2kzODZfXworCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzAgZWF4CisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzEgZWN4CisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzIgZWR4CisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzMgZWJ4CisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzQgZXNwCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzUgZWJwCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzYgZXNpCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzcgZWRpCisKKyNlbGlmIGRlZmluZWQgX194ODZfNjRfXworCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzAgZWF4CisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzEgZWR4CisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzIgZWN4CisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzMgZWJ4CisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzQgZXNpCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzUgZWRpCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzYgZWJwCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzcgZXNwCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzggcjgKKyNkZWZpbmUgZHdhcmZfcmVnaXN0ZXJfOSByOQorI2RlZmluZSBkd2FyZl9yZWdpc3Rlcl8xMCByMTAKKyNkZWZpbmUgZHdhcmZfcmVnaXN0ZXJfMTEgcjExCisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzEyIHIxMgorI2RlZmluZSBkd2FyZl9yZWdpc3Rlcl8xMyByMTMKKyNkZWZpbmUgZHdhcmZfcmVnaXN0ZXJfMTQgcjE0CisjZGVmaW5lIGR3YXJmX3JlZ2lzdGVyXzE1IHIxNQorCisjZWxpZiBkZWZpbmVkIF9fcG93ZXJwY19fCisKKyN1bmRlZiBmZXRjaF9yZWdpc3RlcgorI2RlZmluZSBmZXRjaF9yZWdpc3RlcihyZWdubykgKChpbnRwdHJfdCkgcmVncy0+Z3ByW3JlZ25vXSkKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9faTM4Nl9fIHx8IGRlZmluZWQgX194ODZfNjRfXworCisjZGVmaW5lIGRlcmVmKHNpemUsIGFkZHIpCQkJCQkJICAgICAgXAorICAoewkJCQkJCQkJCSAgICAgIFwKKyAgICBpbnQgX2JhZCA9IDA7CQkJCQkJCSAgICAgIFwKKyAgICB1OCBfYjsgdTE2IF93OyB1MzIgX2w7IHU2NCBfcTsJCQkJCSAgICAgIFwKKyAgICBpbnRwdHJfdCBfdjsJCQkJCQkJICAgICAgXAorICAgIHN3aXRjaCAoc2l6ZSkJCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIGNhc2UgMTogX19nZXRfdXNlcl9hc20oX2IsYWRkcixfYmFkLCJiIiwiYiIsIj1xIiwxKTsgX3YgPSBfYjsgYnJlYWs7ICAgIFwKKyAgICAgIGNhc2UgMjogX19nZXRfdXNlcl9hc20oX3csYWRkcixfYmFkLCJ3IiwidyIsIj1yIiwxKTsgX3YgPSBfdzsgYnJlYWs7ICAgIFwKKyAgICAgIGNhc2UgNDogX19nZXRfdXNlcl9hc20oX2wsYWRkcixfYmFkLCJsIiwiIiwiPXIiLDEpOyBfdiA9IF9sOyBicmVhazsgICAgIFwKKyAgICAgIGNhc2UgODogX19nZXRfdXNlcl9hc20oX3EsYWRkcixfYmFkLCJxIiwiIiwiPXIiLDEpOyBfdiA9IF9xOyBicmVhazsgICAgIFwKKyAgICAgIGRlZmF1bHQ6IF92ID0gX19nZXRfdXNlcl9iYWQoKTsJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgaWYgKF9iYWQpCQkJCQkJCQkgICAgICBcCisgICAgICBnb3RvIGRlcmVmX2ZhdWx0OwkJCQkJCQkgICAgICBcCisgICAgX3Y7CQkJCQkJCQkJICAgICAgXAorICB9KQorCisjZWxpZiBkZWZpbmVkIF9fcG93ZXJwYzY0X18KKworI2RlZmluZSBkZXJlZihzaXplLCBhZGRyKQkJCQkJCSAgICAgIFwKKyAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgaW50IF9iYWQgPSAwOwkJCQkJCQkgICAgICBcCisgICAgaW50cHRyX3QgX3Y7CQkJCQkJCSAgICAgIFwKKyAgICBzd2l0Y2ggKHNpemUpCQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBjYXNlIDE6IF9fZ2V0X3VzZXJfYXNtKF92LGFkZHIsX2JhZCwibGJ6IiwxKTsgYnJlYWs7CQkgICAgICBcCisgICAgICBjYXNlIDI6IF9fZ2V0X3VzZXJfYXNtKF92LGFkZHIsX2JhZCwibGh6IiwxKTsgYnJlYWs7CQkgICAgICBcCisgICAgICBjYXNlIDQ6IF9fZ2V0X3VzZXJfYXNtKF92LGFkZHIsX2JhZCwibHd6IiwxKTsgYnJlYWs7CQkgICAgICBcCisgICAgICBjYXNlIDg6IF9fZ2V0X3VzZXJfYXNtKF92LGFkZHIsX2JhZCwibGQiLDEpOyBicmVhazsJCSAgICAgIFwKKyAgICAgIGRlZmF1bHQ6IF92ID0gX19nZXRfdXNlcl9iYWQoKTsJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgaWYgKF9iYWQpCQkJCQkJCQkgICAgICBcCisgICAgICBnb3RvIGRlcmVmX2ZhdWx0OwkJCQkJCQkgICAgICBcCisgICAgX3Y7CQkJCQkJCQkJICAgICAgXAorICB9KQorCisjZWxpZiBkZWZpbmVkIF9fcG93ZXJwY19fCisKKyNkZWZpbmUgZGVyZWYoc2l6ZSwgYWRkcikJCQkJCQkgICAgICBcCisgICh7CQkJCQkJCQkJICAgICAgXAorICAgIGludCBfYmFkID0gMDsJCQkJCQkJICAgICAgXAorICAgIGludHB0cl90IF92OwkJCQkJCQkgICAgICBcCisgICAgc3dpdGNoIChzaXplKQkJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgY2FzZSAxOiBfX2dldF91c2VyX2FzbShfdixhZGRyLF9iYWQsImxieiIpOyBicmVhazsJCSAgICAgIFwKKyAgICAgIGNhc2UgMjogX19nZXRfdXNlcl9hc20oX3YsYWRkcixfYmFkLCJsaHoiKTsgYnJlYWs7CQkgICAgICBcCisgICAgICBjYXNlIDQ6IF9fZ2V0X3VzZXJfYXNtKF92LGFkZHIsX2JhZCwibHd6Iik7IGJyZWFrOwkJICAgICAgXAorICAgICAgY2FzZSA4OiBfX2dldF91c2VyX2FzbShfdixhZGRyLF9iYWQsImxkIik7IGJyZWFrOwkJCSAgICAgIFwKKyAgICAgIGRlZmF1bHQ6IF92ID0gX19nZXRfdXNlcl9iYWQoKTsJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgaWYgKF9iYWQpCQkJCQkJCQkgICAgICBcCisgICAgICBnb3RvIGRlcmVmX2ZhdWx0OwkJCQkJCQkgICAgICBcCisgICAgX3Y7CQkJCQkJCQkJICAgICAgXAorICB9KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmR3ZmwvbG9jMmMuYyBiL2xpYmR3ZmwvbG9jMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZlYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZHdmbC9sb2MyYy5jCkBAIC0wLDAgKzEsMTM5OCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPG9ic3RhY2suaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlIDxsaWJkdy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIF8oeCkgeAorCisjZGVmaW5lIFNUQUNLX1RZUEUJImludHB0cl90IiAgLyogTXVzdCBiZSB0aGUgc2lnbmVkIHR5cGUuICAqLworI2RlZmluZSBVVFlQRQkJInVpbnRwdHJfdCIgLyogTXVzdCBiZSB0aGUgdW5zaWduZWQgdHlwZS4gICovCisjZGVmaW5lIFNGT1JNQVQJCSIlIiBQUklkNjQgIkwiCisjZGVmaW5lIFVGT1JNQVQJCSIlIiBQUkl1NjQgIlVMIgorI2RlZmluZSBBRk9STUFUCQkiJSMiIFBSSXg2NCAiVUwiCisjZGVmaW5lIFNUQUNLRk1UCSJzJXUiCisKK3N0cnVjdCBsb2NhdGlvbgoreworICBzdHJ1Y3QgbG9jYXRpb24gKm5leHQ7CisKKyAgY29uc3QgRHdhcmZfTG9jICpvcHM7CisgIHNpemVfdCBub3BzOworCisgIER3YXJmX1dvcmQgYnl0ZV9zaXplOworCisgIGVudW0geyBsb2NfYWRkcmVzcywgbG9jX3JlZ2lzdGVyLCBsb2Nfbm9uY29udGlndW91cywgbG9jX2ZpbmFsIH0gdHlwZTsKKyAgdW5pb24KKyAgeworICAgIHN0cnVjdAkJCS8qIGxvY19hZGRyZXNzIG9yIGxvY19maW5hbCAqLworICAgIHsKKyAgICAgIGNoYXIgKnByb2dyYW07CQkvKiBDIGZyYWdtZW50LCBsZWF2ZXMgYWRkcmVzcyBpbiBzMC4gICovCisgICAgICB1bnNpZ25lZCBpbnQgc3RhY2tfZGVwdGg7CS8qIFRlbXBvcmFyaWVzICJzMC4uPE4+IiB1c2VkIGJ5IGl0LiAgKi8KKyAgICAgIHN0cnVjdCBsb2NhdGlvbiAqZnJhbWVfYmFzZTsKKyAgICAgIGJvb2wgdXNlZF9kZXJlZjsJCS8qIFByb2dyYW0gdXNlcyAiZGVyZWYiIG1hY3JvLiAgKi8KKyAgICB9IGFkZHJlc3M7CisgICAgdW5zaWduZWQgaW50IHJlZ25vOwkJLyogbG9jX3JlZ2lzdGVyICovCisgICAgc3RydWN0IGxvY2F0aW9uICpwaWVjZXM7CS8qIGxvY19ub25jb250aWd1b3VzICovCisgIH07Cit9OworCisMCitzdGF0aWMgY29uc3QgY2hhciAqCitkd2FyZl9kaWVuYW1lX2ludGVncmF0ZSAoRHdhcmZfRGllICpkaWUpCit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgcmV0dXJuIGR3YXJmX2Zvcm1zdHJpbmcgKGR3YXJmX2F0dHJfaW50ZWdyYXRlIChkaWUsIERXX0FUX25hbWUsICZhdHRyX21lbSkpOworfQorDAorLyogU3ludGhlc2l6ZSBhIG5ldyBsb2NfYWRkcmVzcyB1c2luZyB0aGUgcHJvZ3JhbSBvbiB0aGUgb2JzdGFjay4gICovCitzdGF0aWMgc3RydWN0IGxvY2F0aW9uICoKK25ld19zeW50aGV0aWNfbG9jIChzdHJ1Y3Qgb2JzdGFjayAqcG9vbCwgc3RydWN0IGxvY2F0aW9uICpvcmlnaW4sIGJvb2wgZGVyZWYpCit7CisgIG9ic3RhY2tfMWdyb3cgKHBvb2wsICdcMCcpOworICBjaGFyICpwcm9ncmFtID0gb2JzdGFja19maW5pc2ggKHBvb2wpOworCisgIHN0cnVjdCBsb2NhdGlvbiAqbG9jID0gb2JzdGFja19hbGxvYyAocG9vbCwgc2l6ZW9mICpsb2MpOworICBsb2MtPm5leHQgPSBOVUxMOworICBsb2MtPmJ5dGVfc2l6ZSA9IDA7CisgIGxvYy0+dHlwZSA9IGxvY19hZGRyZXNzOworICBsb2MtPmFkZHJlc3MucHJvZ3JhbSA9IHByb2dyYW07CisgIGxvYy0+YWRkcmVzcy5zdGFja19kZXB0aCA9IDA7CisgIGxvYy0+YWRkcmVzcy5mcmFtZV9iYXNlID0gTlVMTDsKKyAgbG9jLT5hZGRyZXNzLnVzZWRfZGVyZWYgPSBkZXJlZjsKKworICBpZiAob3JpZ2luLT50eXBlID09IGxvY19yZWdpc3RlcikKKyAgICB7CisgICAgICBsb2MtPm9wcyA9IG9yaWdpbi0+b3BzOworICAgICAgbG9jLT5ub3BzID0gb3JpZ2luLT5ub3BzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxvYy0+b3BzID0gTlVMTDsKKyAgICAgIGxvYy0+bm9wcyA9IDA7CisgICAgfQorCisgIHJldHVybiBsb2M7Cit9CisKKworLyogRGllIGluIHRoZSBtaWRkbGUgb2YgYW4gZXhwcmVzc2lvbi4gICovCitzdGF0aWMgc3RydWN0IGxvY2F0aW9uICoKK2xvc2UgKGNvbnN0IGNoYXIgKmZhaWx1cmUsIGNvbnN0IER3YXJmX0xvYyAqbGV4cHIsIHNpemVfdCBpKQoreworICBlcnJvciAoMiwgMCwgXygiJXMgaW4gRFdBUkYgZXhwcmVzc2lvbiBbJVp1XSBhdCAlIiBQUkl1NjQKKwkJICIgKCUjeDogJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIpLAorCSBmYWlsdXJlLCBpLCBsZXhwcltpXS5vZmZzZXQsCisJIGxleHByW2ldLmF0b20sIGxleHByW2ldLm51bWJlciwgbGV4cHJbaV0ubnVtYmVyMik7CisgIHJldHVybiBOVUxMOworfQorCisvKiBUcmFuc2xhdGUgYSAoY29uc3RyYWluZWQpIERXQVJGIGV4cHJlc3Npb24gaW50byBDIGNvZGUKKyAgIGVtaXR0ZWQgdG8gdGhlIG9ic3RhY2sgUE9PTC4gIElOREVOVCBpcyB0aGUgbnVtYmVyIG9mIGluZGVudGF0aW9uIGxldmVscy4KKyAgIEFERFJCSUFTIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcnVudGltZSBhbmQgRHdhcmYgaW5mbyBhZGRyZXNzZXMuCisgICBJTlBVVCBpcyBudWxsIG9yIGFuIGV4cHJlc3Npb24gdG8gYmUgaW5pdGlhbGx5IHB1c2hlZCBvbiB0aGUgc3RhY2suCisgICBJZiBORUVEX0ZCIGlzIG51bGwsIGZhaWwgb24gRFdfT1BfZmJyZWcsIGVsc2Ugc2V0ICpORUVEX0ZCIHRvIHRydWUKKyAgIGFuZCBlbWl0ICJmcmFtZV9iYXNlIiBmb3IgaXQuICBPbiBzdWNjZXNzLCBzZXQgKk1BWF9TVEFDSyB0byB0aGUgbnVtYmVyCisgICBvZiBzdGFjayBzbG90cyByZXF1aXJlZC4gIE9uIGZhaWx1cmUsIHNldCAqTE9TRVIgdG8gdGhlIGluZGV4IGluIEVYUFIKKyAgIG9mIHRoZSBvcGVyYXRpb24gd2UgY291bGQgbm90IGhhbmRsZS4KKworICAgUmV0dXJucyBhIGZhaWx1cmUgbWVzc2FnZSBvciBudWxsIGZvciBzdWNjZXNzLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgordHJhbnNsYXRlIChzdHJ1Y3Qgb2JzdGFjayAqcG9vbCwgaW50IGluZGVudCwgRHdhcmZfQWRkciBhZGRyYmlhcywKKwkgICBjb25zdCBEd2FyZl9Mb2MgKmV4cHIsIGNvbnN0IHNpemVfdCBsZW4sCisJICAgc3RydWN0IGxvY2F0aW9uICppbnB1dCwKKwkgICBib29sICpuZWVkX2ZiLCBzaXplX3QgKmxvc2VyLAorCSAgIHN0cnVjdCBsb2NhdGlvbiAqbG9jKQoreworICBsb2MtPm9wcyA9IGV4cHI7CisgIGxvYy0+bm9wcyA9IGxlbjsKKworI2RlZmluZSBESUUobXNnKSByZXR1cm4gKCpsb3NlciA9IGksIF8obXNnKSkKKworI2RlZmluZSBlbWl0KGZtdCwgLi4uKSBvYnN0YWNrX3ByaW50ZiAocG9vbCwgZm10LCAjIyBfX1ZBX0FSR1NfXykKKworICB1bnNpZ25lZCBpbnQgc3RhY2tfZGVwdGggPSAwLCBtYXhfc3RhY2sgPSAwOworICBpbmxpbmUgdm9pZCBkZWVwZW4gKHZvaWQpCisgICAgeworICAgICAgaWYgKHN0YWNrX2RlcHRoID09IG1heF9zdGFjaykKKwkrK21heF9zdGFjazsKKyAgICB9CisKKyNkZWZpbmUgUE9QKHZhcikJCQkJCQkJICAgICAgXAorICAgIGlmIChzdGFja19kZXB0aCA+IDApCQkJCQkJICAgICAgXAorICAgICAgLS1zdGFja19kZXB0aDsJCQkJCQkJICAgICAgXAorICAgIGVsc2UgaWYgKHRvc19yZWdpc3RlciAhPSAtMSkJCQkJCSAgICAgIFwKKyAgICAgIGZldGNoX3Rvc19yZWdpc3RlciAoKTsJCQkJCQkgICAgICBcCisgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgZ290byB1bmRlcmZsb3c7CQkJCQkJCSAgICAgIFwKKyAgICBpbnQgdmFyID0gc3RhY2tfZGVwdGgKKyNkZWZpbmUgUFVTSCAJCShkZWVwZW4gKCksIHN0YWNrX2RlcHRoKyspCisjZGVmaW5lIFNUQUNLKGlkeCkJKHN0YWNrX2RlcHRoIC0gMSAtIChpZHgpKQorCisgIC8qIERvbid0IHB1dCBzdGFjayBvcGVyYXRpb25zIGluIHRoZSBhcmd1bWVudHMgdG8gdGhpcy4gICovCisjZGVmaW5lIHB1c2goZm10LCAuLi4pIFwKKyAgZW1pdCAoIiUqcyIgU1RBQ0tGTVQgIiA9ICIgZm10ICI7XG4iLCBpbmRlbnQgKiAyLCAiIiwgUFVTSCwgIyMgX19WQV9BUkdTX18pCisKKyAgaW50IHRvc19yZWdpc3RlciA9IC0xOworICBpbmxpbmUgdm9pZCBmZXRjaF90b3NfcmVnaXN0ZXIgKHZvaWQpCisgICAgeworICAgICAgZGVlcGVuICgpOworICAgICAgZW1pdCAoIiUqcyIgU1RBQ0tGTVQgIiA9IGZldGNoX3JlZ2lzdGVyICglZCk7XG4iLAorCSAgICBpbmRlbnQgKiAyLCAiIiwgc3RhY2tfZGVwdGgsIHRvc19yZWdpc3Rlcik7CisgICAgICB0b3NfcmVnaXN0ZXIgPSAtMTsKKyAgICB9CisKKyAgaWYgKGlucHV0ICE9IE5VTEwpCisgICAgc3dpdGNoIChpbnB1dC0+dHlwZSkKKyAgICAgIHsKKyAgICAgIGNhc2UgbG9jX2FkZHJlc3M6CisJcHVzaCAoImFkZHIiKTsKKwlicmVhazsKKworICAgICAgY2FzZSBsb2NfcmVnaXN0ZXI6CisJdG9zX3JlZ2lzdGVyID0gaW5wdXQtPnJlZ25vOworCWJyZWFrOworCisgICAgICBkZWZhdWx0OgorCWFib3J0ICgpOworCWJyZWFrOworICAgICAgfQorCisgIHNpemVfdCBpOworCisgIGlubGluZSBjb25zdCBjaGFyICpmaW5pc2ggKHN0cnVjdCBsb2NhdGlvbiAqcGllY2UpCisgICAgeworICAgICAgaWYgKHN0YWNrX2RlcHRoID4gMSkKKwlESUUgKCJtdWx0aXBsZSB2YWx1ZXMgbGVmdCBvbiBzdGFjayIpOworICAgICAgaWYgKHN0YWNrX2RlcHRoID09IDEpCisJeworCSAgb2JzdGFja18xZ3JvdyAocG9vbCwgJ1wwJyk7CisJICBjaGFyICpwcm9ncmFtID0gb2JzdGFja19maW5pc2ggKHBvb2wpOworCSAgcGllY2UtPnR5cGUgPSBsb2NfYWRkcmVzczsKKwkgIHBpZWNlLT5hZGRyZXNzLnByb2dyYW0gPSBwcm9ncmFtOworCSAgcGllY2UtPmFkZHJlc3Muc3RhY2tfZGVwdGggPSBtYXhfc3RhY2s7CisJICBwaWVjZS0+YWRkcmVzcy5mcmFtZV9iYXNlID0gTlVMTDsKKwl9CisgICAgICBlbHNlIGlmICh0b3NfcmVnaXN0ZXIgPT0gLTEpCisJRElFICgic3RhY2sgdW5kZXJmbG93Iik7CisgICAgICBlbHNlIGlmIChvYnN0YWNrX29iamVjdF9zaXplIChwb29sKSAhPSAwKQorCURJRSAoInJlZ2lzdGVyIHZhbHVlIG11c3Qgc3RhbmQgYWxvbmUgaW4gbG9jYXRpb24gZXhwcmVzc2lvbiIpOworICAgICAgZWxzZQorCXsKKwkgIHBpZWNlLT50eXBlID0gbG9jX3JlZ2lzdGVyOworCSAgcGllY2UtPnJlZ25vID0gdG9zX3JlZ2lzdGVyOworCX0KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzdHJ1Y3QgbG9jYXRpb24gKnBpZWNlcyA9IE5VTEwsICoqdGFpbHBpZWNlID0gJnBpZWNlczsKKyAgc2l6ZV90IHBpZWNlX2V4cHJfc3RhcnQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHJlZzsKKyAgICAgIHVpbnRfZmFzdDhfdCBzcDsKKyAgICAgIER3YXJmX1dvcmQgdmFsdWU7CisKKyAgICAgIHN3aXRjaCAoZXhwcltpXS5hdG9tKQorCXsKKwkgIC8qIEJhc2ljIHN0YWNrIG9wZXJhdGlvbnMuICAqLworCWNhc2UgRFdfT1Bfbm9wOgorCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2R1cDoKKwkgIGlmIChzdGFja19kZXB0aCA8IDEpCisJICAgIGdvdG8gdW5kZXJmbG93OworCSAgZWxzZQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IHRvcyA9IFNUQUNLICgwKTsKKwkgICAgICBwdXNoIChTVEFDS0ZNVCwgdG9zKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2Ryb3A6CisJICBQT1AgKGlnbm9yZSk7CisJICBlbWl0ICgiJSpzLyogZHJvcCAiIFNUQUNLRk1UICIqL1xuIiwgaW5kZW50ICogMiwgIiIsIGlnbm9yZSk7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfcGljazoKKwkgIHNwID0gZXhwcltpXS5udW1iZXI7CisJb3BfcGljazoKKwkgIGlmIChzcCA+PSBzdGFja19kZXB0aCkKKwkgICAgZ290byB1bmRlcmZsb3c7CisJICBzcCA9IFNUQUNLIChzcCk7CisJICBwdXNoIChTVEFDS0ZNVCwgc3ApOworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX292ZXI6CisJICBzcCA9IDE7CisJICBnb3RvIG9wX3BpY2s7CisKKwljYXNlIERXX09QX3N3YXA6CisJICBpZiAoc3RhY2tfZGVwdGggPCAyKQorCSAgICBnb3RvIHVuZGVyZmxvdzsKKwkgIGRlZXBlbiAoKTsJCS8qIFVzZSBhIHRlbXBvcmFyeSBzbG90LiAgKi8KKwkgIGVtaXQgKCIlKnMiCisJCVNUQUNLRk1UICIgPSAiIFNUQUNLRk1UICIsICIKKwkJU1RBQ0tGTVQgIiA9ICIgU1RBQ0tGTVQgIiwgIgorCQlTVEFDS0ZNVCAiID0gIiBTVEFDS0ZNVCAiO1xuIiwKKwkJaW5kZW50ICogMiwgIiIsCisJCVNUQUNLICgtMSksIFNUQUNLICgwKSwKKwkJU1RBQ0sgKDApLCBTVEFDSyAoMSksCisJCVNUQUNLICgxKSwgU1RBQ0sgKC0xKSk7CisJICBicmVhazsKKworCWNhc2UgRFdfT1Bfcm90OgorCSAgaWYgKHN0YWNrX2RlcHRoIDwgMykKKwkgICAgZ290byB1bmRlcmZsb3c7CisJICBkZWVwZW4gKCk7CQkvKiBVc2UgYSB0ZW1wb3Jhcnkgc2xvdC4gICovCisJICBlbWl0ICgiJSpzIgorCQlTVEFDS0ZNVCAiID0gIiBTVEFDS0ZNVCAiLCAiCisJCVNUQUNLRk1UICIgPSAiIFNUQUNLRk1UICIsICIKKwkJU1RBQ0tGTVQgIiA9ICIgU1RBQ0tGTVQgIiwgIgorCQlTVEFDS0ZNVCAiID0gIiBTVEFDS0ZNVCAiO1xuIiwKKwkJaW5kZW50ICogMiwgIiIsCisJCVNUQUNLICgtMSksIFNUQUNLICgwKSwKKwkJU1RBQ0sgKDApLCBTVEFDSyAoMSksCisJCVNUQUNLICgxKSwgU1RBQ0sgKDIpLAorCQlTVEFDSyAoMyksIFNUQUNLICgtMSkpOworCSAgYnJlYWs7CisKKworCSAgLyogQ29udHJvbCBmbG93IG9wZXJhdGlvbnMuICAqLworCWNhc2UgRFdfT1Bfc2tpcDoKKwkgIHsKKwkgICAgRHdhcmZfT2ZmIHRhcmdldCA9IGV4cHJbaV0ub2Zmc2V0ICsgMyArIGV4cHJbaV0ubnVtYmVyOworCSAgICB3aGlsZSAoaSArIDEgPCBsZW4gJiYgZXhwcltpICsgMV0ub2Zmc2V0IDwgdGFyZ2V0KQorCSAgICAgICsraTsKKwkgICAgaWYgKGV4cHJbaSArIDFdLm9mZnNldCAhPSB0YXJnZXQpCisJICAgICAgRElFICgiaW52YWxpZCBza2lwIHRhcmdldCIpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgRFdfT1BfYnJhOgorCSAgRElFICgiY29uZGl0aW9uYWwgYnJhbmNoZXMgbm90IHN1cHBvcnRlZCIpOworCSAgYnJlYWs7CisKKworCSAgLyogTWVtb3J5IGFjY2Vzcy4gICovCisJY2FzZSBEV19PUF9kZXJlZjoKKwkgIHsKKwkgICAgUE9QIChhZGRyKTsKKwkgICAgcHVzaCAoImRlcmVmIChzaXplb2YgKHZvaWQgKiksICIgU1RBQ0tGTVQgIikiLCBhZGRyKTsKKwkgICAgbG9jLT5hZGRyZXNzLnVzZWRfZGVyZWYgPSB0cnVlOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2RlcmVmX3NpemU6CisJICB7CisJICAgIFBPUCAoYWRkcik7CisJICAgIHB1c2ggKCJkZXJlZiAoIiBVRk9STUFUICIsICIgU1RBQ0tGTVQgIikiLAorCQkgIGV4cHJbaV0ubnVtYmVyLCBhZGRyKTsKKwkgICAgbG9jLT5hZGRyZXNzLnVzZWRfZGVyZWYgPSB0cnVlOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIERXX09QX3hkZXJlZjoKKwkgIHsKKwkgICAgUE9QIChhZGRyKTsKKwkgICAgUE9QIChhcyk7CisJICAgIHB1c2ggKCJ4ZGVyZWYgKHNpemVvZiAodm9pZCAqKSwgIiBTVEFDS0ZNVCAiLCAiIFNUQUNLRk1UICIpIiwKKwkJICBhZGRyLCBhcyk7CisJICAgIGxvYy0+YWRkcmVzcy51c2VkX2RlcmVmID0gdHJ1ZTsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF94ZGVyZWZfc2l6ZToKKwkgIHsKKwkgICAgUE9QIChhZGRyKTsKKwkgICAgUE9QIChhcyk7CisJICAgIHB1c2ggKCJ4ZGVyZWYgKCIgVUZPUk1BVCAiLCAiIFNUQUNLRk1UICIsICIgU1RBQ0tGTVQgIikiLAorCQkgIGV4cHJbaV0ubnVtYmVyLCBhZGRyLCBhcyk7CisJICAgIGxvYy0+YWRkcmVzcy51c2VkX2RlcmVmID0gdHJ1ZTsKKwkgIH0KKwkgIGJyZWFrOworCisJICAvKiBDb25zdGFudC12YWx1ZSBvcGVyYXRpb25zLiAgKi8KKworCWNhc2UgRFdfT1BfYWRkcjoKKwkgIHB1c2ggKEFGT1JNQVQsIGFkZHJiaWFzICsgZXhwcltpXS5udW1iZXIpOworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2xpdDAgLi4uIERXX09QX2xpdDMxOgorCSAgdmFsdWUgPSBleHByW2ldLmF0b20gLSBEV19PUF9saXQwOworCSAgZ290byBvcF9jb25zdDsKKworCWNhc2UgRFdfT1BfY29uc3QxdToKKwljYXNlIERXX09QX2NvbnN0MXM6CisJY2FzZSBEV19PUF9jb25zdDJ1OgorCWNhc2UgRFdfT1BfY29uc3QyczoKKwljYXNlIERXX09QX2NvbnN0NHU6CisJY2FzZSBEV19PUF9jb25zdDRzOgorCWNhc2UgRFdfT1BfY29uc3Q4dToKKwljYXNlIERXX09QX2NvbnN0OHM6CisJY2FzZSBEV19PUF9jb25zdHU6CisJY2FzZSBEV19PUF9jb25zdHM6CisJICB2YWx1ZSA9IGV4cHJbaV0ubnVtYmVyOworCW9wX2NvbnN0OgorCSAgcHVzaCAoU0ZPUk1BVCwgdmFsdWUpOworCSAgYnJlYWs7CisKKwkgIC8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucy4gICovCisjZGVmaW5lIFVOT1AoZHdfb3AsIGNfb3ApCQkJCQkJICAgICAgXAorCWNhc2UgRFdfT1BfIyNkd19vcDoJCQkJCQkgICAgICBcCisJICB7CQkJCQkJCQkgICAgICBcCisJICAgIFBPUCAodG9zKTsJCQkJCQkJICAgICAgXAorCSAgICBwdXNoICgiJXMgKCIgU1RBQ0tGTVQgIikiLCAjY19vcCwgdG9zKTsJCQkgICAgICBcCisJICB9CQkJCQkJCQkgICAgICBcCisJICBicmVhaworI2RlZmluZSBCSU5PUChkd19vcCwgY19vcCkJCQkJCQkgICAgICBcCisJY2FzZSBEV19PUF8jI2R3X29wOgkJCQkJCSAgICAgIFwKKwkgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgUE9QIChiKTsJCQkJCQkJICAgICAgXAorCSAgICBQT1AgKGEpOwkJCQkJCQkgICAgICBcCisJICAgIHB1c2ggKFNUQUNLRk1UICIgJXMgIiBTVEFDS0ZNVCwgYSwgI2Nfb3AsIGIpOwkJICAgICAgXAorCSAgfQkJCQkJCQkJICAgICAgXAorCSAgYnJlYWsKKworCSAgVU5PUCAoYWJzLCBvcF9hYnMpOworCSAgQklOT1AgKGFuZCwgJik7CisJICBCSU5PUCAoZGl2LCAvKTsKKwkgIEJJTk9QIChtaW51cywgLSk7CisJICBCSU5PUCAobW9kLCAlKTsKKwkgIEJJTk9QIChtdWwsICopOworCSAgVU5PUCAobmVnLCAtKTsKKwkgIFVOT1AgKG5vdCwgfik7CisJICBCSU5PUCAob3IsIHwpOworCSAgQklOT1AgKHBsdXMsICspOworCSAgQklOT1AgKHNobCwgPDwpOworCSAgQklOT1AgKHNocmEsID4+KTsKKwkgIEJJTk9QICh4b3IsIF4pOworCisJICAvKiBDb21wYXJpc29ucyBhcmUgYmluYXJ5IG9wZXJhdG9ycyB0b28uICAqLworCSAgQklOT1AgKGxlLCA8PSk7CisJICBCSU5PUCAoZ2UsID49KTsKKwkgIEJJTk9QIChlcSwgPT0pOworCSAgQklOT1AgKGx0LCA8KTsKKwkgIEJJTk9QIChndCwgPik7CisJICBCSU5PUCAobmUsICE9KTsKKworI3VuZGVmCVVOT1AKKyN1bmRlZglCSU5PUAorCisJY2FzZSBEV19PUF9zaHI6CisJICB7CisJICAgIFBPUCAoYik7CisJICAgIFBPUCAoYSk7CisJICAgIHB1c2ggKCIoJXMpICIgU1RBQ0tGTVQgIiA+PiAoJXMpIiBTVEFDS0ZNVCwKKwkJICBVVFlQRSwgYSwgVVRZUEUsIGIpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgRFdfT1BfcGx1c191Y29uc3Q6CisJICB7CisJICAgIFBPUCAoeCk7CisJICAgIHB1c2ggKFNUQUNLRk1UICIgKyAiIFVGT1JNQVQsIHgsIGV4cHJbaV0ubnVtYmVyKTsKKwkgIH0KKwkgIGJyZWFrOworCisKKwkgIC8qIFJlZ2lzdGVyLXJlbGF0aXZlIGFkZHJlc3NpbmcuICAqLworCWNhc2UgRFdfT1BfYnJlZzAgLi4uIERXX09QX2JyZWczMToKKwkgIHJlZyA9IGV4cHJbaV0uYXRvbSAtIERXX09QX2JyZWcwOworCSAgdmFsdWUgPSBleHByW2ldLm51bWJlcjsKKwkgIGdvdG8gb3BfYnJlZzsKKworCWNhc2UgRFdfT1BfYnJlZ3g6CisJICByZWcgPSBleHByW2ldLm51bWJlcjsKKwkgIHZhbHVlID0gZXhwcltpXS5udW1iZXIyOworCW9wX2JyZWc6CisJICBwdXNoICgiZmV0Y2hfcmVnaXN0ZXIgKCV1KSArICIgU0ZPUk1BVCwgcmVnLCB2YWx1ZSk7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfZmJyZWc6CisJICBpZiAobmVlZF9mYiA9PSBOVUxMKQorCSAgICBESUUgKCJEV19PUF9mYnJlZyBmcm9tIERXX0FUX2ZyYW1lX2Jhc2UiKTsKKwkgICpuZWVkX2ZiID0gdHJ1ZTsKKwkgIHB1c2ggKCJmcmFtZV9iYXNlICsgIiBTRk9STUFULCBleHByW2ldLm51bWJlcik7CisJICBicmVhazsKKworCSAgLyogRGlyZWN0IHJlZ2lzdGVyIGNvbnRlbnRzLiAgKi8KKwljYXNlIERXX09QX3JlZzAgLi4uIERXX09QX3JlZzMxOgorCSAgcmVnID0gZXhwcltpXS5hdG9tIC0gRFdfT1BfcmVnMDsKKwkgIGdvdG8gb3BfcmVnOworCisJY2FzZSBEV19PUF9yZWd4OgorCSAgcmVnID0gZXhwcltpXS5udW1iZXI7CisJb3BfcmVnOgorCSAgdG9zX3JlZ2lzdGVyID0gcmVnOworCSAgYnJlYWs7CisKKwkgIC8qIFNwZWNpYWwgbWFnaWMuICAqLworCWNhc2UgRFdfT1BfcGllY2U6CisJICBpZiAoc3RhY2tfZGVwdGggPiAxKQorCSAgICAvKiBJZiB0aGlzIGV2ZXIgaGFwcGVucyB3ZSBjb3VsZCBjb3B5IHRoZSBwcm9ncmFtLiAgKi8KKwkgICAgRElFICgiRFdfT1BfcGllY2UgbGVmdCBtdWx0aXBsZSB2YWx1ZXMgb24gc3RhY2siKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cnVjdCBsb2NhdGlvbiAqcGllY2UgPSBvYnN0YWNrX2FsbG9jIChwb29sLCBzaXplb2YgKnBpZWNlKTsKKwkgICAgICBjb25zdCBjaGFyICpmYWlsdXJlID0gZmluaXNoIChwaWVjZSk7CisJICAgICAgaWYgKHVubGlrZWx5IChmYWlsdXJlICE9IE5VTEwpKQorCQlyZXR1cm4gZmFpbHVyZTsKKworCSAgICAgIHBpZWNlLT5vcHMgPSAmZXhwcltwaWVjZV9leHByX3N0YXJ0XTsKKwkgICAgICBwaWVjZS0+bm9wcyA9IGkgLSBwaWVjZV9leHByX3N0YXJ0OworCSAgICAgIHBpZWNlX2V4cHJfc3RhcnQgPSBpICsgMTsKKworCSAgICAgIHBpZWNlLT5ieXRlX3NpemUgPSBleHByW2ldLm51bWJlcjsKKworCSAgICAgICp0YWlscGllY2UgPSBwaWVjZTsKKwkgICAgICB0YWlscGllY2UgPSAmcGllY2UtPm5leHQ7CisJICAgICAgcGllY2UtPm5leHQgPSBOVUxMOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfcHVzaF9vYmplY3RfYWRkcmVzczoKKwkgIERJRSAoIlhYWCBEV19PUF9wdXNoX29iamVjdF9hZGRyZXNzIik7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBESUUgKCJ1bnJlY29nbml6ZWQgb3BlcmF0aW9uIik7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChsaWtlbHkgKHBpZWNlcyA9PSBOVUxMKSkKKyAgICByZXR1cm4gZmluaXNoIChsb2MpOworCisgIGlmIChwaWVjZV9leHByX3N0YXJ0ICE9IGkpCisgICAgRElFICgiZXh0cmEgb3BlcmF0aW9ucyBhZnRlciBsYXN0IERXX09QX3BpZWNlIik7CisKKyAgbG9jLT50eXBlID0gbG9jX25vbmNvbnRpZ3VvdXM7CisgIGxvYy0+cGllY2VzID0gcGllY2VzOworCisgIHJldHVybiBOVUxMOworCisgdW5kZXJmbG93OgorICBESUUgKCJzdGFjayB1bmRlcmZsb3ciKTsKKworI3VuZGVmIGVtaXQKKyN1bmRlZiBwdXNoCisjdW5kZWYgUFVTSAorI3VuZGVmIFBPUAorI3VuZGVmIFNUQUNLCisjdW5kZWYgRElFCit9CisKKy8qIFRyYW5zbGF0ZSBhIGxvY2F0aW9uIHN0YXJ0aW5nIGZyb20gYW4gYWRkcmVzcyBvciBub3RoaW5nLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9jYXRpb24gKgorbG9jYXRpb25fZnJvbV9hZGRyZXNzIChzdHJ1Y3Qgb2JzdGFjayAqcG9vbCwKKwkJICAgICAgIGludCBpbmRlbnQsIER3YXJmX0FkZHIgZHdiaWFzLAorCQkgICAgICAgY29uc3QgRHdhcmZfTG9jICpleHByLCBzaXplX3QgbGVuLCBEd2FyZl9BZGRyIGFkZHJlc3MsCisJCSAgICAgICBzdHJ1Y3QgbG9jYXRpb24gKippbnB1dCwgRHdhcmZfQXR0cmlidXRlICpmYl9hdHRyKQoreworICBib29sIG5lZWRfZmIgPSBmYWxzZTsKKyAgc2l6ZV90IGxvc2VyOworICBzdHJ1Y3QgbG9jYXRpb24gKmxvYyA9IG9ic3RhY2tfYWxsb2MgKHBvb2wsIHNpemVvZiAqbG9jKTsKKyAgY29uc3QgY2hhciAqZmFpbHVyZSA9IHRyYW5zbGF0ZSAocG9vbCwgaW5kZW50ICsgMSwgZHdiaWFzLCBleHByLCBsZW4sCisJCQkJICAgKmlucHV0LCAmbmVlZF9mYiwgJmxvc2VyLCBsb2MpOworICBpZiAodW5saWtlbHkgKGZhaWx1cmUgIT0gTlVMTCkpCisgICAgcmV0dXJuIGxvc2UgKGZhaWx1cmUsIGV4cHIsIGxvc2VyKTsKKworICBsb2MtPm5leHQgPSBOVUxMOworICBpZiAobmVlZF9mYikKKyAgICB7CisgICAgICAvKiBUaGUgbWFpbiBleHByZXNzaW9uIHVzZXMgRFdfT1BfZmJyZWcsIHNvIHdlIG5lZWQgdG8gY29tcHV0ZQorCSB0aGUgRFdfQVRfZnJhbWVfYmFzZSBhdHRyaWJ1dGUgZXhwcmVzc2lvbidzIHZhbHVlIGZpcnN0LiAgKi8KKworICAgICAgRHdhcmZfTG9jICpmYl9leHByOworICAgICAgc2l6ZV90IGZiX2xlbjsKKyAgICAgIHN3aXRjaCAoZHdhcmZfYWRkcmxvY2xpc3RzIChmYl9hdHRyLCBhZGRyZXNzIC0gZHdiaWFzLAorCQkJCSAgJmZiX2V4cHIsICZmYl9sZW4sIDEpKQorCXsKKwljYXNlIDE6CQkJLyogU2hvdWxkIGFsd2F5cyBoYXBwZW4uICAqLworCSAgaWYgKGZiX2xlbiA9PSAwKQorCSAgICBnb3RvIGZiX2luYWNjZXNzaWJsZTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoJCS8qIFNob3VsZG4ndCBoYXBwZW4uICAqLworCWNhc2UgLTE6CisJICBlcnJvciAoMiwgMCwgImR3YXJmX2FkZHJsb2NsaXN0cyAoZm9ybSAlI3gpOiAlcyIsCisJCSBkd2FyZl93aGF0Zm9ybSAoZmJfYXR0ciksIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkgIHJldHVybiBOVUxMOworCisJY2FzZSAwOgkJCS8qIFNob3VsZG4ndCBoYXBwZW4uICAqLworCWZiX2luYWNjZXNzaWJsZToKKwkgIGVycm9yICgyLCAwLCAiRFdfQVRfZnJhbWVfYmFzZSBub3QgYWNjZXNzaWJsZSBhdCB0aGlzIGFkZHJlc3MiKTsKKwkgIHJldHVybiBOVUxMOworCX0KKworICAgICAgbG9jLT5hZGRyZXNzLmZyYW1lX2Jhc2UgPSBvYnN0YWNrX2FsbG9jIChwb29sLCBzaXplb2YgKmxvYyk7CisgICAgICBmYWlsdXJlID0gdHJhbnNsYXRlIChwb29sLCBpbmRlbnQgKyAxLCBkd2JpYXMsIGZiX2V4cHIsIGZiX2xlbiwgTlVMTCwKKwkJCSAgIE5VTEwsICZsb3NlciwgbG9jLT5hZGRyZXNzLmZyYW1lX2Jhc2UpOworICAgICAgaWYgKHVubGlrZWx5IChmYWlsdXJlICE9IE5VTEwpKQorCXJldHVybiBsb3NlIChmYWlsdXJlLCBmYl9leHByLCBsb3Nlcik7CisgICAgfQorCisgIGlmICgqaW5wdXQgIT0gTlVMTCkKKyAgICAoKmlucHV0KS0+bmV4dCA9IGxvYzsKKyAgKmlucHV0ID0gbG9jOworCisgIHJldHVybiBsb2M7Cit9CisKKy8qIFRyYW5zbGF0ZSBhIGxvY2F0aW9uIHN0YXJ0aW5nIGZyb20gYSBub24tYWRkcmVzcyAib24gdGhlIHRvcCBvZiB0aGUKKyAgIHN0YWNrIi4gIFRoZSAqSU5QVVQgbG9jYXRpb24gaXMgYSByZWdpc3RlciBuYW1lIG9yIG5vbmNvbnRpZ3VvdXMKKyAgIG9iamVjdCBzcGVjaWZpY2F0aW9uLCBhbmQgdGhpcyBleHByZXNzaW9uIHdhbnRzIHRvIGZpbmQgdGhlICJhZGRyZXNzIgorICAgb2YgYW4gb2JqZWN0IHJlbGF0aXZlIHRvIHRoYXQgImFkZHJlc3MiLiAgKi8KKworc3RhdGljIHN0cnVjdCBsb2NhdGlvbiAqCitsb2NhdGlvbl9yZWxhdGl2ZSAoc3RydWN0IG9ic3RhY2sgKnBvb2wsCisJCSAgIGludCBpbmRlbnQsIER3YXJmX0FkZHIgZHdiaWFzLAorCQkgICBjb25zdCBEd2FyZl9Mb2MgKmV4cHIsIHNpemVfdCBsZW4sIER3YXJmX0FkZHIgYWRkcmVzcywKKwkJICAgc3RydWN0IGxvY2F0aW9uICoqaW5wdXQsIER3YXJmX0F0dHJpYnV0ZSAqZmJfYXR0cikKK3sKKyAgRHdhcmZfU3dvcmQgKnN0YWNrOworICB1bnNpZ25lZCBpbnQgc3RhY2tfZGVwdGggPSAwLCBtYXhfc3RhY2sgPSAwOworICBpbmxpbmUgdm9pZCBkZWVwZW4gKHZvaWQpCisgICAgeworICAgICAgaWYgKHN0YWNrX2RlcHRoID09IG1heF9zdGFjaykKKwl7CisJICArK21heF9zdGFjazsKKwkgIG9ic3RhY2tfYmxhbmsgKHBvb2wsIHNpemVvZiBzdGFja1swXSk7CisJICBzdGFjayA9ICh2b2lkICopIG9ic3RhY2tfYmFzZSAocG9vbCk7CisJfQorICAgIH0KKworI2RlZmluZSBQT1AodmFyKQkJCQkJCQkgICAgICBcCisgICAgaWYgKHN0YWNrX2RlcHRoID4gMCkJCQkJCQkgICAgICBcCisgICAgICAtLXN0YWNrX2RlcHRoOwkJCQkJCQkgICAgICBcCisgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgZ290byB1bmRlcmZsb3c7CQkJCQkJCSAgICAgIFwKKyAgICBpbnQgdmFyID0gc3RhY2tfZGVwdGgKKyNkZWZpbmUgUFVTSCAJCShkZWVwZW4gKCksIHN0YWNrX2RlcHRoKyspCisjZGVmaW5lIFNUQUNLKGlkeCkJKHN0YWNrX2RlcHRoIC0gMSAtIChpZHgpKQorI2RlZmluZSBTVEFDS1dPUkQoaWR4KQlzdGFja1tTVEFDSyAoaWR4KV0KKworICAvKiBEb24ndCBwdXQgc3RhY2sgb3BlcmF0aW9ucyBpbiB0aGUgYXJndW1lbnRzIHRvIHRoaXMuICAqLworI2RlZmluZSBwdXNoKHZhbHVlKSAoc3RhY2tbUFVTSF0gPSAodmFsdWUpKQorCisgIGNvbnN0IGNoYXIgKmZhaWx1cmUgPSBOVUxMOworI2RlZmluZSBESUUobXNnKSBkbyB7IGZhaWx1cmUgPSBfKG1zZyk7IGdvdG8gZmFpbDsgfSB3aGlsZSAoMCkKKworICBzdHJ1Y3QgbG9jYXRpb24gKmhlYWQgPSBOVUxMOworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIHsKKyAgICAgIHVpbnRfZmFzdDhfdCBzcDsKKyAgICAgIER3YXJmX1dvcmQgdmFsdWU7CisKKyAgICAgIHN3aXRjaCAoZXhwcltpXS5hdG9tKQorCXsKKwkgIC8qIEJhc2ljIHN0YWNrIG9wZXJhdGlvbnMuICAqLworCWNhc2UgRFdfT1Bfbm9wOgorCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2R1cDoKKwkgIGlmIChzdGFja19kZXB0aCA8IDEpCisJICAgIGdvdG8gdW5kZXJmbG93OworCSAgZWxzZQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IHRvcyA9IFNUQUNLICgwKTsKKwkgICAgICBwdXNoIChzdGFja1t0b3NdKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2Ryb3A6CisJICBpZiAoc3RhY2tfZGVwdGggPiAwKQorCSAgICAtLXN0YWNrX2RlcHRoOworCSAgZWxzZSBpZiAoKmlucHV0ICE9IE5VTEwpCisJICAgIC8qIE1hcmsgdGhhdCB3ZSBoYXZlIGNvbnN1bWVkIHRoZSBpbnB1dC4gICovCisJICAgICppbnB1dCA9IE5VTEw7CisJICBlbHNlCisJICAgIC8qIEhpdHMgaWYgY2xlYXJlZCBhYm92ZSwgb3IgaWYgd2UgaGFkIG5vIGlucHV0IGF0IGFsbC4gICovCisJICAgIGdvdG8gdW5kZXJmbG93OworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX3BpY2s6CisJICBzcCA9IGV4cHJbaV0ubnVtYmVyOworCW9wX3BpY2s6CisJICBpZiAoc3AgPj0gc3RhY2tfZGVwdGgpCisJICAgIGdvdG8gdW5kZXJmbG93OworCSAgc3AgPSBTVEFDSyAoc3ApOworCSAgcHVzaCAoc3RhY2tbc3BdKTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9vdmVyOgorCSAgc3AgPSAxOworCSAgZ290byBvcF9waWNrOworCisJY2FzZSBEV19PUF9zd2FwOgorCSAgaWYgKHN0YWNrX2RlcHRoIDwgMikKKwkgICAgZ290byB1bmRlcmZsb3c7CisJICBkZWVwZW4gKCk7CQkvKiBVc2UgYSB0ZW1wb3Jhcnkgc2xvdC4gICovCisJICBTVEFDS1dPUkQgKC0xKSA9IFNUQUNLV09SRCAoMCk7CisJICBTVEFDS1dPUkQgKDApID0gU1RBQ0tXT1JEICgxKTsKKwkgIFNUQUNLV09SRCAoMSkgPSBTVEFDS1dPUkQgKC0xKTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9yb3Q6CisJICBpZiAoc3RhY2tfZGVwdGggPCAzKQorCSAgICBnb3RvIHVuZGVyZmxvdzsKKwkgIGRlZXBlbiAoKTsJCS8qIFVzZSBhIHRlbXBvcmFyeSBzbG90LiAgKi8KKwkgIFNUQUNLV09SRCAoLTEpID0gU1RBQ0tXT1JEICgwKTsKKwkgIFNUQUNLV09SRCAoMCkgPSBTVEFDS1dPUkQgKDEpOworCSAgU1RBQ0tXT1JEICgyKSA9IFNUQUNLV09SRCAoMik7CisJICBTVEFDS1dPUkQgKDIpID0gU1RBQ0tXT1JEICgtMSk7CisJICBicmVhazsKKworCisJICAvKiBDb250cm9sIGZsb3cgb3BlcmF0aW9ucy4gICovCisJY2FzZSBEV19PUF9icmE6CisJICB7CisJICAgIFBPUCAodGFrZW4pOworCSAgICBpZiAoc3RhY2tbdGFrZW5dID09IDApCisJICAgICAgYnJlYWs7CisJICB9CisJICAvKkZBTExUSFJPVUdIKi8KKworCWNhc2UgRFdfT1Bfc2tpcDoKKwkgIHsKKwkgICAgRHdhcmZfT2ZmIHRhcmdldCA9IGV4cHJbaV0ub2Zmc2V0ICsgMyArIGV4cHJbaV0ubnVtYmVyOworCSAgICB3aGlsZSAoaSArIDEgPCBsZW4gJiYgZXhwcltpICsgMV0ub2Zmc2V0IDwgdGFyZ2V0KQorCSAgICAgICsraTsKKwkgICAgaWYgKGV4cHJbaSArIDFdLm9mZnNldCAhPSB0YXJnZXQpCisJICAgICAgRElFICgiaW52YWxpZCBza2lwIHRhcmdldCIpOworCSAgICBicmVhazsKKwkgIH0KKworCSAgLyogTWVtb3J5IGFjY2Vzcy4gICovCisJY2FzZSBEV19PUF9kZXJlZjoKKwljYXNlIERXX09QX2RlcmVmX3NpemU6CisJY2FzZSBEV19PUF94ZGVyZWY6CisJY2FzZSBEV19PUF94ZGVyZWZfc2l6ZToKKworCSAgLyogUmVnaXN0ZXItcmVsYXRpdmUgYWRkcmVzc2luZy4gICovCisJY2FzZSBEV19PUF9icmVnMCAuLi4gRFdfT1BfYnJlZzMxOgorCWNhc2UgRFdfT1BfYnJlZ3g6CisJY2FzZSBEV19PUF9mYnJlZzoKKworCSAgLyogVGhpcyBzdGFydGVkIGZyb20gYSByZWdpc3RlciwgYnV0IG5vdyBpdCdzIGZvbGxvd2luZyBhIHBvaW50ZXIuCisJICAgICBTbyB3ZSBjYW4gZG8gdGhlIHRyYW5zbGF0aW9uIHN0YXJ0aW5nIGZyb20gYWRkcmVzcyBoZXJlLiAgKi8KKwkgIHJldHVybiBsb2NhdGlvbl9mcm9tX2FkZHJlc3MgKHBvb2wsIGluZGVudCwgZHdiaWFzLAorCQkJCQlleHByLCBsZW4sIGFkZHJlc3MsIGlucHV0LCBmYl9hdHRyKTsKKworCisJICAvKiBDb25zdGFudC12YWx1ZSBvcGVyYXRpb25zLiAgKi8KKwljYXNlIERXX09QX2FkZHI6CisJICBwdXNoIChkd2JpYXMgKyBleHByW2ldLm51bWJlcik7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfbGl0MCAuLi4gRFdfT1BfbGl0MzE6CisJICB2YWx1ZSA9IGV4cHJbaV0uYXRvbSAtIERXX09QX2xpdDA7CisJICBnb3RvIG9wX2NvbnN0OworCisJY2FzZSBEV19PUF9jb25zdDF1OgorCWNhc2UgRFdfT1BfY29uc3QxczoKKwljYXNlIERXX09QX2NvbnN0MnU6CisJY2FzZSBEV19PUF9jb25zdDJzOgorCWNhc2UgRFdfT1BfY29uc3Q0dToKKwljYXNlIERXX09QX2NvbnN0NHM6CisJY2FzZSBEV19PUF9jb25zdDh1OgorCWNhc2UgRFdfT1BfY29uc3Q4czoKKwljYXNlIERXX09QX2NvbnN0dToKKwljYXNlIERXX09QX2NvbnN0czoKKwkgIHZhbHVlID0gZXhwcltpXS5udW1iZXI7CisJb3BfY29uc3Q6CisJICBwdXNoICh2YWx1ZSk7CisJICBicmVhazsKKworCSAgLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zLiAgKi8KKyNkZWZpbmUgVU5PUChkd19vcCwgY19vcCkJCQkJCQkgICAgICBcCisJY2FzZSBEV19PUF8jI2R3X29wOgkJCQkJCSAgICAgIFwKKwkgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgUE9QICh0b3MpOwkJCQkJCQkgICAgICBcCisJICAgIHB1c2ggKGNfb3AgKHN0YWNrW3Rvc10pKTsgCQkJCQkgICAgICBcCisJICB9CQkJCQkJCQkgICAgICBcCisJICBicmVhaworI2RlZmluZSBCSU5PUChkd19vcCwgY19vcCkJCQkJCQkgICAgICBcCisJY2FzZSBEV19PUF8jI2R3X29wOgkJCQkJCSAgICAgIFwKKwkgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgUE9QIChiKTsJCQkJCQkJICAgICAgXAorCSAgICBQT1AgKGEpOwkJCQkJCQkgICAgICBcCisgCSAgICBwdXNoIChzdGFja1thXSBjX29wIHN0YWNrW2JdKTsJCQkJICAgICAgXAorCSAgfQkJCQkJCQkJICAgICAgXAorCSAgYnJlYWsKKworI2RlZmluZSBvcF9hYnMoeCkgKHggPCAwID8gLXggOiB4KQorCSAgVU5PUCAoYWJzLCBvcF9hYnMpOworCSAgQklOT1AgKGFuZCwgJik7CisJICBCSU5PUCAoZGl2LCAvKTsKKwkgIEJJTk9QIChtb2QsICUpOworCSAgQklOT1AgKG11bCwgKik7CisJICBVTk9QIChuZWcsIC0pOworCSAgVU5PUCAobm90LCB+KTsKKwkgIEJJTk9QIChvciwgfCk7CisJICBCSU5PUCAoc2hsLCA8PCk7CisJICBCSU5PUCAoc2hyYSwgPj4pOworCSAgQklOT1AgKHhvciwgXik7CisKKwkgIC8qIENvbXBhcmlzb25zIGFyZSBiaW5hcnkgb3BlcmF0b3JzIHRvby4gICovCisJICBCSU5PUCAobGUsIDw9KTsKKwkgIEJJTk9QIChnZSwgPj0pOworCSAgQklOT1AgKGVxLCA9PSk7CisJICBCSU5PUCAobHQsIDwpOworCSAgQklOT1AgKGd0LCA+KTsKKwkgIEJJTk9QIChuZSwgIT0pOworCisjdW5kZWYJVU5PUAorI3VuZGVmCUJJTk9QCisKKwljYXNlIERXX09QX3NocjoKKwkgIHsKKwkgICAgUE9QIChiKTsKKwkgICAgUE9QIChhKTsKKwkgICAgcHVzaCAoKER3YXJmX1dvcmQpIHN0YWNrW2FdID4+IChEd2FyZl9Xb3JkKSBzdGFja1tiXSk7CisJICAgIGJyZWFrOworCSAgfQorCisJICAvKiBTaW1wbGUgYWRkaXRpb24gd2UgbWF5IGJlIGFibGUgdG8gaGFuZGxlIHJlbGF0aXZlIHRvCisJICAgICB0aGUgc3RhcnRpbmcgcmVnaXN0ZXIgbmFtZS4gICovCisJY2FzZSBEV19PUF9taW51czoKKwkgIHsKKwkgICAgUE9QICh0b3MpOworCSAgICB2YWx1ZSA9IC1zdGFja1t0b3NdOworCSAgICBnb3RvIHBsdXM7CisJICB9CisJY2FzZSBEV19PUF9wbHVzOgorCSAgeworCSAgICBQT1AgKHRvcyk7CisJICAgIHZhbHVlID0gc3RhY2tbdG9zXTsKKwkgICAgZ290byBwbHVzOworCSAgfQorCWNhc2UgRFdfT1BfcGx1c191Y29uc3Q6CisJICB2YWx1ZSA9IGV4cHJbaV0ubnVtYmVyOworCXBsdXM6CisJICBpZiAoc3RhY2tfZGVwdGggPiAwKQorCSAgICB7CisJICAgICAgLyogSXQncyBqdXN0IHByaXZhdGUgZGlkZGxpbmcgYWZ0ZXIgYWxsLiAgKi8KKwkgICAgICBQT1AgKGEpOworCSAgICAgIHB1c2ggKHN0YWNrW2FdICsgdmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpZiAoKmlucHV0ID09IE5VTEwpCisJICAgIGdvdG8gdW5kZXJmbG93OworCisJICAvKiBUaGlzIGlzIHRoZSBwcmltYXJ5IHJlYWwtd29ybGQgY2FzZTogdGhlIGV4cHJlc3Npb24gdGFrZXMKKwkgICAgIHRoZSBpbnB1dCBhZGRyZXNzIGFuZCBhZGRzIGEgY29uc3RhbnQgb2Zmc2V0LiAgKi8KKworCSAgd2hpbGUgKCgqaW5wdXQpLT50eXBlID09IGxvY19ub25jb250aWd1b3VzKQorCSAgICB7CisJICAgICAgLyogV2UgYXJlIHN0YXJ0aW5nIGZyb20gYSBub25jb250aWd1b3VzIG9iamVjdCAoRFdfT1BfcGllY2UpLgorCQkgRmluZCB0aGUgcGllY2Ugd2Ugd2FudC4gICovCisKKwkgICAgICBzdHJ1Y3QgbG9jYXRpb24gKnBpZWNlID0gKCppbnB1dCktPnBpZWNlczsKKwkgICAgICB3aGlsZSAocGllY2UgIT0gTlVMTCAmJiB2YWx1ZSA+PSBwaWVjZS0+Ynl0ZV9zaXplKQorCQl7CisJCSAgdmFsdWUgLT0gcGllY2UtPmJ5dGVfc2l6ZTsKKwkJICBwaWVjZSA9IHBpZWNlLT5uZXh0OworCQl9CisJICAgICAgaWYgKHBpZWNlID09IE5VTEwpCisJCURJRSAoIm9mZnNldCBvdXRzaWRlIGF2YWlsYWJsZSBwaWVjZXMiKTsKKworCSAgICAgICppbnB1dCA9IHBpZWNlOworCSAgICB9CisKKwkgIHN3aXRjaCAoKCppbnB1dCktPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBsb2NfYWRkcmVzczoKKwkgICAgICB7CisJCS8qIFRoZSBwaWVjZSB3ZSB3YW50IGlzIGFjdHVhbGx5IGluIG1lbW9yeS4gIFVzZSB0aGUgc2FtZQorCQkgICBwcm9ncmFtIHRvIGNvbXB1dGUgdGhlIGFkZHJlc3MgZnJvbSB0aGUgcHJlY2VkaW5nIGlucHV0LiAgKi8KKworCQlzdHJ1Y3QgbG9jYXRpb24gKmxvYyA9IG9ic3RhY2tfYWxsb2MgKHBvb2wsIHNpemVvZiAqbG9jKTsKKwkJKmxvYyA9ICoqaW5wdXQ7CisJCWlmIChoZWFkID09IE5VTEwpCisJCSAgaGVhZCA9IGxvYzsKKwkJKCppbnB1dCktPm5leHQgPSBsb2M7CisJCWlmICh2YWx1ZSA9PSAwKQorCQkgIHsKKwkJICAgIC8qIFRoZSBwaWVjZSBhZGRyZXNzZXMgZXhhY3RseSB3aGVyZSB3ZSB3YW50IHRvIGdvLiAgKi8KKwkJICAgIGxvYy0+bmV4dCA9IE5VTEw7CisJCSAgICAqaW5wdXQgPSBsb2M7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgLyogQWRkIGEgc2Vjb25kIGZyYWdtZW50IHRvIG9mZnNldCB0aGUgcGllY2UgYWRkcmVzcy4gICovCisJCSAgICBvYnN0YWNrX3ByaW50ZiAocG9vbCwgIiUqc2FkZHIgKz0gIiBTRk9STUFUICJcbiIsCisJCQkJICAgIGluZGVudCAqIDIsICIiLCB2YWx1ZSk7CisJCSAgICAqaW5wdXQgPSBsb2MtPm5leHQgPSBuZXdfc3ludGhldGljX2xvYyAocG9vbCwgKmlucHV0LAorCQkJCQkJCSAgICBmYWxzZSk7CisJCSAgfQorCisJCWlmIChpICsgMSA8IGxlbikKKwkJICB7CisJCSAgICAvKiBUaGlzIGV4cHJlc3Npb24ga2VlcHMgZ29pbmcsIGJ1dCBmdXJ0aGVyCisJCSAgICAgICBjb21wdXRhdGlvbnMgbm93IGhhdmUgYW4gYWRkcmVzcyB0byBzdGFydCB3aXRoLgorCQkgICAgICAgU28gd2UgY2FuIHB1bnQgdG8gdGhlIGFkZHJlc3MgY29tcHV0YXRpb24gZ2VuZXJhdG9yLiAgKi8KKwkJICAgIGxvYyA9IGxvY2F0aW9uX2Zyb21fYWRkcmVzcyAocG9vbCwgaW5kZW50LCBkd2JpYXMsCisJCQkJCQkgJmV4cHJbaSArIDFdLCBsZW4gLSBpIC0gMSwKKwkJCQkJCSBhZGRyZXNzLCBpbnB1dCwgZmJfYXR0cik7CisJCSAgICBpZiAobG9jID09IE5VTEwpCisJCSAgICAgIHJldHVybiBOVUxMOworCQkgIH0KKworCQkvKiBUaGF0J3MgYWxsIHNoZSB3cm90ZS4gICovCisJCXJldHVybiBoZWFkOworCSAgICAgIH0KKworCSAgICBjYXNlIGxvY19yZWdpc3RlcjoKKwkgICAgICAvLyBYWFgKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBicmVhazsKKworCSAgLyogRGlyZWN0IHJlZ2lzdGVyIGNvbnRlbnRzLiAgKi8KKwljYXNlIERXX09QX3JlZzAgLi4uIERXX09QX3JlZzMxOgorCWNhc2UgRFdfT1BfcmVneDoKKwkgIERJRSAoInJlZ2lzdGVyIik7CisJICBicmVhazsKKworCSAgLyogU3BlY2lhbCBtYWdpYy4gICovCisJY2FzZSBEV19PUF9waWVjZToKKwkgIERJRSAoIkRXX09QX3BpZWNlIik7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfcHVzaF9vYmplY3RfYWRkcmVzczoKKwkgIERJRSAoIlhYWCBEV19PUF9wdXNoX29iamVjdF9hZGRyZXNzIik7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBESUUgKCJ1bnJlY29nbml6ZWQgb3BlcmF0aW9uIik7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChzdGFja19kZXB0aCA+IDEpCisgICAgRElFICgibXVsdGlwbGUgdmFsdWVzIGxlZnQgb24gc3RhY2siKTsKKworICBpZiAoc3RhY2tfZGVwdGggPiAwKQkJLyogc3RhY2tfZGVwdGggPT0gMSAqLworICAgIHsKKyAgICAgIGlmICgqaW5wdXQgIT0gTlVMTCkKKwlESUUgKCJtdWx0aXBsZSB2YWx1ZXMgbGVmdCBvbiBzdGFjayIpOworCisgICAgICAvKiBDb3VsZCBoYW5kbGUgdGhpcyBpZiBpdCBldmVyIGFjdHVhbGx5IGhhcHBlbmVkLiAgKi8KKyAgICAgIERJRSAoInJlbGF0aXZlIGV4cHJlc3Npb24gY29tcHV0ZWQgY29uc3RhbnQiKTsKKyAgICB9CisKKyAgcmV0dXJuIGhlYWQ7CisKKyB1bmRlcmZsb3c6CisgIGlmICgqaW5wdXQgPT0gTlVMTCkKKyAgICBESUUgKCJzdGFjayB1bmRlcmZsb3ciKTsKKyAgZWxzZQorICAgIERJRSAoImNhbm5vdCBoYW5kbGUgbG9jYXRpb24gZXhwcmVzc2lvbiIpOworCisgZmFpbDoKKyAgcmV0dXJuIGxvc2UgKGZhaWx1cmUsIGV4cHIsIGkpOworfQorCisKKy8qIFRyYW5zbGF0ZSBhIEMgZnJhZ21lbnQgZm9yIHRoZSBsb2NhdGlvbiBleHByZXNzaW9uLCB1c2luZyAqSU5QVVQKKyAgIGFzIHRoZSBzdGFydGluZyBsb2NhdGlvbiwgYmVnaW4gZnJvbSBzY3JhdGNoIGlmICpJTlBVVCBpcyBudWxsLgorICAgSWYgRFdfT1BfZmJyZWcgaXMgdXNlZCwgaXQgbWF5IGhhdmUgYSBzdWJmcmFnbWVudCBjb21wdXRpbmcgZnJvbQorICAgdGhlIEZCX0FUVFIgbG9jYXRpb24gZXhwcmVzc2lvbi4KKworICAgT24gZXJyb3JzLCBleGl0IGFuZCBuZXZlciByZXR1cm4gKFhYWCA/KS4gIE9uIHN1Y2Nlc3MsIHJldHVybiB0aGUKKyAgIGZpcnN0IGZyYWdtZW50IGNyZWF0ZWQsIHdoaWNoIGlzIGFsc28gY2hhaW5lZCBvbnRvICgqSU5QVVQpLT5uZXh0LgorICAgKklOUFVUIGlzIHRoZW4gdXBkYXRlZCB3aXRoIHRoZSBuZXcgdGFpbCBvZiB0aGF0IGNoYWluLiAgKi8KKworc3RydWN0IGxvY2F0aW9uICoKK2NfdHJhbnNsYXRlX2xvY2F0aW9uIChzdHJ1Y3Qgb2JzdGFjayAqcG9vbCwKKwkJICAgICAgaW50IGluZGVudCwgRHdhcmZfQWRkciBkd2JpYXMsCisJCSAgICAgIER3YXJmX0F0dHJpYnV0ZSAqbG9jX2F0dHIsIER3YXJmX0FkZHIgYWRkcmVzcywKKwkJICAgICAgc3RydWN0IGxvY2F0aW9uICoqaW5wdXQsIER3YXJmX0F0dHJpYnV0ZSAqZmJfYXR0cikKK3sKKyAgRHdhcmZfTG9jICpleHByOworICBzaXplX3QgbGVuOworICBzd2l0Y2ggKGR3YXJmX2FkZHJsb2NsaXN0cyAobG9jX2F0dHIsIGFkZHJlc3MgLSBkd2JpYXMsICZleHByLCAmbGVuLCAxKSkKKyAgICB7CisgICAgY2FzZSAxOgkJCS8qIFNob3VsZCBhbHdheXMgaGFwcGVuLiAgKi8KKyAgICAgIGlmIChsZW4gPT0gMCkKKwlnb3RvIGluYWNjZXNzaWJsZTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoJCQkvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KKyAgICBjYXNlIC0xOgorICAgICAgZXJyb3IgKDIsIDAsICJkd2FyZl9hZGRybG9jbGlzdHMgKGZvcm0gJSN4KTogJXMiLAorCSAgICAgZHdhcmZfd2hhdGZvcm0gKGZiX2F0dHIpLCBkd2FyZl9lcnJtc2cgKC0xKSk7CisgICAgICByZXR1cm4gTlVMTDsKKworICAgIGNhc2UgMDoJCQkvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KKyAgICBpbmFjY2Vzc2libGU6CisgICAgICBlcnJvciAoMiwgMCwgIm5vdCBhY2Nlc3NpYmxlIGF0IHRoaXMgYWRkcmVzcyIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICsraW5kZW50OworICBzd2l0Y2ggKCppbnB1dCA9PSBOVUxMID8gbG9jX2FkZHJlc3MgOiAoKmlucHV0KS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBsb2NfYWRkcmVzczoKKyAgICAgIC8qIFdlIGhhdmUgYSBwcmV2aW91cyBhZGRyZXNzIGNvbXB1dGF0aW9uLgorCSBUaGlzIGV4cHJlc3Npb24gd2lsbCBjb21wdXRlIHN0YXJ0aW5nIHdpdGggdGhhdCBvbiB0aGUgc3RhY2suICAqLworICAgICAgcmV0dXJuIGxvY2F0aW9uX2Zyb21fYWRkcmVzcyAocG9vbCwgaW5kZW50LCBkd2JpYXMsIGV4cHIsIGxlbiwgYWRkcmVzcywKKwkJCQkgICAgaW5wdXQsIGZiX2F0dHIpOworCisgICAgY2FzZSBsb2Nfbm9uY29udGlndW91czoKKyAgICBjYXNlIGxvY19yZWdpc3RlcjoKKyAgICAgIC8qIFRoZSBzdGFydGluZyBwb2ludCBpcyBub3QgYW4gYWRkcmVzcyBjb21wdXRhdGlvbiwgYnV0IGEKKwkgcmVnaXN0ZXIuICBXZSBjYW4gb25seSBoYW5kbGUgbGltaXRlZCBjb21wdXRhdGlvbnMgZnJvbSBoZXJlLiAgKi8KKyAgICAgIHJldHVybiBsb2NhdGlvbl9yZWxhdGl2ZSAocG9vbCwgaW5kZW50LCBkd2JpYXMsIGV4cHIsIGxlbiwgYWRkcmVzcywKKwkJCQlpbnB1dCwgZmJfYXR0cik7CisKKyAgICBjYXNlIGxvY19maW5hbDoJCS8qIEJvZ3VzIGNhbGxlci4gICovCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisKKy8qIEVtaXQgInVpbnROTl90IFRBUkdFVCA9IC4uLjsiLiAgKi8KK3N0YXRpYyBib29sCitlbWl0X2Jhc2VfZmV0Y2ggKHN0cnVjdCBvYnN0YWNrICpwb29sLCBEd2FyZl9Xb3JkIGJ5dGVfc2l6ZSwKKwkJIGNvbnN0IGNoYXIgKnRhcmdldCwgYm9vbCBkZWNsLCBzdHJ1Y3QgbG9jYXRpb24gKmxvYykKK3sKKyAgaWYgKGRlY2wpCisgICAgb2JzdGFja19wcmludGYgKHBvb2wsICJ1aW50JSIgUFJJdTY0ICJfdCAiLCBieXRlX3NpemUgKiA4KTsKKworICBzd2l0Y2ggKGxvYy0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBsb2NfYWRkcmVzczoKKyAgICAgIGlmIChieXRlX3NpemUgIT0gMCAmJiBieXRlX3NpemUgIT0gKER3YXJmX1dvcmQpIC0xKQorCW9ic3RhY2tfcHJpbnRmIChwb29sLCAiJXMgPSBkZXJlZiAoJSIgUFJJdTY0ICIsIGFkZHIpOyAiLAorCQkJdGFyZ2V0LCBieXRlX3NpemUpOworICAgICAgZWxzZQorCW9ic3RhY2tfcHJpbnRmIChwb29sLCAiJXMgPSBkZXJlZiAoc2l6ZW9mICVzLCBhZGRyKTsgIiwKKwkJCXRhcmdldCwgdGFyZ2V0KTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBsb2NfcmVnaXN0ZXI6CisgICAgICBvYnN0YWNrX3ByaW50ZiAocG9vbCwgIiVzID0gZmV0Y2hfcmVnaXN0ZXIgKCV1KTsiLCB0YXJnZXQsIGxvYy0+cmVnbm8pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGxvY19ub25jb250aWd1b3VzOgorICAgICAgLyogQ291bGQgYmUgaGFuZGxlZCBpZiBpdCBldmVyIGhhcHBlbmVkLiAgKi8KKyAgICAgIGVycm9yICgyLCAwLCBfKCJub25jb250aWd1b3VzIGxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBUcmFuc2xhdGUgYSBmcmFnbWVudCB0byBkZXJlZmVyZW5jZSB0aGUgZ2l2ZW4gcG9pbnRlciB0eXBlLAorICAgd2hlcmUgKklOUFVUIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcG9pbnRlciB3aXRoIHRoYXQgdHlwZS4KKworICAgV2UgY2hhaW4gb24gYSBsb2NfYWRkcmVzcyBwcm9ncmFtIHRoYXQgeWllbGRzIHRoaXMgcG9pbnRlciB2YWx1ZQorICAgKGkuZS4gdGhlIGxvY2F0aW9uIG9mIHdoYXQgaXQgcG9pbnRzIHRvKS4gICovCisKK3ZvaWQKK2NfdHJhbnNsYXRlX3BvaW50ZXIgKHN0cnVjdCBvYnN0YWNrICpwb29sLCBpbnQgaW5kZW50LAorCQkgICAgIER3YXJmX0FkZHIgZHdiaWFzIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJICAgICBEd2FyZl9EaWUgKnR5cGVkaWUsIHN0cnVjdCBsb2NhdGlvbiAqKmlucHV0KQoreworICBvYnN0YWNrX3ByaW50ZiAocG9vbCwgIiUqc3sgIiwgKGluZGVudCArIDIpICogMiwgIiIpOworCisgIGJvb2wgZGVyZWYgPSBmYWxzZTsKKyAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOworICBEd2FyZl9Xb3JkIGJ5dGVfc2l6ZTsKKyAgaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9ieXRlX3NpemUsICZhdHRyX21lbSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBvYnN0YWNrX3ByaW50ZiAocG9vbCwgInVpbnRwdHJfdCAiKTsKKyAgICAgIGVtaXRfYmFzZV9mZXRjaCAocG9vbCwgMCwgInRtcCIsIGZhbHNlLCAqaW5wdXQpOworICAgIH0KKyAgZWxzZSBpZiAoZHdhcmZfZm9ybXVkYXRhICgmYXR0cl9tZW0sICZieXRlX3NpemUpICE9IDApCisgICAgZXJyb3IgKDIsIDAsCisJICAgXygiY2Fubm90IGdldCBieXRlX3NpemUgYXR0cmlidXRlIGZvciB0eXBlICVzOiAlcyIpLAorCSAgIGR3YXJmX2RpZW5hbWVfaW50ZWdyYXRlICh0eXBlZGllKSA/OiAiPGFub255bW91cz4iLAorCSAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKyAgZWxzZQorICAgIGRlcmVmID0gZW1pdF9iYXNlX2ZldGNoIChwb29sLCBieXRlX3NpemUsICJ0bXAiLCB0cnVlLCAqaW5wdXQpOworCisgIG9ic3RhY2tfcHJpbnRmIChwb29sLCAiIGFkZHIgPSB0bXA7IH1cbiIpOworCisgIHN0cnVjdCBsb2NhdGlvbiAqbG9jID0gbmV3X3N5bnRoZXRpY19sb2MgKHBvb2wsICppbnB1dCwgZGVyZWYpOworICAoKmlucHV0KS0+bmV4dCA9IGxvYzsKKyAgKmlucHV0ID0gbG9jOworfQorCisvKiBEZXRlcm1pbmUgdGhlIGJ5dGUgc2l6ZSBvZiBhIGJhc2UgdHlwZS4gICovCitzdGF0aWMgRHdhcmZfV29yZAorYmFzZV9ieXRlX3NpemUgKER3YXJmX0RpZSAqdHlwZWRpZSkKK3sKKyAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOworICBEd2FyZl9Xb3JkIHNpemU7CisgIGlmIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplLCAmYXR0cl9tZW0pICE9IE5VTEwKKyAgICAgICYmIGR3YXJmX2Zvcm11ZGF0YSAoJmF0dHJfbWVtLCAmc2l6ZSkgPT0gMCkKKyAgICByZXR1cm4gc2l6ZTsKKworICBlcnJvciAoMiwgMCwKKwkgXygiY2Fubm90IGdldCBieXRlX3NpemUgYXR0cmlidXRlIGZvciB0eXBlICVzOiAlcyIpLAorCSBkd2FyZl9kaWVuYW1lX2ludGVncmF0ZSAodHlwZWRpZSkgPzogIjxhbm9ueW1vdXM+IiwKKwkgZHdhcmZfZXJybXNnICgtMSkpOworICByZXR1cm4gLTE7Cit9CisKKy8qIEVtaXQgYSBjb2RlIGZyYWdtZW50IGxpa2U6CisJeyB1aW50Tk5fdCB0bXAgPSAuLi47IFMxIFMyIFMzLCB0bXAsIEIwLCBCbik7IH0KKyovCitzdGF0aWMgdm9pZAorZW1pdF9iaXRmaWVsZCAoc3RydWN0IG9ic3RhY2sgKnBvb2wsIGludCBpbmRlbnQsCisJICAgICAgIER3YXJmX0RpZSAqZGllLCBEd2FyZl9Xb3JkIGJ5dGVfc2l6ZSwgc3RydWN0IGxvY2F0aW9uICpsb2MsCisJICAgICAgIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqczMpCit7CisgIER3YXJmX1dvcmQgYml0X29mZnNldCwgYml0X3NpemU7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlIChkaWUsIERXX0FUX2JpdF9vZmZzZXQsICZhdHRyX21lbSkgPT0gTlVMTAorICAgICAgfHwgZHdhcmZfZm9ybXVkYXRhICgmYXR0cl9tZW0sICZiaXRfb2Zmc2V0KSAhPSAwCisgICAgICB8fCBkd2FyZl9hdHRyX2ludGVncmF0ZSAoZGllLCBEV19BVF9iaXRfc2l6ZSwgJmF0dHJfbWVtKSA9PSBOVUxMCisgICAgICB8fCBkd2FyZl9mb3JtdWRhdGEgKCZhdHRyX21lbSwgJmJpdF9zaXplKSAhPSAwKQorICAgIGVycm9yICgyLCAwLCBfKCJjYW5ub3QgZ2V0IGJpdCBmaWVsZCBwYXJhbWV0ZXJzOiAlcyIpLAorCSAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKworICAvKiBFbWl0ICJ7IHVpbnROTl90IHRtcCA9IC4uLjsiIHRvIGZldGNoIHRoZSBiYXNlIHR5cGUuICAqLworCisgIG9ic3RhY2tfcHJpbnRmIChwb29sLCAiJSpzeyAiLCBpbmRlbnQgKiAyLCAiIik7CisgIGVtaXRfYmFzZV9mZXRjaCAocG9vbCwgYnl0ZV9zaXplLCAidG1wIiwgdHJ1ZSwgbG9jKTsKKworICBvYnN0YWNrX3ByaW50ZiAocG9vbCwgIiVzJXMlcywgdG1wLCAlIiBQUkl1NjQgIiwgJSIgUFJJdTY0ICIpOyB9XG4iLAorCQkgIHMxLCBzMiwgczMsIGJpdF9vZmZzZXQsIGJpdF9zaXplKTsKK30KKworLyogVHJhbnNsYXRlIGEgZnJhZ21lbnQgdG8gZmV0Y2ggdGhlIHZhbHVlIG9mIHZhcmlhYmxlIG9yIG1lbWJlciBESUUKKyAgIGF0IHRoZSAqSU5QVVQgbG9jYXRpb24gYW5kIHN0b3JlIGl0IGluIHZhcmlhYmxlIFRBUkdFVC4gICovCisKK3ZvaWQKK2NfdHJhbnNsYXRlX2ZldGNoIChzdHJ1Y3Qgb2JzdGFjayAqcG9vbCwgaW50IGluZGVudCwKKwkJICAgRHdhcmZfQWRkciBkd2JpYXMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICBEd2FyZl9EaWUgKmRpZSwgRHdhcmZfQXR0cmlidXRlICp0eXBlYXR0ciwKKwkJICAgc3RydWN0IGxvY2F0aW9uICoqaW5wdXQsIGNvbnN0IGNoYXIgKnRhcmdldCkKK3sKKyAgKytpbmRlbnQ7CisKKyAgRHdhcmZfQXR0cmlidXRlIHNpemVfYXR0cjsKKyAgRHdhcmZfV29yZCBieXRlX3NpemU7CisgIGlmIChkd2FyZl9hdHRyX2ludGVncmF0ZSAoZGllLCBEV19BVF9ieXRlX3NpemUsICZzaXplX2F0dHIpID09IE5VTEwKKyAgICAgIHx8IGR3YXJmX2Zvcm11ZGF0YSAoJnNpemVfYXR0ciwgJmJ5dGVfc2l6ZSkgIT0gMCkKKyAgICB7CisgICAgICBEd2FyZl9EaWUgYmFzZWRpZTsKKyAgICAgIGlmIChkd2FyZl9mb3JtcmVmX2RpZSAodHlwZWF0dHIsICZiYXNlZGllKSA9PSBOVUxMKQorCWVycm9yICgyLCAwLCBfKCJjYW5ub3QgZ2V0IHR5cGUgb2YgZmllbGQ6ICVzIiksIGR3YXJmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGJ5dGVfc2l6ZSA9IGJhc2VfYnl0ZV9zaXplICgmYmFzZWRpZSk7CisgICAgfQorCisgIGJvb2wgZGVyZWYgPSBmYWxzZTsKKyAgaWYgKGR3YXJmX2hhc2F0dHJfaW50ZWdyYXRlIChkaWUsIERXX0FUX2JpdF9vZmZzZXQpKQorICAgIC8qIFRoaXMgaXMgYSBiaXQgZmllbGQuICAqLworICAgIGVtaXRfYml0ZmllbGQgKHBvb2wsIGluZGVudCwgZGllLCBieXRlX3NpemUsICppbnB1dCwKKwkJICAgImZldGNoX2JpdGZpZWxkICgiLCB0YXJnZXQsICIiKTsKKyAgZWxzZQorICAgIHN3aXRjaCAoYnl0ZV9zaXplKQorICAgICAgeworICAgICAgY2FzZSAxOgorICAgICAgY2FzZSAyOgorICAgICAgY2FzZSA0OgorICAgICAgY2FzZSA4OgorCW9ic3RhY2tfcHJpbnRmIChwb29sLCAiJSpzIiwgaW5kZW50ICogMiwgIiIpOworCWRlcmVmID0gZW1pdF9iYXNlX2ZldGNoIChwb29sLCBieXRlX3NpemUsIHRhcmdldCwgZmFsc2UsICppbnB1dCk7CisJb2JzdGFja19wcmludGYgKHBvb2wsICJcbiIpOworCWJyZWFrOworCisgICAgICBkZWZhdWx0OgorCS8qIENvdWxkIGhhbmRsZSB0aGlzIGdlbmVyYXRpbmcgY2FsbCB0byBtZW1jcHkgZXF1aXZhbGVudC4gICovCisJZXJyb3IgKDIsIDAsIF8oImZldGNoIGlzIGxhcmdlciB0aGFuIGJhc2UgaW50ZWdlciB0eXBlcyIpKTsKKwlicmVhazsKKyAgICAgIH0KKworICBzdHJ1Y3QgbG9jYXRpb24gKmxvYyA9IG5ld19zeW50aGV0aWNfbG9jIChwb29sLCAqaW5wdXQsIGRlcmVmKTsKKyAgbG9jLT50eXBlID0gbG9jX2ZpbmFsOworICAoKmlucHV0KS0+bmV4dCA9IGxvYzsKKyAgKmlucHV0ID0gbG9jOworfQorCit2b2lkCitjX3RyYW5zbGF0ZV9hZGRyZXNzb2YgKHN0cnVjdCBvYnN0YWNrICpwb29sLCBpbnQgaW5kZW50LAorCQkgICAgICAgRHdhcmZfQWRkciBkd2JpYXMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICAgICAgRHdhcmZfRGllICpkaWUsCisJCSAgICAgICBEd2FyZl9BdHRyaWJ1dGUgKnR5cGVhdHRyICBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgICBzdHJ1Y3QgbG9jYXRpb24gKippbnB1dCwgY29uc3QgY2hhciAqdGFyZ2V0KQoreworICArK2luZGVudDsKKworICBpZiAoZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUgKGRpZSwgRFdfQVRfYml0X29mZnNldCkpCisgICAgZXJyb3IgKDIsIDAsIF8oImNhbm5vdCB0YWtlIHRoZSBhZGRyZXNzIG9mIGEgYml0IGZpZWxkIikpOworCisgIHN3aXRjaCAoKCppbnB1dCktPnR5cGUpCisgICAgeworICAgIGNhc2UgbG9jX2FkZHJlc3M6CisgICAgICBvYnN0YWNrX3ByaW50ZiAocG9vbCwgIiUqcyVzID0gYWRkcjtcbiIsIGluZGVudCAqIDIsICIiLCB0YXJnZXQpOworICAgICAgKCppbnB1dCktPm5leHQgPSBuZXdfc3ludGhldGljX2xvYyAocG9vbCwgKmlucHV0LCBmYWxzZSk7CisgICAgICAoKmlucHV0KS0+bmV4dC0+dHlwZSA9IGxvY19maW5hbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBsb2NfcmVnaXN0ZXI6CisgICAgICBlcnJvciAoMiwgMCwgXygiY2Fubm90IHRha2UgYWRkcmVzcyBvZiBvYmplY3QgaW4gcmVnaXN0ZXIiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxvY19ub25jb250aWd1b3VzOgorICAgICAgZXJyb3IgKDIsIDAsIF8oImNhbm5vdCB0YWtlIGFkZHJlc3Mgb2Ygbm9uY29udGlndW91cyBvYmplY3QiKSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKy8qIERldGVybWluZSB0aGUgZWxlbWVudCBzdHJpZGUgb2YgYW4gYXJyYXkgdHlwZS4gICovCitzdGF0aWMgRHdhcmZfV29yZAorYXJyYXlfc3RyaWRlIChEd2FyZl9EaWUgKnR5cGVkaWUpCit7CisgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKyAgaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9zdHJpZGVfc2l6ZSwgJmF0dHJfbWVtKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIER3YXJmX1dvcmQgc3RyaWRlOworICAgICAgaWYgKGR3YXJmX2Zvcm11ZGF0YSAoJmF0dHJfbWVtLCAmc3RyaWRlKSA9PSAwKQorCXJldHVybiBzdHJpZGU7CisgICAgICBlcnJvciAoMiwgMCwgXygiY2Fubm90IGdldCBzdHJpZGVfc2l6ZSBhdHRyaWJ1dGUgYXJyYXkgdHlwZSAlczogJXMiKSwKKwkgICAgIGR3YXJmX2RpZW5hbWVfaW50ZWdyYXRlICh0eXBlZGllKSA/OiAiPGFub255bW91cz4iLAorCSAgICAgZHdhcmZfZXJybXNnICgtMSkpOworICAgIH0KKworICBEd2FyZl9EaWUgZGllX21lbTsKKyAgaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pID09IE5VTEwKKyAgICAgIHx8IGR3YXJmX2Zvcm1yZWZfZGllICgmYXR0cl9tZW0sICZkaWVfbWVtKSA9PSBOVUxMKQorICAgIGVycm9yICgyLCAwLCBfKCJjYW5ub3QgZ2V0IGVsZW1lbnQgdHlwZSBvZiBhcnJheSB0eXBlICVzOiAlcyIpLAorCSAgIGR3YXJmX2RpZW5hbWVfaW50ZWdyYXRlICh0eXBlZGllKSA/OiAiPGFub255bW91cz4iLAorCSAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKworICBpZiAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKCZkaWVfbWVtLCBEV19BVF9ieXRlX3NpemUsICZhdHRyX21lbSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBEd2FyZl9Xb3JkIHN0cmlkZTsKKyAgICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKCZhdHRyX21lbSwgJnN0cmlkZSkgPT0gMCkKKwlyZXR1cm4gc3RyaWRlOworICAgICAgZXJyb3IgKDIsIDAsCisJICAgICBfKCJjYW5ub3QgZ2V0IGJ5dGVfc2l6ZSBhdHRyaWJ1dGUgZm9yIGFycmF5IGVsZW1lbnQgdHlwZSAlczogJXMiKSwKKwkgICAgIGR3YXJmX2RpZW5hbWVfaW50ZWdyYXRlICgmZGllX21lbSkgPzogIjxhbm9ueW1vdXM+IiwKKwkgICAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKyAgICB9CisKKyAgZXJyb3IgKDIsIDAsIF8oImNvbmZ1c2VkIGFib3V0IGFycmF5IGVsZW1lbnQgc2l6ZSIpKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2NfdHJhbnNsYXRlX2FycmF5IChzdHJ1Y3Qgb2JzdGFjayAqcG9vbCwgaW50IGluZGVudCwKKwkJICAgRHdhcmZfQWRkciBkd2JpYXMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICBEd2FyZl9EaWUgKnR5cGVkaWUsIHN0cnVjdCBsb2NhdGlvbiAqKmlucHV0LAorCQkgICBjb25zdCBjaGFyICppZHgsIER3YXJmX1dvcmQgY29uc3RfaWR4KQoreworICArK2luZGVudDsKKworICBEd2FyZl9Xb3JkIHN0cmlkZSA9IGFycmF5X3N0cmlkZSAodHlwZWRpZSk7CisKKyAgc3RydWN0IGxvY2F0aW9uICpsb2MgPSAqaW5wdXQ7CisgIHdoaWxlIChsb2MtPnR5cGUgPT0gbG9jX25vbmNvbnRpZ3VvdXMpCisgICAgeworICAgICAgaWYgKGlkeCAhPSBOVUxMKQorCWVycm9yICgyLCAwLCBfKCJjYW5ub3QgZHluYW1pY2FsbHkgaW5kZXggbm9uY29udGlndW91cyBhcnJheSIpKTsKKyAgICAgIGVsc2UKKwl7CisJICBEd2FyZl9Xb3JkIG9mZnNldCA9IGNvbnN0X2lkeCAqIHN0cmlkZTsKKwkgIHN0cnVjdCBsb2NhdGlvbiAqcGllY2UgPSBsb2MtPnBpZWNlczsKKwkgIHdoaWxlIChwaWVjZSAhPSBOVUxMICYmIG9mZnNldCA+PSBwaWVjZS0+Ynl0ZV9zaXplKQorCSAgICB7CisJICAgICAgb2Zmc2V0IC09IHBpZWNlLT5ieXRlX3NpemU7CisJICAgICAgcGllY2UgPSBwaWVjZS0+bmV4dDsKKwkgICAgfQorCSAgaWYgKHBpZWNlID09IE5VTEwpCisJICAgIGVycm9yICgyLCAwLCBfKCJjb25zdGFudCBpbmRleCBpcyBvdXRzaWRlIG5vbmNvbnRpZ3VvdXMgYXJyYXkiKSk7CisJICBpZiAob2Zmc2V0ICUgc3RyaWRlICE9IDApCisJICAgIGVycm9yICgyLCAwLCBfKCJub25jb250aWd1b3VzIGFycmF5IHNwbGl0cyBlbGVtZW50cyIpKTsKKwkgIGNvbnN0X2lkeCA9IG9mZnNldCAvIHN0cmlkZTsKKwkgIGxvYyA9IHBpZWNlOworCX0KKyAgICB9CisKKyAgc3dpdGNoIChsb2MtPnR5cGUpCisgICAgeworICAgIGNhc2UgbG9jX2FkZHJlc3M6CisgICAgICArK2luZGVudDsKKyAgICAgIGlmIChpZHggIT0gTlVMTCkKKwlvYnN0YWNrX3ByaW50ZiAocG9vbCwgIiUqc2FkZHIgKz0gJXMgKiAiIFVGT1JNQVQgIjtcbiIsCisJCQlpbmRlbnQgKiAyLCAiIiwgaWR4LCBzdHJpZGUpOworICAgICAgZWxzZQorCW9ic3RhY2tfcHJpbnRmIChwb29sLCAiJSpzYWRkciArPSAiIFVGT1JNQVQgIiAqICIgVUZPUk1BVCAiO1xuIiwKKwkJCWluZGVudCAqIDIsICIiLCBjb25zdF9pZHgsIHN0cmlkZSk7CisgICAgICBsb2MgPSBuZXdfc3ludGhldGljX2xvYyAocG9vbCwgbG9jLCBmYWxzZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgbG9jX3JlZ2lzdGVyOgorICAgICAgZXJyb3IgKDIsIDAsIF8oImNhbm5vdCBpbmRleCBhcnJheSBzdG9yZWQgaW4gYSByZWdpc3RlciIpKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0KCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgKCppbnB1dCktPm5leHQgPSBsb2M7CisgICppbnB1dCA9ICgqaW5wdXQpLT5uZXh0OworfQorCisMCisvKiBFbWl0dGluZyBDIGNvZGUgZm9yIGZpbmFsaXplZCBmcmFnbWVudHMuICAqLworCisKKyNkZWZpbmUgZW1pdChmbXQsIC4uLikgZnByaW50ZiAob3V0LCBmbXQsICMjIF9fVkFfQVJHU19fKQorCisvKiBPcGVuIGEgYmxvY2sgd2l0aCBhIGNvbW1lbnQgZ2l2aW5nIHRoZSBvcmlnaW5hbCBEV0FSRiBleHByZXNzaW9uLiAgKi8KK3N0YXRpYyB2b2lkCitlbWl0X2hlYWRlciAoRklMRSAqb3V0LCBzdHJ1Y3QgbG9jYXRpb24gKmxvYywgdW5zaWduZWQgaW50IGhpbmRlbnQpCit7CisgIGlmIChsb2MtPm9wcyA9PSBOVUxMKQorICAgIGVtaXQgKCIlKnN7IC8vIHN5bnRoZXNpemVkXG4iLCBoaW5kZW50ICogMiwgIiIpOworICBlbHNlCisgICAgeworICAgICAgZW1pdCAoIiUqc3sgLy8gRFdBUkYgZXhwcmVzc2lvbjoiLCBoaW5kZW50ICogMiwgIiIpOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsb2MtPm5vcHM7ICsraSkKKwl7CisJICBlbWl0ICgiICUjeCIsIGxvYy0+b3BzW2ldLmF0b20pOworCSAgaWYgKGxvYy0+b3BzW2ldLm51bWJlcjIgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChsb2MtPm9wc1tpXS5udW1iZXIgIT0gMCkKKwkJZW1pdCAoIiglIiBQUklkNjQgIikiLCBsb2MtPm9wc1tpXS5udW1iZXIpOworCSAgICB9CisJICBlbHNlCisJICAgIGVtaXQgKCIoJSIgUFJJZDY0ICIsJSIgUFJJZDY0ICIpIiwKKwkJICBsb2MtPm9wc1tpXS5udW1iZXIsIGxvYy0+b3BzW2ldLm51bWJlcjIpOworCX0KKyAgICAgIGVtaXQgKCJcbiIpOworICAgIH0KK30KKworLyogRW1pdCBhIGNvZGUgZnJhZ21lbnQgdG8gYXNzaWduIHRoZSB0YXJnZXQgdmFyaWFibGUgdG8gYSByZWdpc3RlciB2YWx1ZS4gICovCitzdGF0aWMgdm9pZAorZW1pdF9sb2NfcmVnaXN0ZXIgKEZJTEUgKm91dCwgc3RydWN0IGxvY2F0aW9uICpsb2MsIHVuc2lnbmVkIGludCBpbmRlbnQsCisJCSAgIGNvbnN0IGNoYXIgKnRhcmdldCkKK3sKKyAgYXNzZXJ0IChsb2MtPnR5cGUgPT0gbG9jX3JlZ2lzdGVyKTsKKworICBlbWl0ICgiJSpzJXMgPSBmZXRjaF9yZWdpc3RlciAoJXUpO1xuIiwKKwlpbmRlbnQgKiAyLCAiIiwgdGFyZ2V0LCBsb2MtPnJlZ25vKTsKK30KKworLyogRW1pdCBhIGNvZGUgZnJhZ21lbnQgdG8gYXNzaWduIHRoZSB0YXJnZXQgdmFyaWFibGUgdG8gYW4gYWRkcmVzcy4gICovCitzdGF0aWMgdm9pZAorZW1pdF9sb2NfYWRkcmVzcyAoRklMRSAqb3V0LCBzdHJ1Y3QgbG9jYXRpb24gKmxvYywgdW5zaWduZWQgaW50IGluZGVudCwKKwkJICBjb25zdCBjaGFyICp0YXJnZXQpCit7CisgIGFzc2VydCAobG9jLT50eXBlID09IGxvY19hZGRyZXNzKTsKKworICBpZiAobG9jLT5hZGRyZXNzLnN0YWNrX2RlcHRoID09IDApCisgICAgLyogU3ludGhldGljIHByb2dyYW0uICAqLworICAgIGVtaXQgKCIlcyIsIGxvYy0+YWRkcmVzcy5wcm9ncmFtKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGVtaXQgKCIlKnMlcyAiIFNUQUNLRk1ULCAoaW5kZW50ICsgMSkgKiAyLCAiIiwgU1RBQ0tfVFlQRSwgMCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMTsgaSA8IGxvYy0+YWRkcmVzcy5zdGFja19kZXB0aDsgKytpKQorCWVtaXQgKCIsICIgU1RBQ0tGTVQsIGkpOworICAgICAgZW1pdCAoIjtcbiIpOworCisgICAgICBlbWl0ICgiJXMlKnMlcyA9ICIgU1RBQ0tGTVQgIjtcbiIsIGxvYy0+YWRkcmVzcy5wcm9ncmFtLAorCSAgICAoaW5kZW50ICsgMSkgKiAyLCAiIiwgdGFyZ2V0LCAwKTsKKyAgICB9Cit9CisKKy8qIEVtaXQgYSBjb2RlIGZyYWdtZW50IHRvIGRlY2xhcmUgdGhlIHRhcmdldCB2YXJpYWJsZSBhbmQKKyAgIGFzc2lnbiBpdCB0byBhbiBhZGRyZXNzLXNpemVkIHZhbHVlLiAgKi8KK3N0YXRpYyB2b2lkCitlbWl0X2xvY192YWx1ZSAoRklMRSAqb3V0LCBzdHJ1Y3QgbG9jYXRpb24gKmxvYywgdW5zaWduZWQgaW50IGluZGVudCwKKwkJY29uc3QgY2hhciAqdGFyZ2V0LCBib29sIGRlY2xhcmUpCit7CisgIGlmIChkZWNsYXJlKQorICAgIGVtaXQgKCIlKnMlcyAlcztcbiIsIGluZGVudCAqIDIsICIiLCBTVEFDS19UWVBFLCB0YXJnZXQpOworCisgIGVtaXRfaGVhZGVyIChvdXQsIGxvYywgaW5kZW50KTsKKworICBzd2l0Y2ggKGxvYy0+dHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGxvY19yZWdpc3RlcjoKKyAgICAgIGVtaXRfbG9jX3JlZ2lzdGVyIChvdXQsIGxvYywgaW5kZW50LCB0YXJnZXQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGxvY19hZGRyZXNzOgorICAgICAgaWYgKGxvYy0+YWRkcmVzcy5mcmFtZV9iYXNlICE9IE5VTEwpCisJZW1pdF9sb2NfdmFsdWUgKG91dCwgbG9jLT5hZGRyZXNzLmZyYW1lX2Jhc2UsIGluZGVudCwKKwkJCSJmcmFtZV9iYXNlIiwgdHJ1ZSk7CisgICAgICBlbWl0X2xvY19hZGRyZXNzIChvdXQsIGxvYywgaW5kZW50LCB0YXJnZXQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGVtaXQgKCIlKnN9XG4iLCBpbmRlbnQgKiAyLCAiIik7Cit9CisKK2Jvb2wKK2NfZW1pdF9sb2NhdGlvbiAoRklMRSAqb3V0LCBzdHJ1Y3QgbG9jYXRpb24gKmxvYywgaW50IGluZGVudCkKK3sKKyAgZW1pdCAoIiUqc3tcbiIsIGluZGVudCAqIDIsICIiKTsKKworICBib29sIGRlcmVmID0gZmFsc2U7CisgIGZvciAoYm9vbCBkZWNsYXJlX2FkZHIgPSB0cnVlOyBsb2MtPm5leHQgIT0gTlVMTDsgbG9jID0gbG9jLT5uZXh0KQorICAgIHN3aXRjaCAobG9jLT50eXBlKQorICAgICAgeworICAgICAgY2FzZSBsb2NfYWRkcmVzczoKKwkvKiBFbWl0IHRoZSBwcm9ncmFtIGZyYWdtZW50IHRvIGNhbGN1bGF0ZSB0aGUgYWRkcmVzcy4gICovCisJZW1pdF9sb2NfdmFsdWUgKG91dCwgbG9jLCBpbmRlbnQgKyAxLCAiYWRkciIsIGRlY2xhcmVfYWRkcik7CisJZGVjbGFyZV9hZGRyID0gZmFsc2U7CisJZGVyZWYgPSBkZXJlZiB8fCBsb2MtPmFkZHJlc3MudXNlZF9kZXJlZjsKKwlicmVhazsKKworICAgICAgY2FzZSBsb2NfcmVnaXN0ZXI6CisgICAgICBjYXNlIGxvY19ub25jb250aWd1b3VzOgorCS8qIFRoZXNlIGRvbid0IHByb2R1Y2UgYW55IGNvZGUgZGlyZWN0bHkuCisJICAgVGhlIG5leHQgYWRkcmVzcy9maW5hbCByZWNvcmQgaW5jb3Jwb3JhdGVzIHRoZSB2YWx1ZS4gICovCisJYnJlYWs7CisKKyAgICAgIGNhc2UgbG9jX2ZpbmFsOgkJLyogU2hvdWxkIGJlIGxhc3QgaW4gY2hhaW4hICAqLworICAgICAgZGVmYXVsdDoKKwlhYm9ydCAoKTsKKwlicmVhazsKKyAgICAgIH0KKworICBpZiAobG9jLT50eXBlICE9IGxvY19maW5hbCkJLyogVW5maW5pc2hlZCBjaGFpbi4gICovCisgICAgYWJvcnQgKCk7CisKKyAgZW1pdCAoIiVzJSpzfVxuIiwgbG9jLT5hZGRyZXNzLnByb2dyYW0sIGluZGVudCAqIDIsICIiKTsKKworICByZXR1cm4gZGVyZWY7Cit9CisKKyN1bmRlZiBlbWl0CmRpZmYgLS1naXQgYS9saWJkd2ZsL2xvYzJjLmggYi9saWJkd2ZsL2xvYzJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkODkyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3ZmwvbG9jMmMuaApAQCAtMCwwICsxLDYzIEBACisjaW5jbHVkZSA8bGliZHcuaD4KKworc3RydWN0IG9ic3RhY2s7CQkJLyogVXNlIDxvYnN0YWNrLmg+ICovCitzdHJ1Y3QgbG9jYXRpb247CQkvKiBPcGFxdWUgKi8KKworCisvKiBUcmFuc2xhdGUgYSBDIGZyYWdtZW50IGZvciB0aGUgbG9jYXRpb24gZXhwcmVzc2lvbiwgdXNpbmcgKklOUFVUCisgICBhcyB0aGUgc3RhcnRpbmcgbG9jYXRpb24sIGJlZ2luIGZyb20gc2NyYXRjaCBpZiAqSU5QVVQgaXMgbnVsbC4KKyAgIElmIERXX09QX2ZicmVnIGlzIHVzZWQsIGl0IG1heSBoYXZlIGEgc3ViZnJhZ21lbnQgY29tcHV0aW5nIGZyb20KKyAgIHRoZSBGQl9BVFRSIGxvY2F0aW9uIGV4cHJlc3Npb24uCisKKyAgIE9uIGVycm9ycywgZXhpdCBhbmQgbmV2ZXIgcmV0dXJuIChYWFggPykuICBPbiBzdWNjZXNzLCByZXR1cm4gdGhlCisgICBmaXJzdCBmcmFnbWVudCBjcmVhdGVkLCB3aGljaCBpcyBhbHNvIGNoYWluZWQgb250byAoKklOUFVUKS0+bmV4dC4KKyAgICpJTlBVVCBpcyB0aGVuIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IHRhaWwgb2YgdGhhdCBjaGFpbi4KKyAgICpVU0VEX0RFUkVGIGlzIHNldCB0byB0cnVlIGlmZiB0aGUgImRlcmVmIiBydW50aW1lIG9wZXJhdGlvbgorICAgd2FzIHVzZWQsIG90aGVyd2lzZSBpdCBpcyBub3QgbW9kaWZpZWQuICAqLworc3RydWN0IGxvY2F0aW9uICpjX3RyYW5zbGF0ZV9sb2NhdGlvbiAoc3RydWN0IG9ic3RhY2sgKiwgaW50IGluZGVudCwKKwkJCQkgICAgICAgRHdhcmZfQWRkciBiaWFzLAorCQkJCSAgICAgICBEd2FyZl9BdHRyaWJ1dGUgKmxvY19hdHRyLAorCQkJCSAgICAgICBEd2FyZl9BZGRyIGFkZHJlc3MsCisJCQkJICAgICAgIHN0cnVjdCBsb2NhdGlvbiAqKmlucHV0LAorCQkJCSAgICAgICBEd2FyZl9BdHRyaWJ1dGUgKmZiX2F0dHIpOworCisvKiBUcmFuc2xhdGUgYSBmcmFnbWVudCB0byBkZXJlZmVyZW5jZSB0aGUgZ2l2ZW4gcG9pbnRlciB0eXBlLAorICAgd2hlcmUgKklOUFVUIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcG9pbnRlciB3aXRoIHRoYXQgdHlwZS4gICovCit2b2lkIGNfdHJhbnNsYXRlX3BvaW50ZXIgKHN0cnVjdCBvYnN0YWNrICpwb29sLCBpbnQgaW5kZW50LAorCQkJICBEd2FyZl9BZGRyIGR3YmlhcywgRHdhcmZfRGllICp0eXBlZGllLAorCQkJICBzdHJ1Y3QgbG9jYXRpb24gKippbnB1dCk7CisKKy8qIFRyYW5zbGF0ZSBhIGZyYWdtZW50IHRvIGluZGV4IGFuIGFycmF5ICh0dXJuaW5nIHRoZSBsb2NhdGlvbgorICAgb2YgdGhlIGFycmF5IGludG8gdGhlIGxvY2F0aW9uIG9mIGFuIGVsZW1lbnQpLiAgSWYgSURYIGlzIG5vbi1udWxsLAorICAgaXQncyBhIHN0cmluZyBvZiBDIGNvZGUgdG8gZW1pdCBpbiB0aGUgZnJhZ21lbnQgYXMgdGhlIGFycmF5IGluZGV4LgorICAgSWYgdGhlIGluZGV4IGlzIGEga25vd24gY29uc3RhbnQsIElEWCBzaG91bGQgYmUgbnVsbCBhbmQgQ09OU1RfSURYCisgICBpcyB1c2VkIGluc3RlYWQgKHRoaXMgY2FzZSBjYW4gaGFuZGxlIGxvY2FsIGFycmF5cyBpbiByZWdpc3RlcnMpLiAgKi8KK3ZvaWQgY190cmFuc2xhdGVfYXJyYXkgKHN0cnVjdCBvYnN0YWNrICpwb29sLCBpbnQgaW5kZW50LAorCQkJRHdhcmZfQWRkciBkd2JpYXMsIER3YXJmX0RpZSAqdHlwZWRpZSwKKwkJCXN0cnVjdCBsb2NhdGlvbiAqKmlucHV0LAorCQkJY29uc3QgY2hhciAqaWR4LCBEd2FyZl9Xb3JkIGNvbnN0X2lkeCk7CisKKy8qIFRyYW5zbGF0ZSBhIGZyYWdtZW50IHRvIGNvbXB1dGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGlucHV0IGxvY2F0aW9uCisgICBhbmQgYXNzaWduIGl0IHRvIHRoZSB2YXJpYWJsZSBUQVJHRVQuICBUaGlzIGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nCisgICAoaXQgYWx3YXlzIGVtaXRzICJUQVJHRVQgPSBhZGRyOyIpLCBidXQgaXQgd2lsbCBiYXJmIGlmIHRoZSBsb2NhdGlvbgorICAgaXMgYSByZWdpc3RlciBvciBub25jb250aWd1b3VzIG9iamVjdC4gICovCit2b2lkIGNfdHJhbnNsYXRlX2FkZHJlc3NvZiAoc3RydWN0IG9ic3RhY2sgKnBvb2wsIGludCBpbmRlbnQsCisJCQkgICAgRHdhcmZfQWRkciBkd2JpYXMsIER3YXJmX0RpZSAqZGllLAorCQkJICAgIER3YXJmX0F0dHJpYnV0ZSAqdHlwZWF0dHIsCisJCQkgICAgc3RydWN0IGxvY2F0aW9uICoqaW5wdXQsIGNvbnN0IGNoYXIgKnRhcmdldCk7CisKKy8qIFRyYW5zbGF0ZSBhIGZyYWdtZW50IHRvIGZldGNoIHRoZSB2YWx1ZSBvZiB2YXJpYWJsZSBvciBtZW1iZXIgRElFCisgICBhdCB0aGUgKklOUFVUIGxvY2F0aW9uIGFuZCBzdG9yZSBpdCBpbiB2YXJpYWJsZSBUQVJHRVQuCisgICBUaGlzIGhhbmRsZXMgYmFzZSBpbnRlZ2VyIHR5cGVzIGFuZCBiaXQgZmllbGRzLiAgKi8KK3ZvaWQgY190cmFuc2xhdGVfZmV0Y2ggKHN0cnVjdCBvYnN0YWNrICpwb29sLCBpbnQgaW5kZW50LAorCQkJRHdhcmZfQWRkciBkd2JpYXMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJRHdhcmZfRGllICpkaWUsIER3YXJmX0F0dHJpYnV0ZSAqdHlwZWF0dHIsCisJCQlzdHJ1Y3QgbG9jYXRpb24gKippbnB1dCwgY29uc3QgY2hhciAqdGFyZ2V0KTsKKworLyogRW1pdCB0aGUgQyBmcmFnbWVudCBidWlsdCB1cCBhdCBMT0MgKGkuZS4sIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUKKyAgIGZpcnN0IGNfdHJhbnNsYXRlX2xvY2F0aW9uIGNhbGwgbWFkZSkuICBJTkRFTlQgc2hvdWxkIG1hdGNoIHRoYXQKKyAgIHBhc3NlZCB0byBjX3RyYW5zbGF0ZV8qIHByZXZpb3VzbHkuCisKKyAgIFdyaXRlcyBjb21wbGV0ZSBsaW5lcyBvZiBDOTksIGNvZGUgZm9ybWluZyBhIGNvbXBsZXRlIEMgYmxvY2ssIHRvIFNUUkVBTS4KKyAgIFJldHVybiB2YWx1ZSBpcyB0cnVlIGlmZiB0aGF0IGNvZGUgdXNlcyB0aGUgYGRlcmVmJyBydW50aW1lIG1hY3Jvcy4gICovCitib29sIGNfZW1pdF9sb2NhdGlvbiAoRklMRSAqc3RyZWFtLCBzdHJ1Y3QgbG9jYXRpb24gKmxvYywgaW50IGluZGVudCk7CmRpZmYgLS1naXQgYS9saWJkd2ZsL3B0ZXN0LmMgYi9saWJkd2ZsL3B0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4ZTk3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmR3ZmwvcHRlc3QuYwpAQCAtMCwwICsxLDExNyBAQAorLyogVGVzdCBwcm9ncmFtIGZvciBsaWJkd2ZsIGJhc2ljIG1vZHVsZSB0cmFja2luZywgcmVsb2NhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8YXJncC5oPgorI2luY2x1ZGUgPGxpYmR3ZmwuaD4KKworCitzdGF0aWMgaW50CitwcmludF9mdW5jIChEd2FyZl9GdW5jICpmdW5jLCB2b2lkICphcmcpCit7CisgIGNvbnN0IER3YXJmX0FkZHIgZHdiaWFzID0gKihEd2FyZl9BZGRyICopIGFyZzsKKworICBjb25zdCBjaGFyICpmaWxlID0gZHdhcmZfZnVuY19maWxlIChmdW5jKTsKKyAgaW50IGxpbmUgPSAtMTsKKyAgZHdhcmZfZnVuY19saW5lIChmdW5jLCAmbGluZSk7CisgIGNvbnN0IGNoYXIgKmZjdCA9IGR3YXJmX2Z1bmNfbmFtZSAoZnVuYyk7CisKKyAgcHJpbnRmICgiICAlczolZDogJXM6IiwgZmlsZSwgbGluZSwgZmN0KTsKKworICBEd2FyZl9BZGRyIGxvID0gLTEsIGhpID0gLTEsIGVudHJ5ID0gLTE7CisgIGlmIChkd2FyZl9mdW5jX2xvd3BjIChmdW5jLCAmbG8pID09IDApCisgICAgbG8gKz0gZHdiaWFzOworICBlbHNlCisgICAgcHJpbnRmICgiIChsb3dwYyA9PiAlcykiLCBkd2FyZl9lcnJtc2cgKC0xKSk7CisgIGlmIChkd2FyZl9mdW5jX2hpZ2hwYyAoZnVuYywgJmhpKSA9PSAwKQorICAgIGhpICs9IGR3YmlhczsKKyAgZWxzZQorICAgIHByaW50ZiAoIiAoaGlnaHBjID0+ICVzKSIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKKyAgaWYgKGR3YXJmX2Z1bmNfZW50cnlwYyAoZnVuYywgJmVudHJ5KSA9PSAwKQorICAgIGVudHJ5ICs9IGR3YmlhczsKKyAgZWxzZQorICAgIHByaW50ZiAoIiAoZW50cnlwYyA9PiAlcykiLCBkd2FyZl9lcnJtc2cgKC0xKSk7CisKKyAgaWYgKGxvICE9IChEd2FyZl9BZGRyKSAtMSB8fCBoaSAhPSAoRHdhcmZfQWRkcikgLTEKKyAgICAgIHx8IGVudHJ5ICE9IChEd2FyZl9BZGRyKSAtMSkKKyAgICBwcmludGYgKCIgJSMiIFBSSXg2NCAiLi4lIyIgUFJJeDY0ICIgPT4gJSMiIFBSSXg2NCAiXG4iLAorCSAgICBsbywgaGksIGVudHJ5KTsKKyAgZWxzZQorICAgIHB1dHMgKCIiKTsKKworICByZXR1cm4gRFdBUkZfQ0JfT0s7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X21vZHVsZSAoRHdmbF9Nb2R1bGUgKm1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJICAgICAgdm9pZCAqKnVzZXJkYXRhIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkgICAgICBjb25zdCBjaGFyICpuYW1lLCBEd2FyZl9BZGRyIGJhc2UsCisJICAgICAgRHdhcmYgKmR3LCBEd2FyZl9BZGRyIGJpYXMsCisJICAgICAgdm9pZCAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgcHJpbnRmICgibW9kdWxlOiAlMzBzICUwOCIgUFJJeDY0ICIgJTEycCAlIiBQUkl4NjQgIiAoJXMpXG4iLAorCSAgbmFtZSwgYmFzZSwgZHcsIGJpYXMsIGR3ZmxfZXJybXNnICgtMSkpOworCisgIGlmIChkdyAhPSBOVUxMKQorICAgIHsKKyAgICAgIER3YXJmX09mZiBvZmYgPSAwOworICAgICAgc2l6ZV90IGN1aGw7CisgICAgICBEd2FyZl9PZmYgbm9mZjsKKworICAgICAgd2hpbGUgKGR3YXJmX25leHRjdSAoZHcsIG9mZiwgJm5vZmYsICZjdWhsLCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKQorCXsKKwkgIER3YXJmX0RpZSBkaWVfbWVtOworCSAgRHdhcmZfRGllICpkaWUgPSBkd2FyZl9vZmZkaWUgKGR3LCBvZmYgKyBjdWhsLCAmZGllX21lbSk7CisKKwkgICh2b2lkKSBkd2FyZl9nZXRmdW5jcyAoZGllLCBwcmludF9mdW5jLCAmYmlhcywgMCk7CisKKwkgIG9mZiA9IG5vZmY7CisJfQorICAgIH0KKworICByZXR1cm4gRFdBUkZfQ0JfT0s7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAvKiBXZSB1c2Ugbm8gdGhyZWFkcyBoZXJlIHdoaWNoIGNhbiBpbnRlcmZlcmUgd2l0aCBoYW5kbGluZyBhIHN0cmVhbS4gICovCisgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKworICAvKiBTZXQgbG9jYWxlLiAgKi8KKyAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7CisKKyAgRHdmbCAqZHdmbCA9IE5VTEw7CisgICh2b2lkKSBhcmdwX3BhcnNlIChkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksIGFyZ2MsIGFyZ3YsIDAsIE5VTEwsICZkd2ZsKTsKKyAgYXNzZXJ0IChkd2ZsICE9IE5VTEwpOworCisgIHB0cmRpZmZfdCBwID0gMDsKKyAgZG8KKyAgICBwID0gZHdmbF9nZXRkd2FyZiAoZHdmbCwgJnByaW50X21vZHVsZSwgTlVMTCwgcCk7CisgIHdoaWxlIChwID4gMCk7CisgIGlmIChwIDwgMCkKKyAgICBlcnJvciAoMiwgMCwgImR3ZmxfZ2V0ZHdhcmY6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7CisKKyAgZHdmbF9lbmQgKGR3ZmwpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZHdmbC9yZWxvY2F0ZS5jIGIvbGliZHdmbC9yZWxvY2F0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGU2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2ZsL3JlbG9jYXRlLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qIFJlbG9jYXRlIGRlYnVnIGluZm9ybWF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlICJsaWJkd2ZsUC5oIgorCit0eXBlZGVmIHVpbnQ4X3QgR0VsZl9CeXRlOworCisvKiBBZGp1c3QgKlZBTFVFIHRvIGFkZCB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBTSE5EWCBzZWN0aW9uLgorICAgV2UgdXBkYXRlIHRoZSBzZWN0aW9uIGhlYWRlciBpbiBwbGFjZSB0byBjYWNoZSB0aGUgcmVzdWx0LiAgKi8KKworRHdmbF9FcnJvcgoraW50ZXJuYWxfZnVuY3Rpb25fZGVmCitfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUgKER3ZmxfTW9kdWxlICptb2QsIHNpemVfdCBzeW1zaHN0cm5keCwKKwkJCSAgRWxmMzJfV29yZCBzaG5keCwgR0VsZl9BZGRyICp2YWx1ZSkKK3sKKyAgRWxmX1NjbiAqcmVmc2NuID0gZWxmX2dldHNjbiAobW9kLT5zeW1maWxlLT5lbGYsIHNobmR4KTsKKyAgR0VsZl9TaGRyIHJlZnNoZHJfbWVtLCAqcmVmc2hkciA9IGdlbGZfZ2V0c2hkciAocmVmc2NuLCAmcmVmc2hkcl9tZW0pOworICBpZiAocmVmc2hkciA9PSBOVUxMKQorICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOworCisgIGlmICgocmVmc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICYmIHJlZnNoZHItPnNoX2FkZHIgPT0gMCkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgbG9hZGVkIHNlY3Rpb24uICBGaW5kIGl0cyBhY3R1YWwKKwkgYWRkcmVzcyBhbmQgdXBkYXRlIHRoZSBzZWN0aW9uIGhlYWRlci4gICovCisgICAgICBjb25zdCBjaGFyICpuYW1lID0gZWxmX3N0cnB0ciAobW9kLT5zeW1maWxlLT5lbGYsIHN5bXNoc3RybmR4LAorCQkJCSAgICAgcmVmc2hkci0+c2hfbmFtZSk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKQorCXJldHVybiBEV0ZMX0VfTElCRUxGOworCisgICAgICBpZiAoKCptb2QtPmR3ZmwtPmNhbGxiYWNrcy0+c2VjdGlvbl9hZGRyZXNzKSAoTU9EQ0JfQVJHUyAobW9kKSwgbmFtZSwKKwkJCQkJCSAgICAmcmVmc2hkci0+c2hfYWRkcikpCisJcmV0dXJuIENCRkFJTDsKKworICAgICAgaWYgKHJlZnNoZHItPnNoX2FkZHIgPT0gMCkKKwkvKiBUaGUgY2FsbGJhY2sgcmVzb2x2ZWQgdGhpcyB0byB6ZXJvLCBpbmRpY2F0aW5nIGl0IHdhc24ndAorCSAgIHJlYWxseSBsb2FkZWQgYnV0IHdlIGRvbid0IHJlYWxseSBjYXJlLiAgTWFyayBpdCBzbyB3ZQorCSAgIGRvbid0IGNoZWNrIGl0IGFnYWluIGZvciB0aGUgbmV4dCByZWxvY2F0aW9uLiAgKi8KKwlyZWZzaGRyLT5zaF9mbGFncyAmPSB+U0hGX0FMTE9DOworCisgICAgICAvKiBVcGRhdGUgdGhlIGluLWNvcmUgZmlsZSdzIHNlY3Rpb24gaGVhZGVyIHRvIHNob3cgdGhlIGZpbmFsCisJIGxvYWQgYWRkcmVzcyAob3IgdW5sb2FkZWRuZXNzKS4gIFRoaXMgc2VydmVzIGFzIGEgY2FjaGUsCisJIHNvIHdlIHdvbid0IGdldCBoZXJlIGFnYWluIGZvciB0aGUgc2FtZSBzZWN0aW9uLiAgKi8KKyAgICAgIGlmICghIGdlbGZfdXBkYXRlX3NoZHIgKHJlZnNjbiwgcmVmc2hkcikpCisJcmV0dXJuIERXRkxfRV9MSUJFTEY7CisgICAgfQorCisgIC8qIEFwcGx5IHRoZSBhZGp1c3RtZW50LiAgKi8KKyAgKnZhbHVlICs9IHJlZnNoZHItPnNoX2FkZHI7CisgIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKK30KKworRHdmbF9FcnJvcgoraW50ZXJuYWxfZnVuY3Rpb25fZGVmCitfX2xpYmR3ZmxfcmVsb2NhdGUgKER3ZmxfTW9kdWxlICptb2QpCit7CisgIGFzc2VydCAobW9kLT5pc3JlbCk7CisKKyAgR0VsZl9FaGRyIGVoZHJfbWVtOworICBjb25zdCBHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKG1vZC0+ZGVidWcuZWxmLCAmZWhkcl9tZW0pOworICBpZiAoZWhkciA9PSBOVUxMKQorICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOworCisgIHNpemVfdCBzeW1zaHN0cm5keCwgZF9zaHN0cm5keDsKKyAgaWYgKGVsZl9nZXRzaHN0cm5keCAobW9kLT5zeW1maWxlLT5lbGYsICZzeW1zaHN0cm5keCkgPCAwKQorICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOworICBpZiAobW9kLT5zeW1maWxlID09ICZtb2QtPmRlYnVnKQorICAgIGRfc2hzdHJuZHggPSBzeW1zaHN0cm5keDsKKyAgZWxzZSBpZiAoZWxmX2dldHNoc3RybmR4IChtb2QtPmRlYnVnLmVsZiwgJmRfc2hzdHJuZHgpIDwgMCkKKyAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKKworICAvKiBMb29rIGF0IGVhY2ggc2VjdGlvbiBpbiB0aGUgZGVidWdpbmZvIGZpbGUsIGFuZCBwcm9jZXNzIHRoZQorICAgICByZWxvY2F0aW9uIHNlY3Rpb25zIGZvciBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICBEd2ZsX0Vycm9yIHJlc3VsdCA9IERXRkxfRV9OT19EV0FSRjsKKyAgRWxmX1NjbiAqc2NuID0gTlVMTDsKKyAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAobW9kLT5kZWJ1Zy5lbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9SRUwgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKKwl7CisJICAvKiBJdCdzIGEgcmVsb2NhdGlvbiBzZWN0aW9uLiAgRmlyc3QsIGZldGNoIHRoZSBuYW1lIG9mIHRoZQorCSAgICAgc2VjdGlvbiB0aGVzZSByZWxvY2F0aW9ucyBhcHBseSB0by4gICovCisKKwkgIEVsZl9TY24gKnRzY24gPSBlbGZfZ2V0c2NuIChtb2QtPmRlYnVnLmVsZiwgc2hkci0+c2hfaW5mbyk7CisJICBpZiAodHNjbiA9PSBOVUxMKQorCSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKKworCSAgR0VsZl9TaGRyIHRzaGRyX21lbTsKKwkgIEdFbGZfU2hkciAqdHNoZHIgPSBnZWxmX2dldHNoZHIgKHRzY24sICZ0c2hkcl9tZW0pOworCSAgY29uc3QgY2hhciAqdG5hbWUgPSBlbGZfc3RycHRyIChtb2QtPmRlYnVnLmVsZiwgZF9zaHN0cm5keCwKKwkJCQkJICB0c2hkci0+c2hfbmFtZSk7CisJICBpZiAodG5hbWUgPT0gTlVMTCkKKwkgICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7CisKKwkgIGlmICghIGVibF9kZWJ1Z3Njbl9wIChtb2QtPmVibCwgdG5hbWUpKQorCSAgICAvKiBUaGlzIHJlbG9jYXRpb24gc2VjdGlvbiBpcyBub3QgZm9yIGEgZGVidWdnaW5nIHNlY3Rpb24uCisJICAgICAgIE5vdGhpbmcgdG8gZG8gaGVyZS4gICovCisJICAgIGNvbnRpbnVlOworCisJICAvKiBGZXRjaCB0aGUgc2VjdGlvbiBkYXRhIHRoYXQgbmVlZHMgdGhlIHJlbG9jYXRpb25zIGFwcGxpZWQuICAqLworCSAgRWxmX0RhdGEgKnRkYXRhID0gZWxmX3Jhd2RhdGEgKHRzY24sIE5VTEwpOworCSAgaWYgKHRkYXRhID09IE5VTEwpCisJICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOworCisJICAvKiBBcHBseSBvbmUgcmVsb2NhdGlvbi4gIFJldHVybnMgdHJ1ZSBmb3IgYW55IGludmFsaWQgZGF0YS4gICovCisJICBEd2ZsX0Vycm9yIHJlbG9jYXRlIChHRWxmX0FkZHIgb2Zmc2V0LCBjb25zdCBHRWxmX1N4d29yZCAqYWRkZW5kLAorCQkJICAgICAgIGludCBydHlwZSwgaW50IHN5bW5keCkKKwkgICAgeworCSAgICAgIC8qIEZpcnN0LCByZXNvbHZlIHRoZSBzeW1ib2wgdG8gYW4gYWJzb2x1dGUgdmFsdWUuICAqLworCSAgICAgIEdFbGZfQWRkciB2YWx1ZTsKKwkgICAgICBpbmxpbmUgRHdmbF9FcnJvciBhZGp1c3QgKEdFbGZfV29yZCBzaG5keCkKKwkJeworCQkgIHJldHVybiBfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUgKG1vZCwgc3ltc2hzdHJuZHgsCisJCQkJCQkgICBzaG5keCwgJnZhbHVlKTsKKwkJfQorCisJICAgICAgaWYgKHN5bW5keCA9PSBTVE5fVU5ERUYpCisJCS8qIFdoZW4gc3RyaXAgcmVtb3ZlcyBhIHNlY3Rpb24gc3ltYm9sIHJlZmVycmluZyB0byBhCisJCSAgIHNlY3Rpb24gbW92ZWQgaW50byB0aGUgZGVidWdpbmZvIGZpbGUsIGl0IHJlcGxhY2VzCisJCSAgIHRoYXQgc3ltYm9sIGluZGV4IGluIHJlbG9jcyB3aXRoIFNUTl9VTkRFRi4gIFdlCisJCSAgIGRvbid0IGFjdHVhbGx5IG5lZWQgdGhlIHN5bWJvbCwgYmVjYXVzZSB0aG9zZSByZWxvY3MKKwkJICAgYXJlIGFsd2F5cyByZWZlcmVuY2VzIHJlbGF0aXZlIHRvIHRoZSBub25hbGxvY2F0ZWQKKwkJICAgZGVidWdnaW5nIHNlY3Rpb25zLCB3aGljaCBzdGFydCBhdCB6ZXJvLiAgKi8KKwkJdmFsdWUgPSAwOworCSAgICAgIGVsc2UKKwkJeworCQkgIEdFbGZfU3ltIHN5bV9tZW07CisJCSAgR0VsZl9Xb3JkIHNobmR4OworCQkgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bXNobmR4IChtb2QtPnN5bWRhdGEsCisJCQkJCQkgICAgbW9kLT5zeW14bmR4ZGF0YSwKKwkJCQkJCSAgICBzeW1uZHgsICZzeW1fbWVtLAorCQkJCQkJICAgICZzaG5keCk7CisJCSAgaWYgKHN5bSA9PSBOVUxMKQorCQkgICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7CisKKwkJICB2YWx1ZSA9IHN5bS0+c3RfdmFsdWU7CisJCSAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1hJTkRFWCkKKwkJICAgIHNobmR4ID0gc3ltLT5zdF9zaG5keDsKKwkJICBzd2l0Y2ggKHNobmR4KQorCQkgICAgeworCQkgICAgY2FzZSBTSE5fQUJTOgorCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSBTSE5fVU5ERUY6CisJCSAgICBjYXNlIFNITl9DT01NT046CisJCSAgICAgIHJldHVybiBEV0ZMX0VfUkVMVU5ERUY7CisKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIHsKKwkJCUR3ZmxfRXJyb3IgZXJyb3IgPSBhZGp1c3QgKHNobmR4KTsKKwkJCWlmIChlcnJvciAhPSBEV0ZMX0VfTk9FUlJPUikKKwkJCSAgcmV0dXJuIGVycm9yOworCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICAgIH0KKwkJfQorCisJICAgICAgLyogVGhlc2UgYXJlIHRoZSB0eXBlcyB3ZSBjYW4gcmVsb2NhdGUuICAqLworI2RlZmluZSBUWVBFUwkJRE9fVFlQRSAoQllURSwgQnl0ZSkgRE9fVFlQRSAoSEFMRiwgSGFsZikgXAorCQkJRE9fVFlQRSAoV09SRCwgV29yZCkgRE9fVFlQRSAoU1dPUkQsIFN3b3JkKSBcCisJCQlET19UWVBFIChYV09SRCwgWHdvcmQpIERPX1RZUEUgKFNYV09SRCwgU3h3b3JkKQorCSAgICAgIHNpemVfdCBzaXplOworCSAgICAgIEVsZl9UeXBlIHR5cGUgPSBlYmxfcmVsb2Nfc2ltcGxlX3R5cGUgKG1vZC0+ZWJsLCBydHlwZSk7CisJICAgICAgc3dpdGNoICh0eXBlKQorCQl7CisjZGVmaW5lIERPX1RZUEUoTkFNRSwgTmFtZSkJCQkJCQkgICAgICBcCisJCSAgICBjYXNlIEVMRl9UXyMjTkFNRToJCQkJCSAgICAgIFwKKwkJICAgICAgc2l6ZSA9IHNpemVvZiAoR0VsZl8jI05hbWUpOwkJCSAgICAgIFwKKwkJICAgICAgYnJlYWs7CisJCSAgVFlQRVMKKyN1bmRlZiBET19UWVBFCisJCSAgICBkZWZhdWx0OgorCQkgIHJldHVybiBEV0ZMX0VfQkFEUkVMVFlQRTsKKwkJfQorCisJICAgICAgaWYgKG9mZnNldCArIHNpemUgPj0gdGRhdGEtPmRfc2l6ZSkKKwkJcmV0dXJuIERXRkxfRV9CQURSRUxPRkY7CisKKyNkZWZpbmUgRE9fVFlQRShOQU1FLCBOYW1lKSBHRWxmXyMjTmFtZSBOYW1lOworCSAgICAgIHVuaW9uIHsgVFlQRVMgfSB0bXBidWY7CisjdW5kZWYgRE9fVFlQRQorCSAgICAgIEVsZl9EYXRhIHRtcGRhdGEgPQorCQl7CisJCSAgLmRfdHlwZSA9IHR5cGUsCisJCSAgLmRfYnVmID0gJnRtcGJ1ZiwKKwkJICAuZF9zaXplID0gc2l6ZSwKKwkJICAuZF92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKKwkJfTsKKwkgICAgICBFbGZfRGF0YSByZGF0YSA9CisJCXsKKwkJICAuZF90eXBlID0gdHlwZSwKKwkJICAuZF9idWYgPSB0ZGF0YS0+ZF9idWYgKyBvZmZzZXQsCisJCSAgLmRfc2l6ZSA9IHNpemUsCisJCSAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCisJCX07CisKKwkgICAgICAvKiBYWFggY2hlY2sgZm9yIG92ZXJmbG93PyAqLworCSAgICAgIGlmIChhZGRlbmQpCisJCXsKKwkJICAvKiBGb3IgdGhlIGFkZGVuZCBmb3JtLCB3ZSBoYXZlIHRoZSB2YWx1ZSBhbHJlYWR5LiAgKi8KKwkJICB2YWx1ZSArPSAqYWRkZW5kOworCQkgIHN3aXRjaCAodHlwZSkKKwkJICAgIHsKKyNkZWZpbmUgRE9fVFlQRShOQU1FLCBOYW1lKQkJCQkJCSAgICAgIFwKKwkJCWNhc2UgRUxGX1RfIyNOQU1FOgkJCQkgICAgICBcCisJCQkgIHRtcGJ1Zi5OYW1lID0gdmFsdWU7CQkJCSAgICAgIFwKKwkJCSAgYnJlYWs7CisJCSAgICAgIFRZUEVTCisjdW5kZWYgRE9fVFlQRQorCQkJZGVmYXVsdDoKKwkJICAgICAgYWJvcnQgKCk7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBFeHRyYWN0IHRoZSBvcmlnaW5hbCB2YWx1ZSBhbmQgYXBwbHkgdGhlIHJlbG9jLiAgKi8KKwkJICBFbGZfRGF0YSAqZCA9IGdlbGZfeGxhdGV0b20gKG1vZC0+bWFpbi5lbGYsICZ0bXBkYXRhLCAmcmRhdGEsCisJCQkJCSAgICAgICBlaGRyLT5lX2lkZW50W0VJX0RBVEFdKTsKKwkJICBpZiAoZCA9PSBOVUxMKQorCQkgICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7CisJCSAgYXNzZXJ0IChkID09ICZ0bXBkYXRhKTsKKwkJICBzd2l0Y2ggKHR5cGUpCisJCSAgICB7CisjZGVmaW5lIERPX1RZUEUoTkFNRSwgTmFtZSkJCQkJCQkgICAgICBcCisJCQljYXNlIEVMRl9UXyMjTkFNRToJCQkJICAgICAgXAorCQkJICB0bXBidWYuTmFtZSArPSAoR0VsZl8jI05hbWUpIHZhbHVlOwkJICAgICAgXAorCQkJICBicmVhazsKKwkJICAgICAgVFlQRVMKKyN1bmRlZiBET19UWVBFCisJCQlkZWZhdWx0OgorCQkgICAgICBhYm9ydCAoKTsKKwkJICAgIH0KKwkJfQorCisJICAgICAgLyogTm93IGNvbnZlcnQgdGhlIHJlbG9jYXRlZCBkYXR1bSBiYWNrIHRvIHRoZSB0YXJnZXQKKwkJIGZvcm1hdC4gIFRoaXMgd2lsbCB3cml0ZSBpbnRvIHJkYXRhLmRfYnVmLCB3aGljaAorCQkgcG9pbnRzIGludG8gdGhlIHJhdyBzZWN0aW9uIGRhdGEgYmVpbmcgcmVsb2NhdGVkLiAgKi8KKwkgICAgICBFbGZfRGF0YSAqcyA9IGdlbGZfeGxhdGV0b2YgKG1vZC0+bWFpbi5lbGYsICZyZGF0YSwgJnRtcGRhdGEsCisJCQkJCSAgIGVoZHItPmVfaWRlbnRbRUlfREFUQV0pOworCSAgICAgIGlmIChzID09IE5VTEwpCisJCXJldHVybiBEV0ZMX0VfTElCRUxGOworCSAgICAgIGFzc2VydCAocyA9PSAmcmRhdGEpOworCisJICAgICAgLyogV2UgaGF2ZSBhcHBsaWVkIHRoaXMgcmVsb2NhdGlvbiEgICovCisJICAgICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOworCSAgICB9CisKKwkgIC8qIEZldGNoIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gYW5kIGFwcGx5IGVhY2ggcmVsb2MgaW4gaXQuICAqLworCSAgRWxmX0RhdGEgKnJlbGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKwkgIGlmIChyZWxkYXRhID09IE5VTEwpCisJICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOworCisJICByZXN1bHQgPSBEV0ZMX0VfTk9FUlJPUjsKKwkgIHNpemVfdCBucmVscyA9IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOworCSAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKKwkgICAgZm9yIChzaXplX3QgcmVsaWR4ID0gMDsgIXJlc3VsdCAmJiByZWxpZHggPCBucmVsczsgKytyZWxpZHgpCisJICAgICAgeworCQlHRWxmX1JlbCByZWxfbWVtLCAqciA9IGdlbGZfZ2V0cmVsIChyZWxkYXRhLCByZWxpZHgsICZyZWxfbWVtKTsKKwkJaWYgKHIgPT0gTlVMTCkKKwkJICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKKwkJcmVzdWx0ID0gcmVsb2NhdGUgKHItPnJfb2Zmc2V0LCBOVUxMLAorCQkJCSAgIEdFTEZfUl9UWVBFIChyLT5yX2luZm8pLAorCQkJCSAgIEdFTEZfUl9TWU0gKHItPnJfaW5mbykpOworCSAgICAgIH0KKwkgIGVsc2UKKwkgICAgZm9yIChzaXplX3QgcmVsaWR4ID0gMDsgIXJlc3VsdCAmJiByZWxpZHggPCBucmVsczsgKytyZWxpZHgpCisJICAgICAgeworCQlHRWxmX1JlbGEgcmVsYV9tZW0sICpyID0gZ2VsZl9nZXRyZWxhIChyZWxkYXRhLCByZWxpZHgsCisJCQkJCQkgICAgICAgJnJlbGFfbWVtKTsKKwkJaWYgKHIgPT0gTlVMTCkKKwkJICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKKwkJcmVzdWx0ID0gcmVsb2NhdGUgKHItPnJfb2Zmc2V0LCAmci0+cl9hZGRlbmQsCisJCQkJICAgR0VMRl9SX1RZUEUgKHItPnJfaW5mbyksCisJCQkJICAgR0VMRl9SX1NZTSAoci0+cl9pbmZvKSk7CisJICAgICAgfQorCSAgaWYgKHJlc3VsdCAhPSBEV0ZMX0VfTk9FUlJPUikKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZHdmbC90ZXN0Mi5jIGIvbGliZHdmbC90ZXN0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWU3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJkd2ZsL3Rlc3QyLmMKQEAgLTAsMCArMSwyNjggQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW9fZXh0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxhcmdwLmg+CisjaW5jbHVkZSA8bGliZHdmbC5oPgorI2luY2x1ZGUgPGR3YXJmLmg+CisjaW5jbHVkZSAiLi4vbGliZHcvbGliZHdQLmgiCisjaW5jbHVkZSA8b2JzdGFjay5oPgorCisjaW5jbHVkZSAibG9jMmMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZHdhcmZfZGllbmFtZV9pbnRlZ3JhdGUgKER3YXJmX0RpZSAqZGllKQoreworICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07CisgIHJldHVybiBkd2FyZl9mb3Jtc3RyaW5nIChkd2FyZl9hdHRyX2ludGVncmF0ZSAoZGllLCBEV19BVF9uYW1lLCAmYXR0cl9tZW0pKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfdmFyaWFibGUgKER3YXJmX0RpZSAqc2NvcGVzLCBpbnQgbnNjb3BlcywgaW50IG91dCwKKwkJIER3YXJmX0FkZHIgY3ViaWFzLCBEd2FyZl9EaWUgKnZhcmRpZSwgRHdhcmZfQWRkciBwYywKKwkJIGNoYXIgKipmaWVsZHMpCit7CisjZGVmaW5lIG9ic3RhY2tfY2h1bmtfYWxsb2MgbWFsbG9jCisjZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCisgIHN0cnVjdCBvYnN0YWNrIHBvb2w7CisgIG9ic3RhY2tfaW5pdCAoJnBvb2wpOworCisgICAvKiBGaWd1cmUgb3V0IHRoZSBhcHByb3ByaWF0ZSBmcmFtZSBiYXNlIGZvciBhY2Nlc3NpbmcgdGhpcyB2YXJpYWJsZS4KKyAgICAgWFhYIG5vdCBoYW5kbGluZyBuZXN0ZWQgZnVuY3Rpb25zCisgICAgIFhYWCBpbmxpbmVzIGJvdGNoZWQKKyAgKi8KKyAgRHdhcmZfQXR0cmlidXRlIGZiX2F0dHJfbWVtLCAqZmJfYXR0ciA9IE5VTEw7CisgIGZvciAoaW50IGlubmVyID0gMDsgaW5uZXIgPCBuc2NvcGVzOyArK2lubmVyKQorICAgIHsKKyAgICAgIHN3aXRjaCAoZHdhcmZfdGFnICgmc2NvcGVzW2lubmVyXSkpCisJeworCWRlZmF1bHQ6CisJICBjb250aW51ZTsKKwljYXNlIERXX1RBR19zdWJwcm9ncmFtOgorCWNhc2UgRFdfVEFHX2VudHJ5X3BvaW50OgorCWNhc2UgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZToJLyogWFhYICovCisJICBpZiAoaW5uZXIgPj0gb3V0KQorCSAgICBmYl9hdHRyID0gZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKCZzY29wZXNbaW5uZXJdLAorCQkJCQkgICAgRFdfQVRfZnJhbWVfYmFzZSwKKwkJCQkJICAgICZmYl9hdHRyX21lbSk7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOworCisgIGlmIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodmFyZGllLCBEV19BVF9sb2NhdGlvbiwgJmF0dHJfbWVtKSA9PSBOVUxMKQorICAgIGVycm9yICgyLCAwLCBfKCJjYW5ub3QgZ2V0IGxvY2F0aW9uIG9mIHZhcmlhYmxlOiAlcyIpLAorCSAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKworI2RlZmluZSBGSUVMRCAiYWRkciIKKyNkZWZpbmUgZW1pdChmbXQsIC4uLikgcHJpbnRmICgiICBhZGRyID0gIiBmbXQgIlxuIiwgIyMgX19WQV9BUkdTX18pCisKKyAgc3RydWN0IGxvY2F0aW9uICpoZWFkLCAqdGFpbCA9IE5VTEw7CisgIGhlYWQgPSBjX3RyYW5zbGF0ZV9sb2NhdGlvbiAoJnBvb2wsIDEsIGN1YmlhcywgJmF0dHJfbWVtLCBwYywKKwkJCSAgICAgICAmdGFpbCwgZmJfYXR0cik7CisKKyAgaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh2YXJkaWUsIERXX0FUX3R5cGUsICZhdHRyX21lbSkgPT0gTlVMTCkKKyAgICBlcnJvciAoMiwgMCwgXygiY2Fubm90IGdldCB0eXBlIG9mIHZhcmlhYmxlOiAlcyIpLAorCSAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKworICBEd2FyZl9EaWUgZGllX21lbSwgKmRpZSA9IHZhcmRpZTsKKyAgd2hpbGUgKCpmaWVsZHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBkaWUgPSBkd2FyZl9mb3JtcmVmX2RpZSAoJmF0dHJfbWVtLCAmZGllX21lbSk7CisKKyAgICAgIGNvbnN0IGludCB0eXBldGFnID0gZHdhcmZfdGFnIChkaWUpOworICAgICAgc3dpdGNoICh0eXBldGFnKQorCXsKKwljYXNlIERXX1RBR190eXBlZGVmOgorCSAgLyogSnVzdCBpdGVyYXRlIG9uIHRoZSByZWZlcmVudCB0eXBlLiAgKi8KKwkgIGJyZWFrOworCisJY2FzZSBEV19UQUdfcG9pbnRlcl90eXBlOgorCSAgaWYgKCoqZmllbGRzID09ICcrJykKKwkgICAgZ290byBzdWJzY3JpcHQ7CisJICAvKiBBICIiIGZpZWxkIG1lYW5zIGV4cGxpY2l0IHBvaW50ZXIgZGVyZWZlcmVuY2UgYW5kIHdlIGNvbnN1bWUgaXQuCisJICAgICBPdGhlcndpc2UgdGhlIG5leHQgZmllbGQgaW1wbGljaXRseSBnZXRzIHRoZSBkZXJlZmVyZW5jZS4gICovCisJICBpZiAoKipmaWVsZHMgPT0gJ1wwJykKKwkgICAgKytmaWVsZHM7CisJICBjX3RyYW5zbGF0ZV9wb2ludGVyICgmcG9vbCwgMSwgY3ViaWFzLCBkaWUsICZ0YWlsKTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19UQUdfYXJyYXlfdHlwZToKKwkgIGlmICgqKmZpZWxkcyA9PSAnKycpCisJICAgIHsKKwkgICAgc3Vic2NyaXB0OjsKKwkgICAgICBjaGFyICplbmRwID0gKmZpZWxkcyArIDE7CisJICAgICAgdWludG1heF90IGlkeCA9IHN0cnRvdW1heCAoKmZpZWxkcyArIDEsICZlbmRwLCAwKTsKKwkgICAgICBpZiAoZW5kcCA9PSBOVUxMIHx8IGVuZHAgPT0gKmZpZWxkcyB8fCAqZW5kcCAhPSAnXDAnKQorCQljX3RyYW5zbGF0ZV9hcnJheSAoJnBvb2wsIDEsIGN1YmlhcywgZGllLCAmdGFpbCwKKwkJCQkgICAqZmllbGRzICsgMSwgMCk7CisJICAgICAgZWxzZQorCQljX3RyYW5zbGF0ZV9hcnJheSAoJnBvb2wsIDEsIGN1YmlhcywgZGllLCAmdGFpbCwKKwkJCQkgICBOVUxMLCBpZHgpOworCSAgICAgICsrZmllbGRzOworCSAgICB9CisJICBlbHNlCisJICAgIGVycm9yICgyLCAwLCBfKCJiYWQgZmllbGQgZm9yIGFycmF5IHR5cGU6ICVzIiksICpmaWVsZHMpOworCSAgYnJlYWs7CisKKwljYXNlIERXX1RBR19zdHJ1Y3R1cmVfdHlwZToKKwljYXNlIERXX1RBR191bmlvbl90eXBlOgorCSAgc3dpdGNoIChkd2FyZl9jaGlsZCAoZGllLCAmZGllX21lbSkpCisJICAgIHsKKwkgICAgY2FzZSAxOgkJLyogTm8gY2hpbGRyZW4uICAqLworCSAgICAgIGVycm9yICgyLCAwLCBfKCJlbXB0eSBzdHJ1Y3QgJXMiKSwKKwkJICAgICBkd2FyZl9kaWVuYW1lX2ludGVncmF0ZSAoZGllKSA/OiAiPGFub255bW91cz4iKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAtMToJCS8qIEVycm9yLiAgKi8KKwkgICAgZGVmYXVsdDoJCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwkgICAgICBlcnJvciAoMiwgMCwgXygiJXMgJXM6ICVzIiksCisJCSAgICAgdHlwZXRhZyA9PSBEV19UQUdfdW5pb25fdHlwZSA/ICJ1bmlvbiIgOiAic3RydWN0IiwKKwkJICAgICBkd2FyZl9kaWVuYW1lX2ludGVncmF0ZSAoZGllKSA/OiAiPGFub255bW91cz4iLAorCQkgICAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIDA6CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHdoaWxlIChkd2FyZl90YWcgKGRpZSkgIT0gRFdfVEFHX21lbWJlcgorCQkgfHwgKHsgY29uc3QgY2hhciAqbWVtYmVyID0gZHdhcmZfZGllbmFtZV9pbnRlZ3JhdGUgKGRpZSk7CisJCSAgICAgICBtZW1iZXIgPT0gTlVMTCB8fCBzdHJjbXAgKG1lbWJlciwgKmZpZWxkcyk7IH0pKQorCSAgICBpZiAoZHdhcmZfc2libGluZ29mIChkaWUsICZkaWVfbWVtKSAhPSAwKQorCSAgICAgIGVycm9yICgyLCAwLCBfKCJmaWVsZCBuYW1lICVzIG5vdCBmb3VuZCIpLCAqZmllbGRzKTsKKworCSAgaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlIChkaWUsIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uLAorCQkJCSAgICAmYXR0cl9tZW0pID09IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBVbmlvbiBtZW1iZXJzIGRvbid0IHVzdWFsbHkgaGF2ZSBhIGxvY2F0aW9uLAorCQkgYnV0IGp1c3QgdXNlIHRoZSBjb250YWluaW5nIHVuaW9uJ3MgbG9jYXRpb24uICAqLworCSAgICAgIGlmICh0eXBldGFnICE9IERXX1RBR191bmlvbl90eXBlKQorCQllcnJvciAoMiwgMCwgXygibm8gbG9jYXRpb24gZm9yIGZpZWxkICVzOiAlcyIpLAorCQkgICAgICAgKmZpZWxkcywgZHdhcmZfZXJybXNnICgtMSkpOworCSAgICB9CisJICBlbHNlCisJICAgIGNfdHJhbnNsYXRlX2xvY2F0aW9uICgmcG9vbCwgMSwgY3ViaWFzLCAmYXR0cl9tZW0sIHBjLAorCQkJCSAgJnRhaWwsIE5VTEwpOworCSAgKytmaWVsZHM7CisJICBicmVhazsKKworCWNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKKwkgIGVycm9yICgyLCAwLCBfKCJmaWVsZCAlcyB2cyBiYXNlIHR5cGUgJXMiKSwKKwkJICpmaWVsZHMsIGR3YXJmX2RpZW5hbWVfaW50ZWdyYXRlIChkaWUpID86ICI8YW5vbnltb3VzIHR5cGU+Iik7CisJICBicmVhazsKKworCWNhc2UgLTE6CisJICBlcnJvciAoMiwgMCwgXygiY2Fubm90IGZpbmQgdHlwZTogJXMiKSwgZHdhcmZfZXJybXNnICgtMSkpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgZXJyb3IgKDIsIDAsIF8oIiVzOiB1bmV4cGVjdGVkIHR5cGUgdGFnICUjeCIpLAorCQkgZHdhcmZfZGllbmFtZV9pbnRlZ3JhdGUgKGRpZSkgPzogIjxhbm9ueW1vdXMgdHlwZT4iLAorCQkgZHdhcmZfdGFnIChkaWUpKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogTm93IGl0ZXJhdGUgb24gdGhlIHR5cGUgaW4gRElFJ3MgYXR0cmlidXRlLiAgKi8KKyAgICAgIGlmIChkd2FyZl9hdHRyX2ludGVncmF0ZSAoZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pID09IE5VTEwpCisJZXJyb3IgKDIsIDAsIF8oImNhbm5vdCBnZXQgdHlwZSBvZiBmaWVsZDogJXMiKSwgZHdhcmZfZXJybXNnICgtMSkpOworICAgIH0KKworICBjX3RyYW5zbGF0ZV9mZXRjaCAoJnBvb2wsIDEsIGN1YmlhcywgZGllLCAmYXR0cl9tZW0sICZ0YWlsLCAidmFsdWUiKTsKKworICBwcmludGYgKCIjZGVmaW5lIFBST0JFQUREUiAlIyIgUFJJeDY0ICJVTExcbiIsIHBjKTsKKyAgcHV0cyAoInN0YXRpYyB2b2lkIHByaW50X3ZhbHVlKHN0cnVjdCBwdF9yZWdzICpyZWdzKVxuIgorCSJ7XG4iCisJIiAgaW50cHRyX3QgdmFsdWU7Iik7CisKKyAgYm9vbCBkZXJlZiA9IGNfZW1pdF9sb2NhdGlvbiAoc3Rkb3V0LCBoZWFkLCAxKTsKKworICBwdXRzICgiICBwcmludGsgKFwiIC0tLT4gJWxkXFxuXCIsICh1bnNpZ25lZCBsb25nKSB2YWx1ZSk7XG4iCisJIiAgcmV0dXJuOyIpOworCisgIGlmIChkZXJlZikKKyAgICBwdXRzICgiXG4iCisJICAiIGRlcmVmX2ZhdWx0OlxuIgorCSAgIiAgcHJpbnRrIChcIiA9PiBCQUQgRkVUQ0hcXG5cIik7Iik7CisKKyAgcHV0cyAoIn0iKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KKyAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworCisgIC8qIFNldCBsb2NhbGUuICAqLworICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKKworICBEd2ZsICpkd2ZsID0gTlVMTDsKKyAgaW50IGFyZ2k7CisgICh2b2lkKSBhcmdwX3BhcnNlIChkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksIGFyZ2MsIGFyZ3YsIDAsICZhcmdpLCAmZHdmbCk7CisgIGFzc2VydCAoZHdmbCAhPSBOVUxMKTsKKworICBpZiAoYXJnaSA9PSBhcmdjKQorICAgIGVycm9yICgyLCAwLCAibmVlZCBhZGRyZXNzIGFyZ3VtZW50Iik7CisKKyAgY2hhciAqZW5kcDsKKyAgdWludG1heF90IHBjID0gc3RydG91bWF4IChhcmd2W2FyZ2ldLCAmZW5kcCwgMCk7CisgIGlmIChlbmRwID09IGFyZ3ZbYXJnaV0pCisgICAgZXJyb3IgKDIsIDAsICJiYWQgYWRkcmVzcyBhcmd1bWVudCIpOworCisgIER3YXJmX0FkZHIgY3ViaWFzOworICBEd2FyZl9EaWUgKmN1ZGllID0gZHdmbF9hZGRyZGllIChkd2ZsLCBwYywgJmN1Ymlhcyk7CisgIGlmIChjdWRpZSA9PSBOVUxMKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2ZsX2FkZHJkaWU6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7CisKKyAgRHdhcmZfRGllICpzY29wZXM7CisgIGludCBuID0gZHdhcmZfZ2V0c2NvcGVzIChjdWRpZSwgcGMgLSBjdWJpYXMsICZzY29wZXMpOworICBpZiAobiA8IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2dldHNjb3BlczogJXMiLCBkd2FyZl9lcnJtc2cgKC0xKSk7CisgIGVsc2UgaWYgKG4gPT0gMCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiJSMiIFBSSXg2NCAiOiBub3QgaW4gYW55IHNjb3BlXG4iLCBwYyk7CisKKyAgaWYgKCsrYXJnaSA9PSBhcmdjKQorICAgIGVycm9yICgyLCAwLCAibmVlZCB2YXJpYWJsZSBhcmd1bWVudHMiKTsKKworICBjaGFyICpzcGVjID0gYXJndlthcmdpKytdOworCisgIGludCBsaW5lbm8gPSAwLCBjb2xubyA9IDAsIHNoYWRvdyA9IDA7CisgIGNoYXIgKmF0ID0gc3RyY2hyIChzcGVjLCAnQCcpOworICBpZiAoYXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAqYXQrKyA9ICdcMCc7CisgICAgICBpZiAoc3NjYW5mIChhdCwgIiUqW146XTolaTolaSIsICZsaW5lbm8sICZjb2xubykgPCAxKQorCWxpbmVubyA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGxlbjsKKyAgICAgIGlmIChzc2NhbmYgKHNwZWMsICIlKlteK10lbislaSIsICZsZW4sICZzaGFkb3cpID09IDIpCisJc3BlY1tsZW5dID0gJ1wwJzsKKyAgICB9CisKKyAgRHdhcmZfRGllIHZhcmRpZTsKKyAgaW50IG91dCA9IGR3YXJmX2dldHNjb3BldmFyIChzY29wZXMsIG4sIHNwZWMsIHNoYWRvdywgYXQsIGxpbmVubywgY29sbm8sCisJCQkgICAgICAgJnZhcmRpZSk7CisgIGlmIChvdXQgPT0gLTIpCisgICAgZXJyb3IgKDAsIDAsICJubyBtYXRjaCBmb3IgJXMgKCslZCwgJXM6JWQ6JWQpIiwKKwkgICBzcGVjLCBzaGFkb3csIGF0LCBsaW5lbm8sIGNvbG5vKTsKKyAgZWxzZSBpZiAob3V0IDwgMCkKKyAgICBlcnJvciAoMCwgMCwgImR3YXJmX2dldHNjb3BldmFyOiAlcyAoKyVkLCAlczolZDolZCk6ICVzIiwKKwkgICBzcGVjLCBzaGFkb3csIGF0LCBsaW5lbm8sIGNvbG5vLCBkd2FyZl9lcnJtc2cgKC0xKSk7CisgIGVsc2UKKyAgICBoYW5kbGVfdmFyaWFibGUgKHNjb3Blcywgbiwgb3V0LCBjdWJpYXMsICZ2YXJkaWUsIHBjLCAmYXJndlthcmdpXSk7CisKKyAgZHdmbF9lbmQgKGR3ZmwpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsLy5jdnNpZ25vcmUgYi9saWJlYmwvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg0NWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYmVibC9DaGFuZ2VMb2cgYi9saWJlYmwvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDU3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMjgxIEBACisyMDA1LTA3LTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWJsc2VjdGlvbnN0cmlwcC5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IEFkZCBlYmxzZWN0aW9uc3RyaXBwLmMuCisJKiBpMzg2X2luaXQuYyAoaTM4Nl9pbml0KTogSW5zdGFsbCBzcGVjaWZpYyBkZWJ1Z3Njbl9wIGNhbGxiYWNrLgorCSogaTM4Nl9zeW1ib2wuYyAoaTM4Nl9kZWJ1Z3Njbl9wKTogTmV3IGZ1bmN0aW9uLgorCSogbGliZWJsLmg6IERlY2xhcmUgZWJsX3NlY3Rpb25fc3RyaXBfcC4KKwkqIGxpYmVibF9pMzg2Lmg6IERlY2xhcmUgaTM4Nl9kZWJ1Z3Njbl9wLgorCisJKiBsaWJlYmwuaDogTW92ZSBFYmwgZGVmaW5pdGlvbiB0by4uLgorCSogbGliZWJsUC5oOiAuLi5oZXJlLgorCisyMDA1LTA3LTIxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1lYmwtbW9kdWxlcyk6IE5ldyB0YXJnZXQsIGNvbW1hbmRzIGZyb20gLi4uCisJKGluc3RhbGwpOiAuLi4gaGVyZS4gIE1ha2UgdGhpcyBkZXBlbmQgb24gaXQuCisJKExJQkVCTF9TVUJESVIpOiBOZXcgdmFyaWFibGUsIHN1YnN0aXR1dGVkIGJ5IGNvbmZpZ3VyZS4KKwkoaW5zdGFsbC1lYmwtbW9kdWxlcyk6IEluc3RhbGwgaW4gJChsaWJkaXIpLyQoTElCRUJMX1NVQkRJUikuCisJKiBlYmxvcGVuYmFja2VuZC5jIChvcGVuYmFja2VuZCk6IFVzZSBMSUJFQkxfU1VCRElSIGluIG1vZHVsZSBuYW1lLgorCisyMDA1LTA3LTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWJsY29weXJlbG9jcC5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IEFkZCBlYmxjb3B5cmVsb2NwLmMuCisJKiBsaWJlYmwuaDogRGVjbGFyZSBlYmxfY29weV9yZWxvY19wLgorCSogZWJsb3BlbmJhY2tlbmQuYyAoZmlsbF9kZWZhdWx0cyk6IEZpbGwgaW4gY29weV9yZWxvY19wLgorCShkZWZhdWx0X2NvcHlfcmVsb2NfcCk6IE5ldyBmdW5jdGlvbi4KKwkqIGFscGhhX2luaXQuYzogRGVmaW5lIGFuZCB1c2UgYXJjaC1zcGVjaWZpYyBjb3B5X3JlbG9jX3AgZnVuY3Rpb24uCisJKiBhbHBoYV9zeW1ib2wuYzogTGlrZXdpc2UuCisJKiBhcm1faW5pdC5jOiBMaWtld2lzZS4KKwkqIGFybV9zeW1ib2wuYzogTGlrZXdpc2UuCisJKiBpMzg2X2luaXQuYzogTGlrZXdpc2UuCisJKiBpMzg2X3N5bWJvbC5jOiBMaWtld2lzZS4KKwkqIGlhNjRfaW5pdC5jOiBMaWtld2lzZS4KKwkqIGlhNjRfc3ltYm9sLmM6IExpa2V3aXNlLgorCSogcHBjNjRfaW5pdC5jOiBMaWtld2lzZS4KKwkqIHBwYzY0X3N5bWJvbC5jOiBMaWtld2lzZS4KKwkqIHBwY19pbml0LmM6IExpa2V3aXNlLgorCSogcHBjX3N5bWJvbC5jOiBMaWtld2lzZS4KKwkqIHNoX2luaXQuYzogTGlrZXdpc2UuCisJKiBzaF9zeW1ib2wuYzogTGlrZXdpc2UuCisJKiBzcGFyY19pbml0LmM6IExpa2V3aXNlLgorCSogc3BhcmNfc3ltYm9sLmM6IExpa2V3aXNlLgorCSogeDg2XzY0X2luaXQuYzogTGlrZXdpc2UuCisJKiB4ODZfNjRfc3ltYm9sLmM6IExpa2V3aXNlLgorCSogbGliZWJsX2FscGhhLmg6IERlY2xhcmUgdGhlIGNvcHlfcmVsb2NfcCBmdW5jdGlvbi4KKwkqIGxpYmVibF9hcm0uaDogTGlrZXdpc2UuCisJKiBsaWJlYmxfaTM4Ni5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF9pYTY0Lmg6IExpa2V3aXNlLgorCSogbGliZWJsX3BwYy5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF9wcGM2NC5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF9zaC5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF9zcGFyYy5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF94ODZfNjQuaDogTGlrZXdpc2UuCisKKzIwMDUtMDUtMzEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChsaWJlYmxfKl9zb19TT1VSQ0VTKTogU2V0IHRvICQoKl9TUkNTKSBzbyBkZXBlbmRlbmN5CisJdHJhY2tpbmcgd29ya3MgcmlnaHQuCisKKzIwMDUtMDUtMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBsaWJlYmxfeDg2XzY0Lm1hcDogQWRkIHg4Nl82NF9jb3JlX25vdGUuCisKKzIwMDUtMDUtMTkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGxpYmVibF9pMzg2Lm1hcDogQWRkIGkzODZfcmVsb2NfdmFsaWRfdXNlLCBpMzg2X3JlbG9jX3NpbXBsZV90eXBlLgorCSogbGliZWJsX3BwYy5tYXA6IEFkZCBwcGNfcmVsb2Nfc2ltcGxlX3R5cGUuCisJKiBsaWJlYmxfcHBjNjQubWFwOiBBZGQgcHBjNjRfcmVsb2Nfc2ltcGxlX3R5cGUuCisJKiBsaWJlYmxfeDg2XzY0Lm1hcDogQWRkIHg4Nl82NF9yZWxvY19zaW1wbGVfdHlwZS4KKworMjAwNS0wNS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVibGNvcmVub3RlLmM6IEhhbmRsZSBuZXcgQVRfKiB2YWx1ZXMgYW5kIGZpbGVzIHdpdGggZGlmZmVyZW50CisJZW5kaWFuZXNzLgorCSogTWFrZWZpbGUuYW0gKHg4Nl82NF9TUkNTKTogQWRkIHg4Nl82NF9jb3Jlbm90ZS5jLgorCSogeDg2LTY0X2NvcmVub3RlLmM6IE5ldyBmaWxlLgorCSogeDg2XzY0X2luaXQuYzogSG9vayBpbiB4ODZfNjRfY29yZW5vdGUuCisJKiBpMzg2X2NvcmVub3RlLmM6IE1ha2UgZmlsZSB1c2FibGUgb24gNjQtYml0IHBsYXRmb3Jtcy4KKworCSogZWJsb3BlbmJhY2tlbmQuYzogSWYgbW9kdWxlcyB2ZXJzaW9uIGNvbXBhcmlzb24gZmFpbHMsIHJlaW5pdGlhbGl6ZQorCWhvb2tzLgorCisyMDA1LTA1LTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWJsb3BlbmJhY2tlbmQuYzogUmVxdWlyZSB0aGUgaW5pdCBmdW5jdGlvbiB0byByZXR1cm4gYSBzdHJpbmcuCisJQ29tcGFyZSBpdCB3aXRoIE1PRFZFUlNJT04gZnJvbSBjb25maWcuaC4KKwkqIGFscGhhX2luaXQuYzogQ2hhbmdlIHJldHVybiB0eXBlLiAgUmV0dXJuIE1PRFZFUlNJT04gb3IgTlVMTC4KKwkqIGFybV9pbml0LmM6IExpa2V3aXNlLgorCSogZWJsb3BlbmJhY2tlbmQuYzogTGlrZXdpc2UuCisJKiBpMzg2X2luaXQuYzogTGlrZXdpc2UuCisJKiBpYTY0X2luaXQuYzogTGlrZXdpc2UuCisJKiBwcGM2NF9pbml0LmM6IExpa2V3aXNlLgorCSogcHBjX2luaXQuYzogTGlrZXdpc2UuCisJKiBzaF9pbml0LmM6IExpa2V3aXNlLgorCSogc3BhcmNfaW5pdC5jOiBMaWtld2lzZS4KKwkqIHg4Nl82NF9pbml0LmM6IExpa2V3aXNlLgorCSogbGliZWJsUC5oOiBBZGp1c3QgZWJsX2JoaW5pdF90LgorCSogbGliZWJsX2FscGhhLmg6IEFkanVzdCBpbml0IGZ1bmN0aW9uIHByb3RvdHlwZS4KKwkqIGxpYmVibF9hcm0uaDogTGlrZXdpc2UuCisJKiBsaWJlYmxfaTM4Ni5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF9pYTY0Lmg6IExpa2V3aXNlLgorCSogbGliZWJsX3BwYy5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF9wcGM2NC5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF9zaC5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF9zcGFyYy5oOiBMaWtld2lzZS4KKwkqIGxpYmVibF94ODZfNjQuaDogTGlrZXdpc2UuCisKKwkqIG1pcHNfZGVzdHIuYzogUmVtb3ZlZC4KKwkqIG1pcHNfaW5pdC5jOiBSZW1vdmVkLgorCSogbWlwc19zeW1ib2wuYzogUmVtb3ZlZC4KKwkqIGxpYmVibF9taXBzLmg6IFJlbW92ZWQuCisJKiBsaWJlYmxfbWlwcy5tYXA6IFJlbW92ZWQuCisKKzIwMDUtMDUtMDMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGxpYmVibC5oIChFYmwpOiBBZGQgYHJlbG9jX3NpbXBsZV90eXBlJyBtZW1iZXIuCisJKiBlYmxvcGVuYmFja2VuZC5jIChkZWZhdWx0X3JlbG9jX3NpbXBsZV90eXBlKTogTmV3IGZ1bmN0aW9uLgorCShvcGVuYmFja2VuZCk6IFVzZSB0aGF0IGFzIGRlZmF1bHQgcmVsb2Nfc2ltcGxlX3R5cGUgY2FsbGJhY2suCisJKiBlYmxyZWxvY3NpbXBsZXR5cGUuYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBBZGQgaXQuCisJKiBpMzg2X3N5bWJvbC5jIChpMzg2X3JlbG9jX3NpbXBsZV90eXBlKTogTmV3IGZ1bmN0aW9uLgorCSogbGliZWJsX2kzODYuaDogRGVjbGFyZSBpdC4KKwkqIGkzODZfaW5pdC5jIChpMzg2X2luaXQpOiBVc2UgaXQuCisJKiB4ODZfNjRfc3ltYm9sLmMgKHg4Nl82NF9yZWxvY19zaW1wbGVfdHlwZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGxpYmVibF94ODZfNjQuaDogRGVjbGFyZSBpdC4KKwkqIHg4Nl82NF9pbml0LmMgKHg4Nl82NF9pbml0KTogVXNlIGl0LgorCSogcHBjX3N5bWJvbC5jIChwcGNfcmVsb2Nfc2ltcGxlX3R5cGUpOiBOZXcgZnVuY3Rpb24uCisJKiBsaWJlYmxfcHBjLmg6IERlY2xhcmUgaXQuCisJKiBwcGNfaW5pdC5jIChwcGNfaW5pdCk6IFVzZSBpdC4KKwkqIHBwYzY0X3N5bWJvbC5jIChwcGM2NF9yZWxvY19zaW1wbGVfdHlwZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGxpYmVibF9wcGM2NC5oOiBEZWNsYXJlIGl0LgorCSogcHBjNjRfaW5pdC5jIChwcGM2NF9pbml0KTogVXNlIGl0LgorCisyMDA1LTAzLTE3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWJsY29yZW5vdGUuYyAoZWJsX2NvcmVfbm90ZSk6IEFkZCBzdXBwb3J0IGZvciBBVF9TRUNVUkUuCisKKzIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1XZm9ybWF0PTIuCisKKzIwMDUtMDItMTQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBhbHBoYV9kZXN0ci5jOiBBZGQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgd2hlcmUgbmVlZGVkLgorCSogYWxwaGFfaW5pdC5jOiBMaWtld2lzZS4KKwkqIGFscGhhX3N5bWJvbC5jOiBMaWtld2lzZS4KKwkqIGFybV9kZXN0ci5jOiBMaWtld2lzZS4KKwkqIGFybV9pbml0LmM6IExpa2V3aXNlLgorCSogYXJtX3N5bWJvbC5jOiBMaWtld2lzZS4KKwkqIGkzODZfY29yZW5vdGUuYzogTGlrZXdpc2UuCisJKiBpMzg2X2Rlc3RyLmM6IExpa2V3aXNlLgorCSogaTM4Nl9pbml0LmM6IExpa2V3aXNlLgorCSogaTM4Nl9zeW1ib2wuYzogTGlrZXdpc2UuCisJKiBpYTY0X2Rlc3RyLmM6IExpa2V3aXNlLgorCSogaWE2NF9pbml0LmM6IExpa2V3aXNlLgorCSogaWE2NF9zeW1ib2wuYzogTGlrZXdpc2UuCisJKiBtaXBzX2Rlc3RyLmM6IExpa2V3aXNlLgorCSogbWlwc19pbml0LmM6IExpa2V3aXNlLgorCSogbWlwc19zeW1ib2wuYzogTGlrZXdpc2UuCisJKiBwcGM2NF9kZXN0ci5jOiBMaWtld2lzZS4KKwkqIHBwYzY0X2luaXQuYzogTGlrZXdpc2UuCisJKiBwcGM2NF9zeW1ib2wuYzogTGlrZXdpc2UuCisJKiBwcGNfZGVzdHIuYzogTGlrZXdpc2UuCisJKiBwcGNfaW5pdC5jOiBMaWtld2lzZS4KKwkqIHBwY19zeW1ib2wuYzogTGlrZXdpc2UuCisJKiBzaF9kZXN0ci5jOiBMaWtld2lzZS4KKwkqIHNoX2luaXQuYzogTGlrZXdpc2UuCisJKiBzaF9zeW1ib2wuYzogTGlrZXdpc2UuCisJKiBzcGFyY19kZXN0ci5jOiBMaWtld2lzZS4KKwkqIHNwYXJjX2luaXQuYzogTGlrZXdpc2UuCisJKiBzcGFyY19zeW1ib2wuYzogTGlrZXdpc2UuCisJKiB4ODZfNjRfZGVzdHIuYzogTGlrZXdpc2UuCisJKiB4ODZfNjRfaW5pdC5jOiBMaWtld2lzZS4KKwkqIHg4Nl82NF9zeW1ib2wuYzogTGlrZXdpc2UuCisKKwkqIHg4Nl82NF9zeW1ib2wuYyAocmVsb2NfbWFwX3RhYmxlKTogRml4IGVudHJpZXMgZm9yIFJfWDg2XzY0XzY0CisJYW5kIFJfWDg2XzY0XzMyLi4KKworMjAwNS0wMi0wNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVibHN0cnRhYi5jOiBBIGZldyBjbGVhbnVwcy4KKworCSogZWJsb3BlbmJhY2tlbmQuYzogTWFyayB1bnVzZWQgcGFyYW1ldGVycy4KKworCSogZWJsZ3N0cnRhYi5jOiBDbGVhbnVwcyBhIGZldyBwcmludGYgZm9ybWF0IHN0cmluZ3MuCisKKwkqIE1ha2VmaWxlLmFtOiBDbGVhbnVwIEFNX0NGTEFHUyBoYW5kbGluZy4gIEFkZCAtV3VudXNlZCAtV2V4dHJhLgorCisyMDA1LTAyLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IENoZWNrIGZvciB0ZXh0IHJlbG9jYXRpb25zIGluIGNvbnN0cnVjdGVkIERTT3MuCisKKwkqIGVibHN0cnRhYi5jOiBNaW5vciBjbGVhbnVwcy4KKworCSogTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IEFkZCAtc3RkPWdudTk5IGFuZCAtZm11ZGZsYXAgZm9yIE1VREZMQVAuCisKKzIwMDQtMDgtMTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIExJQlNUUiBkZWZpbml0aW9uIHdpdGggYmFzZSBuYW1lIG9mCisJdGhlIGxpYiBkaXJlY3RvcnkuCisJKiBlYmxvcGVuYmFja2VuZC5jIChvcGVuYmFja2VuZCk6IFVzZSBMSUJTVFIgaW5zdGVhZCBvZiBoYXJkY29kZWQKKwlsaWIgaW4gcGF0aCB0byBlYmwgbW9kdWxlcy4KKworMjAwNC0wNC0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZXMgZm9yIHBwYyBhbmQgcHBjNjQgZWJsIG1vZHVsZS4KKwkqIHBwY19pbml0Li5jOiBOZXcgZmlsZS4KKwkqIHBwY19kZXN0ci5jOiBOZXcgZmlsZS4KKwkqIHBwY19zeW1ib2wuYzogTmV3IGZpbGUuCisJKiBsaWJlYmxfcHBjLmg6IE5ldyBmaWxlLgorCSogbGliZWJsX3BwYy5tYXA6IE5ldyBmaWxlLgorCSogcHBjNjRfaW5pdC4uYzogTmV3IGZpbGUuCisJKiBwcGM2NF9kZXN0ci5jOiBOZXcgZmlsZS4KKwkqIHBwYzY0X3N5bWJvbC5jOiBOZXcgZmlsZS4KKwkqIGxpYmVibF9wcGM2NC5oOiBOZXcgZmlsZS4KKwkqIGxpYmVibF9wcGM2NC5tYXA6IE5ldyBmaWxlLgorCisyMDA0LTAxLTIwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IFN1cHBvcnQgYnVpbGRpbmcgd2l0aCBtdWRmbGFwLgorCisyMDA0LTAxLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbGliZWJsUC5oIChfKTogVXNlIGVsZnV0aWxzIGRvbWFpbi4KKworMjAwNC0wMS0xNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVibHNlY3Rpb25uYW1lLmM6IEFkZCBzdXBwb3J0IGZvciBTSE5fQkVGT1JFIGFuZCBTSE5fQUZURVIuCisKKzIwMDQtMDEtMTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBlYmxzZWdtZW50dHlwZW5hbWUuYyAoKGVibF9zZWdtZW50X3R5cGVfbmFtZSk6IEFkZCBzdXBwb3J0IGZvcgorCVBUX0dOVV9SRUxSTy4KKworMjAwNC0wMS0wOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGxpYmVibC5oOiBSZW1vdmUgbGFzdCB0cmFjZXMgb2YgbGlidG9vbC4KKworMjAwNC0wMS0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVsZi1rbm93bGVkZ2UuaDogTW92ZSB0byBsaWJlbGYgc3ViZGlyLgorCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IFJlbW92ZSBsaWJlYmwubWFwLgorCSogbGliZWJsLm1hcDogUmVtb3ZlZC4KKworMjAwMy0xMi0wOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVibHNlY3Rpb250eXBlbmFtZS5jIChlYmxfc2VjdGlvbl90eXBlX25hbWUpOiBBZGQgc3VwcG9ydCBmb3IKKwlTSFRfU1VOV19tb3ZlLCBTSFRfQ0hFQ0tTVU0sIGFuZCBTSFRfR05VX0xJQkxJU1QuCisKKzIwMDMtMTEtMTkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBpYTY0X3N5bWJvbC5jIChpYTY0X2R5bmFtaWNfdGFnX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKiBsaWJlYmxfaWE2NC5oIChpYTY0X2R5bmFtaWNfdGFnX25hbWUpOiBEZWNsYXJlLgorCSogaWE2NF9pbml0LmMgKGlhNjRfaW5pdCk6IFJlZ2lzdGVyIGkxNjRfZHluYW1pY190YWdfbmFtZS4KKworMjAwMy0wOS0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGlhNjRfaW5pdC5jIChpYTY0X2luaXQpOiBJbml0aWFsaXplIHNlZ21lbnRfdHlwZV9uYW1lIGNhbGxiYWNrLgorCSogaWE2NF9zeW1ib2wuYyAoaWE2NF9zZWdtZW50X3R5cGVfbmFtZSk6IERlZmluZS4KKwkqIGxpYmVibF9pYTY0LmggKGlhNjRfc2VnbWVudF90eXBlX25hbWUpOiBEZWNsYXJlLgorCisyMDAzLTA5LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IEFkZCAtZnBpYy4KKworMjAwMy0wOC0xNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChpbnN0YWxsKTogUmVtb3ZlIGRlcGVuZGVuY3kgb24gbGliZWJsLnNvLgorCisyMDAzLTA4LTEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWJsb3BlbmJhY2tlbmQuYzogQWRqdXN0IHJlbGF0aXZlIHBhdGggdG8gYXJjaC1zcGVjaWZpYyBEU09zCisJYXNzdW1pbmcgdGhlIGNvZGUgZW5kcyB1cCBpbiB0aGUgYXBwbGljYXRpb24uICBBZGQgc2Vjb25kIGRsb3BlbigpCisJdHJ5IHdpdGhvdXQgYW55IHBhdGgsIGp1c3QgdGhlIGZpbGVuYW1lLgorCSogTWFrZWZpbGUuaW46IFJlbW92ZSBydWxlcyB0byBidWlsZCBhbmQgaW5zdGFsbCBsaWJlYmwuc28uCisKKzIwMDMtMDgtMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisgICAgICAgICogTW92ZWQgdG8gQ1ZTIGFyY2hpdmUuCmRpZmYgLS1naXQgYS9saWJlYmwvTWFrZWZpbGUuYW0gYi9saWJlYmwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3YmU1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIwMSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBjcmVhdGUgTWFrZWZpbGUuaW4KKyMjCisjIyBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMjCisjIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyMgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorIyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorIyMKK0RFRlMgPSAtRF9HTlVfU09VUkNFIC1ESEFWRV9DT05GSUdfSCAtRE9CSkRJUj1cIiQoc2hlbGwgcHdkKVwiCitpZiBNVURGTEFQCitBTV9DRkxBR1MgPSAtZm11ZGZsYXAKK2Vsc2UKK0FNX0NGTEFHUyA9CitlbmRpZgorQU1fQ0ZMQUdTICs9IC1mcGljIC1XYWxsIC1Xc2hhZG93IC1XZXJyb3IgLVd1bnVzZWQgLVdleHRyYSAtV2Zvcm1hdD0yIFwKKwkgICAgIC1zdGQ9Z251OTkKKworSU5DTFVERVMgPSAtSSQoc3JjZGlyKSAtSSQodG9wX3NyY2RpcikvbGliZWxmIC1JJCh0b3Bfc3JjZGlyKS9saWIgLUkuLgorVkVSU0lPTiA9IDEKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitMSUJFQkxfU1VCRElSID0gQExJQkVCTF9TVUJESVJACisKK2xpYl9MSUJSQVJJRVMgPSBsaWJlYmwuYQorbW9kdWxlcyA9IGkzODYgc2ggeDg2XzY0IGlhNjQgYWxwaGEgYXJtIHNwYXJjIHBwYyBwcGM2NAorbm9pbnN0X0xJQlJBUklFUyA9IGxpYmVibF9pMzg2X3BpYy5hIGxpYmVibF9zaF9waWMuYSBcCisJCSAgIGxpYmVibF94ODZfNjRfcGljLmEgbGliZWJsX2lhNjRfcGljLmEgbGliZWJsX2FscGhhX3BpYy5hIFwKKwkJICAgbGliZWJsX2FybV9waWMuYSBsaWJlYmxfc3BhcmNfcGljLmEgbGliZWJsX3BwY19waWMuYSBcCisJCSAgIGxpYmVibF9wcGM2NF9waWMuYQorbm9pbnN0X1BST0dSQU1TID0gJChub2luc3RfTElCUkFSSUVTOl9waWMuYT0uc28pCisKK2V1aW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvZWxmdXRpbHMKK2V1aW5jbHVkZV9IRUFERVJTID0gbGliZWJsLmgKKworZ2VuX1NPVVJDRVMgPSBlYmxvcGVuYmFja2VuZC5jIGVibGNsb3NlYmFja2VuZC5jIGVibHN0cnRhYi5jIFwKKwkgICAgICBlYmxyZWxvY3R5cGVuYW1lLmMgZWJsc2VnbWVudHR5cGVuYW1lLmMgXAorCSAgICAgIGVibHNlY3Rpb250eXBlbmFtZS5jIGVibG1hY2hpbmVmbGFnbmFtZS5jIFwKKwkgICAgICBlYmxzeW1ib2x0eXBlbmFtZS5jIGVibGR5bmFtaWN0YWduYW1lLmMgZWJsc2VjdGlvbm5hbWUuYyBcCisJICAgICAgZWJsb2JqZWN0dHlwZW5hbWUuYyBlYmxzeW1ib2xiaW5kaW5nbmFtZS5jIFwKKwkgICAgICBlYmxiYWNrZW5kbmFtZS5jIGVibHNoZmxhZ3Njb21iaW5lLmMgZWJsd3N0cnRhYi5jIFwKKwkgICAgICBlYmxnc3RydGFiLmMgZWJsb3NhYmluYW1lLmMgZWJsbWFjaGluZWZsYWdjaGVjay5jIFwKKwkgICAgICBlYmxyZWxvY3R5cGVjaGVjay5jIGVibHJlbG9jdmFsaWR1c2UuYyBlYmxyZWxvY3NpbXBsZXR5cGUuYyBcCisJICAgICAgZWJsZHluYW1pY3RhZ2NoZWNrLmMgZWJsY29yZW5vdGV0eXBlbmFtZS5jIGVibG9iam5vdGV0eXBlbmFtZS5jIFwKKwkgICAgICBlYmxjb3Jlbm90ZS5jIGVibG9iam5vdGUuYyBlYmxkZWJ1Z3NjbnAuYyBcCisJICAgICAgZWJsZ290cGNyZWxvY2NoZWNrLmMgZWJsY29weXJlbG9jcC5jIGVibHNlY3Rpb25zdHJpcHAuYworCitsaWJlYmxfYV9TT1VSQ0VTID0gJChnZW5fU09VUkNFUykKKworaTM4Nl9TUkNTID0gaTM4Nl9pbml0LmMgaTM4Nl9kZXN0ci5jIGkzODZfc3ltYm9sLmMgaTM4Nl9jb3Jlbm90ZS5jCitsaWJlYmxfaTM4Nl9waWNfYV9TT1VSQ0VTID0gJChpMzg2X1NSQ1MpCithbV9saWJlYmxfaTM4Nl9waWNfYV9PQkpFQ1RTID0gJChpMzg2X1NSQ1M6LmM9Lm9zKQorCitpZiBNVURGTEFQCitsaWJlbGYgPSAuLi9saWJlbGYvbGliZWxmLmEKK2xpYm11ZGZsYXAgPSAtbG11ZGZsYXAKK2Vsc2UKK2xpYmVsZiA9IC4uL2xpYmVsZi9saWJlbGYuc28KK2xpYm11ZGZsYXAgPQorZW5kaWYKKwordGV4dHJlbF9jaGVjayA9IGlmIHJlYWRlbGYgLWQgJEAgfCBmZ3JlcCAtcSBURVhUUkVMOyB0aGVuIGV4aXQgMTsgZmkKKworbGliZWJsX2kzODZfc29fU09VUkNFUyA9CitsaWJlYmxfaTM4Ni5zbzogbGliZWJsX2kzODZfcGljLmEgbGliZWJsX2kzODYubWFwCisJJChDQykgLXNoYXJlZCAtbyAkQCAtV2wsLS13aG9sZS1hcmNoaXZlLCQ8LC0tbm8td2hvbGUtYXJjaGl2ZSBcCisJICAgICAgLVdsLC0tdmVyc2lvbi1zY3JpcHQsJChzcmNkaXIpL2xpYmVibF9pMzg2Lm1hcCBcCisJICAgICAgLVdsLC16LGRlZnMgJChsaWJlbGYpICQobGlibXVkZmxhcCkKKwkkKHRleHRyZWxfY2hlY2spCisKKworc2hfU1JDUyA9IHNoX2luaXQuYyBzaF9kZXN0ci5jIHNoX3N5bWJvbC5jCitsaWJlYmxfc2hfcGljX2FfU09VUkNFUyA9ICQoc2hfU1JDUykKK2FtX2xpYmVibF9zaF9waWNfYV9PQkpFQ1RTID0gJChzaF9TUkNTOi5jPS5vcykKKworbGliZWJsX3NoX3NvX1NPVVJDRVMgPQorbGliZWJsX3NoLnNvOiBsaWJlYmxfc2hfcGljLmEgbGliZWJsX3NoLm1hcAorCSQoQ0MpIC1zaGFyZWQgLW8gJEAgLVdsLC0td2hvbGUtYXJjaGl2ZSwkPCwtLW5vLXdob2xlLWFyY2hpdmUgXAorCSAgICAgIC1XbCwtLXZlcnNpb24tc2NyaXB0LCQoc3JjZGlyKS9saWJlYmxfc2gubWFwIFwKKwkgICAgICAtV2wsLXosZGVmcyAkKGxpYm11ZGZsYXApCisJJCh0ZXh0cmVsX2NoZWNrKQorCisKK3g4Nl82NF9TUkNTID0geDg2XzY0X2luaXQuYyB4ODZfNjRfZGVzdHIuYyB4ODZfNjRfc3ltYm9sLmMgeDg2XzY0X2NvcmVub3RlLmMKK2xpYmVibF94ODZfNjRfcGljX2FfU09VUkNFUyA9ICQoeDg2XzY0X1NSQ1MpCithbV9saWJlYmxfeDg2XzY0X3BpY19hX09CSkVDVFMgPSAkKHg4Nl82NF9TUkNTOi5jPS5vcykKKworbGliZWJsX3g4Nl82NF9zb19TT1VSQ0VTID0KK2xpYmVibF94ODZfNjQuc286IGxpYmVibF94ODZfNjRfcGljLmEgbGliZWJsX3g4Nl82NC5tYXAKKwkkKENDKSAtc2hhcmVkIC1vICRAIC1XbCwtLXdob2xlLWFyY2hpdmUsJDwsLS1uby13aG9sZS1hcmNoaXZlIFwKKwkgICAgICAtV2wsLS12ZXJzaW9uLXNjcmlwdCwkKHNyY2RpcikvbGliZWJsX3g4Nl82NC5tYXAgXAorCSAgICAgIC1XbCwteixkZWZzICQobGliZWxmKSAkKGxpYm11ZGZsYXApCisJJCh0ZXh0cmVsX2NoZWNrKQorCisKK2lhNjRfU1JDUyA9IGlhNjRfaW5pdC5jIGlhNjRfZGVzdHIuYyBpYTY0X3N5bWJvbC5jCitsaWJlYmxfaWE2NF9waWNfYV9TT1VSQ0VTID0gJChpYTY0X1NSQ1MpCithbV9saWJlYmxfaWE2NF9waWNfYV9PQkpFQ1RTID0gJChpYTY0X1NSQ1M6LmM9Lm9zKQorCitsaWJlYmxfaWE2NF9zb19TT1VSQ0VTID0KK2xpYmVibF9pYTY0LnNvOiBsaWJlYmxfaWE2NF9waWMuYSBsaWJlYmxfaWE2NC5tYXAKKwkkKENDKSAtc2hhcmVkIC1vICRAIC1XbCwtLXdob2xlLWFyY2hpdmUsJDwsLS1uby13aG9sZS1hcmNoaXZlIFwKKwkgICAgICAtV2wsLS12ZXJzaW9uLXNjcmlwdCwkKHNyY2RpcikvbGliZWJsX2lhNjQubWFwIFwKKwkgICAgICAtV2wsLXosZGVmcyAkKGxpYm11ZGZsYXApCisJJCh0ZXh0cmVsX2NoZWNrKQorCisKK2FscGhhX1NSQ1MgPSBhbHBoYV9pbml0LmMgYWxwaGFfZGVzdHIuYyBhbHBoYV9zeW1ib2wuYworbGliZWJsX2FscGhhX3BpY19hX1NPVVJDRVMgPSAkKGFscGhhX1NSQ1MpCithbV9saWJlYmxfYWxwaGFfcGljX2FfT0JKRUNUUyA9ICQoYWxwaGFfU1JDUzouYz0ub3MpCisKK2xpYmVibF9hbHBoYV9zb19TT1VSQ0VTID0KK2xpYmVibF9hbHBoYS5zbzogbGliZWJsX2FscGhhX3BpYy5hIGxpYmVibF9hbHBoYS5tYXAKKwkkKENDKSAtc2hhcmVkIC1vICRAIC1XbCwtLXdob2xlLWFyY2hpdmUsJDwsLS1uby13aG9sZS1hcmNoaXZlIFwKKwkgICAgICAtV2wsLS12ZXJzaW9uLXNjcmlwdCwkKHNyY2RpcikvbGliZWJsX2FscGhhLm1hcCBcCisJICAgICAgLVdsLC16LGRlZnMgJChsaWJtdWRmbGFwKQorCSQodGV4dHJlbF9jaGVjaykKKworCithcm1fU1JDUyA9IGFybV9pbml0LmMgYXJtX2Rlc3RyLmMgYXJtX3N5bWJvbC5jCitsaWJlYmxfYXJtX3BpY19hX1NPVVJDRVMgPSAkKGFybV9TUkNTKQorYW1fbGliZWJsX2FybV9waWNfYV9PQkpFQ1RTID0gJChhcm1fU1JDUzouYz0ub3MpCisKK2xpYmVibF9hcm1fc29fU09VUkNFUyA9CitsaWJlYmxfYXJtLnNvOiBsaWJlYmxfYXJtX3BpYy5hIGxpYmVibF9hcm0ubWFwCisJJChDQykgLXNoYXJlZCAtbyAkQCAtV2wsLS13aG9sZS1hcmNoaXZlLCQ8LC0tbm8td2hvbGUtYXJjaGl2ZSBcCisJICAgICAgLVdsLC0tdmVyc2lvbi1zY3JpcHQsJChzcmNkaXIpL2xpYmVibF9hcm0ubWFwIFwKKwkgICAgICAtV2wsLXosZGVmcyAkKGxpYm11ZGZsYXApCisJJCh0ZXh0cmVsX2NoZWNrKQorCisKK3NwYXJjX1NSQ1MgPSBzcGFyY19pbml0LmMgc3BhcmNfZGVzdHIuYyBzcGFyY19zeW1ib2wuYworbGliZWJsX3NwYXJjX3BpY19hX1NPVVJDRVMgPSAkKHNwYXJjX1NSQ1MpCithbV9saWJlYmxfc3BhcmNfcGljX2FfT0JKRUNUUyA9ICQoc3BhcmNfU1JDUzouYz0ub3MpCisKK2xpYmVibF9zcGFyY19zb19TT1VSQ0VTID0KK2xpYmVibF9zcGFyYy5zbzogbGliZWJsX3NwYXJjX3BpYy5hIGxpYmVibF9zcGFyYy5tYXAKKwkkKENDKSAtc2hhcmVkIC1vICRAIC1XbCwtLXdob2xlLWFyY2hpdmUsJDwsLS1uby13aG9sZS1hcmNoaXZlIFwKKwkgICAgICAtV2wsLS12ZXJzaW9uLXNjcmlwdCwkKHNyY2RpcikvbGliZWJsX3NwYXJjLm1hcCBcCisJICAgICAgLVdsLC16LGRlZnMgJChsaWJtdWRmbGFwKQorCSQodGV4dHJlbF9jaGVjaykKKworCitwcGNfU1JDUyA9IHBwY19pbml0LmMgcHBjX2Rlc3RyLmMgcHBjX3N5bWJvbC5jCitsaWJlYmxfcHBjX3BpY19hX1NPVVJDRVMgPSAkKHBwY19TUkNTKQorYW1fbGliZWJsX3BwY19waWNfYV9PQkpFQ1RTID0gJChwcGNfU1JDUzouYz0ub3MpCisKK2xpYmVibF9wcGNfc29fU09VUkNFUyA9CitsaWJlYmxfcHBjLnNvOiBsaWJlYmxfcHBjX3BpYy5hIGxpYmVibF9wcGMubWFwCisJJChDQykgLXNoYXJlZCAtbyAkQCAtV2wsLS13aG9sZS1hcmNoaXZlLCQ8LC0tbm8td2hvbGUtYXJjaGl2ZSBcCisJICAgICAgLVdsLC0tdmVyc2lvbi1zY3JpcHQsJChzcmNkaXIpL2xpYmVibF9wcGMubWFwIFwKKwkgICAgICAtV2wsLXosZGVmcyAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorCSQodGV4dHJlbF9jaGVjaykKKworCitwcGM2NF9TUkNTID0gcHBjNjRfaW5pdC5jIHBwYzY0X2Rlc3RyLmMgcHBjNjRfc3ltYm9sLmMKK2xpYmVibF9wcGM2NF9waWNfYV9TT1VSQ0VTID0gJChwcGM2NF9TUkNTKQorYW1fbGliZWJsX3BwYzY0X3BpY19hX09CSkVDVFMgPSAkKHBwYzY0X1NSQ1M6LmM9Lm9zKQorCitsaWJlYmxfcHBjNjRfc29fU09VUkNFUyA9CitsaWJlYmxfcHBjNjQuc286IGxpYmVibF9wcGM2NF9waWMuYSBsaWJlYmxfcHBjNjQubWFwCisJJChDQykgLXNoYXJlZCAtbyAkQCAtV2wsLS13aG9sZS1hcmNoaXZlLCQ8LC0tbm8td2hvbGUtYXJjaGl2ZSBcCisJICAgICAgLVdsLC0tdmVyc2lvbi1zY3JpcHQsJChzcmNkaXIpL2xpYmVibF9wcGM2NC5tYXAgXAorCSAgICAgIC1XbCwteixkZWZzICQobGliZWxmKSAkKGxpYm11ZGZsYXApCisJJCh0ZXh0cmVsX2NoZWNrKQorCisKKyUub3M6ICUuYyAlLm8KKwlpZiAkKENPTVBJTEUpIC1jIC1vICRAIC1mcGljIC1EUElDIC1EU0hBUkVEIC1NVCAkQCAtTUQgLU1QIFwKKwkgIC1NRiAiJChERVBESVIpLyQqLlRwbyIgYHRlc3QgLWYgJyQ8JyB8fCBlY2hvICckKHNyY2RpcikvJ2AkPDsgXAorCXRoZW4gY2F0ICIkKERFUERJUikvJCouVHBvIiA+PiAiJChERVBESVIpLyQqLlBvIjsgXAorCSAgICAgcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBcCisJZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgXAorCWZpCisKK2luc3RhbGw6IGluc3RhbGwtYW0gaW5zdGFsbC1lYmwtbW9kdWxlcworaW5zdGFsbC1lYmwtbW9kdWxlczoKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikvJChMSUJFQkxfU1VCRElSKQorCWZvciBtIGluICQobW9kdWxlcyk7IGRvIFwKKwkgICQoSU5TVEFMTF9QUk9HUkFNKSBsaWJlYmxfJCR7bX0uc28gJChERVNURElSKSQobGliZGlyKS8kKExJQkVCTF9TVUJESVIpL2xpYmVibF8kJHttfS0kKFBBQ0tBR0VfVkVSU0lPTikuc287IFwKKwkgIGxuIC1mcyBsaWJlYmxfJCR7bX0tJChQQUNLQUdFX1ZFUlNJT04pLnNvICQoREVTVERJUikkKGxpYmRpcikvJChMSUJFQkxfU1VCRElSKS9saWJlYmxfJCR7bX0uc287IFwKKwlkb25lCisKK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisJZm9yIG0gaW4gJChtb2R1bGVzKTsgZG8gXAorCSAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS8kKExJQkVCTF9TVUJESVIpL2xpYmVibF8kJHttfS0kKFBBQ0tBR0VfVkVSU0lPTikuc287IFwKKwkgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJChMSUJFQkxfU1VCRElSKS9saWJlYmxfJCR7bX0uc287IFwKKwlkb25lCisJcm1kaXIgLS1pZ25vcmUtZmFpbC1vbi1ub24tZW1wdHkgJChERVNURElSKSQobGliZGlyKS8kKExJQkVCTF9TVUJESVIpCisJcm1kaXIgLS1pZ25vcmUtZmFpbC1vbi1ub24tZW1wdHkgJChERVNURElSKSQoaW5jbHVkZWRpcikvZWxmdXRpbHMKKworbm9pbnN0X0hFQURFUlMgPSBsaWJlYmxQLmggJChub2luc3RfTElCUkFSSUVTOiVfcGljLmE9JS5oKQorRVhUUkFfRElTVCA9ICQobm9pbnN0X0xJQlJBUklFUzolX3BpYy5hPSUubWFwKSBcCisJICAgICAkKGZvcmVhY2ggbSwkKG1vZHVsZXMpLCQoJChtKV9TUkNTKSkKKworQ0xFQU5GSUxFUyA9ICQoYW1fbGliZWJsX3BpY19hX09CSkVDVFMpIFwKKwkgICAgICQoZm9yZWFjaCBtLCQobW9kdWxlcyksJChhbV9saWJlYmxfJChtKV9waWNfYV9PQkpFQ1RTKSkKZGlmZiAtLWdpdCBhL2xpYmVibC9hbHBoYV9kZXN0ci5jIGIvbGliZWJsL2FscGhhX2Rlc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjNWNmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9hbHBoYV9kZXN0ci5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIERlc3RydWN0b3IgZm9yIEFscGhhIHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVibF9hbHBoYS5oPgorCisKK3ZvaWQKK2FscGhhX2Rlc3RyIChiaCkKKyAgICAgRWJsICpiaCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7Cit7CisgIC8qIE5vdGhpbmcgdG8gZG8gc28gZmFyLiAgKi8KK30KZGlmZiAtLWdpdCBhL2xpYmVibC9hbHBoYV9pbml0LmMgYi9saWJlYmwvYWxwaGFfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWZmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvYWxwaGFfaW5pdC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIEluaXRpYWxpemF0aW9uIG9mIEFscGhhIHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVibF9hbHBoYS5oPgorCisKK2NvbnN0IGNoYXIgKgorYWxwaGFfaW5pdCAoZWxmLCBtYWNoaW5lLCBlaCwgZWhsZW4pCisgICAgIEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKyAgICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworICAgICBFYmwgKmVoOworICAgICBzaXplX3QgZWhsZW47Cit7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIEVsZl9CSCBvYmplY3QgaGFzIGEgc3VmZmljZW50IHNpemUuICAqLworICBpZiAoZWhsZW4gPCBzaXplb2YgKEVibCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogV2UgaGFuZGxlIGl0LiAgKi8KKyAgZWgtPm5hbWUgPSAiQWxwaGEiOworICBlaC0+cmVsb2NfdHlwZV9uYW1lID0gYWxwaGFfcmVsb2NfdHlwZV9uYW1lOworICBlaC0+cmVsb2NfdHlwZV9jaGVjayA9IGFscGhhX3JlbG9jX3R5cGVfY2hlY2s7CisgIGVoLT5jb3B5X3JlbG9jX3AgPSBhbHBoYV9jb3B5X3JlbG9jX3A7CisgIGVoLT5kZXN0ciA9IGFscGhhX2Rlc3RyOworCisgIHJldHVybiBNT0RWRVJTSU9OOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2FscGhhX3N5bWJvbC5jIGIvbGliZWJsL2FscGhhX3N5bWJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTdjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvYWxwaGFfc3ltYm9sLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qIEFscGhhIHNwZWNpZmljIHN5bWJvbGljIG5hbWUgaGFuZGxpbmcuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGxpYmVibF9hbHBoYS5oPgorCisKKy8qIFJldHVybiBvZiB0aGUgYmFja2VuZC4gICovCitjb25zdCBjaGFyICoKK2FscGhhX2JhY2tlbmRfbmFtZSAodm9pZCkKK3sKKyAgcmV0dXJuICJhbHBoYSI7Cit9CisKKworLyogUmVsb2NhdGlvbiBtYXBwaW5nIHRhYmxlLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpyZWxvY19tYXBfdGFibGVbXSA9CisgIHsKKyAgICBbUl9BTFBIQV9OT05FXSA9ICJSX0FMUEhBX05PTkUiLAorICAgIFtSX0FMUEhBX1JFRkxPTkddID0gIlJfQUxQSEFfUkVGTE9ORyIsCisgICAgW1JfQUxQSEFfUkVGUVVBRF0gPSAiUl9BTFBIQV9SRUZRVUFEIiwKKyAgICBbUl9BTFBIQV9HUFJFTDMyXSA9ICJSX0FMUEhBX0dQUkVMMzIiLAorICAgIFtSX0FMUEhBX0xJVEVSQUxdID0gIlJfQUxQSEFfTElURVJBTCIsCisgICAgW1JfQUxQSEFfTElUVVNFXSA9ICJSX0FMUEhBX0xJVFVTRSIsCisgICAgW1JfQUxQSEFfR1BESVNQXSA9ICJSX0FMUEhBX0dQRElTUCIsCisgICAgW1JfQUxQSEFfQlJBRERSXSA9ICJSX0FMUEhBX0JSQUREUiIsCisgICAgW1JfQUxQSEFfSElOVF0gPSAiUl9BTFBIQV9ISU5UIiwKKyAgICBbUl9BTFBIQV9TUkVMMTZdID0gIlJfQUxQSEFfU1JFTDE2IiwKKyAgICBbUl9BTFBIQV9TUkVMMzJdID0gIlJfQUxQSEFfU1JFTDMyIiwKKyAgICBbUl9BTFBIQV9TUkVMNjRdID0gIlJfQUxQSEFfU1JFTDY0IiwKKyAgICBbUl9BTFBIQV9HUFJFTEhJR0hdID0gIlJfQUxQSEFfR1BSRUxISUdIIiwKKyAgICBbUl9BTFBIQV9HUFJFTExPV10gPSAiUl9BTFBIQV9HUFJFTExPVyIsCisgICAgW1JfQUxQSEFfR1BSRUwxNl0gPSAiUl9BTFBIQV9HUFJFTDE2IiwKKyAgICBbUl9BTFBIQV9DT1BZXSA9ICJSX0FMUEhBX0NPUFkiLAorICAgIFtSX0FMUEhBX0dMT0JfREFUXSA9ICJSX0FMUEhBX0dMT0JfREFUIiwKKyAgICBbUl9BTFBIQV9KTVBfU0xPVF0gPSAiUl9BTFBIQV9KTVBfU0xPVCIsCisgICAgW1JfQUxQSEFfUkVMQVRJVkVdID0gIlJfQUxQSEFfUkVMQVRJVkUiLAorICAgIFtSX0FMUEhBX1RMU19HRF9ISV0gPSAiUl9BTFBIQV9UTFNfR0RfSEkiLAorICAgIFtSX0FMUEhBX1RMU0dEXSA9ICJSX0FMUEhBX1RMU0dEIiwKKyAgICBbUl9BTFBIQV9UTFNfTERNXSA9ICJSX0FMUEhBX1RMU19MRE0iLAorICAgIFtSX0FMUEhBX0RUUE1PRDY0XSA9ICJSX0FMUEhBX0RUUE1PRDY0IiwKKyAgICBbUl9BTFBIQV9HT1REVFBSRUxdID0gIlJfQUxQSEFfR09URFRQUkVMIiwKKyAgICBbUl9BTFBIQV9EVFBSRUw2NF0gPSAiUl9BTFBIQV9EVFBSRUw2NCIsCisgICAgW1JfQUxQSEFfRFRQUkVMSEldID0gIlJfQUxQSEFfRFRQUkVMSEkiLAorICAgIFtSX0FMUEhBX0RUUFJFTExPXSA9ICJSX0FMUEhBX0RUUFJFTExPIiwKKyAgICBbUl9BTFBIQV9EVFBSRUwxNl0gPSAiUl9BTFBIQV9EVFBSRUwxNiIsCisgICAgW1JfQUxQSEFfR09UVFBSRUxdID0gIlJfQUxQSEFfR09UVFBSRUwiLAorICAgIFtSX0FMUEhBX1RQUkVMNjRdID0gIlJfQUxQSEFfVFBSRUw2NCIsCisgICAgW1JfQUxQSEFfVFBSRUxISV0gPSAiUl9BTFBIQV9UUFJFTEhJIiwKKyAgICBbUl9BTFBIQV9UUFJFTExPXSA9ICJSX0FMUEhBX1RQUkVMTE8iLAorICAgIFtSX0FMUEhBX1RQUkVMMTZdID0gIlJfQUxQSEFfVFBSRUwxNiIKKyAgfTsKKworCisvKiBEZXRlcm1pbmUgcmVsb2NhdGlvbiB0eXBlIHN0cmluZyBmb3IgQWxwaGEuICAqLworY29uc3QgY2hhciAqCithbHBoYV9yZWxvY190eXBlX25hbWUgKGludCB0eXBlLCBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICAgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGlmICh0eXBlIDwgMAorICAgICAgfHwgKChzaXplX3QpIHR5cGUKKwkgID49IHNpemVvZiAocmVsb2NfbWFwX3RhYmxlKSAvIHNpemVvZiAocmVsb2NfbWFwX3RhYmxlWzBdKSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlbG9jX21hcF90YWJsZVt0eXBlXTsKK30KKworCisvKiBDaGVjayBmb3IgY29ycmVjdCByZWxvY2F0aW9uIHR5cGUuICAqLworYm9vbAorYWxwaGFfcmVsb2NfdHlwZV9jaGVjayAoaW50IHR5cGUpCit7CisgIHJldHVybiAodHlwZSA+PSBSX0FMUEhBX05PTkUKKwkgICYmICgoc2l6ZV90KSB0eXBlCisJICAgICAgPCBzaXplb2YgKHJlbG9jX21hcF90YWJsZSkgLyBzaXplb2YgKHJlbG9jX21hcF90YWJsZVswXSkpCisJICAmJiByZWxvY19tYXBfdGFibGVbdHlwZV0gIT0gTlVMTCkgPyB0cnVlIDogZmFsc2U7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gcmVsb2NhdGlvbiBpcyBhIGNvcHkgcmVsb2NhdGlvbi4gICovCitib29sCithbHBoYV9jb3B5X3JlbG9jX3AgKGludCByZWxvYykKK3sKKyAgcmV0dXJuIHJlbG9jID09IFJfQUxQSEFfQ09QWTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9hcm1fZGVzdHIuYyBiL2xpYmVibC9hcm1fZGVzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc1NzIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2FybV9kZXN0ci5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIERlc3RydWN0b3IgZm9yIEFybSBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxfYXJtLmg+CisKKwordm9pZAorYXJtX2Rlc3RyIChiaCkKKyAgICAgRWJsICpiaCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7Cit7CisgIC8qIE5vdGhpbmcgdG8gZG8gc28gZmFyLiAgKi8KK30KZGlmZiAtLWdpdCBhL2xpYmVibC9hcm1faW5pdC5jIGIvbGliZWJsL2FybV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhNjVmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9hcm1faW5pdC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIEluaXRpYWxpemF0aW9uIG9mIEFybSBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxfYXJtLmg+CisKKworY29uc3QgY2hhciAqCithcm1faW5pdCAoZWxmLCBtYWNoaW5lLCBlaCwgZWhsZW4pCisgICAgIEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKyAgICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworICAgICBFYmwgKmVoOworICAgICBzaXplX3QgZWhsZW47Cit7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIEVsZl9CSCBvYmplY3QgaGFzIGEgc3VmZmljZW50IHNpemUuICAqLworICBpZiAoZWhsZW4gPCBzaXplb2YgKEVibCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogV2UgaGFuZGxlIGl0LiAgKi8KKyAgZWgtPm5hbWUgPSAiQXJtIjsKKyAgZWgtPnJlbG9jX3R5cGVfbmFtZSA9IGFybV9yZWxvY190eXBlX25hbWU7CisgIGVoLT5yZWxvY190eXBlX2NoZWNrID0gYXJtX3JlbG9jX3R5cGVfY2hlY2s7CisgIGVoLT5jb3B5X3JlbG9jX3AgPSBhcm1fY29weV9yZWxvY19wOworICBlaC0+ZGVzdHIgPSBhcm1fZGVzdHI7CisKKyAgcmV0dXJuIE1PRFZFUlNJT047Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvYXJtX3N5bWJvbC5jIGIvbGliZWJsL2FybV9zeW1ib2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGRlOGJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2FybV9zeW1ib2wuYwpAQCAtMCwwICsxLDEyMSBAQAorLyogQXJtIHNwZWNpZmljIHN5bWJvbGljIG5hbWUgaGFuZGxpbmcuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGxpYmVibF9hcm0uaD4KKworCisvKiBSZXR1cm4gb2YgdGhlIGJhY2tlbmQuICAqLworY29uc3QgY2hhciAqCithcm1fYmFja2VuZF9uYW1lICh2b2lkKQoreworICByZXR1cm4gImFybSI7Cit9CisKKworLyogUmVsb2NhdGlvbiBtYXBwaW5nIHRhYmxlLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpyZWxvY19tYXBfdGFibGVbXSA9CisgIHsKKyAgICBbUl9BUk1fTk9ORV0gPSAiUl9BUk1fTk9ORSIsCisgICAgW1JfQVJNX1BDMjRdID0gIlJfQVJNX1BDMjQiLAorICAgIFtSX0FSTV9BQlMzMl0gPSAiUl9BUk1fQUJTMzIiLAorICAgIFtSX0FSTV9SRUwzMl0gPSAiUl9BUk1fUkVMMzIiLAorICAgIFtSX0FSTV9QQzEzXSA9ICJSX0FSTV9QQzEzIiwKKyAgICBbUl9BUk1fQUJTMTZdID0gIlJfQVJNX0FCUzE2IiwKKyAgICBbUl9BUk1fQUJTMTJdID0gIlJfQVJNX0FCUzEyIiwKKyAgICBbUl9BUk1fVEhNX0FCUzVdID0gIlJfQVJNX1RITV9BQlM1IiwKKyAgICBbUl9BUk1fQUJTOF0gPSAiUl9BUk1fQUJTOCIsCisgICAgW1JfQVJNX1NCUkVMMzJdID0gIlJfQVJNX1NCUkVMMzIiLAorICAgIFtSX0FSTV9USE1fUEMyMl0gPSAiUl9BUk1fVEhNX1BDMjIiLAorICAgIFtSX0FSTV9USE1fUEM4XSA9ICJSX0FSTV9USE1fUEM4IiwKKyAgICBbUl9BUk1fQU1QX1ZDQUxMOV0gPSAiUl9BUk1fQU1QX1ZDQUxMOSIsCisgICAgW1JfQVJNX1NXSTI0XSA9ICJSX0FSTV9TV0kyNCIsCisgICAgW1JfQVJNX1RITV9TV0k4XSA9ICJSX0FSTV9USE1fU1dJOCIsCisgICAgW1JfQVJNX1hQQzI1XSA9ICJSX0FSTV9YUEMyNSIsCisgICAgW1JfQVJNX1RITV9YUEMyMl0gPSAiUl9BUk1fVEhNX1hQQzIyIiwKKyAgICBbUl9BUk1fQ09QWV0gPSAiUl9BUk1fQ09QWSIsCisgICAgW1JfQVJNX0dMT0JfREFUXSA9ICJSX0FSTV9HTE9CX0RBVCIsCisgICAgW1JfQVJNX0pVTVBfU0xPVF0gPSAiUl9BUk1fSlVNUF9TTE9UIiwKKyAgICBbUl9BUk1fUkVMQVRJVkVdID0gIlJfQVJNX1JFTEFUSVZFIiwKKyAgICBbUl9BUk1fR09UT0ZGXSA9ICJSX0FSTV9HT1RPRkYiLAorICAgIFtSX0FSTV9HT1RQQ10gPSAiUl9BUk1fR09UUEMiLAorICAgIFtSX0FSTV9HT1QzMl0gPSAiUl9BUk1fR09UMzIiLAorICAgIFtSX0FSTV9QTFQzMl0gPSAiUl9BUk1fUExUMzIiLAorICAgIFtSX0FSTV9BTFVfUENSRUxfN18wXSA9ICJSX0FSTV9BTFVfUENSRUxfN18wIiwKKyAgICBbUl9BUk1fQUxVX1BDUkVMXzE1XzhdID0gIlJfQVJNX0FMVV9QQ1JFTF8xNV84IiwKKyAgICBbUl9BUk1fQUxVX1BDUkVMXzIzXzE1XSA9ICJSX0FSTV9BTFVfUENSRUxfMjNfMTUiLAorICAgIFtSX0FSTV9MRFJfU0JSRUxfMTFfMF0gPSAiUl9BUk1fTERSX1NCUkVMXzExXzAiLAorICAgIFtSX0FSTV9BTFVfU0JSRUxfMTlfMTJdID0gIlJfQVJNX0FMVV9TQlJFTF8xOV8xMiIsCisgICAgW1JfQVJNX0FMVV9TQlJFTF8yN18yMF0gPSAiUl9BUk1fQUxVX1NCUkVMXzI3XzIwIgorICB9OworCitzdGF0aWMgY29uc3QgY2hhciAqcmVsb2NfbWFwX3RhYmxlMltdID0KKyAgeworICAgIFtSX0FSTV9HTlVfVlRFTlRSWV0gPSAiUl9BUk1fR05VX1ZURU5UUlkiLAorICAgIFtSX0FSTV9HTlVfVlRJTkhFUklUXSA9ICJSX0FSTV9HTlVfVlRJTkhFUklUIiwKKyAgICBbUl9BUk1fVEhNX1BDMTFdID0gIlJfQVJNX1RITV9QQzExIiwKKyAgICBbUl9BUk1fVEhNX1BDOV0gPSAiUl9BUk1fVEhNX1BDOSIKKyAgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJlbG9jX21hcF90YWJsZTNbXSA9CisgIHsKKyAgICBbUl9BUk1fUlhQQzI1XSA9ICJSX0FSTV9SWFBDMjUiLAorICAgIFtSX0FSTV9SU0JSRUwzMl0gPSAiUl9BUk1fUlNCUkVMMzIiLAorICAgIFtSX0FSTV9USE1fUlBDMjJdID0gIlJfQVJNX1RITV9SUEMyMiIsCisgICAgW1JfQVJNX1JSRUwzMl0gPSAiUl9BUk1fUlJFTDMyIiwKKyAgICBbUl9BUk1fUkFCUzIyXSA9ICJSX0FSTV9SQUJTMjIiLAorICAgIFtSX0FSTV9SUEMyNF0gPSAiUl9BUk1fUlBDMjQiLAorICAgIFtSX0FSTV9SQkFTRV0gPSAiUl9BUk1fUkJBU0UiCisgIH07CisKKworLyogRGV0ZXJtaW5lIHJlbG9jYXRpb24gdHlwZSBzdHJpbmcgZm9yIEFscGhhLiAgKi8KK2NvbnN0IGNoYXIgKgorYXJtX3JlbG9jX3R5cGVfbmFtZSAoaW50IHR5cGUsIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGlmICh0eXBlID49IFJfQVJNX05PTkUgJiYgdHlwZSA8PSBSX0FSTV9BTFVfU0JSRUxfMjdfMjApCisgICAgcmV0dXJuIHJlbG9jX21hcF90YWJsZVt0eXBlXTsKKworICBpZiAodHlwZSA+PSBSX0FSTV9HTlVfVlRFTlRSWSAmJiB0eXBlIDw9IFJfQVJNX1RITV9QQzkpCisgICAgcmV0dXJuIHJlbG9jX21hcF90YWJsZTJbdHlwZSAtIFJfQVJNX0dOVV9WVEVOVFJZXTsKKworICBpZiAodHlwZSA+PSBSX0FSTV9SWFBDMjUgJiYgdHlwZSA8PSBSX0FSTV9SQkFTRSkKKyAgICByZXR1cm4gcmVsb2NfbWFwX3RhYmxlM1t0eXBlIC0gUl9BUk1fUlhQQzI1XTsKKworICByZXR1cm4gTlVMTDsKK30KKworCisvKiBDaGVjayBmb3IgY29ycmVjdCByZWxvY2F0aW9uIHR5cGUuICAqLworYm9vbAorYXJtX3JlbG9jX3R5cGVfY2hlY2sgKGludCB0eXBlKQoreworICByZXR1cm4gKCh0eXBlID49IFJfQVJNX05PTkUgJiYgdHlwZSA8PSBSX0FSTV9BTFVfU0JSRUxfMjdfMjApCisJICB8fCAodHlwZSA+PSBSX0FSTV9HTlVfVlRFTlRSWSAmJiB0eXBlIDw9IFJfQVJNX1RITV9QQzkpCisJICB8fCAodHlwZSA+PSBSX0FSTV9SWFBDMjUgJiYgdHlwZSA8PSBSX0FSTV9SQkFTRSkpID8gdHJ1ZSA6IGZhbHNlOworfQorCisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSBjb3B5IHJlbG9jYXRpb24uICAqLworYm9vbAorYXJtX2NvcHlfcmVsb2NfcCAoaW50IHJlbG9jKQoreworICByZXR1cm4gcmVsb2MgPT0gUl9BUk1fQ09QWTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxiYWNrZW5kbmFtZS5jIGIvbGliZWJsL2VibGJhY2tlbmRuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4MzBlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxiYWNrZW5kbmFtZS5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIFJldHVybiBiYWNrZW5kIG5hbWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCitjb25zdCBjaGFyICoKK2VibF9iYWNrZW5kX25hbWUgKGVibCkKKyAgICAgRWJsICplYmw7Cit7CisgIHJldHVybiBlYmwgIT0gTlVMTCA/IGVibC0+ZW11bGF0aW9uIDogZ2V0dGV4dCAoIk5vIGJhY2tlbmQiKTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxjbG9zZWJhY2tlbmQuYyBiL2xpYmVibC9lYmxjbG9zZWJhY2tlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTU3OTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibGNsb3NlYmFja2VuZC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIEZyZWUgRUxGIGJhY2tlbmQgaGFuZGxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK3ZvaWQKK2VibF9jbG9zZWJhY2tlbmQgKEVibCAqZWJsKQoreworICBpZiAoZWJsICE9IE5VTEwpCisgICAgeworICAgICAgLyogUnVuIHRoZSBkZXN0cnVjdG9yLiAgKi8KKyAgICAgIGVibC0+ZGVzdHIgKGVibCk7CisKKyAgICAgIC8qIENsb3NlIHRoZSBkeW5hbWljYWxseSBsb2FkZWQgb2JqZWN0LiAgKi8KKyAgICAgIGlmIChlYmwtPmRsaGFuZGxlICE9IE5VTEwpCisJKHZvaWQpIGRsY2xvc2UgKGVibC0+ZGxoYW5kbGUpOworCisgICAgICAvKiBGcmVlIHRoZSByZXNvdXJjZXMuICAqLworICAgICAgZnJlZSAoZWJsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsY29weXJlbG9jcC5jIGIvbGliZWJsL2VibGNvcHlyZWxvY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDMzNjJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibGNvcHlyZWxvY3AuYwpAQCAtMCwwICsxLDI4IEBACisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSBjb3B5IHJlbG9jYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworYm9vbAorZWJsX2NvcHlfcmVsb2NfcCAoZWJsLCByZWxvYykKKyAgICAgRWJsICplYmw7CisgICAgIGludCByZWxvYzsKK3sKKyAgcmV0dXJuIGVibC0+Y29weV9yZWxvY19wIChyZWxvYyk7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsY29yZW5vdGUuYyBiL2xpYmVibC9lYmxjb3Jlbm90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNWQzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvZWJsY29yZW5vdGUuYwpAQCAtMCwwICsxLDE5MSBAQAorLyogUHJpbnQgY29udGVudHMgb2YgY29yZSBub3RlLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK3ZvaWQKK2VibF9jb3JlX25vdGUgKGVibCwgbmFtZSwgdHlwZSwgZGVzY3N6LCBkZXNjKQorICAgICBFYmwgKmVibDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgdWludDMyX3QgZGVzY3N6OworICAgICBjb25zdCBjaGFyICpkZXNjOworeworICBHRWxmX0VoZHIgZWhkcl9tZW07CisgIEdFbGZfRWhkciAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWJsLT5lbGYsICZlaGRyX21lbSk7CisgIGFzc2VydCAoZWhkciAhPSBOVUxMKTsKKyAgaW50IGNsYXNzID0gZWhkci0+ZV9pZGVudFtFSV9DTEFTU107CisgIGludCBlbmRpYW4gPSBlaGRyLT5lX2lkZW50W0VJX0RBVEFdOworCisgIGlmICghIGVibC0+Y29yZV9ub3RlIChuYW1lLCB0eXBlLCBkZXNjc3osIGRlc2MpKQorICAgIC8qIFRoZSBtYWNoaW5lIHNwZWNpZmljIGZ1bmN0aW9uIGRpZCBub3Qga25vdyB0aGlzIHR5cGUuICAqLworICAgIHN3aXRjaCAodHlwZSkKKyAgICAgIHsKKyAgICAgIGNhc2UgTlRfUExBVEZPUk06CisJcHJpbnRmIChnZXR0ZXh0ICgiICAgIFBsYXRmb3JtOiAlLipzXG4iKSwgKGludCkgZGVzY3N6LCBkZXNjKTsKKwlicmVhazsKKworICAgICAgY2FzZSBOVF9BVVhWOgorCTsKKwlzaXplX3QgZWxzaXplID0gKGNsYXNzID09IEVMRkNMQVNTMzIKKwkJCSA/IHNpemVvZiAoRWxmMzJfYXV4dl90KSA6IHNpemVvZiAoRWxmNjRfYXV4dl90KSk7CisKKwlmb3IgKHNpemVfdCBjbnQgPSAwOyAoY250ICsgMSkgKiBlbHNpemUgPD0gZGVzY3N6OyArK2NudCkKKwkgIHsKKwkgICAgdWludG1heF90IGF0eXBlOworCSAgICB1aW50bWF4X3QgdmFsOworCisJICAgIGlmIChjbGFzcyA9PSBFTEZDTEFTUzMyKQorCSAgICAgIHsKKwkJRWxmMzJfYXV4dl90ICphdXh2ID0gJigoRWxmMzJfYXV4dl90ICopIGRlc2MpW2NudF07CisKKwkJaWYgKChlbmRpYW4gPT0gRUxGREFUQTJMU0IgJiYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTikKKwkJICAgIHx8IChlbmRpYW4gPT0gRUxGREFUQTJNU0IgJiYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTikpCisJCSAgeworCQkgICAgYXR5cGUgPSBhdXh2LT5hX3R5cGU7CisJCSAgICB2YWwgPSBhdXh2LT5hX3VuLmFfdmFsOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGF0eXBlID0gYnN3YXBfMzIgKGF1eHYtPmFfdHlwZSk7CisJCSAgICB2YWwgPSBic3dhcF8zMiAoYXV4di0+YV91bi5hX3ZhbCk7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJRWxmNjRfYXV4dl90ICphdXh2ID0gJigoRWxmNjRfYXV4dl90ICopIGRlc2MpW2NudF07CisKKwkJaWYgKChlbmRpYW4gPT0gRUxGREFUQTJMU0IgJiYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTikKKwkJICAgIHx8IChlbmRpYW4gPT0gRUxGREFUQTJNU0IgJiYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTikpCisJCSAgeworCQkgICAgYXR5cGUgPSBhdXh2LT5hX3R5cGU7CisJCSAgICB2YWwgPSBhdXh2LT5hX3VuLmFfdmFsOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGF0eXBlID0gYnN3YXBfNjQgKGF1eHYtPmFfdHlwZSk7CisJCSAgICB2YWwgPSBic3dhcF82NCAoYXV4di0+YV91bi5hX3ZhbCk7CisJCSAgfQorCSAgICAgIH0KKworCSAgICAvKiBYWFggRG8gd2UgbmVlZCB0aGUgYXV4aWxpYXJ5IHZlY3RvciBpbmZvIGFueXdoZXJlCisJICAgICAgIGVsc2U/ICBJZiB5ZXMsIG1vdmUgY29kZSBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24uICAqLworCSAgICBjb25zdCBjaGFyICphdDsKKworCSAgICBzd2l0Y2ggKGF0eXBlKQorCSAgICAgIHsKKyNkZWZpbmUgTkVXX0FUKG5hbWUpIGNhc2UgQVRfIyNuYW1lOiBhdCA9ICNuYW1lOyBicmVhaworCQlORVdfQVQgKE5VTEwpOworCQlORVdfQVQgKElHTk9SRSk7CisJCU5FV19BVCAoRVhFQ0ZEKTsKKwkJTkVXX0FUIChQSERSKTsKKwkJTkVXX0FUIChQSEVOVCk7CisJCU5FV19BVCAoUEhOVU0pOworCQlORVdfQVQgKFBBR0VTWik7CisJCU5FV19BVCAoQkFTRSk7CisJCU5FV19BVCAoRkxBR1MpOworCQlORVdfQVQgKEVOVFJZKTsKKwkJTkVXX0FUIChOT1RFTEYpOworCQlORVdfQVQgKFVJRCk7CisJCU5FV19BVCAoRVVJRCk7CisJCU5FV19BVCAoR0lEKTsKKwkJTkVXX0FUIChFR0lEKTsKKwkJTkVXX0FUIChDTEtUQ0spOworCQlORVdfQVQgKFBMQVRGT1JNKTsKKwkJTkVXX0FUIChIV0NBUCk7CisJCU5FV19BVCAoRlBVQ1cpOworCQlORVdfQVQgKERDQUNIRUJTSVpFKTsKKwkJTkVXX0FUIChJQ0FDSEVCU0laRSk7CisJCU5FV19BVCAoVUNBQ0hFQlNJWkUpOworCQlORVdfQVQgKElHTk9SRVBQQyk7CisJCU5FV19BVCAoU0VDVVJFKTsKKwkJTkVXX0FUIChTWVNJTkZPKTsKKwkJTkVXX0FUIChTWVNJTkZPX0VIRFIpOworCQlORVdfQVQgKEwxSV9DQUNIRVNIQVBFKTsKKwkJTkVXX0FUIChMMURfQ0FDSEVTSEFQRSk7CisJCU5FV19BVCAoTDJfQ0FDSEVTSEFQRSk7CisJCU5FV19BVCAoTDNfQ0FDSEVTSEFQRSk7CisKKwkgICAgICBkZWZhdWx0OjsKKwkJc3RhdGljIGNoYXIgYnVmWzMwXTsKKwkJc3ByaW50ZiAoYnVmLCAiJWp1IChBVF8/IiI/IiI/KSIsIGF0eXBlKTsKKwkJYXQgPSBidWY7CisJCWJyZWFrOworCSAgICAgIH0KKworCSAgICBzd2l0Y2ggKGF0eXBlKQorCSAgICAgIHsKKwkgICAgICBjYXNlIEFUX05VTEw6CisJICAgICAgY2FzZSBBVF9JR05PUkU6CisJICAgICAgY2FzZSBBVF9JR05PUkVQUEM6CisJICAgICAgY2FzZSBBVF9OT1RFTEY6CisJICAgICAgZGVmYXVsdDoKKwkJcHJpbnRmICgiICAgICVzXG4iLCBhdCk7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBBVF9FWEVDRkQ6CisJICAgICAgY2FzZSBBVF9QSEVOVDoKKwkgICAgICBjYXNlIEFUX1BITlVNOgorCSAgICAgIGNhc2UgQVRfUEFHRVNaOgorCSAgICAgIGNhc2UgQVRfVUlEOgorCSAgICAgIGNhc2UgQVRfRVVJRDoKKwkgICAgICBjYXNlIEFUX0dJRDoKKwkgICAgICBjYXNlIEFUX0VHSUQ6CisJICAgICAgY2FzZSBBVF9DTEtUQ0s6CisJICAgICAgY2FzZSBBVF9GUFVDVzoKKwkgICAgICBjYXNlIEFUX0RDQUNIRUJTSVpFOgorCSAgICAgIGNhc2UgQVRfSUNBQ0hFQlNJWkU6CisJICAgICAgY2FzZSBBVF9VQ0FDSEVCU0laRToKKwkgICAgICBjYXNlIEFUX1NFQ1VSRToKKwkgICAgICBjYXNlIEFUX0wxSV9DQUNIRVNIQVBFOgorCSAgICAgIGNhc2UgQVRfTDFEX0NBQ0hFU0hBUEU6CisJICAgICAgY2FzZSBBVF9MMl9DQUNIRVNIQVBFOgorCSAgICAgIGNhc2UgQVRfTDNfQ0FDSEVTSEFQRToKKwkJcHJpbnRmICgiICAgICVzOiAlamRcbiIsIGF0LCB2YWwpOworCQlicmVhazsKKworCSAgICAgIGNhc2UgQVRfUEhEUjoKKwkgICAgICBjYXNlIEFUX0JBU0U6CisJICAgICAgY2FzZSBBVF9GTEFHUzoJLyogWFhYIFByaW50IGZsYWdzPyAgKi8KKwkgICAgICBjYXNlIEFUX0VOVFJZOgorCSAgICAgIGNhc2UgQVRfUExBVEZPUk06CS8qIFhYWCBHZXQgc3RyaW5nPyAgKi8KKwkgICAgICBjYXNlIEFUX0hXQ0FQOgkvKiBYWFggUHJpbnQgZmxhZ3M/ICAqLworCSAgICAgIGNhc2UgQVRfU1lTSU5GTzoKKwkgICAgICBjYXNlIEFUX1NZU0lORk9fRUhEUjoKKwkJcHJpbnRmICgiICAgICVzOiAlI2p4XG4iLCBhdCwgdmFsKTsKKwkJYnJlYWs7CisJICAgICAgfQorCisJICAgIGlmIChhdHlwZSA9PSBBVF9OVUxMKQorCSAgICAgIC8qIFJlYWNoZWQgdGhlIGVuZC4gICovCisJICAgICAgYnJlYWs7CisJICB9CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJLyogVW5rbm93biB0eXBlLiAgKi8KKwlicmVhazsKKyAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxjb3Jlbm90ZXR5cGVuYW1lLmMgYi9saWJlYmwvZWJsY29yZW5vdGV0eXBlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTRkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvZWJsY29yZW5vdGV0eXBlbmFtZS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIFJldHVybiBub3RlIHR5cGUgbmFtZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworY29uc3QgY2hhciAqCitlYmxfY29yZV9ub3RlX3R5cGVfbmFtZSAoZWJsLCB0eXBlLCBidWYsIGxlbikKKyAgICAgRWJsICplYmw7CisgICAgIHVpbnQzMl90IHR5cGU7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgc2l6ZV90IGxlbjsKK3sKKyAgY29uc3QgY2hhciAqcmVzID0gZWJsLT5jb3JlX25vdGVfdHlwZV9uYW1lICh0eXBlLCBidWYsIGxlbik7CisKKyAgaWYgKHJlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyICprbm93bnR5cGVzW10gPQorCXsKKyNkZWZpbmUgS05PV05TVFlQRShuYW1lKSBbTlRfIyNuYW1lXSA9ICNuYW1lCisJICBLTk9XTlNUWVBFIChQUlNUQVRVUyksCisJICBLTk9XTlNUWVBFIChGUFJFR1NFVCksCisJICBLTk9XTlNUWVBFIChQUlBTSU5GTyksCisJICBLTk9XTlNUWVBFIChUQVNLU1RSVUNUKSwKKwkgIEtOT1dOU1RZUEUgKFBMQVRGT1JNKSwKKwkgIEtOT1dOU1RZUEUgKEFVWFYpLAorCSAgS05PV05TVFlQRSAoR1dJTkRPV1MpLAorCSAgS05PV05TVFlQRSAoQVNSUyksCisJICBLTk9XTlNUWVBFIChQU1RBVFVTKSwKKwkgIEtOT1dOU1RZUEUgKFBTSU5GTyksCisJICBLTk9XTlNUWVBFIChQUkNSRUQpLAorCSAgS05PV05TVFlQRSAoVVRTTkFNRSksCisJICBLTk9XTlNUWVBFIChMV1BTVEFUVVMpLAorCSAgS05PV05TVFlQRSAoTFdQU0lORk8pLAorCSAgS05PV05TVFlQRSAoUFJGUFhSRUcpCisJfTsKKworICAgICAgLyogSGFuZGxlIHN0YW5kYXJkIG5hbWVzLiAgKi8KKyAgICAgIGlmICh0eXBlIDwgc2l6ZW9mIChrbm93bnR5cGVzKSAvIHNpemVvZiAoa25vd250eXBlc1swXSkKKwkgICYmIGtub3dudHlwZXNbdHlwZV0gIT0gTlVMTCkKKwlyZXMgPSBrbm93bnR5cGVzW3R5cGVdOworICAgICAgZWxzZQorCXsKKwkgIHNucHJpbnRmIChidWYsIGxlbiwgIiVzOiAlIiBQUkl1MzIsIGdldHRleHQgKCI8dW5rbm93bj4iKSwgdHlwZSk7CisKKwkgIHJlcyA9IGJ1ZjsKKwl9CisgICAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsZGVidWdzY25wLmMgYi9saWJlYmwvZWJsZGVidWdzY25wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzMTBiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxkZWJ1Z3NjbnAuYwpAQCAtMCwwICsxLDI5IEBACisvKiBDaGVjayBzZWN0aW9uIG5hbWUgZm9yIGJlaW5nIHRoYXQgb2YgYSBkZWJ1ZyBpbmZvcm1hdGlubyBzZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK2Jvb2wKK2VibF9kZWJ1Z3Njbl9wIChlYmwsIG5hbWUpCisgICAgIEVibCAqZWJsOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICByZXR1cm4gZWJsLT5kZWJ1Z3Njbl9wIChuYW1lKTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxkeW5hbWljdGFnY2hlY2suYyBiL2xpYmVibC9lYmxkeW5hbWljdGFnY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGI0MTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibGR5bmFtaWN0YWdjaGVjay5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIENoZWNrIGR5bmFtaWMgdGFnLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworYm9vbAorZWJsX2R5bmFtaWNfdGFnX2NoZWNrIChlYmwsIHRhZykKKyAgICAgRWJsICplYmw7CisgICAgIGludDY0X3QgdGFnOworeworICBib29sIHJlcyA9IGVibCAhPSBOVUxMID8gZWJsLT5keW5hbWljX3RhZ19jaGVjayAodGFnKSA6IGZhbHNlOworCisgIGlmICghcmVzCisgICAgICAmJiAoKHRhZyA+PSAwICYmIHRhZyA8IERUX05VTSkKKwkgIHx8ICh0YWcgPj0gRFRfR05VX1BSRUxJTktFRCAmJiB0YWcgPD0gRFRfU1lNSU5FTlQpCisJICB8fCAodGFnID49IERUX0dOVV9DT05GTElDVCAmJiB0YWcgPD0gRFRfU1lNSU5GTykKKwkgIHx8IHRhZyA9PSBEVF9WRVJTWU0KKwkgIHx8ICh0YWcgPj0gRFRfUkVMQUNPVU5UICYmIHRhZyA8PSBEVF9WRVJORUVETlVNKQorCSAgfHwgdGFnID09IERUX0FVWElMSUFSWQorCSAgfHwgdGFnID09IERUX0ZJTFRFUikpCisgICAgcmVzID0gdHJ1ZTsKKworICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2VibGR5bmFtaWN0YWduYW1lLmMgYi9saWJlYmwvZWJsZHluYW1pY3RhZ25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRjMWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibGR5bmFtaWN0YWduYW1lLmMKQEAgLTAsMCArMSw5NyBAQAorLyogUmV0dXJuIGR5bmFtaWMgdGFnIG5hbWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK2NvbnN0IGNoYXIgKgorZWJsX2R5bmFtaWNfdGFnX25hbWUgKGVibCwgdGFnLCBidWYsIGxlbikKKyAgICAgRWJsICplYmw7CisgICAgIGludDY0X3QgdGFnOworICAgICBjaGFyICpidWY7CisgICAgIHNpemVfdCBsZW47Cit7CisgIGNvbnN0IGNoYXIgKnJlcyA9IGVibCAhPSBOVUxMID8gZWJsLT5keW5hbWljX3RhZ19uYW1lICh0YWcsIGJ1ZiwgbGVuKSA6IE5VTEw7CisKKyAgaWYgKHJlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICh0YWcgPj0gMCAmJiB0YWcgPCBEVF9OVU0pCisJeworCSAgc3RhdGljIGNvbnN0IGNoYXIgKnN0ZHRhZ3NbXSA9CisJICAgIHsKKwkgICAgICAiTlVMTCIsICJORUVERUQiLCAiUExUUkVMU1oiLCAiUExUR09UIiwgIkhBU0giLCAiU1RSVEFCIiwKKwkgICAgICAiU1lNVEFCIiwgIlJFTEEiLCAiUkVMQVNaIiwgIlJFTEFFTlQiLCAiU1RSU1oiLCAiU1lNRU5UIiwKKwkgICAgICAiSU5JVCIsICJGSU5JIiwgIlNPTkFNRSIsICJSUEFUSCIsICJTWU1CT0xJQyIsICJSRUwiLCAiUkVMU1oiLAorCSAgICAgICJSRUxFTlQiLCAiUExUUkVMIiwgIkRFQlVHIiwgIlRFWFRSRUwiLCAiSk1QUkVMIiwgIkJJTkRfTk9XIiwKKwkgICAgICAiSU5JVF9BUlJBWSIsICJGSU5JX0FSUkFZIiwgIklOSVRfQVJSQVlTWiIsICJGSU5JX0FSUkFZU1oiLAorCSAgICAgICJSVU5QQVRIIiwgIkZMQUdTIiwgIkVOQ09ESU5HIiwgIlBSRUlOSVRfQVJSQVkiLAorCSAgICAgICJQUkVJTklUX0FSUkFZU1oiCisJICAgIH07CisKKwkgIHJlcyA9IHN0ZHRhZ3NbdGFnXTsKKwl9CisgICAgICBlbHNlIGlmICh0YWcgPT0gRFRfVkVSU1lNKQorCXJlcyA9ICJWRVJTWU0iOworICAgICAgZWxzZSBpZiAodGFnID49IERUX0dOVV9QUkVMSU5LRUQgJiYgdGFnIDw9IERUX1NZTUlORU5UKQorCXsKKwkgIHN0YXRpYyBjb25zdCBjaGFyICp2YWxybnRhZ3NbXSA9CisJICAgIHsKKwkgICAgICAiR05VX1BSRUxJTktFRCIsICJHTlVfQ09ORkxJQ1RTWiIsICJHTlVfTElCTElTVFNaIiwKKwkgICAgICAiQ0hFQ0tTVU0iLCAiUExUUEFEU1oiLCAiTU9WRUVOVCIsICJNT1ZFU1oiLCAiRkVBVFVSRV8xIiwKKwkgICAgICAiUE9TRkxBR18xIiwgIlNZTUlOU1oiLCAiU1lNSU5FTlQiCisJICAgIH07CisKKwkgIHJlcyA9IHZhbHJudGFnc1t0YWcgLSBEVF9HTlVfUFJFTElOS0VEXTsKKwl9CisgICAgICBlbHNlIGlmICh0YWcgPj0gRFRfR05VX0NPTkZMSUNUICYmIHRhZyA8PSBEVF9TWU1JTkZPKQorCXsKKwkgIHN0YXRpYyBjb25zdCBjaGFyICphZGRycm50YWdzW10gPQorCSAgICB7CisJICAgICAgIkdOVV9DT05GTElDVCIsICJHTlVfTElCTElTVCIsICJDT05GSUciLCAiREVQQVVESVQiLCAiQVVESVQiLAorCSAgICAgICJQTFRQQUQiLCAiTU9WRVRBQiIsICJTWU1JTkZPIgorCSAgICB9OworCisJICByZXMgPSBhZGRycm50YWdzW3RhZyAtIERUX0dOVV9DT05GTElDVF07CisJfQorICAgICAgZWxzZSBpZiAodGFnID49IERUX1JFTEFDT1VOVCAmJiB0YWcgPD0gRFRfVkVSTkVFRE5VTSkKKwl7CisJICBzdGF0aWMgY29uc3QgY2hhciAqc3VudGFnc1tdID0KKwkgICAgeworCSAgICAgICJSRUxBQ09VTlQiLCAiUkVMQ09VTlQiLCAiRkxBR1NfMSIsICJWRVJERUYiLCAiVkVSREVGTlVNIiwKKwkgICAgICAiVkVSTkVFRCIsICJWRVJORUVETlVNIgorCSAgICB9OworCisJICByZXMgPSBzdW50YWdzW3RhZyAtIERUX1JFTEFDT1VOVF07CisJfQorICAgICAgZWxzZSBpZiAodGFnID09IERUX0FVWElMSUFSWSkKKwlyZXMgPSAiQVVYSUxJQVJZIjsKKyAgICAgIGVsc2UgaWYgKHRhZyA9PSBEVF9GSUxURVIpCisJcmVzID0gIkZJTFRFUiI7CisgICAgICBlbHNlCisJeworCSAgc25wcmludGYgKGJ1ZiwgbGVuLCBnZXR0ZXh0ICgiPHVua25vd24+OiAlIiBQUklkNjQpLCB0YWcpOworCisJICByZXMgPSBidWY7CisKKwl9CisgICAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsZ290cGNyZWxvY2NoZWNrLmMgYi9saWJlYmwvZWJsZ290cGNyZWxvY2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlOGI3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxnb3RwY3JlbG9jY2hlY2suYwpAQCAtMCwwICsxLDI5IEBACisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3ltYm9sIHR5cGUgaXMgdGhhdCByZWZlcmVuY2luZyB0aGUgR09ULiAgRS5nLiwKKyAgIFJfMzg2X0dPVFBDLgorICAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK2Jvb2wKK2VibF9nb3RwY19yZWxvY19jaGVjayAoZWJsLCByZWxvYykKKyAgICAgRWJsICplYmw7CisgICAgIGludCByZWxvYzsKK3sKKyAgcmV0dXJuIGVibCAhPSBOVUxMID8gZWJsLT5nb3RwY19yZWxvY19jaGVjayAoZWJsLT5lbGYsIHJlbG9jKSA6IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2VibGdzdHJ0YWIuYyBiL2xpYmVibC9lYmxnc3RydGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjYjJkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxnc3RydGFiLmMKQEAgLTAsMCArMSwzNTAgQEAKKy8qIEdlbmVyaWMgc3RyaW5nIHRhYmxlIGhhbmRsaW5nLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgImxpYmVibC5oIgorCisjaWZuZGVmIE1JTgorIyBkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKworCitzdHJ1Y3QgRWJsX0dTdHJlbnQKK3sKKyAgY29uc3QgY2hhciAqc3RyaW5nOworICBzaXplX3QgbGVuOworICBzdHJ1Y3QgRWJsX0dTdHJlbnQgKm5leHQ7CisgIHN0cnVjdCBFYmxfR1N0cmVudCAqbGVmdDsKKyAgc3RydWN0IEVibF9HU3RyZW50ICpyaWdodDsKKyAgc2l6ZV90IG9mZnNldDsKKyAgdW5zaWduZWQgaW50IHdpZHRoOworICBjaGFyIHJldmVyc2VbMF07Cit9OworCisKK3N0cnVjdCBtZW1vcnlibG9jaworeworICBzdHJ1Y3QgbWVtb3J5YmxvY2sgKm5leHQ7CisgIGNoYXIgbWVtb3J5WzBdOworfTsKKworCitzdHJ1Y3QgRWJsX0dTdHJ0YWIKK3sKKyAgc3RydWN0IEVibF9HU3RyZW50ICpyb290OworICBzdHJ1Y3QgbWVtb3J5YmxvY2sgKm1lbW9yeTsKKyAgY2hhciAqYmFja3A7CisgIHNpemVfdCBsZWZ0OworICBzaXplX3QgdG90YWw7CisgIHVuc2lnbmVkIGludCB3aWR0aDsKKyAgYm9vbCBudWxsc3RyOworCisgIHN0cnVjdCBFYmxfR1N0cmVudCBudWxsOworfTsKKworCisvKiBDYWNoZSBmb3IgdGhlIHBhZ2VzaXplLiAgV2UgY29ycmVjdCB0aGlzIHZhbHVlIGEgYml0IHNvIHRoYXQgYG1hbGxvYycKKyAgIGlzIG5vdCBhbGxvY2F0aW5nIG1vcmUgdGhhbiBhIHBhZ2UuICAqLworc3RhdGljIHNpemVfdCBwczsKKworCitzdHJ1Y3QgRWJsX0dTdHJ0YWIgKgorZWJsX2dzdHJ0YWJpbml0ICh1bnNpZ25lZCBpbnQgd2lkdGgsIGJvb2wgbnVsbHN0cikKK3sKKyAgc3RydWN0IEVibF9HU3RydGFiICpyZXQ7CisKKyAgaWYgKHBzID09IDApCisgICAgeworICAgICAgcHMgPSBzeXNjb25mIChfU0NfUEFHRVNJWkUpIC0gMiAqIHNpemVvZiAodm9pZCAqKTsKKyAgICAgIGFzc2VydCAoc2l6ZW9mIChzdHJ1Y3QgbWVtb3J5YmxvY2spIDwgcHMpOworICAgIH0KKworICByZXQgPSAoc3RydWN0IEVibF9HU3RydGFiICopIGNhbGxvYyAoMSwgc2l6ZW9mIChzdHJ1Y3QgRWJsX0dTdHJ0YWIpKTsKKyAgaWYgKHJldCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldC0+d2lkdGggPSB3aWR0aDsKKyAgICAgIHJldC0+bnVsbHN0ciA9IG51bGxzdHI7CisKKyAgICAgIGlmIChudWxsc3RyKQorCXsKKwkgIHJldC0+bnVsbC5sZW4gPSAxOworCSAgcmV0LT5udWxsLnN0cmluZyA9IChjaGFyICopIGNhbGxvYyAoMSwgd2lkdGgpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAorbW9yZW1lbW9yeSAoc3RydWN0IEVibF9HU3RydGFiICpzdCwgc2l6ZV90IGxlbikKK3sKKyAgc3RydWN0IG1lbW9yeWJsb2NrICpuZXdtZW07CisKKyAgaWYgKGxlbiA8IHBzKQorICAgIGxlbiA9IHBzOworICBuZXdtZW0gPSAoc3RydWN0IG1lbW9yeWJsb2NrICopIG1hbGxvYyAobGVuKTsKKyAgaWYgKG5ld21lbSA9PSBOVUxMKQorICAgIGFib3J0ICgpOworCisgIG5ld21lbS0+bmV4dCA9IHN0LT5tZW1vcnk7CisgIHN0LT5tZW1vcnkgPSBuZXdtZW07CisgIHN0LT5iYWNrcCA9IG5ld21lbS0+bWVtb3J5OworICBzdC0+bGVmdCA9IGxlbiAtIG9mZnNldG9mIChzdHJ1Y3QgbWVtb3J5YmxvY2ssIG1lbW9yeSk7Cit9CisKKwordm9pZAorZWJsX2dzdHJ0YWJmcmVlIChzdHJ1Y3QgRWJsX0dTdHJ0YWIgKnN0KQoreworICBzdHJ1Y3QgbWVtb3J5YmxvY2sgKm1iID0gc3QtPm1lbW9yeTsKKworICB3aGlsZSAobWIgIT0gTlVMTCkKKyAgICB7CisgICAgICB2b2lkICpvbGQgPSBtYjsKKyAgICAgIG1iID0gbWItPm5leHQ7CisgICAgICBmcmVlIChvbGQpOworICAgIH0KKworICBpZiAoc3QtPm51bGwuc3RyaW5nICE9IE5VTEwpCisgICAgZnJlZSAoKGNoYXIgKikgc3QtPm51bGwuc3RyaW5nKTsKKworICBmcmVlIChzdCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBFYmxfR1N0cmVudCAqCituZXdzdHJpbmcgKHN0cnVjdCBFYmxfR1N0cnRhYiAqc3QsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKyAgLyogQ29tcHV0ZSB0aGUgYW1vdW50IG9mIHBhZGRpbmcgbmVlZGVkIHRvIG1ha2UgdGhlIHN0cnVjdHVyZSBhbGlnbmVkLiAgKi8KKyAgc2l6ZV90IGFsaWduID0gKChfX2FsaWdub2ZfXyAoc3RydWN0IEVibF9HU3RyZW50KQorCQkgICAtICgoKHVpbnRwdHJfdCkgc3QtPmJhY2twKQorCQkgICAgICAmIChfX2FsaWdub2ZfXyAoc3RydWN0IEVibF9HU3RyZW50KSAtIDEpKSkKKwkJICAmIChfX2FsaWdub2ZfXyAoc3RydWN0IEVibF9HU3RyZW50KSAtIDEpKTsKKworICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gdGhlIG1lbW9yeSBibG9jay4gICovCisgIGlmIChzdC0+bGVmdCA8IGFsaWduICsgc2l6ZW9mIChzdHJ1Y3QgRWJsX0dTdHJlbnQpICsgbGVuICogc3QtPndpZHRoKQorICAgIHsKKyAgICAgIG1vcmVtZW1vcnkgKHN0LCBzaXplb2YgKHN0cnVjdCBFYmxfR1N0cmVudCkgKyBsZW4gKiBzdC0+d2lkdGgpOworICAgICAgYWxpZ24gPSAwOworICAgIH0KKworICAvKiBDcmVhdGUgdGhlIHJlc2VydmVkIHN0cmluZy4gICovCisgIHN0cnVjdCBFYmxfR1N0cmVudCAqbmV3c3RyID0gKHN0cnVjdCBFYmxfR1N0cmVudCAqKSAoc3QtPmJhY2twICsgYWxpZ24pOworICBuZXdzdHItPnN0cmluZyA9IHN0cjsKKyAgbmV3c3RyLT5sZW4gPSBsZW47CisgIG5ld3N0ci0+d2lkdGggPSBzdC0+d2lkdGg7CisgIG5ld3N0ci0+bmV4dCA9IE5VTEw7CisgIG5ld3N0ci0+bGVmdCA9IE5VTEw7CisgIG5ld3N0ci0+cmlnaHQgPSBOVUxMOworICBuZXdzdHItPm9mZnNldCA9IDA7CisgIGZvciAoaW50IGkgPSBsZW4gLSAyOyBpID49IDA7IC0taSkKKyAgICBmb3IgKGludCBqID0gc3QtPndpZHRoIC0gMTsgaiA+PSAwOyAtLWopCisgICAgICBuZXdzdHItPnJldmVyc2VbaSAqIHN0LT53aWR0aCArIGpdID0gc3RyWyhsZW4gLSAyIC0gaSkgKiBzdC0+d2lkdGggKyBqXTsKKyAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzdC0+d2lkdGg7ICsraikKKyAgICBuZXdzdHItPnJldmVyc2VbKGxlbiAtIDEpICogc3QtPndpZHRoICsgal0gPSAnXDAnOworICBzdC0+YmFja3AgKz0gYWxpZ24gKyBzaXplb2YgKHN0cnVjdCBFYmxfR1N0cmVudCkgKyBsZW4gKiBzdC0+d2lkdGg7CisgIHN0LT5sZWZ0IC09IGFsaWduICsgc2l6ZW9mIChzdHJ1Y3QgRWJsX0dTdHJlbnQpICsgbGVuICogc3QtPndpZHRoOworCisgIHJldHVybiBuZXdzdHI7Cit9CisKKworLyogWFhYIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGRlZmluaXRlbHkgYmUgcmV3cml0dGVuIHRvIHVzZSBhIGJhbGFuY2luZworICAgdHJlZSBhbGdvcml0aCAoQVZMLCByZWQtYmxhY2sgdHJlZXMpLiAgRm9yIG5vdyBhIHNpbXBsZSwgY29ycmVjdAorICAgaW1wbGVtZW50YXRpb24gaXMgZW5vdWdoLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgRWJsX0dTdHJlbnQgKioKK3NlYXJjaHN0cmluZyAoc3RydWN0IEVibF9HU3RyZW50ICoqc2VwLCBzdHJ1Y3QgRWJsX0dTdHJlbnQgKm5ld3N0cikKK3sKKyAgaW50IGNtcHJlczsKKworICAvKiBNb3JlIHN0cmluZ3M/ICAqLworICBpZiAoKnNlcCA9PSBOVUxMKQorICAgIHsKKyAgICAgICpzZXAgPSBuZXdzdHI7CisgICAgICByZXR1cm4gc2VwOworICAgIH0KKworICAvKiBDb21wYXJlIHRoZSBzdHJpbmdzLiAgKi8KKyAgY21wcmVzID0gbWVtY21wICgoKnNlcCktPnJldmVyc2UsIG5ld3N0ci0+cmV2ZXJzZSwKKwkJICAgKE1JTiAoKCpzZXApLT5sZW4sIG5ld3N0ci0+bGVuKSAtIDEpICogKCpzZXApLT53aWR0aCk7CisgIGlmIChjbXByZXMgPT0gMCkKKyAgICAvKiBXZSBmb3VuZCBhIG1hdGNoaW5nIHN0cmluZy4gICovCisgICAgcmV0dXJuIHNlcDsKKyAgZWxzZSBpZiAoY21wcmVzID4gMCkKKyAgICByZXR1cm4gc2VhcmNoc3RyaW5nICgmKCpzZXApLT5sZWZ0LCBuZXdzdHIpOworICBlbHNlCisgICAgcmV0dXJuIHNlYXJjaHN0cmluZyAoJigqc2VwKS0+cmlnaHQsIG5ld3N0cik7Cit9CisKKworLyogQWRkIG5ldyBzdHJpbmcuICBUaGUgYWN0dWFsIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIHBlcm1hbmVudC4gICovCitzdHJ1Y3QgRWJsX0dTdHJlbnQgKgorZWJsX2dzdHJ0YWJhZGQgKHN0cnVjdCBFYmxfR1N0cnRhYiAqc3QsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKyAgc3RydWN0IEVibF9HU3RyZW50ICpuZXdzdHI7CisgIHN0cnVjdCBFYmxfR1N0cmVudCAqKnNlcDsKKworICAvKiBDb21wdXRlIHRoZSBzdHJpbmcgbGVuZ3RoIGlmIHRoZSBjYWxsZXIgZG9lc24ndCBrbm93IGl0LiAgKi8KKyAgaWYgKGxlbiA9PSAwKQorICAgIHsKKyAgICAgIHNpemVfdCBqOworCisgICAgICBkbworCWZvciAoaiA9IDA7IGogPCBzdC0+d2lkdGg7ICsraikKKwkgIGlmIChzdHJbbGVuICogc3QtPndpZHRoICsgal0gIT0gJ1wwJykKKwkgICAgYnJlYWs7CisgICAgICB3aGlsZSAoaiA9PSBzdC0+d2lkdGggJiYgKytsZW4pOworICAgIH0KKworICAvKiBNYWtlIHN1cmUgYWxsICIiIHN0cmluZ3MgZ2V0IG9mZnNldCAwIGJ1dCBvbmx5IGlmIHRoZSB0YWJsZSB3YXMKKyAgICAgY3JlYXRlZCB3aXRoIGEgc3BlY2lhbCBudWxsIGVudHJ5IGluIG1pbmQuICAqLworICBpZiAobGVuID09IDEgJiYgc3QtPm51bGwuc3RyaW5nICE9IE5VTEwpCisgICAgcmV0dXJuICZzdC0+bnVsbDsKKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgc3RyaW5nIGFuZCBpdHMgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbi4gICovCisgIG5ld3N0ciA9IG5ld3N0cmluZyAoc3QsIHN0ciwgbGVuKTsKKworICAvKiBTZWFyY2ggaW4gdGhlIGFycmF5IGZvciB0aGUgcGxhY2UgdG8gaW5zZXJ0IHRoZSBzdHJpbmcuICBJZiB0aGVyZQorICAgICBpcyBubyBzdHJpbmcgd2l0aCBtYXRjaGluZyBwcmVmaXggYW5kIG5vIHN0cmluZyB3aXRoIG1hdGNoaW5nCisgICAgIGxlYWRpbmcgc3Vic3RyaW5nLCBjcmVhdGUgYSBuZXcgZW50cnkuICAqLworICBzZXAgPSBzZWFyY2hzdHJpbmcgKCZzdC0+cm9vdCwgbmV3c3RyKTsKKyAgaWYgKCpzZXAgIT0gbmV3c3RyKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgbm90IHRoZSBzYW1lIGVudHJ5LiAgVGhpcyBtZWFucyB3ZSBoYXZlIGEgcHJlZml4IG1hdGNoLiAgKi8KKyAgICAgIGlmICgoKnNlcCktPmxlbiA+IG5ld3N0ci0+bGVuKQorCXsKKwkgIHN0cnVjdCBFYmxfR1N0cmVudCAqc3ViczsKKworCSAgLyogQ2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IGtub3cgdGhpcyBzdHJpbmcuICAqLworCSAgZm9yIChzdWJzID0gKCpzZXApLT5uZXh0OyBzdWJzICE9IE5VTEw7IHN1YnMgPSBzdWJzLT5uZXh0KQorCSAgICBpZiAoc3Vicy0+bGVuID09IG5ld3N0ci0+bGVuKQorCSAgICAgIHsKKwkJLyogV2UgaGF2ZSBhbiBleGFjdCBtYXRjaCB3aXRoIGEgc3Vic3RyaW5nLiAgRnJlZSB0aGUgbWVtb3J5CisJCSAgIHdlIGFsbG9jYXRlZC4gICovCisJCXN0LT5sZWZ0ICs9IChzdC0+YmFja3AgLSAoY2hhciAqKSBuZXdzdHIpICogc3QtPndpZHRoOworCQlzdC0+YmFja3AgPSAoY2hhciAqKSBuZXdzdHI7CisKKwkJcmV0dXJuIHN1YnM7CisJICAgICAgfQorCisJICAvKiBXZSBoYXZlIGEgbmV3IHN1YnN0cmluZy4gIFRoaXMgbWVhbnMgd2UgZG9uJ3QgbmVlZCB0aGUgcmV2ZXJzZQorCSAgICAgc3RyaW5nIG9mIHRoaXMgZW50cnkgYW55bW9yZS4gICovCisJICBzdC0+YmFja3AgLT0gbmV3c3RyLT5sZW47CisJICBzdC0+bGVmdCArPSBuZXdzdHItPmxlbjsKKworCSAgbmV3c3RyLT5uZXh0ID0gKCpzZXApLT5uZXh0OworCSAgKCpzZXApLT5uZXh0ID0gbmV3c3RyOworCX0KKyAgICAgIGVsc2UgaWYgKCgqc2VwKS0+bGVuICE9IG5ld3N0ci0+bGVuKQorCXsKKwkgIC8qIFdoZW4gd2UgZ2V0IGhlcmUgaXQgbWVhbnMgdGhhdCB0aGUgc3RyaW5nIHdlIGFyZSBhYm91dCB0bworCSAgICAgYWRkIGhhcyBhIGNvbW1vbiBwcmVmaXggd2l0aCBhIHN0cmluZyB3ZSBhbHJlYWR5IGhhdmUgYnV0CisJICAgICBpdCBpcyBsb25nZXIuICBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgaXQgZmlyc3QuICAqLworCSAgc3QtPnRvdGFsICs9IG5ld3N0ci0+bGVuIC0gKCpzZXApLT5sZW47CisJICBuZXdzdHItPm5leHQgPSAqc2VwOworCSAgbmV3c3RyLT5sZWZ0ID0gKCpzZXApLT5sZWZ0OworCSAgbmV3c3RyLT5yaWdodCA9ICgqc2VwKS0+cmlnaHQ7CisJICAqc2VwID0gbmV3c3RyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBoYXZlIGFuIGV4YWN0IG1hdGNoLiAgRnJlZSB0aGUgbWVtb3J5IHdlIGFsbG9jYXRlZC4gICovCisJICBzdC0+bGVmdCArPSAoc3QtPmJhY2twIC0gKGNoYXIgKikgbmV3c3RyKSAqIHN0LT53aWR0aDsKKwkgIHN0LT5iYWNrcCA9IChjaGFyICopIG5ld3N0cjsKKworCSAgbmV3c3RyID0gKnNlcDsKKwl9CisgICAgfQorICBlbHNlCisgICAgc3QtPnRvdGFsICs9IG5ld3N0ci0+bGVuOworCisgIHJldHVybiBuZXdzdHI7Cit9CisKKworc3RhdGljIHZvaWQKK2NvcHlzdHJpbmdzIChzdHJ1Y3QgRWJsX0dTdHJlbnQgKm5vZGVwLCBjaGFyICoqZnJlZXAsIHNpemVfdCAqb2Zmc2V0cCkKK3sKKyAgc3RydWN0IEVibF9HU3RyZW50ICpzdWJzOworCisgIGlmIChub2RlcC0+bGVmdCAhPSBOVUxMKQorICAgIGNvcHlzdHJpbmdzIChub2RlcC0+bGVmdCwgZnJlZXAsIG9mZnNldHApOworCisgIC8qIFByb2Nlc3MgdGhlIGN1cnJlbnQgbm9kZS4gICovCisgIG5vZGVwLT5vZmZzZXQgPSAqb2Zmc2V0cDsKKyAgKmZyZWVwID0gKGNoYXIgKikgbWVtcGNweSAoKmZyZWVwLCBub2RlcC0+c3RyaW5nLCBub2RlcC0+bGVuICogbm9kZXAtPndpZHRoKTsKKyAgKm9mZnNldHAgKz0gbm9kZXAtPmxlbiAqIG5vZGVwLT53aWR0aDsKKworICBmb3IgKHN1YnMgPSBub2RlcC0+bmV4dDsgc3VicyAhPSBOVUxMOyBzdWJzID0gc3Vicy0+bmV4dCkKKyAgICB7CisgICAgICBhc3NlcnQgKHN1YnMtPmxlbiA8IG5vZGVwLT5sZW4pOworICAgICAgc3Vicy0+b2Zmc2V0ID0gbm9kZXAtPm9mZnNldCArIChub2RlcC0+bGVuIC0gc3Vicy0+bGVuKSAqIG5vZGVwLT53aWR0aDsKKyAgICAgIGFzc2VydCAoc3Vicy0+b2Zmc2V0ICE9IDAgfHwgc3Vicy0+c3RyaW5nWzBdID09ICdcMCcpOworICAgIH0KKworICBpZiAobm9kZXAtPnJpZ2h0ICE9IE5VTEwpCisgICAgY29weXN0cmluZ3MgKG5vZGVwLT5yaWdodCwgZnJlZXAsIG9mZnNldHApOworfQorCisKK3ZvaWQKK2VibF9nc3RydGFiZmluYWxpemUgKHN0cnVjdCBFYmxfR1N0cnRhYiAqc3QsIEVsZl9EYXRhICpkYXRhKQoreworICBzaXplX3QgY29weWxlbjsKKyAgY2hhciAqZW5kcDsKKyAgc2l6ZV90IG51bGxsZW4gPSBzdC0+bnVsbHN0ciA/IHN0LT53aWR0aCA6IDA7CisKKyAgLyogRmlsbCBpbiB0aGUgaW5mb3JtYXRpb24uICAqLworICBkYXRhLT5kX2J1ZiA9IG1hbGxvYyAoc3QtPnRvdGFsICsgbnVsbGxlbik7CisgIGlmIChkYXRhLT5kX2J1ZiA9PSBOVUxMKQorICAgIGFib3J0ICgpOworCisgIC8qIFRoZSBmaXJzdCBieXRlIG11c3QgYWx3YXlzIGJlIHplcm8gaWYgd2UgY3JlYXRlZCB0aGUgdGFibGUgd2l0aCBhCisgICAgIG51bGwgc3RyaW5nLiAgKi8KKyAgaWYgKHN0LT5udWxsc3RyKQorICAgIG1lbXNldCAoZGF0YS0+ZF9idWYsICdcMCcsIHN0LT53aWR0aCk7CisKKyAgZGF0YS0+ZF90eXBlID0gRUxGX1RfQllURTsKKyAgZGF0YS0+ZF9zaXplID0gc3QtPnRvdGFsICsgbnVsbGxlbjsKKyAgZGF0YS0+ZF9vZmYgPSAwOworICBkYXRhLT5kX2FsaWduID0gMTsKKyAgZGF0YS0+ZF92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKKworICAvKiBOb3cgcnVuIHRocm91Z2ggdGhlIHRyZWUgYW5kIGFkZCBhbGwgdGhlIHN0cmluZyB3aGlsZSBhbHNvIHVwZGF0aW5nCisgICAgIHRoZSBvZmZzZXQgbWVtYmVycyBvZiB0aGUgZWxmc3RyZW50IHJlY29yZHMuICAqLworICBlbmRwID0gKGNoYXIgKikgZGF0YS0+ZF9idWYgKyBudWxsbGVuOworICBjb3B5bGVuID0gbnVsbGxlbjsKKyAgY29weXN0cmluZ3MgKHN0LT5yb290LCAmZW5kcCwgJmNvcHlsZW4pOworICBhc3NlcnQgKGNvcHlsZW4gPT0gc3QtPnRvdGFsICogc3QtPndpZHRoICsgbnVsbGxlbik7Cit9CisKKworc2l6ZV90CitlYmxfZ3N0cnRhYm9mZnNldCAoc3RydWN0IEVibF9HU3RyZW50ICpzZSkKK3sKKyAgcmV0dXJuIHNlLT5vZmZzZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsbWFjaGluZWZsYWdjaGVjay5jIGIvbGliZWJsL2VibG1hY2hpbmVmbGFnY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmM4ZDMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibG1hY2hpbmVmbGFnY2hlY2suYwpAQCAtMCwwICsxLDI4IEBACisvKiBDaGVjayBtYWNoaW5lIGZsYWcuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworYm9vbAorZWJsX21hY2hpbmVfZmxhZ19jaGVjayAoZWJsLCBmbGFncykKKyAgICAgRWJsICplYmw7CisgICAgIEVsZjY0X1dvcmQgZmxhZ3M7Cit7CisgIHJldHVybiBlYmwgIT0gTlVMTCA/IGVibC0+bWFjaGluZV9mbGFnX2NoZWNrIChmbGFncykgOiAoZmxhZ3MgPT0gMCk7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsbWFjaGluZWZsYWduYW1lLmMgYi9saWJlYmwvZWJsbWFjaGluZWZsYWduYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4YTk5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxtYWNoaW5lZmxhZ25hbWUuYwpAQCAtMCwwICsxLDc2IEBACisvKiBSZXR1cm4gbWFjaGluZSBmbGFnIG5hbWVzLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworY29uc3QgY2hhciAqCitlYmxfbWFjaGluZV9mbGFnX25hbWUgKGVibCwgZmxhZ3MsIGJ1ZiwgbGVuKQorICAgICBFYmwgKmVibDsKKyAgICAgRWxmNjRfV29yZCBmbGFnczsKKyAgICAgY2hhciAqYnVmOworICAgICBzaXplX3QgbGVuOworeworICBjb25zdCBjaGFyICpyZXM7CisKKyAgaWYgKGZsYWdzID09IDApCisgICAgcmVzID0gIiI7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICpjcCA9IGJ1ZjsKKyAgICAgIGludCBmaXJzdCA9IDE7CisgICAgICBjb25zdCBjaGFyICptYWNoc3RyOworICAgICAgc2l6ZV90IG1hY2hzdHJsZW47CisKKyAgICAgIGRvCisJeworCSAgaWYgKCEgZmlyc3QpCisJICAgIHsKKwkgICAgICBpZiAoY3AgKyAxID49IGJ1ZiArIGxlbikKKwkJYnJlYWs7CisJICAgICAgKmNwKysgPSAnLCc7CisJICAgIH0KKworCSAgbWFjaHN0ciA9IGVibCAhPSBOVUxMID8gZWJsLT5tYWNoaW5lX2ZsYWdfbmFtZSAoJmZsYWdzKSA6IE5VTEw7CisJICBpZiAobWFjaHN0ciA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogTm8gbW9yZSBrbm93biBmbGFnLiAgKi8KKwkgICAgICBzbnByaW50ZiAoY3AsIGJ1ZiArIGxlbiAtIGNwLCAiJSN4IiwgZmxhZ3MpOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIG1hY2hzdHJsZW4gPSBzdHJsZW4gKG1hY2hzdHIpICsgMTsKKwkgIGlmICgoc2l6ZV90KSAoYnVmICsgbGVuIC0gY3ApIDwgbWFjaHN0cmxlbikKKwkgICAgeworCSAgICAgICooKGNoYXIgKikgbWVtcGNweSAoY3AsIG1hY2hzdHIsIGJ1ZiArIGxlbiAtIGNwIC0gMSkpID0gJ1wwJzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBjcCA9IG1lbXBjcHkgKGNwLCBtYWNoc3RyLCBtYWNoc3RybGVuKTsKKworCSAgZmlyc3QgPSAwOworCX0KKyAgICAgIHdoaWxlIChmbGFncyAhPSAwKTsKKworICAgICAgcmVzID0gYnVmOworICAgIH0KKworICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2VibG9iamVjdHR5cGVuYW1lLmMgYi9saWJlYmwvZWJsb2JqZWN0dHlwZW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDk5YzcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibG9iamVjdHR5cGVuYW1lLmMKQEAgLTAsMCArMSw0OCBAQAorLyogUmV0dXJuIG9iamVjdCBmaWxlIHR5cGUgbmFtZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK2NvbnN0IGNoYXIgKgorZWJsX29iamVjdF90eXBlX25hbWUgKGVibCwgb2JqZWN0LCBidWYsIGxlbikKKyAgICAgRWJsICplYmw7CisgICAgIGludCBvYmplY3Q7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgc2l6ZV90IGxlbjsKK3sKKyAgY29uc3QgY2hhciAqcmVzOworCisgIHJlcyA9IGVibCAhPSBOVUxMID8gZWJsLT5vYmplY3RfdHlwZV9uYW1lIChvYmplY3QsIGJ1ZiwgbGVuKSA6IE5VTEw7CisgIGlmIChyZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgT1Mtc3BlY2lmaWMgc2VjdGlvbiBuYW1lcy4gICovCisgICAgICBpZiAob2JqZWN0ID49IEVUX0xPT1MgJiYgb2JqZWN0IDw9IEVUX0hJT1MpCisJc25wcmludGYgKGJ1ZiwgbGVuLCAiTE9PUysleCIsIG9iamVjdCAtIEVUX0xPT1MpOworICAgICAgLyogSGFuZGxlIHByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIG5hbWVzLiAgKi8KKyAgICAgIGVsc2UgaWYgKG9iamVjdCA+PSBFVF9MT1BST0MgJiYgb2JqZWN0IDw9IEVUX0hJUFJPQykKKwlzbnByaW50ZiAoYnVmLCBsZW4sICJMT1BST0MrJXgiLCBvYmplY3QgLSBFVF9MT1BST0MpOworICAgICAgZWxzZQorCXNucHJpbnRmIChidWYsIGxlbiwgIiVzOiAlZCIsIGdldHRleHQgKCI8dW5rbm93bj4iKSwgb2JqZWN0KTsKKworICAgICAgcmVzID0gYnVmOworICAgIH0KKworICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2VibG9iam5vdGUuYyBiL2xpYmVibC9lYmxvYmpub3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkZmYxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxvYmpub3RlLmMKQEAgLTAsMCArMSw4NyBAQAorLyogUHJpbnQgY29udGVudHMgb2Ygb2JqZWN0IGZpbGUgbm90ZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKwordm9pZAorZWJsX29iamVjdF9ub3RlIChlYmwsIG5hbWUsIHR5cGUsIGRlc2NzeiwgZGVzYykKKyAgICAgRWJsICplYmw7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIHVpbnQzMl90IHR5cGU7CisgICAgIHVpbnQzMl90IGRlc2NzejsKKyAgICAgY29uc3QgY2hhciAqZGVzYzsKK3sKKyAgaWYgKCEgZWJsLT5vYmplY3Rfbm90ZSAobmFtZSwgdHlwZSwgZGVzY3N6LCBkZXNjKSkKKyAgICAvKiBUaGUgbWFjaGluZSBzcGVjaWZpYyBmdW5jdGlvbiBkaWQgbm90IGtub3cgdGhpcyB0eXBlLiAgKi8KKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgICB7CisgICAgICBjYXNlIE5UX1ZFUlNJT046CisJaWYgKHN0cmNtcCAobmFtZSwgIkdOVSIpID09IDAgJiYgZGVzY3N6ID49IDgpCisJICB7CisJICAgIHN0cnVjdAorCSAgICB7CisJICAgICAgdWludDMyX3Qgb3M7CisJICAgICAgdWludDMyX3QgdmVyc2lvbltkZXNjc3ogLyA0IC0gMV07CisJICAgIH0gKnRhZyA9IChfX3R5cGVvZiAodGFnKSkgZGVzYzsKKworCSAgICBjb25zdCBjaGFyICpvczsKKwkgICAgc3dpdGNoICh0YWctPm9zKQorCSAgICAgIHsKKwkgICAgICBjYXNlIEVMRl9OT1RFX09TX0xJTlVYOgorCQlvcyA9ICJMaW51eCI7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBFTEZfTk9URV9PU19HTlU6CisJCW9zID0gIkdOVSI7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBFTEZfTk9URV9PU19TT0xBUklTMjoKKwkJb3MgPSAiU29sYXJpcyI7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBFTEZfTk9URV9PU19GUkVFQlNEOgorCQlvcyA9ICJGcmVlQlNEIjsKKwkJYnJlYWs7CisKKwkgICAgICBkZWZhdWx0OgorCQlvcyA9ICI/Pz8iOworCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgcHJpbnRmIChnZXR0ZXh0ICgiICAgIE9TOiAlcywgQUJJOiAiKSwgb3MpOworCSAgICBzaXplX3QgY250OworCSAgICBmb3IgKGNudCA9IDA7IGNudCA8IGRlc2NzeiAvIDQgLSAxOyArK2NudCkKKwkgICAgICB7CisJCWlmIChjbnQgIT0gMCkKKwkJICBwdXRjaGFyX3VubG9ja2VkICgnLicpOworCQlwcmludGYgKCIlIiBQUkl1MzIsIHRhZy0+dmVyc2lvbltjbnRdKTsKKwkgICAgICB9CisJICAgIHB1dGNoYXJfdW5sb2NrZWQgKCdcbicpOworCSAgICBicmVhazsKKwkgIH0KKwkvKiBGQUxMVEhST1VHSCAqLworCisgICAgICBkZWZhdWx0OgorCS8qIFVua25vd24gdHlwZS4gICovCisJYnJlYWs7CisgICAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsb2Jqbm90ZXR5cGVuYW1lLmMgYi9saWJlYmwvZWJsb2Jqbm90ZXR5cGVuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2M2NlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxvYmpub3RldHlwZW5hbWUuYwpAQCAtMCwwICsxLDU0IEBACisvKiBSZXR1cm4gbm90ZSB0eXBlIG5hbWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK2NvbnN0IGNoYXIgKgorZWJsX29iamVjdF9ub3RlX3R5cGVfbmFtZSAoZWJsLCB0eXBlLCBidWYsIGxlbikKKyAgICAgRWJsICplYmw7CisgICAgIHVpbnQzMl90IHR5cGU7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgc2l6ZV90IGxlbjsKK3sKKyAgY29uc3QgY2hhciAqcmVzID0gZWJsLT5vYmplY3Rfbm90ZV90eXBlX25hbWUgKHR5cGUsIGJ1ZiwgbGVuKTsKKworICBpZiAocmVzID09IE5VTEwpCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtub3dudHlwZXNbXSA9CisJeworI2RlZmluZSBLTk9XTlNUWVBFKG5hbWUpIFtOVF8jI25hbWVdID0gI25hbWUKKwkgIEtOT1dOU1RZUEUgKFZFUlNJT04pLAorCX07CisKKyAgICAgIC8qIEhhbmRsZSBzdGFuZGFyZCBuYW1lcy4gICovCisgICAgICBpZiAodHlwZSA8IHNpemVvZiAoa25vd250eXBlcykgLyBzaXplb2YgKGtub3dudHlwZXNbMF0pCisJICAmJiBrbm93bnR5cGVzW3R5cGVdICE9IE5VTEwpCisJcmVzID0ga25vd250eXBlc1t0eXBlXTsKKyAgICAgIGVsc2UKKwl7CisJICBzbnByaW50ZiAoYnVmLCBsZW4sICIlczogJSIgUFJJdTMyLCBnZXR0ZXh0ICgiPHVua25vd24+IiksIHR5cGUpOworCisJICByZXMgPSBidWY7CisJfQorICAgIH0KKworICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2VibG9wZW5iYWNrZW5kLmMgYi9saWJlYmwvZWJsb3BlbmJhY2tlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJmN2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibG9wZW5iYWNrZW5kLmMKQEAgLTAsMCArMSw1NTEgQEAKKy8qIEdlbmVyYXRlIEVMRiBiYWNrZW5kIGhhbmRsZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxlcnJvci5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCisvKiBUaGlzIHRhYmxlIHNob3VsZCBjb250YWluIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGFyY2hpdGVjdHVyZXMgYXMgZmFyCisgICBhcyB0aGUgRUxGIHNwZWNpZmljYXRpb24gaXMgY29uY2VybmVkLiAgKi8KKy8qIFhYWCBXaGVuIHRoaW5ncyBhcmUgc3RhYmxlIHJlcGxhY2UgdGhlIHN0cmluZyBwb2ludGVycyB3aXRoIGNoYXIKKyAgIGFycmF5cyB0byBhdm9pZCByZWxvY2F0aW9ucy4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKmRzb25hbWU7CisgIGNvbnN0IGNoYXIgKmVtdWxhdGlvbjsKKyAgY29uc3QgY2hhciAqcHJlZml4OworICBpbnQgcHJlZml4X2xlbjsKKyAgaW50IGVtOworfSBtYWNoaW5lc1tdID0KK3sKKyAgeyAiaTM4NiIsICJlbGZfaTM4NiIsICJpMzg2IiwgNCwgRU1fMzg2IH0sCisgIHsgImlhNjQiLCAiZWxmX2lhNjQiLCAiaWE2NCIsIDQsIEVNX0lBXzY0IH0sCisgIHsgImFscGhhIiwgImVsZl9hbHBoYSIsICJhbHBoYSIsIDUsIEVNX0FMUEhBIH0sCisgIHsgIng4Nl82NCIsICJlbGZfeDg2XzY0IiwgIng4Nl82NCIsIDYsIEVNX1g4Nl82NCB9LAorICB7ICJzaCIsICJlbGZfc2giLCAic2giLCAyLCBFTV9TSCB9LAorICB7ICJhcm0iLCAiZWJsX2FybSIsICJhcm0iLCAzLCBFTV9BUk0gfSwKKyAgeyAic3BhcmMiLCAiZWxmX3NwYXJjdjkiLCAic3BhcmMiLCA1LCBFTV9TUEFSQ1Y5IH0sCisgIHsgInNwYXJjIiwgImVsZl9zcGFyYyIsICJzcGFyYyIsIDUsIEVNX1NQQVJDIH0sCisgIHsgInNwYXJjIiwgImVsZl9zcGFyY3Y4cGx1cyIsICJzcGFyYyIsIDUsIEVNX1NQQVJDMzJQTFVTIH0sCisKKyAgeyAibTMyIiwgImVsZl9tMzIiLCAibTMyIiwgMywgRU1fTTMyIH0sCisgIHsgIm02OGsiLCAiZWxmX202OGsiLCAibTY4ayIsIDQsIEVNXzY4SyB9LAorICB7ICJtODhrIiwgImVsZl9tODhrIiwgIm04OGsiLCA0LCBFTV84OEsgfSwKKyAgeyAiaTg2MCIsICJlbGZfaTg2MCIsICJpODYwIiwgNCwgRU1fODYwIH0sCisgIHsgIm1pcHMiLCAiZWxmX21pcHMiLCAibWlwcyIsIDQsIEVNX01JUFMgfSwKKyAgeyAiczM3MCIsICJlYmxfczM3MCIsICJzMzcwIiwgNCwgRU1fUzM3MCB9LAorICB7ICJtaXBzIiwgImVsZl9taXBzZWwiLCAibWlwcyIsIDQsIEVNX01JUFNfUlMzX0xFIH0sCisgIHsgInBhcmlzYyIsICJlbGZfcGFyaXNjIiwgInBhcmlzYyIsIDYsIEVNX1BBUklTQyB9LAorICB7ICJ2cHA1MDAiLCAiZWxmX3ZwcDUwMCIsICJ2cHA1MDAiLCA1LCBFTV9WUFA1MDAgfSwKKyAgeyAic3BhcmMiLCAiZWxmX3Y4cGx1cyIsICJ2OHBsdXMiLCA2LCBFTV9TUEFSQzMyUExVUyB9LAorICB7ICJpOTYwIiwgImVsZl9pOTYwIiwgImk5NjAiLCA0LCBFTV85NjAgfSwKKyAgeyAicHBjIiwgImVsZl9wcGMiLCAicHBjIiwgMywgRU1fUFBDIH0sCisgIHsgInBwYzY0IiwgImVsZl9wcGM2NCIsICJwcGM2NCIsIDUsIEVNX1BQQzY0IH0sCisgIHsgInMzOTAiLCAiZWJsX3MzOTAiLCAiczM5MCIsIDQsIEVNX1MzOTAgfSwKKyAgeyAidjgwMCIsICJlYmxfdjgwMCIsICJ2ODAwIiwgNCwgRU1fVjgwMCB9LAorICB7ICJmcjIwIiwgImVibF9mcjIwIiwgImZyMjAiLCA0LCBFTV9GUjIwIH0sCisgIHsgInJoMzIiLCAiZWJsX3JoMzIiLCAicmgzMiIsIDQsIEVNX1JIMzIgfSwKKyAgeyAicmNlIiwgImVibF9yY2UiLCAicmNlIiwgMywgRU1fUkNFIH0sCisgIHsgInRyaWNvcmUiLCAiZWxmX3RyaWNvcmUiLCAidHJpY29yZSIsIDcsIEVNX1RSSUNPUkUgfSwKKyAgeyAiYXJjIiwgImVsZl9hcmMiLCAiYXJjIiwgMywgRU1fQVJDIH0sCisgIHsgImg4IiwgImVsZl9oOF8zMDAiLCAiaDhfMzAwIiwgNiwgRU1fSDhfMzAwIH0sCisgIHsgImg4IiwgImVsZl9oOF8zMDBoIiwgImg4XzMwMGgiLCA2LCBFTV9IOF8zMDBIIH0sCisgIHsgImg4IiwgImVsZl9oOHMiLCAiaDhzIiwgNiwgRU1fSDhTIH0sCisgIHsgImg4IiwgImVsZl9oOF81MDAiLCAiaDhfNTAwIiwgNiwgRU1fSDhfNTAwIH0sCisgIHsgIm1pcHNfeCIsICJlbGZfbWlwc194IiwgIm1pcHNfeCIsIDYsIEVNX01JUFNfWCB9LAorICB7ICJjb2xkZmlyZSIsICJlbGZfY29sZGZpcmUiLCAiY29sZGZpcmUiLCA4LCBFTV9DT0xERklSRSB9LAorICB7ICJtNjhrIiwgImVsZl82OGhjMTIiLCAiNjhoYzEyIiwgNiwgRU1fNjhIQzEyIH0sCisgIHsgIm1tYSIsICJlbGZfbW1hIiwgIm1tYSIsIDMsIEVNX01NQSB9LAorICB7ICJwY3AiLCAiZWxmX3BjcCIsICJwY3AiLCAzLCBFTV9QQ1AgfSwKKyAgeyAibmNwdSIsICJlbGZfbmNwdSIsICJuY3B1IiwgNCwgRU1fTkNQVSB9LAorICB7ICJuZHIxIiwgImVsZl9uZHIxIiwgIm5kcjEiLCA0LCBFTV9ORFIxIH0sCisgIHsgInN0YXJjb3JlIiwgImVsZl9zdGFyY29yZSIsICJzdGFyY29yZSIsIDgsIEVNX1NUQVJDT1JFIH0sCisgIHsgIm1lMTYiLCAiZWxmX21lMTYiLCAiZW0xNiIsIDQsIEVNX01FMTYgfSwKKyAgeyAic3QxMDAiLCAiZWxmX3N0MTAwIiwgInN0MTAwIiwgNSwgRU1fU1QxMDAgfSwKKyAgeyAidGlueWoiLCAiZWxmX3RpbnlqIiwgInRpbnlqIiwgNSwgRU1fVElOWUogfSwKKyAgeyAicGRzcCIsICJlbGZfcGRzcCIsICJwZHNwIiwgNCwgRU1fUERTUCB9LAorICB7ICJmeDY2IiwgImVsZl9meDY2IiwgImZ4NjYiLCA0LCBFTV9GWDY2IH0sCisgIHsgInN0OXBsdXMiLCAiZWxmX3N0OXBsdXMiLCAic3Q5cGx1cyIsIDcsIEVNX1NUOVBMVVMgfSwKKyAgeyAic3Q3IiwgImVsZl9zdDciLCAic3Q3IiwgMywgRU1fU1Q3IH0sCisgIHsgIm02OGsiLCAiZWxmXzY4aGMxNiIsICI2OGhjMTYiLCA2LCBFTV82OEhDMTYgfSwKKyAgeyAibTY4ayIsICJlbGZfNjhoYzExIiwgIjY4aGMxMSIsIDYsIEVNXzY4SEMxMSB9LAorICB7ICJtNjhrIiwgImVsZl82OGhjMDgiLCAiNjhoYzA4IiwgNiwgRU1fNjhIQzA4IH0sCisgIHsgIm02OGsiLCAiZWxmXzY4aGMwNSIsICI2OGhjMDUiLCA2LCBFTV82OEhDMDUgfSwKKyAgeyAic3Z4IiwgImVsZl9zdngiLCAic3Z4IiwgMywgRU1fU1ZYIH0sCisgIHsgInN0MTkiLCAiZWxmX3N0MTkiLCAic3QxOSIsIDQsIEVNX1NUMTkgfSwKKyAgeyAidmF4IiwgImVsZl92YXgiLCAidmF4IiwgMywgRU1fVkFYIH0sCisgIHsgImNyaXMiLCAiZWxmX2NyaXMiLCAiY3JpcyIsIDQsIEVNX0NSSVMgfSwKKyAgeyAiamF2ZWxpbiIsICJlbGZfamF2ZWxpbiIsICJqYXZlbGluIiwgNywgRU1fSkFWRUxJTiB9LAorICB7ICJmaXJlcGF0aCIsICJlbGZfZmlyZXBhdGgiLCAiZmlyZXBhdGgiLCA4LCBFTV9GSVJFUEFUSCB9LAorICB7ICJ6c3AiLCAiZWxmX3pzcCIsICJ6c3AiLCAzLCBFTV9aU1B9LAorICB7ICJtbWl4IiwgImVsZl9tbWl4IiwgIm1taXgiLCA0LCBFTV9NTUlYIH0sCisgIHsgImh1bmF5IiwgImVsZl9odWFueSIsICJodWFueSIsIDUsIEVNX0hVQU5ZIH0sCisgIHsgInByaXNtIiwgImVsZl9wcmlzbSIsICJwcmlzbSIsIDUsIEVNX1BSSVNNIH0sCisgIHsgImF2ciIsICJlbGZfYXZyIiwgImF2ciIsIDMsIEVNX0FWUiB9LAorICB7ICJmcjMwIiwgImVsZl9mcjMwIiwgImZyMzAiLCA0LCBFTV9GUjMwIH0sCisgIHsgImR2MTAiLCAiZWxmX2R2MTAiLCAiZHYxMCIsIDQsIEVNX0QxMFYgfSwKKyAgeyAiZHYzMCIsICJlbGZfZHYzMCIsICJkdjMwIiwgNCwgRU1fRDMwViB9LAorICB7ICJ2ODUwIiwgImVsZl92ODUwIiwgInY4NTAiLCA0LCBFTV9WODUwIH0sCisgIHsgIm0zMnIiLCAiZWxmX20zMnIiLCAibTMyciIsIDQsIEVNX00zMlIgfSwKKyAgeyAibW4xMDMwMCIsICJlbGZfbW4xMDMwMCIsICJtbjEwMzAwIiwgNywgRU1fTU4xMDMwMCB9LAorICB7ICJtbjEwMjAwIiwgImVsZl9tbjEwMjAwIiwgIm1uMTAyMDAiLCA3LCBFTV9NTjEwMjAwIH0sCisgIHsgInBqIiwgImVsZl9waiIsICJwaiIsIDIsIEVNX1BKIH0sCisgIHsgIm9wZW5yaXNjIiwgImVsZl9vcGVucmlzYyIsICJvcGVucmlzYyIsIDgsIEVNX09QRU5SSVNDIH0sCisgIHsgImFyYyIsICJlbGZfYXJjX2E1IiwgImFyY19hNSIsIDYsIEVNX0FSQ19BNSB9LAorICB7ICJ4dGVuc2EiLCAiZWxmX3h0ZW5zYSIsICJ4dGVuc2EiLCA2LCBFTV9YVEVOU0EgfSwKK307CisjZGVmaW5lIG5tYWNoaW5lcyAoc2l6ZW9mIChtYWNoaW5lcykgLyBzaXplb2YgKG1hY2hpbmVzWzBdKSkKKworCisvKiBEZWZhdWx0IGNhbGxiYWNrcy4gIE1vc3RseSB0aGV5IGp1c3QgcmV0dXJuIHRoZSBlcnJvciB2YWx1ZS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9vYmplY3RfdHlwZV9uYW1lIChpbnQgaWdub3JlLCBjaGFyICpidWYsCisJCQkJCSAgICAgc2l6ZV90IGxlbik7CitzdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9yZWxvY190eXBlX25hbWUgKGludCBpZ25vcmUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdGF0aWMgYm9vbCBkZWZhdWx0X3JlbG9jX3R5cGVfY2hlY2sgKGludCBpZ25vcmUpOworc3RhdGljIGJvb2wgZGVmYXVsdF9yZWxvY192YWxpZF91c2UgKEVsZiAqZWxmLCBpbnQgaWdub3JlKTsKK3N0YXRpYyBFbGZfVHlwZSBkZWZhdWx0X3JlbG9jX3NpbXBsZV90eXBlIChFbGYgKmVsZiwgaW50IGlnbm9yZSk7CitzdGF0aWMgYm9vbCBkZWZhdWx0X2dvdHBjX3JlbG9jX2NoZWNrIChFbGYgKmVsZiwgaW50IGlnbm9yZSk7CitzdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9zZWdtZW50X3R5cGVfbmFtZSAoaW50IGlnbm9yZSwgY2hhciAqYnVmLAorCQkJCQkgICAgICBzaXplX3QgbGVuKTsKK3N0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X3NlY3Rpb25fdHlwZV9uYW1lIChpbnQgaWdub3JlLCBjaGFyICpidWYsCisJCQkJCSAgICAgIHNpemVfdCBsZW4pOworc3RhdGljIGNvbnN0IGNoYXIgKmRlZmF1bHRfc2VjdGlvbl9uYW1lIChpbnQgaWdub3JlLCBpbnQgaWdub3JlMiwgY2hhciAqYnVmLAorCQkJCQkgc2l6ZV90IGxlbik7CitzdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9tYWNoaW5lX2ZsYWdfbmFtZSAoRWxmNjRfV29yZCAqaWdub3JlKTsKK3N0YXRpYyBib29sIGRlZmF1bHRfbWFjaGluZV9mbGFnX2NoZWNrIChFbGY2NF9Xb3JkIGZsYWdzKTsKK3N0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X3N5bWJvbF90eXBlX25hbWUgKGludCBpZ25vcmUsIGNoYXIgKmJ1ZiwKKwkJCQkJICAgICBzaXplX3QgbGVuKTsKK3N0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X3N5bWJvbF9iaW5kaW5nX25hbWUgKGludCBpZ25vcmUsIGNoYXIgKmJ1ZiwKKwkJCQkJCXNpemVfdCBsZW4pOworc3RhdGljIGNvbnN0IGNoYXIgKmRlZmF1bHRfZHluYW1pY190YWdfbmFtZSAoaW50NjRfdCBpZ25vcmUsIGNoYXIgKmJ1ZiwKKwkJCQkJICAgICBzaXplX3QgbGVuKTsKK3N0YXRpYyBib29sIGRlZmF1bHRfZHluYW1pY190YWdfY2hlY2sgKGludDY0X3QgaWdub3JlKTsKK3N0YXRpYyBHRWxmX1dvcmQgZGVmYXVsdF9zaF9mbGFnc19jb21iaW5lIChHRWxmX1dvcmQgZmxhZ3MxLCBHRWxmX1dvcmQgZmxhZ3MyKTsKK3N0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X29zYWJpX25hbWUgKGludCBpZ25vcmUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdGF0aWMgdm9pZCBkZWZhdWx0X2Rlc3RyIChzdHJ1Y3QgZWJsICppZ25vcmUpOworc3RhdGljIGNvbnN0IGNoYXIgKmRlZmF1bHRfY29yZV9ub3RlX3R5cGVfbmFtZSAodWludDMyX3QsIGNoYXIgKmJ1ZiwKKwkJCQkJCXNpemVfdCBsZW4pOworc3RhdGljIGNvbnN0IGNoYXIgKmRlZmF1bHRfb2JqZWN0X25vdGVfdHlwZV9uYW1lICh1aW50MzJfdCwgY2hhciAqYnVmLAorCQkJCQkJICBzaXplX3QgbGVuKTsKK3N0YXRpYyBib29sIGRlZmF1bHRfY29yZV9ub3RlIChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCB0eXBlLAorCQkJICAgICAgIHVpbnQzMl90IGRlc2NzeiwgY29uc3QgY2hhciAqZGVzYyk7CitzdGF0aWMgYm9vbCBkZWZhdWx0X29iamVjdF9ub3RlIChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCB0eXBlLAorCQkJCSB1aW50MzJfdCBkZXNjc3osIGNvbnN0IGNoYXIgKmRlc2MpOworc3RhdGljIGJvb2wgZGVmYXVsdF9kZWJ1Z3Njbl9wIChjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyBib29sIGRlZmF1bHRfY29weV9yZWxvY19wIChpbnQgcmVsb2MpOworCisKK3N0YXRpYyB2b2lkCitmaWxsX2RlZmF1bHRzIChFYmwgKnJlc3VsdCkKK3sKKyAgcmVzdWx0LT5vYmplY3RfdHlwZV9uYW1lID0gZGVmYXVsdF9vYmplY3RfdHlwZV9uYW1lOworICByZXN1bHQtPnJlbG9jX3R5cGVfbmFtZSA9IGRlZmF1bHRfcmVsb2NfdHlwZV9uYW1lOworICByZXN1bHQtPnJlbG9jX3R5cGVfY2hlY2sgPSBkZWZhdWx0X3JlbG9jX3R5cGVfY2hlY2s7CisgIHJlc3VsdC0+cmVsb2NfdmFsaWRfdXNlID0gZGVmYXVsdF9yZWxvY192YWxpZF91c2U7CisgIHJlc3VsdC0+cmVsb2Nfc2ltcGxlX3R5cGUgPSBkZWZhdWx0X3JlbG9jX3NpbXBsZV90eXBlOworICByZXN1bHQtPmdvdHBjX3JlbG9jX2NoZWNrID0gZGVmYXVsdF9nb3RwY19yZWxvY19jaGVjazsKKyAgcmVzdWx0LT5zZWdtZW50X3R5cGVfbmFtZSA9IGRlZmF1bHRfc2VnbWVudF90eXBlX25hbWU7CisgIHJlc3VsdC0+c2VjdGlvbl90eXBlX25hbWUgPSBkZWZhdWx0X3NlY3Rpb25fdHlwZV9uYW1lOworICByZXN1bHQtPnNlY3Rpb25fbmFtZSA9IGRlZmF1bHRfc2VjdGlvbl9uYW1lOworICByZXN1bHQtPm1hY2hpbmVfZmxhZ19uYW1lID0gZGVmYXVsdF9tYWNoaW5lX2ZsYWdfbmFtZTsKKyAgcmVzdWx0LT5tYWNoaW5lX2ZsYWdfY2hlY2sgPSBkZWZhdWx0X21hY2hpbmVfZmxhZ19jaGVjazsKKyAgcmVzdWx0LT5zeW1ib2xfdHlwZV9uYW1lID0gZGVmYXVsdF9zeW1ib2xfdHlwZV9uYW1lOworICByZXN1bHQtPnN5bWJvbF9iaW5kaW5nX25hbWUgPSBkZWZhdWx0X3N5bWJvbF9iaW5kaW5nX25hbWU7CisgIHJlc3VsdC0+ZHluYW1pY190YWdfbmFtZSA9IGRlZmF1bHRfZHluYW1pY190YWdfbmFtZTsKKyAgcmVzdWx0LT5keW5hbWljX3RhZ19jaGVjayA9IGRlZmF1bHRfZHluYW1pY190YWdfY2hlY2s7CisgIHJlc3VsdC0+c2hfZmxhZ3NfY29tYmluZSA9IGRlZmF1bHRfc2hfZmxhZ3NfY29tYmluZTsKKyAgcmVzdWx0LT5vc2FiaV9uYW1lID0gZGVmYXVsdF9vc2FiaV9uYW1lOworICByZXN1bHQtPmNvcmVfbm90ZV90eXBlX25hbWUgPSBkZWZhdWx0X2NvcmVfbm90ZV90eXBlX25hbWU7CisgIHJlc3VsdC0+b2JqZWN0X25vdGVfdHlwZV9uYW1lID0gZGVmYXVsdF9vYmplY3Rfbm90ZV90eXBlX25hbWU7CisgIHJlc3VsdC0+Y29yZV9ub3RlID0gZGVmYXVsdF9jb3JlX25vdGU7CisgIHJlc3VsdC0+b2JqZWN0X25vdGUgPSBkZWZhdWx0X29iamVjdF9ub3RlOworICByZXN1bHQtPmRlYnVnc2NuX3AgPSBkZWZhdWx0X2RlYnVnc2NuX3A7CisgIHJlc3VsdC0+Y29weV9yZWxvY19wID0gZGVmYXVsdF9jb3B5X3JlbG9jX3A7CisgIHJlc3VsdC0+ZGVzdHIgPSBkZWZhdWx0X2Rlc3RyOworfQorCisKKy8qIEZpbmQgYW4gYXBwcm9wcmlhdGUgYmFja2VuZCBmb3IgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIEVMRi4gICovCitzdGF0aWMgRWJsICoKK29wZW5iYWNrZW5kIChlbGYsIGVtdWxhdGlvbiwgbWFjaGluZSkKKyAgICAgRWxmICplbGY7CisgICAgIGNvbnN0IGNoYXIgKmVtdWxhdGlvbjsKKyAgICAgR0VsZl9IYWxmIG1hY2hpbmU7Cit7CisgIEVibCAqcmVzdWx0OworICBzaXplX3QgY250OworCisgIC8qIEZpcnN0IGFsbG9jYXRlIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHJlc3VsdC4gIFdlIGRvIHRoaXMKKyAgICAgaGVyZSBzaW5jZSB0aGlzIGFzc3VyZXMgdGhhdCB0aGUgc3RydWN0dXJlIGlzIGFsd2F5cyBsYXJnZQorICAgICBlbm91Z2guICAqLworICByZXN1bHQgPSAoRWJsICopIGNhbGxvYyAoMSwgc2l6ZW9mIChFYmwpKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8vIFhYWCB1bmNvbW1lbnQKKyAgICAgIC8vIF9fbGliZWJsX3NldGVycm9yIChFTEZfRV9OT01FTSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogRmlsbCBpbiB0aGUgZGVmYXVsdCBjYWxsYmFja3MuICBUaGUgaW5pdGlhbGl6ZXIgZm9yIHRoZSBtYWNoaW5lCisgICAgIHNwZWNpZmljIG1vZHVsZSBjYW4gb3ZlcndyaXRlIHRoZSB2YWx1ZXMuICAqLworICBmaWxsX2RlZmF1bHRzIChyZXN1bHQpOworCisgIC8qIFhYWCBDdXJyZW50bHkgYWxsIHdlIGRvIGlzIHRvIGxvb2sgYXQgJ2VfbWFjaGluZScgdmFsdWUgaW4gdGhlCisgICAgIEVMRiBoZWFkZXIuICBXaXRoIGFuIGludGVybmFsIG1hcHBpbmcgdGFibGUgZnJvbSBFTV8qIHZhbHVlIHRvCisgICAgIERTTyBuYW1lIHdlIHRyeSB0byBsb2FkIHRoZSBhcHByb3ByaWF0ZSBtb2R1bGUgdG8gaGFuZGxlIHRoaXMKKyAgICAgYmluYXJ5IHR5cGUuCisKKyAgICAgTXVsdGlwbGUgbW9kdWxlcyBmb3IgdGhlIHNhbWUgbWFjaGluZSB0eXBlIGFyZSBwb3NzaWJsZSBhbmQgdGhleQorICAgICB3aWxsIGJlIHRyaWVkIGluIHNlcXVlbmNlLiAgVGhlIGxvb2t1cCBwcm9jZXNzIHdpbGwgb25seSBzdG9wCisgICAgIHdoZW4gYSBtb2R1bGUgd2hpY2ggY2FuIGhhbmRsZSB0aGUgbWFjaGluZSB0eXBlIGlzIGZvdW5kIG9yIGFsbAorICAgICBhdmFpbGFibGUgbWF0Y2hpbmcgbW9kdWxlcyBhcmUgdHJpZWQuICAqLworICBmb3IgKGNudCA9IDA7IGNudCA8IG5tYWNoaW5lczsgKytjbnQpCisgICAgaWYgKChlbXVsYXRpb24gIT0gTlVMTCAmJiBzdHJjbXAgKGVtdWxhdGlvbiwgbWFjaGluZXNbY250XS5lbXVsYXRpb24pID09IDApCisJfHwgKGVtdWxhdGlvbiA9PSBOVUxMICYmIG1hY2hpbmVzW2NudF0uZW0gPT0gbWFjaGluZSkpCisgICAgICB7CisJLyogV2VsbCwgd2Uga25vdyB0aGUgZW11bGF0aW9uIG5hbWUgbm93LiAgKi8KKwlyZXN1bHQtPmVtdWxhdGlvbiA9IG1hY2hpbmVzW2NudF0uZW11bGF0aW9uOworCisjaWZuZGVmIExJQkVCTF9TVUJESVIKKyMgZGVmaW5lIExJQkVCTF9TVUJESVIgUEFDS0FHRQorI2VuZGlmCisjZGVmaW5lIE9SSUdJTkRJUiAiJE9SSUdJTi8uLi8kTElCLyIgTElCRUJMX1NVQkRJUiAiLyIKKworCS8qIEdpdmUgaXQgYSB0cnkuICBBdCBsZWFzdCB0aGUgbWFjaGluZSB0eXBlIG1hdGNoZXMuICBGaXJzdAorICAgICAgICAgICB0cnkgdG8gbG9hZCB0aGUgbW9kdWxlLiAgKi8KKwljaGFyIGRzb25hbWVbMTAwXTsKKwlzdHJjcHkgKHN0cGNweSAoc3RwY3B5IChkc29uYW1lLCBPUklHSU5ESVIgImxpYmVibF8iKSwKKwkJCW1hY2hpbmVzW2NudF0uZHNvbmFtZSksCisJCSIuc28iKTsKKworCXZvaWQgKmggPSBkbG9wZW4gKGRzb25hbWUsIFJUTERfTEFaWSk7CisJaWYgKGggPT0gTlVMTCkKKwkgIHsKKwkgICAgc3RyY3B5IChzdHBjcHkgKHN0cGNweSAoZHNvbmFtZSwgImxpYmVibF8iKSwKKwkJCSAgICBtYWNoaW5lc1tjbnRdLmRzb25hbWUpLAorCQkgICAgIi5zbyIpOworCSAgICBoID0gZGxvcGVuIChkc29uYW1lLCBSVExEX0xBWlkpOworCSAgfQorCisJICAvKiBUcnkgd2l0aG91dCBhbiBleHBsaWNpdCBwYXRoLiAgKi8KKwlpZiAoaCAhPSBOVUxMKQorCSAgeworCSAgICAvKiBXZSBtYW5hZ2VkIHRvIGxvYWQgdGhlIG9iamVjdC4gIE5vdyBzZWUgd2hldGhlciB0aGUKKwkgICAgICAgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gbGlrZXMgb3VyIGZpbGUuICAqLworCSAgICBzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSBNT0RWRVJTSU9OOworCSAgICBjb25zdCBjaGFyICptb2R2ZXJzaW9uOworCSAgICBlYmxfYmhpbml0X3QgaW5pdHA7CisJICAgIGNoYXIgc3ltbmFtZVttYWNoaW5lc1tjbnRdLnByZWZpeF9sZW4gKyBzaXplb2YgIl9pbml0Il07CisKKwkgICAgc3RyY3B5IChtZW1wY3B5IChzeW1uYW1lLCBtYWNoaW5lc1tjbnRdLnByZWZpeCwKKwkJCSAgICAgbWFjaGluZXNbY250XS5wcmVmaXhfbGVuKSwgIl9pbml0Iik7CisKKwkgICAgaW5pdHAgPSAoZWJsX2JoaW5pdF90KSBkbHN5bSAoaCwgc3ltbmFtZSk7CisJICAgIGlmIChpbml0cCAhPSBOVUxMCisJCSYmIChtb2R2ZXJzaW9uID0gaW5pdHAgKGVsZiwgbWFjaGluZSwgcmVzdWx0LCBzaXplb2YgKEVibCkpKQorCQkmJiBzdHJjbXAgKHZlcnNpb24sIG1vZHZlcnNpb24pID09IDApCisJICAgICAgeworCQkvKiBXZSBmb3VuZCBhIG1vZHVsZSB0byBoYW5kbGUgb3VyIGZpbGUuICAqLworCQlyZXN1bHQtPmRsaGFuZGxlID0gaDsKKwkJcmVzdWx0LT5lbGYgPSBlbGY7CisKKwkJLyogQSBmZXcgZW50cmllcyBhcmUgbWFuZGF0b3J5LiAgKi8KKwkJYXNzZXJ0IChyZXN1bHQtPm5hbWUgIT0gTlVMTCk7CisJCWFzc2VydCAocmVzdWx0LT5kZXN0ciAhPSBOVUxMKTsKKworCQlyZXR1cm4gcmVzdWx0OworCSAgICAgIH0KKworCSAgICAvKiBOb3QgdGhlIG1vZHVsZSB3ZSBuZWVkLiAgKi8KKwkgICAgKHZvaWQpIGRsY2xvc2UgKGgpOworCSAgfQorCisJLyogV2UgY2Fubm90IGZpbmQgYSBEU08gYnV0IHRoZSBlbXVsYXRpb24vbWFjaGluZSBJRCBtYXRjaGVzLgorCSAgIFJldHVybiB0aGF0IGluZm9ybWF0aW9uLiAgKi8KKwlyZXN1bHQtPmRsaGFuZGxlID0gTlVMTDsKKwlyZXN1bHQtPmVsZiA9IGVsZjsKKwlyZXN1bHQtPm5hbWUgPSBtYWNoaW5lc1tjbnRdLnByZWZpeDsKKwlmaWxsX2RlZmF1bHRzIChyZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKworICAvKiBOb3RoaW5nIG1hdGNoZWQuICBXZSB1c2Ugb25seSB0aGUgZGVmYXVsdCBjYWxsYmFja3MuICAgKi8KKyAgcmVzdWx0LT5kbGhhbmRsZSA9IE5VTEw7CisgIHJlc3VsdC0+ZWxmID0gZWxmOworICByZXN1bHQtPmVtdWxhdGlvbiA9ICI8dW5rbm93bj4iOworICByZXN1bHQtPm5hbWUgPSAiPHVua25vd24+IjsKKyAgZmlsbF9kZWZhdWx0cyAocmVzdWx0KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIEZpbmQgYW4gYXBwcm9wcmlhdGUgYmFja2VuZCBmb3IgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIEVMRi4gICovCitFYmwgKgorZWJsX29wZW5iYWNrZW5kIChlbGYpCisgICAgIEVsZiAqZWxmOworeworICBHRWxmX0VoZHIgZWhkcl9tZW07CisgIEdFbGZfRWhkciAqZWhkcjsKKworICAvKiBHZXQgdGhlIEVMRiBoZWFkZXIgb2YgdGhlIG9iamVjdC4gICovCisgIGVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICAvLyBYWFggdW5jb21tZW50CisgICAgICAvLyBfX2xpYmVibF9zZXRlcnJvciAoZWxmX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gb3BlbmJhY2tlbmQgKGVsZiwgTlVMTCwgZWhkci0+ZV9tYWNoaW5lKTsKK30KKworCisvKiBGaW5kIGJhY2tlbmQgd2l0aG91dCB1bmRlcmx5aW5nIEVMRiBmaWxlLiAgKi8KK0VibCAqCitlYmxfb3BlbmJhY2tlbmRfbWFjaGluZSAobWFjaGluZSkKKyAgICAgR0VsZl9IYWxmIG1hY2hpbmU7Cit7CisgIHJldHVybiBvcGVuYmFja2VuZCAoTlVMTCwgTlVMTCwgbWFjaGluZSk7Cit9CisKKworLyogRmluZCBiYWNrZW5kIHdpdGggZ2l2ZW4gZW11bGF0aW9uIG5hbWUuICAqLworRWJsICoKK2VibF9vcGVuYmFja2VuZF9lbXVsYXRpb24gKGNvbnN0IGNoYXIgKmVtdWxhdGlvbikKK3sKKyAgcmV0dXJuIG9wZW5iYWNrZW5kIChOVUxMLCBlbXVsYXRpb24sIEVNX05PTkUpOworfQorCisKKy8qIERlZmF1bHQgY2FsbGJhY2tzLiAgTW9zdGx5IHRoZXkganVzdCByZXR1cm4gdGhlIGVycm9yIHZhbHVlLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2RlZmF1bHRfb2JqZWN0X3R5cGVfbmFtZSAoaW50IGlnbm9yZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGVmYXVsdF9yZWxvY190eXBlX25hbWUgKGludCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgYm9vbAorZGVmYXVsdF9yZWxvY190eXBlX2NoZWNrIChpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbAorZGVmYXVsdF9yZWxvY192YWxpZF91c2UgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSBpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgRWxmX1R5cGUKK2RlZmF1bHRfcmVsb2Nfc2ltcGxlX3R5cGUgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgIGludCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICByZXR1cm4gRUxGX1RfTlVNOworfQorCitzdGF0aWMgYm9vbAorZGVmYXVsdF9nb3RwY19yZWxvY19jaGVjayAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgaW50IGlnbm9yZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGVmYXVsdF9zZWdtZW50X3R5cGVfbmFtZSAoaW50IGlnbm9yZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitkZWZhdWx0X3NlY3Rpb25fdHlwZV9uYW1lIChpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RlZmF1bHRfc2VjdGlvbl9uYW1lIChpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJICAgICAgaW50IGlnbm9yZTIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICAgICBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RlZmF1bHRfbWFjaGluZV9mbGFnX25hbWUgKEVsZjY0X1dvcmQgKmlnbm9yZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgYm9vbAorZGVmYXVsdF9tYWNoaW5lX2ZsYWdfY2hlY2sgKEVsZjY0X1dvcmQgZmxhZ3MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICByZXR1cm4gZmxhZ3MgPT0gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGVmYXVsdF9zeW1ib2xfdHlwZV9uYW1lIChpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitkZWZhdWx0X3N5bWJvbF9iaW5kaW5nX25hbWUgKGludCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgICBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RlZmF1bHRfZHluYW1pY190YWdfbmFtZSAoaW50NjRfdCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sCitkZWZhdWx0X2R5bmFtaWNfdGFnX2NoZWNrIChpbnQ2NF90IGlnbm9yZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIEdFbGZfV29yZAorZGVmYXVsdF9zaF9mbGFnc19jb21iaW5lIChHRWxmX1dvcmQgZmxhZ3MxLCBHRWxmX1dvcmQgZmxhZ3MyKQoreworICByZXR1cm4gU0hfRkxBR1NfQ09NQklORSAoZmxhZ3MxLCBmbGFnczIpOworfQorCitzdGF0aWMgdm9pZAorZGVmYXVsdF9kZXN0ciAoc3RydWN0IGVibCAqaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGVmYXVsdF9vc2FiaV9uYW1lIChpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJICAgIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RlZmF1bHRfY29yZV9ub3RlX3R5cGVfbmFtZSAodWludDMyX3QgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgICAgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitkZWZhdWx0X29iamVjdF9ub3RlX3R5cGVfbmFtZSAodWludDMyX3QgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgICAgICBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgICAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2wKK2RlZmF1bHRfY29yZV9ub3RlIChjb25zdCBjaGFyICpuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJICAgdWludDMyX3QgdHlwZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgIHVpbnQzMl90IGRlc2NzeiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgIGNvbnN0IGNoYXIgKmRlc2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2wKK2RlZmF1bHRfb2JqZWN0X25vdGUgKGNvbnN0IGNoYXIgKm5hbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICAgIHVpbnQzMl90IHR5cGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICAgIHVpbnQzMl90IGRlc2NzeiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgY29uc3QgY2hhciAqZGVzYyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgYm9vbAorZGVmYXVsdF9kZWJ1Z3Njbl9wIChjb25zdCBjaGFyICpuYW1lKQoreworICAvKiBXZSBrbm93IGJ5IGRlZmF1bHQgb25seSBhYm91dCB0aGUgRFdBUkYgZGVidWcgc2VjdGlvbnMgd2hpY2ggaGF2ZQorICAgICBmaXhlZCBuYW1lcy4gICovCisgIHN0YXRpYyBjb25zdCBjaGFyICpkd2FyZl9zY25fbmFtZXNbXSA9CisgICAgeworICAgICAgLyogRFdBUkYgMSAqLworICAgICAgIi5kZWJ1ZyIsCisgICAgICAiLmxpbmUiLAorICAgICAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAgICAgIi5kZWJ1Z19zcmNpbmZvIiwKKyAgICAgICIuZGVidWdfc2ZuYW1lcyIsCisgICAgICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgICAgICIuZGVidWdfYXJhbmdlcyIsCisgICAgICAiLmRlYnVnX3B1Ym5hbWVzIiwKKyAgICAgIC8qIERXQVJGIDIgKi8KKyAgICAgICIuZGVidWdfaW5mbyIsCisgICAgICAiLmRlYnVnX2FiYnJldiIsCisgICAgICAiLmRlYnVnX2xpbmUiLAorICAgICAgIi5kZWJ1Z19mcmFtZSIsCisgICAgICAiLmRlYnVnX3N0ciIsCisgICAgICAiLmRlYnVnX2xvYyIsCisgICAgICAiLmRlYnVnX21hY2luZm8iLAorICAgICAgLyogRFdBUkYgMyAqLworICAgICAgIi5kZWJ1Z19yYW5nZXMiLAorICAgICAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgICAgICAiLmRlYnVnX3dlYWtuYW1lcyIsCisgICAgICAiLmRlYnVnX2Z1bmNuYW1lcyIsCisgICAgICAiLmRlYnVnX3R5cGVuYW1lcyIsCisgICAgICAiLmRlYnVnX3Zhcm5hbWVzIgorICAgIH07CisgIGNvbnN0IHNpemVfdCBuZHdhcmZfc2NuX25hbWVzID0gKHNpemVvZiAoZHdhcmZfc2NuX25hbWVzKQorCQkJCSAgIC8gc2l6ZW9mIChkd2FyZl9zY25fbmFtZXNbMF0pKTsKKyAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbmR3YXJmX3Njbl9uYW1lczsgKytjbnQpCisgICAgaWYgKHN0cmNtcCAobmFtZSwgZHdhcmZfc2NuX25hbWVzW2NudF0pID09IDApCisgICAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sCitkZWZhdWx0X2NvcHlfcmVsb2NfcCAoaW50IHJlbG9jIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2VibG9zYWJpbmFtZS5jIGIvbGliZWJsL2VibG9zYWJpbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMWU2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvZWJsb3NhYmluYW1lLmMKQEAgLTAsMCArMSw2OSBAQAorLyogUmV0dXJuIE9TIEFCSSBuYW1lCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCitjb25zdCBjaGFyICoKK2VibF9vc2FiaV9uYW1lIChlYmwsIG9zYWJpLCBidWYsIGxlbikKKyAgICAgRWJsICplYmw7CisgICAgIGludCBvc2FiaTsKKyAgICAgY2hhciAqYnVmOworICAgICBzaXplX3QgbGVuOworeworICBjb25zdCBjaGFyICpyZXMgPSBlYmwgIT0gTlVMTCA/IGVibC0+b3NhYmlfbmFtZSAob3NhYmksIGJ1ZiwgbGVuKSA6IE5VTEw7CisKKyAgaWYgKHJlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChvc2FiaSA9PSBFTEZPU0FCSV9OT05FKQorCXJlcyA9ICJVTklYIC0gU3lzdGVtIFYiOworICAgICAgZWxzZSBpZiAob3NhYmkgPT0gRUxGT1NBQklfSFBVWCkKKwlyZXMgPSAiSFAvVVgiOworICAgICAgZWxzZSBpZiAob3NhYmkgPT0gRUxGT1NBQklfTkVUQlNEKQorCXJlcyA9ICJOZXRCU0QiOworICAgICAgZWxzZSBpZiAob3NhYmkgPT0gRUxGT1NBQklfTElOVVgpCisJcmVzID0gIkxpbnV4IjsKKyAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX1NPTEFSSVMpCisJcmVzID0gIlNvbGFyaXMiOworICAgICAgZWxzZSBpZiAob3NhYmkgPT0gRUxGT1NBQklfQUlYKQorCXJlcyA9ICJBSVgiOworICAgICAgZWxzZSBpZiAob3NhYmkgPT0gRUxGT1NBQklfSVJJWCkKKwlyZXMgPSAiSXJpeCI7CisgICAgICBlbHNlIGlmIChvc2FiaSA9PSBFTEZPU0FCSV9GUkVFQlNEKQorCXJlcyA9ICJGcmVlQlNEIjsKKyAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX1RSVTY0KQorCXJlcyA9ICJUUlU2NCI7CisgICAgICBlbHNlIGlmIChvc2FiaSA9PSBFTEZPU0FCSV9NT0RFU1RPKQorCXJlcyA9ICJNb2Rlc3RvIjsKKyAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX09QRU5CU0QpCisJcmVzID0gIk9wZW5CU0QiOworICAgICAgZWxzZSBpZiAob3NhYmkgPT0gRUxGT1NBQklfQVJNKQorCXJlcyA9ICJBcm0iOworICAgICAgZWxzZSBpZiAob3NhYmkgPT0gRUxGT1NBQklfU1RBTkRBTE9ORSkKKwlyZXMgPSBnZXR0ZXh0ICgiU3RhbmQgYWxvbmUiKTsKKyAgICAgIGVsc2UKKwl7CisJICBzbnByaW50ZiAoYnVmLCBsZW4sICIlczogJWQiLCBnZXR0ZXh0ICgiPHVua25vd24+IiksIG9zYWJpKTsKKworCSAgcmVzID0gYnVmOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxyZWxvY3NpbXBsZXR5cGUuYyBiL2xpYmVibC9lYmxyZWxvY3NpbXBsZXR5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTA0OGQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibHJlbG9jc2ltcGxldHlwZS5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIENoZWNrIHJlbG9jYXRpb24gdHlwZSBmb3Igc2ltcGxlIHR5cGVzLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworRWxmX1R5cGUKK2VibF9yZWxvY19zaW1wbGVfdHlwZSAoZWJsLCByZWxvYykKKyAgICAgRWJsICplYmw7CisgICAgIGludCByZWxvYzsKK3sKKyAgcmV0dXJuIGVibCAhPSBOVUxMID8gZWJsLT5yZWxvY19zaW1wbGVfdHlwZSAoZWJsLT5lbGYsIHJlbG9jKSA6IEVMRl9UX05VTTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxyZWxvY3R5cGVjaGVjay5jIGIvbGliZWJsL2VibHJlbG9jdHlwZWNoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmYmM2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxyZWxvY3R5cGVjaGVjay5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIENoZWNrIHJlbG9jYXRpb24gdHlwZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCitib29sCitlYmxfcmVsb2NfdHlwZV9jaGVjayAoZWJsLCByZWxvYykKKyAgICAgRWJsICplYmw7CisgICAgIGludCByZWxvYzsKK3sKKyAgcmV0dXJuIGVibCAhPSBOVUxMID8gZWJsLT5yZWxvY190eXBlX2NoZWNrIChyZWxvYykgOiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxyZWxvY3R5cGVuYW1lLmMgYi9saWJlYmwvZWJscmVsb2N0eXBlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYTk1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvZWJscmVsb2N0eXBlbmFtZS5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIFJldHVybiByZWxvY2F0aW9uIHR5cGUgbmFtZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK2NvbnN0IGNoYXIgKgorZWJsX3JlbG9jX3R5cGVfbmFtZSAoZWJsLCByZWxvYywgYnVmLCBsZW4pCisgICAgIEVibCAqZWJsOworICAgICBpbnQgcmVsb2M7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgc2l6ZV90IGxlbjsKK3sKKyAgY29uc3QgY2hhciAqcmVzOworCisgIHJlcyA9IGVibCAhPSBOVUxMID8gZWJsLT5yZWxvY190eXBlX25hbWUgKHJlbG9jLCBidWYsIGxlbikgOiBOVUxMOworICBpZiAocmVzID09IE5VTEwpCisgICAgLyogVGhlcmUgYXJlIG5vIGdlbmVyaWMgcmVsb2NhdGlvbiB0eXBlIG5hbWVzLiAgKi8KKyAgICByZXMgPSAiPz8/IjsKKworICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2VibHJlbG9jdmFsaWR1c2UuYyBiL2xpYmVibC9lYmxyZWxvY3ZhbGlkdXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4ODk4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxyZWxvY3ZhbGlkdXNlLmMKQEAgLTAsMCArMSwyOCBAQAorLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlIHVzZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCitib29sCitlYmxfcmVsb2NfdmFsaWRfdXNlIChlYmwsIHJlbG9jKQorICAgICBFYmwgKmVibDsKKyAgICAgaW50IHJlbG9jOworeworICByZXR1cm4gZWJsICE9IE5VTEwgPyBlYmwtPnJlbG9jX3ZhbGlkX3VzZSAoZWJsLT5lbGYsIHJlbG9jKSA6IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2VibHNlY3Rpb25uYW1lLmMgYi9saWJlYmwvZWJsc2VjdGlvbm5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgwMWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibHNlY3Rpb25uYW1lLmMKQEAgLTAsMCArMSw4MSBAQAorLyogUmV0dXJuIHNlY3Rpb24gbmFtZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK2NvbnN0IGNoYXIgKgorZWJsX3NlY3Rpb25fbmFtZSAoZWJsLCBzZWN0aW9uLCB4c2VjdGlvbiwgYnVmLCBsZW4sIHNjbm5hbWVzLCBzaG51bSkKKyAgICAgRWJsICplYmw7CisgICAgIGludCBzZWN0aW9uOworICAgICBpbnQgeHNlY3Rpb247CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgc2l6ZV90IGxlbjsKKyAgICAgY29uc3QgY2hhciAqc2NubmFtZXNbXTsKKyAgICAgc2l6ZV90IHNobnVtOworeworICBjb25zdCBjaGFyICpyZXMgPSBlYmwgIT0gTlVMTCA/IGVibC0+c2VjdGlvbl9uYW1lIChzZWN0aW9uLCB4c2VjdGlvbiwKKwkJCQkJCSAgICAgYnVmLCBsZW4pIDogTlVMTDsKKworICBpZiAocmVzID09IE5VTEwpCisgICAgeworICAgICAgaWYgKHNlY3Rpb24gPT0gU0hOX1VOREVGKQorCXJlcyA9ICJVTkRFRiI7CisgICAgICBlbHNlIGlmIChzZWN0aW9uID09IFNITl9BQlMpCisJcmVzID0gIkFCUyI7CisgICAgICBlbHNlIGlmIChzZWN0aW9uID09IFNITl9DT01NT04pCisJcmVzID0gIkNPTU1PTiI7CisgICAgICBlbHNlIGlmIChzZWN0aW9uID09IFNITl9CRUZPUkUpCisJcmVzID0gIkJFRk9SRSI7CisgICAgICBlbHNlIGlmIChzZWN0aW9uID09IFNITl9BRlRFUikKKwlyZXMgPSAiQUZURVIiOworICAgICAgZWxzZSBpZiAoKHNlY3Rpb24gPCBTSE5fTE9SRVNFUlZFIHx8IHNlY3Rpb24gPT0gU0hOX1hJTkRFWCkKKwkgICAgICAgJiYgKHNpemVfdCkgc2VjdGlvbiA8IHNobnVtKQorCXsKKwkgIGludCBpZHggPSBzZWN0aW9uICE9IFNITl9YSU5ERVggPyBzZWN0aW9uIDogeHNlY3Rpb247CisKKwkgIGlmIChzY25uYW1lcyAhPSBOVUxMKQorCSAgICByZXMgPSBzY25uYW1lc1tpZHhdOworCSAgZWxzZQorCSAgICB7CisJICAgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiJWQiLCBpZHgpOworCSAgICAgIHJlcyA9IGJ1ZjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBIYW5kbGUgT1Mtc3BlY2lmaWMgc2VjdGlvbiBuYW1lcy4gICovCisJICBpZiAoc2VjdGlvbiA9PSBTSE5fWElOREVYKQorCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICIlczogJWQiLCAiWElOREVYIiwgeHNlY3Rpb24pOworCSAgZWxzZSBpZiAoc2VjdGlvbiA+PSBTSE5fTE9PUyAmJiBzZWN0aW9uIDw9IFNITl9ISU9TKQorCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICJMT09TKyV4Iiwgc2VjdGlvbiAtIFNITl9MT09TKTsKKwkgIC8qIEhhbmRsZSBwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiBuYW1lcy4gICovCisJICBlbHNlIGlmIChzZWN0aW9uID49IFNITl9MT1BST0MgJiYgc2VjdGlvbiA8PSBTSE5fSElQUk9DKQorCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICJMT1BST0MrJXgiLCBzZWN0aW9uIC0gU0hOX0xPUFJPQyk7CisJICBlbHNlIGlmIChzZWN0aW9uID49IFNITl9MT1JFU0VSVkUgJiYgc2VjdGlvbiA8PSBTSE5fSElSRVNFUlZFKQorCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICJMT1JFU0VSVkUrJXgiLCBzZWN0aW9uIC0gU0hOX0xPUkVTRVJWRSk7CisJICBlbHNlCisJICAgIHNucHJpbnRmIChidWYsIGxlbiwgIiVzOiAlZCIsIGdldHRleHQgKCI8dW5rbm93bj4iKSwgc2VjdGlvbik7CisKKwkgIHJlcyA9IGJ1ZjsKKwl9CisgICAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsc2VjdGlvbnN0cmlwcC5jIGIvbGliZWJsL2VibHNlY3Rpb25zdHJpcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2EyMmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibHNlY3Rpb25zdHJpcHAuYwpAQCAtMCwwICsxLDUyIEBACisvKiBDaGVjayB3aGV0aGVyIHNlY3Rpb24gY2FuIGJlIHN0cmlwcGVkLgorICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsaWJlYmxQLmgiCisKKworYm9vbAorZWJsX3NlY3Rpb25fc3RyaXBfcCAoRWJsICplYmwsIGNvbnN0IEdFbGZfRWhkciAqZWhkciwgY29uc3QgR0VsZl9TaGRyICpzaGRyLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgcmVtb3ZlX2NvbW1lbnQsCisJCSAgICAgYm9vbCBvbmx5X3JlbW92ZV9kZWJ1ZykKK3sKKyAgLyogSWYgb25seSBkZWJ1ZyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBjaGVjayB0aGUgbmFtZS4gIFRoZXJlCisgICAgIGlzIHVuZm9ydHVuYXRlbHkgbm8gb3RoZXIgd2F5LiAgKi8KKyAgaWYgKHVubGlrZWx5IChvbmx5X3JlbW92ZV9kZWJ1ZykpCisgICAgeworICAgICAgaWYgKGVibF9kZWJ1Z3Njbl9wIChlYmwsIG5hbWUpKQorCXJldHVybiB0cnVlOworCisgICAgICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSB8fCBzaGRyLT5zaF90eXBlID09IFNIVF9SRUwpCisJeworCSAgRWxmX1NjbiAqc2NuX2wgPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgKHNoZHIpLT5zaF9pbmZvKTsKKwkgIEdFbGZfU2hkciBzaGRyX21lbV9sOworCSAgR0VsZl9TaGRyICpzaGRyX2wgPSBnZWxmX2dldHNoZHIgKHNjbl9sLCAmc2hkcl9tZW1fbCk7CisJICBpZiAoc2hkcl9sID09IE5VTEwpCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpzX2wgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgZWhkci0+ZV9zaHN0cm5keCwKKwkJCQkJICAgIHNoZHJfbC0+c2hfbmFtZSk7CisJICAgICAgaWYgKHNfbCAhPSBOVUxMICYmIGVibF9kZWJ1Z3Njbl9wIChlYmwsIHNfbCkpCisJCXJldHVybiB0cnVlOworCSAgICB9CisJfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiBTRUNUSU9OX1NUUklQX1AgKHNoZHIsIG5hbWUsIHJlbW92ZV9jb21tZW50KTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxzZWN0aW9udHlwZW5hbWUuYyBiL2xpYmVibC9lYmxzZWN0aW9udHlwZW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjg1N2FjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibHNlY3Rpb250eXBlbmFtZS5jCkBAIC0wLDAgKzEsMTAzIEBACisvKiBSZXR1cm4gc2VjdGlvbiB0eXBlIG5hbWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCitjb25zdCBjaGFyICoKK2VibF9zZWN0aW9uX3R5cGVfbmFtZSAoZWJsLCBzZWN0aW9uLCBidWYsIGxlbikKKyAgICAgRWJsICplYmw7CisgICAgIGludCBzZWN0aW9uOworICAgICBjaGFyICpidWY7CisgICAgIHNpemVfdCBsZW47Cit7CisgIGNvbnN0IGNoYXIgKnJlcyA9IGVibC0+c2VjdGlvbl90eXBlX25hbWUgKHNlY3Rpb24sIGJ1ZiwgbGVuKTsKKworICBpZiAocmVzID09IE5VTEwpCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtub3dudHlwZXNbXSA9CisJeworI2RlZmluZSBLTk9XTlNUWVBFKG5hbWUpIFtTSFRfIyNuYW1lXSA9ICNuYW1lCisJICBLTk9XTlNUWVBFIChOVUxMKSwKKwkgIEtOT1dOU1RZUEUgKFBST0dCSVRTKSwKKwkgIEtOT1dOU1RZUEUgKFNZTVRBQiksCisJICBLTk9XTlNUWVBFIChTVFJUQUIpLAorCSAgS05PV05TVFlQRSAoUkVMQSksCisJICBLTk9XTlNUWVBFIChIQVNIKSwKKwkgIEtOT1dOU1RZUEUgKERZTkFNSUMpLAorCSAgS05PV05TVFlQRSAoTk9URSksCisJICBLTk9XTlNUWVBFIChOT0JJVFMpLAorCSAgS05PV05TVFlQRSAoUkVMKSwKKwkgIEtOT1dOU1RZUEUgKFNITElCKSwKKwkgIEtOT1dOU1RZUEUgKERZTlNZTSksCisJICBLTk9XTlNUWVBFIChJTklUX0FSUkFZKSwKKwkgIEtOT1dOU1RZUEUgKEZJTklfQVJSQVkpLAorCSAgS05PV05TVFlQRSAoUFJFSU5JVF9BUlJBWSksCisJICBLTk9XTlNUWVBFIChHUk9VUCksCisJICBLTk9XTlNUWVBFIChTWU1UQUJfU0hORFgpCisJfTsKKworICAgICAgLyogSGFuZGxlIHN0YW5kYXJkIG5hbWVzLiAgKi8KKyAgICAgIGlmICgoc2l6ZV90KSBzZWN0aW9uIDwgc2l6ZW9mIChrbm93bnR5cGVzKSAvIHNpemVvZiAoa25vd250eXBlc1swXSkKKwkgICYmIGtub3dudHlwZXNbc2VjdGlvbl0gIT0gTlVMTCkKKwlyZXMgPSBrbm93bnR5cGVzW3NlY3Rpb25dOworICAgICAgLyogVGhlIHN5bWJvbCB2ZXJzaW9uaW5nL1N1biBleHRlbnNpb25zLiAgKi8KKyAgICAgIGVsc2UgaWYgKHNlY3Rpb24gPj0gU0hUX0xPU1VOVyAmJiBzZWN0aW9uIDw9IFNIVF9ISVNVTlcpCisJeworCSAgc3RhdGljIGNvbnN0IGNoYXIgKnN1bnd0eXBlc1tdID0KKwkgICAgeworI3VuZGVmIEtOT1dOU1RZUEUKKyNkZWZpbmUgS05PV05TVFlQRShuYW1lKSBbU0hUXyMjbmFtZSAtIFNIVF9MT1NVTlddID0gI25hbWUKKwkgICAgICBLTk9XTlNUWVBFIChTVU5XX21vdmUpLAorCSAgICAgIEtOT1dOU1RZUEUgKFNVTldfQ09NREFUKSwKKwkgICAgICBLTk9XTlNUWVBFIChTVU5XX3N5bWluZm8pLAorCSAgICAgIEtOT1dOU1RZUEUgKEdOVV92ZXJkZWYpLAorCSAgICAgIEtOT1dOU1RZUEUgKEdOVV92ZXJuZWVkKSwKKwkgICAgICBLTk9XTlNUWVBFIChHTlVfdmVyc3ltKQorCSAgICB9OworCSAgcmVzID0gc3Vud3R5cGVzW3NlY3Rpb24gLSBTSFRfTE9TVU5XXTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogQSBmZXcgR05VIGFkZGl0aW9ucy4gICovCisJICBpZiAoc2VjdGlvbiA9PSBTSFRfQ0hFQ0tTVU0pCisJICAgIHJlcyA9ICJDSEVDS1NVTSI7CisJICBlbHNlIGlmIChzZWN0aW9uID09IFNIVF9HTlVfTElCTElTVCkKKwkgICAgcmVzID0gIkdOVV9MSUJMSVNUIjsKKwkgIC8qIEhhbmRsZSBPUy1zcGVjaWZpYyBzZWN0aW9uIG5hbWVzLiAgKi8KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChzZWN0aW9uID49IFNIVF9MT09TICYmIHNlY3Rpb24gPD0gU0hUX0hJT1MpCisJCXNucHJpbnRmIChidWYsIGxlbiwgIlNIVF9MT09TKyV4Iiwgc2VjdGlvbiAtIFNIVF9MT09TKTsKKwkgICAgICAvKiBIYW5kbGUgcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gbmFtZXMuICAqLworCSAgICAgIGVsc2UgaWYgKHNlY3Rpb24gPj0gU0hUX0xPUFJPQyAmJiBzZWN0aW9uIDw9IFNIVF9ISVBST0MpCisJCXNucHJpbnRmIChidWYsIGxlbiwgIlNIVF9MT1BST0MrJXgiLCBzZWN0aW9uIC0gU0hUX0xPUFJPQyk7CisJICAgICAgZWxzZSBpZiAoKHVuc2lnbmVkIGludCkgc2VjdGlvbiA+PSBTSFRfTE9VU0VSCisJCSAgICAgICAmJiAodW5zaWduZWQgaW50KSBzZWN0aW9uIDw9IFNIVF9ISVVTRVIpCisJCXNucHJpbnRmIChidWYsIGxlbiwgIlNIVF9MT1VTRVIrJXgiLCBzZWN0aW9uIC0gU0hUX0xPVVNFUik7CisJICAgICAgZWxzZQorCQlzbnByaW50ZiAoYnVmLCBsZW4sICIlczogJWQiLCBnZXR0ZXh0ICgiPHVua25vd24+IiksIHNlY3Rpb24pOworCisJICAgICAgcmVzID0gYnVmOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL2VibHNlZ21lbnR0eXBlbmFtZS5jIGIvbGliZWJsL2VibHNlZ21lbnR0eXBlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OWYwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvZWJsc2VnbWVudHR5cGVuYW1lLmMKQEAgLTAsMCArMSw3NSBAQAorLyogUmV0dXJuIHNlZ21lbnQgdHlwZSBuYW1lLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworY29uc3QgY2hhciAqCitlYmxfc2VnbWVudF90eXBlX25hbWUgKGVibCwgc2VnbWVudCwgYnVmLCBsZW4pCisgICAgIEVibCAqZWJsOworICAgICBpbnQgc2VnbWVudDsKKyAgICAgY2hhciAqYnVmOworICAgICBzaXplX3QgbGVuOworeworICBjb25zdCBjaGFyICpyZXM7CisKKyAgcmVzID0gZWJsICE9IE5VTEwgPyBlYmwtPnNlZ21lbnRfdHlwZV9uYW1lIChzZWdtZW50LCBidWYsIGxlbikgOiBOVUxMOworICBpZiAocmVzID09IE5VTEwpCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnB0eXBlc1tQVF9OVU1dID0KKwl7CisjZGVmaW5lIFBUWVBFKG5hbWUpIFtQVF8jI25hbWVdID0gI25hbWUKKwkgIFBUWVBFIChOVUxMKSwKKwkgIFBUWVBFIChMT0FEKSwKKwkgIFBUWVBFIChEWU5BTUlDKSwKKwkgIFBUWVBFIChJTlRFUlApLAorCSAgUFRZUEUgKE5PVEUpLAorCSAgUFRZUEUgKFNITElCKSwKKwkgIFBUWVBFIChQSERSKSwKKwkgIFBUWVBFIChUTFMpCisJfTsKKworICAgICAgLyogSXMgaXQgb25lIG9mIHRoZSBzdGFuZGFyZCBzZWdtZW50IHR5cGVzPyAgKi8KKyAgICAgIGlmIChzZWdtZW50ID49IFBUX05VTEwgJiYgc2VnbWVudCA8IFBUX05VTSkKKwlyZXMgPSBwdHlwZXNbc2VnbWVudF07CisgICAgICBlbHNlIGlmIChzZWdtZW50ID09IFBUX0dOVV9FSF9GUkFNRSkKKwlyZXMgPSAiR05VX0VIX0ZSQU1FIjsKKyAgICAgIGVsc2UgaWYgKHNlZ21lbnQgPT0gUFRfR05VX1NUQUNLKQorCXJlcyA9ICJHTlVfU1RBQ0siOworICAgICAgZWxzZSBpZiAoc2VnbWVudCA9PSBQVF9HTlVfUkVMUk8pCisJcmVzID0gIkdOVV9SRUxSTyI7CisgICAgICBlbHNlIGlmIChzZWdtZW50ID09IFBUX1NVTldCU1MpCisJcmVzID0gIlNVTldCU1MiOworICAgICAgZWxzZSBpZiAoc2VnbWVudCA9PSBQVF9TVU5XU1RBQ0spCisJcmVzID0gIlNVTldTVEFDSyI7CisgICAgICBlbHNlCisJeworCSAgaWYgKHNlZ21lbnQgPj0gUFRfTE9PUyAmJiBzZWdtZW50IDw9IFBUX0hJT1MpCisJICAgIHNucHJpbnRmIChidWYsIGxlbiwgIkxPT1MrJWQiLCBzZWdtZW50IC0gUFRfTE9PUyk7CisJICBlbHNlIGlmIChzZWdtZW50ID49IFBUX0xPUFJPQyAmJiBzZWdtZW50IDw9IFBUX0hJUFJPQykKKwkgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiTE9QUk9DKyVkIiwgc2VnbWVudCAtIFBUX0xPUFJPQyk7CisJICBlbHNlCisJICAgIHNucHJpbnRmIChidWYsIGxlbiwgIiVzOiAlZCIsIGdldHRleHQgKCI8dW5rbm93bj4iKSwgc2VnbWVudCk7CisKKwkgIHJlcyA9IGJ1ZjsKKwl9CisgICAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsc2hmbGFnc2NvbWJpbmUuYyBiL2xpYmVibC9lYmxzaGZsYWdzY29tYmluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZGNmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvZWJsc2hmbGFnc2NvbWJpbmUuYwpAQCAtMCwwICsxLDI5IEBACisvKiBSZXR1cm4gY29tYmluZXMgc2VjdGlvbiBoZWFkZXIgZmxhZ3MgdmFsdWUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworR0VsZl9Xb3JkCitlYmxfc2hfZmxhZ3NfY29tYmluZSAoZWJsLCBmbGFnczEsIGZsYWdzMikKKyAgICAgRWJsICplYmw7CisgICAgIEdFbGZfV29yZCBmbGFnczE7CisgICAgIEdFbGZfV29yZCBmbGFnczI7Cit7CisgIHJldHVybiBlYmwtPnNoX2ZsYWdzX2NvbWJpbmUgKGZsYWdzMSwgZmxhZ3MyKTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxzdHJ0YWIuYyBiL2xpYmVibC9lYmxzdHJ0YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjU5MDlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2VibHN0cnRhYi5jCkBAIC0wLDAgKzEsMzM3IEBACisvKiBFTEYgc3RyaW5nIHRhYmxlIGhhbmRsaW5nLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgImxpYmVibC5oIgorI2luY2x1ZGUgPHN5c3RlbS5oPgorCisjaWZuZGVmIE1JTgorIyBkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKworCitzdHJ1Y3QgRWJsX1N0cmVudAoreworICBjb25zdCBjaGFyICpzdHJpbmc7CisgIHNpemVfdCBsZW47CisgIHN0cnVjdCBFYmxfU3RyZW50ICpuZXh0OworICBzdHJ1Y3QgRWJsX1N0cmVudCAqbGVmdDsKKyAgc3RydWN0IEVibF9TdHJlbnQgKnJpZ2h0OworICBzaXplX3Qgb2Zmc2V0OworICBjaGFyIHJldmVyc2VbMF07Cit9OworCisKK3N0cnVjdCBtZW1vcnlibG9jaworeworICBzdHJ1Y3QgbWVtb3J5YmxvY2sgKm5leHQ7CisgIGNoYXIgbWVtb3J5WzBdOworfTsKKworCitzdHJ1Y3QgRWJsX1N0cnRhYgoreworICBzdHJ1Y3QgRWJsX1N0cmVudCAqcm9vdDsKKyAgc3RydWN0IG1lbW9yeWJsb2NrICptZW1vcnk7CisgIGNoYXIgKmJhY2twOworICBzaXplX3QgbGVmdDsKKyAgc2l6ZV90IHRvdGFsOworICBib29sIG51bGxzdHI7CisKKyAgc3RydWN0IEVibF9TdHJlbnQgbnVsbDsKK307CisKKworLyogQ2FjaGUgZm9yIHRoZSBwYWdlc2l6ZS4gIFdlIGNvcnJlY3QgdGhpcyB2YWx1ZSBhIGJpdCBzbyB0aGF0IGBtYWxsb2MnCisgICBpcyBub3QgYWxsb2NhdGluZyBtb3JlIHRoYW4gYSBwYWdlLiAgKi8KK3N0YXRpYyBzaXplX3QgcHM7CisKKworc3RydWN0IEVibF9TdHJ0YWIgKgorZWJsX3N0cnRhYmluaXQgKGJvb2wgbnVsbHN0cikKK3sKKyAgaWYgKHBzID09IDApCisgICAgeworICAgICAgcHMgPSBzeXNjb25mIChfU0NfUEFHRVNJWkUpIC0gMiAqIHNpemVvZiAodm9pZCAqKTsKKyAgICAgIGFzc2VydCAoc2l6ZW9mIChzdHJ1Y3QgbWVtb3J5YmxvY2spIDwgcHMpOworICAgIH0KKworICBzdHJ1Y3QgRWJsX1N0cnRhYiAqcmV0CisgICAgPSAoc3RydWN0IEVibF9TdHJ0YWIgKikgY2FsbG9jICgxLCBzaXplb2YgKHN0cnVjdCBFYmxfU3RydGFiKSk7CisgIGlmIChyZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXQtPm51bGxzdHIgPSBudWxsc3RyOworCisgICAgICBpZiAobnVsbHN0cikKKwl7CisJICByZXQtPm51bGwubGVuID0gMTsKKwkgIHJldC0+bnVsbC5zdHJpbmcgPSAiIjsKKwl9CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludAorbW9yZW1lbW9yeSAoc3RydWN0IEVibF9TdHJ0YWIgKnN0LCBzaXplX3QgbGVuKQoreworICBpZiAobGVuIDwgcHMpCisgICAgbGVuID0gcHM7CisKKyAgc3RydWN0IG1lbW9yeWJsb2NrICpuZXdtZW0gPSAoc3RydWN0IG1lbW9yeWJsb2NrICopIG1hbGxvYyAobGVuKTsKKyAgaWYgKG5ld21lbSA9PSBOVUxMKQorICAgIHJldHVybiAxOworCisgIG5ld21lbS0+bmV4dCA9IHN0LT5tZW1vcnk7CisgIHN0LT5tZW1vcnkgPSBuZXdtZW07CisgIHN0LT5iYWNrcCA9IG5ld21lbS0+bWVtb3J5OworICBzdC0+bGVmdCA9IGxlbiAtIG9mZnNldG9mIChzdHJ1Y3QgbWVtb3J5YmxvY2ssIG1lbW9yeSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZAorZWJsX3N0cnRhYmZyZWUgKHN0cnVjdCBFYmxfU3RydGFiICpzdCkKK3sKKyAgc3RydWN0IG1lbW9yeWJsb2NrICptYiA9IHN0LT5tZW1vcnk7CisKKyAgd2hpbGUgKG1iICE9IE5VTEwpCisgICAgeworICAgICAgdm9pZCAqb2xkID0gbWI7CisgICAgICBtYiA9IG1iLT5uZXh0OworICAgICAgZnJlZSAob2xkKTsKKyAgICB9CisKKyAgZnJlZSAoc3QpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgRWJsX1N0cmVudCAqCituZXdzdHJpbmcgKHN0cnVjdCBFYmxfU3RydGFiICpzdCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKQoreworICAvKiBDb21wdXRlIHRoZSBhbW91bnQgb2YgcGFkZGluZyBuZWVkZWQgdG8gbWFrZSB0aGUgc3RydWN0dXJlIGFsaWduZWQuICAqLworICBzaXplX3QgYWxpZ24gPSAoKF9fYWxpZ25vZl9fIChzdHJ1Y3QgRWJsX1N0cmVudCkKKwkJICAgLSAoKCh1aW50cHRyX3QpIHN0LT5iYWNrcCkKKwkJICAgICAgJiAoX19hbGlnbm9mX18gKHN0cnVjdCBFYmxfU3RyZW50KSAtIDEpKSkKKwkJICAmIChfX2FsaWdub2ZfXyAoc3RydWN0IEVibF9TdHJlbnQpIC0gMSkpOworCisgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB0aGUgbWVtb3J5IGJsb2NrLiAgKi8KKyAgaWYgKHN0LT5sZWZ0IDwgYWxpZ24gKyBzaXplb2YgKHN0cnVjdCBFYmxfU3RyZW50KSArIGxlbikKKyAgICB7CisgICAgICBpZiAobW9yZW1lbW9yeSAoc3QsIHNpemVvZiAoc3RydWN0IEVibF9TdHJlbnQpICsgbGVuKSkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgYWxpZ24gPSAwOworICAgIH0KKworICAvKiBDcmVhdGUgdGhlIHJlc2VydmVkIHN0cmluZy4gICovCisgIHN0cnVjdCBFYmxfU3RyZW50ICpuZXdzdHIgPSAoc3RydWN0IEVibF9TdHJlbnQgKikgKHN0LT5iYWNrcCArIGFsaWduKTsKKyAgbmV3c3RyLT5zdHJpbmcgPSBzdHI7CisgIG5ld3N0ci0+bGVuID0gbGVuOworICBuZXdzdHItPm5leHQgPSBOVUxMOworICBuZXdzdHItPmxlZnQgPSBOVUxMOworICBuZXdzdHItPnJpZ2h0ID0gTlVMTDsKKyAgbmV3c3RyLT5vZmZzZXQgPSAwOworICBmb3IgKGludCBpID0gbGVuIC0gMjsgaSA+PSAwOyAtLWkpCisgICAgbmV3c3RyLT5yZXZlcnNlW2ldID0gc3RyW2xlbiAtIDIgLSBpXTsKKyAgbmV3c3RyLT5yZXZlcnNlW2xlbiAtIDFdID0gJ1wwJzsKKyAgc3QtPmJhY2twICs9IGFsaWduICsgc2l6ZW9mIChzdHJ1Y3QgRWJsX1N0cmVudCkgKyBsZW47CisgIHN0LT5sZWZ0IC09IGFsaWduICsgc2l6ZW9mIChzdHJ1Y3QgRWJsX1N0cmVudCkgKyBsZW47CisKKyAgcmV0dXJuIG5ld3N0cjsKK30KKworCisvKiBYWFggVGhpcyBmdW5jdGlvbiBzaG91bGQgZGVmaW5pdGVseSBiZSByZXdyaXR0ZW4gdG8gdXNlIGEgYmFsYW5jaW5nCisgICB0cmVlIGFsZ29yaXRoIChBVkwsIHJlZC1ibGFjayB0cmVlcykuICBGb3Igbm93IGEgc2ltcGxlLCBjb3JyZWN0CisgICBpbXBsZW1lbnRhdGlvbiBpcyBlbm91Z2guICAqLworc3RhdGljIHN0cnVjdCBFYmxfU3RyZW50ICoqCitzZWFyY2hzdHJpbmcgKHN0cnVjdCBFYmxfU3RyZW50ICoqc2VwLCBzdHJ1Y3QgRWJsX1N0cmVudCAqbmV3c3RyKQoreworICAvKiBNb3JlIHN0cmluZ3M/ICAqLworICBpZiAoKnNlcCA9PSBOVUxMKQorICAgIHsKKyAgICAgICpzZXAgPSBuZXdzdHI7CisgICAgICByZXR1cm4gc2VwOworICAgIH0KKworICAvKiBDb21wYXJlIHRoZSBzdHJpbmdzLiAgKi8KKyAgaW50IGNtcHJlcyA9IG1lbWNtcCAoKCpzZXApLT5yZXZlcnNlLCBuZXdzdHItPnJldmVyc2UsCisJCSAgICAgICBNSU4gKCgqc2VwKS0+bGVuLCBuZXdzdHItPmxlbikgLSAxKTsKKyAgaWYgKGNtcHJlcyA9PSAwKQorICAgIC8qIFdlIGZvdW5kIGEgbWF0Y2hpbmcgc3RyaW5nLiAgKi8KKyAgICByZXR1cm4gc2VwOworICBlbHNlIGlmIChjbXByZXMgPiAwKQorICAgIHJldHVybiBzZWFyY2hzdHJpbmcgKCYoKnNlcCktPmxlZnQsIG5ld3N0cik7CisgIGVsc2UKKyAgICByZXR1cm4gc2VhcmNoc3RyaW5nICgmKCpzZXApLT5yaWdodCwgbmV3c3RyKTsKK30KKworCisvKiBBZGQgbmV3IHN0cmluZy4gIFRoZSBhY3R1YWwgc3RyaW5nIGlzIGFzc3VtZWQgdG8gYmUgcGVybWFuZW50LiAgKi8KK3N0cnVjdCBFYmxfU3RyZW50ICoKK2VibF9zdHJ0YWJhZGQgKHN0cnVjdCBFYmxfU3RydGFiICpzdCwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKQoreworICAvKiBDb21wdXRlIHRoZSBzdHJpbmcgbGVuZ3RoIGlmIHRoZSBjYWxsZXIgZG9lc24ndCBrbm93IGl0LiAgKi8KKyAgaWYgKGxlbiA9PSAwKQorICAgIGxlbiA9IHN0cmxlbiAoc3RyKSArIDE7CisKKyAgLyogTWFrZSBzdXJlIGFsbCAiIiBzdHJpbmdzIGdldCBvZmZzZXQgMCBidXQgb25seSBpZiB0aGUgdGFibGUgd2FzCisgICAgIGNyZWF0ZWQgd2l0aCBhIHNwZWNpYWwgbnVsbCBlbnRyeSBpbiBtaW5kLiAgKi8KKyAgaWYgKGxlbiA9PSAxICYmIHN0LT5udWxsLnN0cmluZyAhPSBOVUxMKQorICAgIHJldHVybiAmc3QtPm51bGw7CisKKyAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbmV3IHN0cmluZyBhbmQgaXRzIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24uICAqLworICBzdHJ1Y3QgRWJsX1N0cmVudCAqbmV3c3RyID0gbmV3c3RyaW5nIChzdCwgc3RyLCBsZW4pOworICBpZiAobmV3c3RyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogU2VhcmNoIGluIHRoZSBhcnJheSBmb3IgdGhlIHBsYWNlIHRvIGluc2VydCB0aGUgc3RyaW5nLiAgSWYgdGhlcmUKKyAgICAgaXMgbm8gc3RyaW5nIHdpdGggbWF0Y2hpbmcgcHJlZml4IGFuZCBubyBzdHJpbmcgd2l0aCBtYXRjaGluZworICAgICBsZWFkaW5nIHN1YnN0cmluZywgY3JlYXRlIGEgbmV3IGVudHJ5LiAgKi8KKyAgc3RydWN0IEVibF9TdHJlbnQgKipzZXAgPSBzZWFyY2hzdHJpbmcgKCZzdC0+cm9vdCwgbmV3c3RyKTsKKyAgaWYgKCpzZXAgIT0gbmV3c3RyKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgbm90IHRoZSBzYW1lIGVudHJ5LiAgVGhpcyBtZWFucyB3ZSBoYXZlIGEgcHJlZml4IG1hdGNoLiAgKi8KKyAgICAgIGlmICgoKnNlcCktPmxlbiA+IG5ld3N0ci0+bGVuKQorCXsKKwkgIC8qIENoZWNrIHdoZXRoZXIgd2UgYWxyZWFkeSBrbm93IHRoaXMgc3RyaW5nLiAgKi8KKwkgIGZvciAoc3RydWN0IEVibF9TdHJlbnQgKnN1YnMgPSAoKnNlcCktPm5leHQ7IHN1YnMgIT0gTlVMTDsKKwkgICAgICAgc3VicyA9IHN1YnMtPm5leHQpCisJICAgIGlmIChzdWJzLT5sZW4gPT0gbmV3c3RyLT5sZW4pCisJICAgICAgeworCQkvKiBXZSBoYXZlIGFuIGV4YWN0IG1hdGNoIHdpdGggYSBzdWJzdHJpbmcuICBGcmVlIHRoZSBtZW1vcnkKKwkJICAgd2UgYWxsb2NhdGVkLiAgKi8KKwkJc3QtPmxlZnQgKz0gc3QtPmJhY2twIC0gKGNoYXIgKikgbmV3c3RyOworCQlzdC0+YmFja3AgPSAoY2hhciAqKSBuZXdzdHI7CisKKwkJcmV0dXJuIHN1YnM7CisJICAgICAgfQorCisJICAvKiBXZSBoYXZlIGEgbmV3IHN1YnN0cmluZy4gIFRoaXMgbWVhbnMgd2UgZG9uJ3QgbmVlZCB0aGUgcmV2ZXJzZQorCSAgICAgc3RyaW5nIG9mIHRoaXMgZW50cnkgYW55bW9yZS4gICovCisJICBzdC0+YmFja3AgLT0gbmV3c3RyLT5sZW47CisJICBzdC0+bGVmdCArPSBuZXdzdHItPmxlbjsKKworCSAgbmV3c3RyLT5uZXh0ID0gKCpzZXApLT5uZXh0OworCSAgKCpzZXApLT5uZXh0ID0gbmV3c3RyOworCX0KKyAgICAgIGVsc2UgaWYgKCgqc2VwKS0+bGVuICE9IG5ld3N0ci0+bGVuKQorCXsKKwkgIC8qIFdoZW4gd2UgZ2V0IGhlcmUgaXQgbWVhbnMgdGhhdCB0aGUgc3RyaW5nIHdlIGFyZSBhYm91dCB0bworCSAgICAgYWRkIGhhcyBhIGNvbW1vbiBwcmVmaXggd2l0aCBhIHN0cmluZyB3ZSBhbHJlYWR5IGhhdmUgYnV0CisJICAgICBpdCBpcyBsb25nZXIuICBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgaXQgZmlyc3QuICAqLworCSAgc3QtPnRvdGFsICs9IG5ld3N0ci0+bGVuIC0gKCpzZXApLT5sZW47CisJICBuZXdzdHItPm5leHQgPSAqc2VwOworCSAgbmV3c3RyLT5sZWZ0ID0gKCpzZXApLT5sZWZ0OworCSAgbmV3c3RyLT5yaWdodCA9ICgqc2VwKS0+cmlnaHQ7CisJICAqc2VwID0gbmV3c3RyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBoYXZlIGFuIGV4YWN0IG1hdGNoLiAgRnJlZSB0aGUgbWVtb3J5IHdlIGFsbG9jYXRlZC4gICovCisJICBzdC0+bGVmdCArPSBzdC0+YmFja3AgLSAoY2hhciAqKSBuZXdzdHI7CisJICBzdC0+YmFja3AgPSAoY2hhciAqKSBuZXdzdHI7CisKKwkgIG5ld3N0ciA9ICpzZXA7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHN0LT50b3RhbCArPSBuZXdzdHItPmxlbjsKKworICByZXR1cm4gbmV3c3RyOworfQorCisKK3N0YXRpYyB2b2lkCitjb3B5c3RyaW5ncyAoc3RydWN0IEVibF9TdHJlbnQgKm5vZGVwLCBjaGFyICoqZnJlZXAsIHNpemVfdCAqb2Zmc2V0cCkKK3sKKyAgaWYgKG5vZGVwLT5sZWZ0ICE9IE5VTEwpCisgICAgY29weXN0cmluZ3MgKG5vZGVwLT5sZWZ0LCBmcmVlcCwgb2Zmc2V0cCk7CisKKyAgLyogUHJvY2VzcyB0aGUgY3VycmVudCBub2RlLiAgKi8KKyAgbm9kZXAtPm9mZnNldCA9ICpvZmZzZXRwOworICAqZnJlZXAgPSAoY2hhciAqKSBtZW1wY3B5ICgqZnJlZXAsIG5vZGVwLT5zdHJpbmcsIG5vZGVwLT5sZW4pOworICAqb2Zmc2V0cCArPSBub2RlcC0+bGVuOworCisgIGZvciAoc3RydWN0IEVibF9TdHJlbnQgKnN1YnMgPSBub2RlcC0+bmV4dDsgc3VicyAhPSBOVUxMOyBzdWJzID0gc3Vicy0+bmV4dCkKKyAgICB7CisgICAgICBhc3NlcnQgKHN1YnMtPmxlbiA8IG5vZGVwLT5sZW4pOworICAgICAgc3Vicy0+b2Zmc2V0ID0gbm9kZXAtPm9mZnNldCArIG5vZGVwLT5sZW4gLSBzdWJzLT5sZW47CisgICAgICBhc3NlcnQgKHN1YnMtPm9mZnNldCAhPSAwIHx8IHN1YnMtPnN0cmluZ1swXSA9PSAnXDAnKTsKKyAgICB9CisKKyAgaWYgKG5vZGVwLT5yaWdodCAhPSBOVUxMKQorICAgIGNvcHlzdHJpbmdzIChub2RlcC0+cmlnaHQsIGZyZWVwLCBvZmZzZXRwKTsKK30KKworCit2b2lkCitlYmxfc3RydGFiZmluYWxpemUgKHN0cnVjdCBFYmxfU3RydGFiICpzdCwgRWxmX0RhdGEgKmRhdGEpCit7CisgIHNpemVfdCBudWxsbGVuID0gc3QtPm51bGxzdHIgPyAxIDogMDsKKworICAvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbi4gICovCisgIGRhdGEtPmRfYnVmID0gbWFsbG9jIChzdC0+dG90YWwgKyBudWxsbGVuKTsKKyAgaWYgKGRhdGEtPmRfYnVmID09IE5VTEwpCisgICAgYWJvcnQgKCk7CisKKyAgLyogVGhlIGZpcnN0IGJ5dGUgbXVzdCBhbHdheXMgYmUgemVybyBpZiB3ZSBjcmVhdGVkIHRoZSB0YWJsZSB3aXRoIGEKKyAgICAgbnVsbCBzdHJpbmcuICAqLworICBpZiAoc3QtPm51bGxzdHIpCisgICAgKigoY2hhciAqKSBkYXRhLT5kX2J1ZikgPSAnXDAnOworCisgIGRhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7CisgIGRhdGEtPmRfc2l6ZSA9IHN0LT50b3RhbCArIG51bGxsZW47CisgIGRhdGEtPmRfb2ZmID0gMDsKKyAgZGF0YS0+ZF9hbGlnbiA9IDE7CisgIGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7CisKKyAgLyogTm93IHJ1biB0aHJvdWdoIHRoZSB0cmVlIGFuZCBhZGQgYWxsIHRoZSBzdHJpbmcgd2hpbGUgYWxzbyB1cGRhdGluZworICAgICB0aGUgb2Zmc2V0IG1lbWJlcnMgb2YgdGhlIGVsZnN0cmVudCByZWNvcmRzLiAgKi8KKyAgY2hhciAqZW5kcCA9IChjaGFyICopIGRhdGEtPmRfYnVmICsgbnVsbGxlbjsKKyAgc2l6ZV90IGNvcHlsZW4gPSBudWxsbGVuOworICBjb3B5c3RyaW5ncyAoc3QtPnJvb3QsICZlbmRwLCAmY29weWxlbik7CisgIGFzc2VydCAoY29weWxlbiA9PSBzdC0+dG90YWwgKyBudWxsbGVuKTsKK30KKworCitzaXplX3QKK2VibF9zdHJ0YWJvZmZzZXQgKHN0cnVjdCBFYmxfU3RyZW50ICpzZSkKK3sKKyAgcmV0dXJuIHNlLT5vZmZzZXQ7Cit9CisKKworY29uc3QgY2hhciAqCitlYmxfc3RyaW5nIChzdHJ1Y3QgRWJsX1N0cmVudCAqc2UpCit7CisgIGFzc2VydCAoc2UtPnN0cmluZyAhPSBOVUxMKTsKKworICByZXR1cm4gc2UtPnN0cmluZzsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmxzeW1ib2xiaW5kaW5nbmFtZS5jIGIvbGliZWJsL2VibHN5bWJvbGJpbmRpbmduYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjZDI1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9lYmxzeW1ib2xiaW5kaW5nbmFtZS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qIFJldHVybiBzeW1ib2wgYmluZGluZyBuYW1lLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworY29uc3QgY2hhciAqCitlYmxfc3ltYm9sX2JpbmRpbmdfbmFtZSAoZWJsLCBiaW5kaW5nLCBidWYsIGxlbikKKyAgICAgRWJsICplYmw7CisgICAgIGludCBiaW5kaW5nOworICAgICBjaGFyICpidWY7CisgICAgIHNpemVfdCBsZW47Cit7CisgIGNvbnN0IGNoYXIgKnJlczsKKworICByZXMgPSBlYmwgIT0gTlVMTCA/IGVibC0+c3ltYm9sX3R5cGVfbmFtZSAoYmluZGluZywgYnVmLCBsZW4pIDogTlVMTDsKKyAgaWYgKHJlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdGJfbmFtZXNbU1RCX05VTV0gPQorCXsKKwkgICJMT0NBTCIsICJHTE9CQUwiLCAiV0VBSyIKKwl9OworCisgICAgICAvKiBTdGFuZGFyZCBiaW5kaW5nPyAgKi8KKyAgICAgIGlmIChiaW5kaW5nIDwgU1RCX05VTSkKKwlyZXMgPSBzdGJfbmFtZXNbYmluZGluZ107CisgICAgICBlbHNlCisJeworCSAgaWYgKGJpbmRpbmcgPj0gU1RCX0xPUFJPQyAmJiBiaW5kaW5nIDw9IFNUQl9ISVBST0MpCisJICAgIHNucHJpbnRmIChidWYsIGxlbiwgIkxPUFJPQyslZCIsIGJpbmRpbmcgLSBTVEJfTE9QUk9DKTsKKwkgIGVsc2UgaWYgKGJpbmRpbmcgPj0gU1RCX0xPT1MgJiYgYmluZGluZyA8PSBTVEJfSElPUykKKwkgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiTE9PUyslZCIsIGJpbmRpbmcgLSBTVEJfTE9PUyk7CisJICBlbHNlCisJICAgIHNucHJpbnRmIChidWYsIGxlbiwgZ2V0dGV4dCAoIjx1bmtub3duPjogJWQiKSwgYmluZGluZyk7CisKKwkgIHJlcyA9IGJ1ZjsKKwl9CisgICAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvZWJsc3ltYm9sdHlwZW5hbWUuYyBiL2xpYmVibC9lYmxzeW1ib2x0eXBlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWFlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvZWJsc3ltYm9sdHlwZW5hbWUuYwpAQCAtMCwwICsxLDYzIEBACisvKiBSZXR1cm4gc3ltYm9sIHR5cGUgbmFtZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKK2NvbnN0IGNoYXIgKgorZWJsX3N5bWJvbF90eXBlX25hbWUgKGVibCwgc3ltYm9sLCBidWYsIGxlbikKKyAgICAgRWJsICplYmw7CisgICAgIGludCBzeW1ib2w7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgc2l6ZV90IGxlbjsKK3sKKyAgY29uc3QgY2hhciAqcmVzOworCisgIHJlcyA9IGVibCAhPSBOVUxMID8gZWJsLT5zeW1ib2xfdHlwZV9uYW1lIChzeW1ib2wsIGJ1ZiwgbGVuKSA6IE5VTEw7CisgIGlmIChyZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgY2hhciAqc3R0X25hbWVzW1NUVF9OVU1dID0KKwl7CisJICBbU1RUX05PVFlQRV0gPSAiTk9UWVBFIiwKKwkgIFtTVFRfT0JKRUNUXSA9ICJPQkpFQ1QiLAorCSAgW1NUVF9GVU5DXSA9ICJGVU5DIiwKKwkgIFtTVFRfU0VDVElPTl0gPSAiU0VDVElPTiIsCisJICBbU1RUX0ZJTEVdID0gIkZJTEUiLAorCSAgW1NUVF9DT01NT05dID0gIkNPTU1PTiIsCisJICBbU1RUX1RMU10gPSAiVExTIgorCX07CisKKyAgICAgIC8qIFN0YW5kYXJkIHR5cGU/ICAqLworICAgICAgaWYgKHN5bWJvbCA8IFNUVF9OVU0pCisJcmVzID0gc3R0X25hbWVzW3N5bWJvbF07CisgICAgICBlbHNlCisJeworCSAgaWYgKHN5bWJvbCA+PSBTVFRfTE9QUk9DICYmIHN5bWJvbCA8PSBTVFRfSElQUk9DKQorCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICJMT1BST0MrJWQiLCBzeW1ib2wgLSBTVFRfTE9QUk9DKTsKKwkgIGVsc2UgaWYgKHN5bWJvbCA+PSBTVFRfTE9PUyAmJiBzeW1ib2wgPD0gU1RUX0hJT1MpCisJICAgIHNucHJpbnRmIChidWYsIGxlbiwgIkxPT1MrJWQiLCBzeW1ib2wgLSBTVFRfTE9PUyk7CisJICBlbHNlCisJICAgIHNucHJpbnRmIChidWYsIGxlbiwgZ2V0dGV4dCAoIjx1bmtub3duPjogJWQiKSwgc3ltYm9sKTsKKworCSAgcmVzID0gYnVmOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9lYmx3c3RydGFiLmMgYi9saWJlYmwvZWJsd3N0cnRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjBjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvZWJsd3N0cnRhYi5jCkBAIC0wLDAgKzEsMzQ0IEBACisvKiBFTEYgc3RyaW5nIHRhYmxlIGhhbmRsaW5nLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx3Y2hhci5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisjaW5jbHVkZSAibGliZWJsLmgiCisjaW5jbHVkZSA8c3lzdGVtLmg+CisKKyNpZm5kZWYgTUlOCisjIGRlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisKK3N0cnVjdCBFYmxfV1N0cmVudAoreworICBjb25zdCB3Y2hhcl90ICpzdHJpbmc7CisgIHNpemVfdCBsZW47CisgIHN0cnVjdCBFYmxfV1N0cmVudCAqbmV4dDsKKyAgc3RydWN0IEVibF9XU3RyZW50ICpsZWZ0OworICBzdHJ1Y3QgRWJsX1dTdHJlbnQgKnJpZ2h0OworICBzaXplX3Qgb2Zmc2V0OworICB3Y2hhcl90IHJldmVyc2VbMF07Cit9OworCisKK3N0cnVjdCBtZW1vcnlibG9jaworeworICBzdHJ1Y3QgbWVtb3J5YmxvY2sgKm5leHQ7CisgIGNoYXIgbWVtb3J5WzBdOworfTsKKworCitzdHJ1Y3QgRWJsX1dTdHJ0YWIKK3sKKyAgc3RydWN0IEVibF9XU3RyZW50ICpyb290OworICBzdHJ1Y3QgbWVtb3J5YmxvY2sgKm1lbW9yeTsKKyAgY2hhciAqYmFja3A7CisgIHNpemVfdCBsZWZ0OworICBzaXplX3QgdG90YWw7CisgIGJvb2wgbnVsbHN0cjsKKworICBzdHJ1Y3QgRWJsX1dTdHJlbnQgbnVsbDsKK307CisKKworLyogQ2FjaGUgZm9yIHRoZSBwYWdlc2l6ZS4gIFdlIGNvcnJlY3QgdGhpcyB2YWx1ZSBhIGJpdCBzbyB0aGF0IGBtYWxsb2MnCisgICBpcyBub3QgYWxsb2NhdGluZyBtb3JlIHRoYW4gYSBwYWdlLiAgKi8KK3N0YXRpYyBzaXplX3QgcHM7CisKKworc3RydWN0IEVibF9XU3RydGFiICoKK2VibF93c3RydGFiaW5pdCAoYm9vbCBudWxsc3RyKQoreworICBzdHJ1Y3QgRWJsX1dTdHJ0YWIgKnJldDsKKworICBpZiAocHMgPT0gMCkKKyAgICB7CisgICAgICBwcyA9IHN5c2NvbmYgKF9TQ19QQUdFU0laRSkgLSAyICogc2l6ZW9mICh2b2lkICopOworICAgICAgYXNzZXJ0IChzaXplb2YgKHN0cnVjdCBtZW1vcnlibG9jaykgPCBwcyk7CisgICAgfQorCisgIHJldCA9IChzdHJ1Y3QgRWJsX1dTdHJ0YWIgKikgY2FsbG9jICgxLCBzaXplb2YgKHN0cnVjdCBFYmxfV1N0cnRhYikpOworICBpZiAocmV0ICE9IE5VTEwpCisgICAgeworICAgICAgcmV0LT5udWxsc3RyID0gbnVsbHN0cjsKKyAgICAgIGlmIChudWxsc3RyKQorCXsKKwkgIHJldC0+bnVsbC5sZW4gPSAxOworCSAgcmV0LT5udWxsLnN0cmluZyA9IEwiIjsKKwl9CisgICAgfQorICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQKK21vcmVtZW1vcnkgKHN0cnVjdCBFYmxfV1N0cnRhYiAqc3QsIHNpemVfdCBsZW4pCit7CisgIHN0cnVjdCBtZW1vcnlibG9jayAqbmV3bWVtOworCisgIGlmIChsZW4gPCBwcykKKyAgICBsZW4gPSBwczsKKyAgbmV3bWVtID0gKHN0cnVjdCBtZW1vcnlibG9jayAqKSBtYWxsb2MgKGxlbik7CisgIGlmIChuZXdtZW0gPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKworICBuZXdtZW0tPm5leHQgPSBzdC0+bWVtb3J5OworICBzdC0+bWVtb3J5ID0gbmV3bWVtOworICBzdC0+YmFja3AgPSBuZXdtZW0tPm1lbW9yeTsKKyAgc3QtPmxlZnQgPSBsZW4gLSBvZmZzZXRvZiAoc3RydWN0IG1lbW9yeWJsb2NrLCBtZW1vcnkpOworCisgIHJldHVybiAwOworfQorCisKK3ZvaWQKK2VibF93c3RydGFiZnJlZSAoc3RydWN0IEVibF9XU3RydGFiICpzdCkKK3sKKyAgc3RydWN0IG1lbW9yeWJsb2NrICptYiA9IHN0LT5tZW1vcnk7CisKKyAgd2hpbGUgKG1iICE9IE5VTEwpCisgICAgeworICAgICAgdm9pZCAqb2xkID0gbWI7CisgICAgICBtYiA9IG1iLT5uZXh0OworICAgICAgZnJlZSAob2xkKTsKKyAgICB9CisKKyAgZnJlZSAoc3QpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgRWJsX1dTdHJlbnQgKgorbmV3c3RyaW5nIChzdHJ1Y3QgRWJsX1dTdHJ0YWIgKnN0LCBjb25zdCB3Y2hhcl90ICpzdHIsIHNpemVfdCBsZW4pCit7CisgIHN0cnVjdCBFYmxfV1N0cmVudCAqbmV3c3RyOworICBzaXplX3QgYWxpZ247CisgIGludCBpOworCisgIC8qIENvbXB1dGUgdGhlIGFtb3VudCBvZiBwYWRkaW5nIG5lZWRlZCB0byBtYWtlIHRoZSBzdHJ1Y3R1cmUgYWxpZ25lZC4gICovCisgIGFsaWduID0gKChfX2FsaWdub2ZfXyAoc3RydWN0IEVibF9XU3RyZW50KQorCSAgICAtICgoKHVpbnRwdHJfdCkgc3QtPmJhY2twKQorCSAgICAgICAmIChfX2FsaWdub2ZfXyAoc3RydWN0IEVibF9XU3RyZW50KSAtIDEpKSkKKwkgICAmIChfX2FsaWdub2ZfXyAoc3RydWN0IEVibF9XU3RyZW50KSAtIDEpKTsKKworICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gdGhlIG1lbW9yeSBibG9jay4gICovCisgIGlmIChzdC0+bGVmdCA8IGFsaWduICsgc2l6ZW9mIChzdHJ1Y3QgRWJsX1dTdHJlbnQpICsgbGVuICogc2l6ZW9mICh3Y2hhcl90KSkKKyAgICB7CisgICAgICBpZiAobW9yZW1lbW9yeSAoc3QsCisJCSAgICAgIHNpemVvZiAoc3RydWN0IEVibF9XU3RyZW50KSArIGxlbiAqIHNpemVvZiAod2NoYXJfdCkpKQorCXJldHVybiBOVUxMOworCisgICAgICBhbGlnbiA9IDA7CisgICAgfQorCisgIC8qIENyZWF0ZSB0aGUgcmVzZXJ2ZWQgc3RyaW5nLiAgKi8KKyAgbmV3c3RyID0gKHN0cnVjdCBFYmxfV1N0cmVudCAqKSAoc3QtPmJhY2twICsgYWxpZ24pOworICBuZXdzdHItPnN0cmluZyA9IHN0cjsKKyAgbmV3c3RyLT5sZW4gPSBsZW47CisgIG5ld3N0ci0+bmV4dCA9IE5VTEw7CisgIG5ld3N0ci0+bGVmdCA9IE5VTEw7CisgIG5ld3N0ci0+cmlnaHQgPSBOVUxMOworICBuZXdzdHItPm9mZnNldCA9IDA7CisgIGZvciAoaSA9IGxlbiAtIDI7IGkgPj0gMDsgLS1pKQorICAgIG5ld3N0ci0+cmV2ZXJzZVtpXSA9IHN0cltsZW4gLSAyIC0gaV07CisgIG5ld3N0ci0+cmV2ZXJzZVtsZW4gLSAxXSA9IEwnXDAnOworICBzdC0+YmFja3AgKz0gYWxpZ24gKyBzaXplb2YgKHN0cnVjdCBFYmxfV1N0cmVudCkgKyBsZW4gKiBzaXplb2YgKHdjaGFyX3QpOworICBzdC0+bGVmdCAtPSBhbGlnbiArIHNpemVvZiAoc3RydWN0IEVibF9XU3RyZW50KSArIGxlbiAqIHNpemVvZiAod2NoYXJfdCk7CisKKyAgcmV0dXJuIG5ld3N0cjsKK30KKworCisvKiBYWFggVGhpcyBmdW5jdGlvbiBzaG91bGQgZGVmaW5pdGVseSBiZSByZXdyaXR0ZW4gdG8gdXNlIGEgYmFsYW5jaW5nCisgICB0cmVlIGFsZ29yaXRoIChBVkwsIHJlZC1ibGFjayB0cmVlcykuICBGb3Igbm93IGEgc2ltcGxlLCBjb3JyZWN0CisgICBpbXBsZW1lbnRhdGlvbiBpcyBlbm91Z2guICAqLworc3RhdGljIHN0cnVjdCBFYmxfV1N0cmVudCAqKgorc2VhcmNoc3RyaW5nIChzdHJ1Y3QgRWJsX1dTdHJlbnQgKipzZXAsIHN0cnVjdCBFYmxfV1N0cmVudCAqbmV3c3RyKQoreworICBpbnQgY21wcmVzOworCisgIC8qIE1vcmUgc3RyaW5ncz8gICovCisgIGlmICgqc2VwID09IE5VTEwpCisgICAgeworICAgICAgKnNlcCA9IG5ld3N0cjsKKyAgICAgIHJldHVybiBzZXA7CisgICAgfQorCisgIC8qIENvbXBhcmUgdGhlIHN0cmluZ3MuICAqLworICBjbXByZXMgPSB3bWVtY21wICgoKnNlcCktPnJldmVyc2UsIG5ld3N0ci0+cmV2ZXJzZSwKKwkJICAgIE1JTiAoKCpzZXApLT5sZW4sIG5ld3N0ci0+bGVuKSAtIDEpOworICBpZiAoY21wcmVzID09IDApCisgICAgLyogV2UgZm91bmQgYSBtYXRjaGluZyBzdHJpbmcuICAqLworICAgIHJldHVybiBzZXA7CisgIGVsc2UgaWYgKGNtcHJlcyA+IDApCisgICAgcmV0dXJuIHNlYXJjaHN0cmluZyAoJigqc2VwKS0+bGVmdCwgbmV3c3RyKTsKKyAgZWxzZQorICAgIHJldHVybiBzZWFyY2hzdHJpbmcgKCYoKnNlcCktPnJpZ2h0LCBuZXdzdHIpOworfQorCisKKy8qIEFkZCBuZXcgc3RyaW5nLiAgVGhlIGFjdHVhbCBzdHJpbmcgaXMgYXNzdW1lZCB0byBiZSBwZXJtYW5lbnQuICAqLworc3RydWN0IEVibF9XU3RyZW50ICoKK2VibF93c3RydGFiYWRkIChzdHJ1Y3QgRWJsX1dTdHJ0YWIgKnN0LCBjb25zdCB3Y2hhcl90ICpzdHIsIHNpemVfdCBsZW4pCit7CisgIHN0cnVjdCBFYmxfV1N0cmVudCAqbmV3c3RyOworICBzdHJ1Y3QgRWJsX1dTdHJlbnQgKipzZXA7CisKKyAgLyogQ29tcHV0ZSB0aGUgc3RyaW5nIGxlbmd0aCBpZiB0aGUgY2FsbGVyIGRvZXNuJ3Qga25vdyBpdC4gICovCisgIGlmIChsZW4gPT0gMCkKKyAgICBsZW4gPSB3Y3NsZW4gKHN0cikgKyAxOworCisgIC8qIE1ha2Ugc3VyZSBhbGwgIiIgc3RyaW5ncyBnZXQgb2Zmc2V0IDAgYnV0IG9ubHkgaWYgdGhlIHRhYmxlIHdhcworICAgICBjcmVhdGVkIHdpdGggYSBzcGVjaWFsIG51bGwgZW50cnkgaW4gbWluZC4gICovCisgIGlmIChsZW4gPT0gMSAmJiBzdC0+bnVsbC5zdHJpbmcgIT0gTlVMTCkKKyAgICByZXR1cm4gJnN0LT5udWxsOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG5ldyBzdHJpbmcgYW5kIGl0cyBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLiAgKi8KKyAgbmV3c3RyID0gbmV3c3RyaW5nIChzdCwgc3RyLCBsZW4pOworICBpZiAobmV3c3RyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogU2VhcmNoIGluIHRoZSBhcnJheSBmb3IgdGhlIHBsYWNlIHRvIGluc2VydCB0aGUgc3RyaW5nLiAgSWYgdGhlcmUKKyAgICAgaXMgbm8gc3RyaW5nIHdpdGggbWF0Y2hpbmcgcHJlZml4IGFuZCBubyBzdHJpbmcgd2l0aCBtYXRjaGluZworICAgICBsZWFkaW5nIHN1YnN0cmluZywgY3JlYXRlIGEgbmV3IGVudHJ5LiAgKi8KKyAgc2VwID0gc2VhcmNoc3RyaW5nICgmc3QtPnJvb3QsIG5ld3N0cik7CisgIGlmICgqc2VwICE9IG5ld3N0cikKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBlbnRyeS4gIFRoaXMgbWVhbnMgd2UgaGF2ZSBhIHByZWZpeCBtYXRjaC4gICovCisgICAgICBpZiAoKCpzZXApLT5sZW4gPiBuZXdzdHItPmxlbikKKwl7CisJICBzdHJ1Y3QgRWJsX1dTdHJlbnQgKnN1YnM7CisKKwkgIC8qIENoZWNrIHdoZXRoZXIgd2UgYWxyZWFkeSBrbm93IHRoaXMgc3RyaW5nLiAgKi8KKwkgIGZvciAoc3VicyA9ICgqc2VwKS0+bmV4dDsgc3VicyAhPSBOVUxMOyBzdWJzID0gc3Vicy0+bmV4dCkKKwkgICAgaWYgKHN1YnMtPmxlbiA9PSBuZXdzdHItPmxlbikKKwkgICAgICB7CisJCS8qIFdlIGhhdmUgYW4gZXhhY3QgbWF0Y2ggd2l0aCBhIHN1YnN0cmluZy4gIEZyZWUgdGhlIG1lbW9yeQorCQkgICB3ZSBhbGxvY2F0ZWQuICAqLworCQlzdC0+bGVmdCArPSBzdC0+YmFja3AgLSAoY2hhciAqKSBuZXdzdHI7CisJCXN0LT5iYWNrcCA9IChjaGFyICopIG5ld3N0cjsKKworCQlyZXR1cm4gc3ViczsKKwkgICAgICB9CisKKwkgIC8qIFdlIGhhdmUgYSBuZXcgc3Vic3RyaW5nLiAgVGhpcyBtZWFucyB3ZSBkb24ndCBuZWVkIHRoZSByZXZlcnNlCisJICAgICBzdHJpbmcgb2YgdGhpcyBlbnRyeSBhbnltb3JlLiAgKi8KKwkgIHN0LT5iYWNrcCAtPSBuZXdzdHItPmxlbjsKKwkgIHN0LT5sZWZ0ICs9IG5ld3N0ci0+bGVuOworCisJICBuZXdzdHItPm5leHQgPSAoKnNlcCktPm5leHQ7CisJICAoKnNlcCktPm5leHQgPSBuZXdzdHI7CisJfQorICAgICAgZWxzZSBpZiAoKCpzZXApLT5sZW4gIT0gbmV3c3RyLT5sZW4pCisJeworCSAgLyogV2hlbiB3ZSBnZXQgaGVyZSBpdCBtZWFucyB0aGF0IHRoZSBzdHJpbmcgd2UgYXJlIGFib3V0IHRvCisJICAgICBhZGQgaGFzIGEgY29tbW9uIHByZWZpeCB3aXRoIGEgc3RyaW5nIHdlIGFscmVhZHkgaGF2ZSBidXQKKwkgICAgIGl0IGlzIGxvbmdlci4gIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBpdCBmaXJzdC4gICovCisJICBzdC0+dG90YWwgKz0gbmV3c3RyLT5sZW4gLSAoKnNlcCktPmxlbjsKKwkgIG5ld3N0ci0+bmV4dCA9ICpzZXA7CisJICBuZXdzdHItPmxlZnQgPSAoKnNlcCktPmxlZnQ7CisJICBuZXdzdHItPnJpZ2h0ID0gKCpzZXApLT5yaWdodDsKKwkgICpzZXAgPSBuZXdzdHI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFdlIGhhdmUgYW4gZXhhY3QgbWF0Y2guICBGcmVlIHRoZSBtZW1vcnkgd2UgYWxsb2NhdGVkLiAgKi8KKwkgIHN0LT5sZWZ0ICs9IHN0LT5iYWNrcCAtIChjaGFyICopIG5ld3N0cjsKKwkgIHN0LT5iYWNrcCA9IChjaGFyICopIG5ld3N0cjsKKworCSAgbmV3c3RyID0gKnNlcDsKKwl9CisgICAgfQorICBlbHNlCisgICAgc3QtPnRvdGFsICs9IG5ld3N0ci0+bGVuOworCisgIHJldHVybiBuZXdzdHI7Cit9CisKKworc3RhdGljIHZvaWQKK2NvcHlzdHJpbmdzIChzdHJ1Y3QgRWJsX1dTdHJlbnQgKm5vZGVwLCB3Y2hhcl90ICoqZnJlZXAsIHNpemVfdCAqb2Zmc2V0cCkKK3sKKyAgc3RydWN0IEVibF9XU3RyZW50ICpzdWJzOworCisgIGlmIChub2RlcC0+bGVmdCAhPSBOVUxMKQorICAgIGNvcHlzdHJpbmdzIChub2RlcC0+bGVmdCwgZnJlZXAsIG9mZnNldHApOworCisgIC8qIFByb2Nlc3MgdGhlIGN1cnJlbnQgbm9kZS4gICovCisgIG5vZGVwLT5vZmZzZXQgPSAqb2Zmc2V0cDsKKyAgKmZyZWVwID0gd21lbXBjcHkgKCpmcmVlcCwgbm9kZXAtPnN0cmluZywgbm9kZXAtPmxlbik7CisgICpvZmZzZXRwICs9IG5vZGVwLT5sZW4gKiBzaXplb2YgKHdjaGFyX3QpOworCisgIGZvciAoc3VicyA9IG5vZGVwLT5uZXh0OyBzdWJzICE9IE5VTEw7IHN1YnMgPSBzdWJzLT5uZXh0KQorICAgIHsKKyAgICAgIGFzc2VydCAoc3Vicy0+bGVuIDwgbm9kZXAtPmxlbik7CisgICAgICBzdWJzLT5vZmZzZXQgPSBub2RlcC0+b2Zmc2V0ICsgbm9kZXAtPmxlbiAtIHN1YnMtPmxlbjsKKyAgICAgIGFzc2VydCAoc3Vicy0+b2Zmc2V0ICE9IDAgfHwgc3Vicy0+c3RyaW5nWzBdID09ICdcMCcpOworICAgIH0KKworICBpZiAobm9kZXAtPnJpZ2h0ICE9IE5VTEwpCisgICAgY29weXN0cmluZ3MgKG5vZGVwLT5yaWdodCwgZnJlZXAsIG9mZnNldHApOworfQorCisKK3ZvaWQKK2VibF93c3RydGFiZmluYWxpemUgKHN0cnVjdCBFYmxfV1N0cnRhYiAqc3QsIEVsZl9EYXRhICpkYXRhKQoreworICBzaXplX3QgY29weWxlbjsKKyAgd2NoYXJfdCAqZW5kcDsKKyAgc2l6ZV90IG51bGxsZW4gPSBzdC0+bnVsbHN0ciA/IDEgOiAwOworCisgIC8qIEZpbGwgaW4gdGhlIGluZm9ybWF0aW9uLiAgKi8KKyAgZGF0YS0+ZF9idWYgPSBtYWxsb2MgKChzdC0+dG90YWwgKyBudWxsbGVuKSAqIHNpemVvZiAod2NoYXJfdCkpOworICBpZiAoZGF0YS0+ZF9idWYgPT0gTlVMTCkKKyAgICBhYm9ydCAoKTsKKworICAvKiBUaGUgZmlyc3QgYnl0ZSBtdXN0IGFsd2F5cyBiZSB6ZXJvIGlmIHdlIGNyZWF0ZWQgdGhlIHRhYmxlIHdpdGggYQorICAgICBudWxsIHN0cmluZy4gICovCisgIGlmIChzdC0+bnVsbHN0cikKKyAgICAqKCh3Y2hhcl90ICopIGRhdGEtPmRfYnVmKSA9IEwnXDAnOworCisgIGRhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7CisgIGRhdGEtPmRfc2l6ZSA9IHN0LT50b3RhbCArIG51bGxsZW47CisgIGRhdGEtPmRfb2ZmID0gMDsKKyAgZGF0YS0+ZF9hbGlnbiA9IDE7CisgIGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7CisKKyAgLyogTm93IHJ1biB0aHJvdWdoIHRoZSB0cmVlIGFuZCBhZGQgYWxsIHRoZSBzdHJpbmcgd2hpbGUgYWxzbyB1cGRhdGluZworICAgICB0aGUgb2Zmc2V0IG1lbWJlcnMgb2YgdGhlIGVsZnN0cmVudCByZWNvcmRzLiAgKi8KKyAgZW5kcCA9ICh3Y2hhcl90ICopIGRhdGEtPmRfYnVmICsgbnVsbGxlbjsKKyAgY29weWxlbiA9IHNpemVvZiAod2NoYXJfdCkgKiBudWxsbGVuOworICBjb3B5c3RyaW5ncyAoc3QtPnJvb3QsICZlbmRwLCAmY29weWxlbik7CisgIGFzc2VydCAoY29weWxlbiA9PSAoc3QtPnRvdGFsICsgbnVsbGxlbikgKiBzaXplb2YgKHdjaGFyX3QpKTsKK30KKworCitzaXplX3QKK2VibF93c3RydGFib2Zmc2V0IChzdHJ1Y3QgRWJsX1dTdHJlbnQgKnNlKQoreworICByZXR1cm4gc2UtPm9mZnNldDsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9pMzg2X2NvcmVub3RlLmMgYi9saWJlYmwvaTM4Nl9jb3Jlbm90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTIzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvaTM4Nl9jb3Jlbm90ZS5jCkBAIC0wLDAgKzEsMTYyIEBACisvKiBpMzg2IHNwZWNpZmljIGNvcmUgbm90ZSBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8bGliZWJsX2kzODYuaD4KKworCisvKiBXZSBjYW5ub3QgaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPiBzaW5jZSB0aGUgZGVmaW5pdGlvbiB3b3VsZCBiZSBmb3IKKyAgIHRoZSBob3N0IHBsYXRmb3JtIGFuZCBub3QgYWx3YXlzIHg4NiBhcyByZXF1aXJlZCBoZXJlLiAgKi8KK3N0cnVjdCBlbGZfcHJzdGF0dXMKKyAgeworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIGludDMyX3Qgc2lfc2lnbm87CQkJLyogU2lnbmFsIG51bWJlci4gICovCisgICAgICBpbnQzMl90IHNpX2NvZGU7CQkJLyogRXh0cmEgY29kZS4gICovCisgICAgICBpbnQzMl90IHNpX2Vycm5vOwkJCS8qIEVycm5vLiAgKi8KKyAgICB9IHByX2luZm87CQkJCS8qIEluZm8gYXNzb2NpYXRlZCB3aXRoIHNpZ25hbC4gICovCisgICAgaW50MTZfdCBwcl9jdXJzaWc7CQkJLyogQ3VycmVudCBzaWduYWwuICAqLworICAgIHVpbnQzMl90IHByX3NpZ3BlbmQ7CQkvKiBTZXQgb2YgcGVuZGluZyBzaWduYWxzLiAgKi8KKyAgICB1aW50MzJfdCBwcl9zaWdob2xkOwkJLyogU2V0IG9mIGhlbGQgc2lnbmFscy4gICovCisgICAgaW50MzJfdCBwcl9waWQ7CisgICAgaW50MzJfdCBwcl9wcGlkOworICAgIGludDMyX3QgcHJfcGdycDsKKyAgICBpbnQzMl90IHByX3NpZDsKKyAgICBzdHJ1Y3QgaTM4Nl90aW1ldmFsCisgICAgeworICAgICAgaW50MzJfdCB0dl9zZWM7CisgICAgICBpbnQzMl90IHR2X3VzZWM7CisgICAgfSBwcl91dGltZTsJCQkJLyogVXNlciB0aW1lLiAgKi8KKyAgICBzdHJ1Y3QgaTM4Nl90aW1ldmFsIHByX3N0aW1lOwkvKiBTeXN0ZW0gdGltZS4gICovCisgICAgc3RydWN0IGkzODZfdGltZXZhbCBwcl9jdXRpbWU7CS8qIEN1bXVsYXRpdmUgdXNlciB0aW1lLiAgKi8KKyAgICBzdHJ1Y3QgaTM4Nl90aW1ldmFsIHByX2NzdGltZTsJLyogQ3VtdWxhdGl2ZSBzeXN0ZW0gdGltZS4gICovCisgICAgdWludDMyX3QgcHJfcmVnWzE3XTsJCS8qIEdQIHJlZ2lzdGVycy4gICovCisgICAgaW50MzJfdCBwcl9mcHZhbGlkOwkJCS8qIFRydWUgaWYgbWF0aCBjb3BybyBiZWluZyB1c2VkLiAgKi8KKyAgfTsKKworCitzdHJ1Y3QgZWxmX3BycHNpbmZvCisgIHsKKyAgICBjaGFyIHByX3N0YXRlOwkJCS8qIE51bWVyaWMgcHJvY2VzcyBzdGF0ZS4gICovCisgICAgY2hhciBwcl9zbmFtZTsJCQkvKiBDaGFyIGZvciBwcl9zdGF0ZS4gICovCisgICAgY2hhciBwcl96b21iOwkJCS8qIFpvbWJpZS4gICovCisgICAgY2hhciBwcl9uaWNlOwkJCS8qIE5pY2UgdmFsLiAgKi8KKyAgICB1aW50MzJfdCBwcl9mbGFnOwkJCS8qIEZsYWdzLiAgKi8KKyAgICB1aW50MTZfdCBwcl91aWQ7CisgICAgdWludDE2X3QgcHJfZ2lkOworICAgIGludDMyX3QgcHJfcGlkOworICAgIGludDMyX3QgcHJfcHBpZDsKKyAgICBpbnQzMl90IHByX3BncnA7CisgICAgaW50MzJfdCBwcl9zaWQ7CisgICAgLyogTG90cyBtaXNzaW5nICovCisgICAgY2hhciBwcl9mbmFtZVsxNl07CQkJLyogRmlsZW5hbWUgb2YgZXhlY3V0YWJsZS4gICovCisgICAgY2hhciBwcl9wc2FyZ3NbODBdOwkJCS8qIEluaXRpYWwgcGFydCBvZiBhcmcgbGlzdC4gICovCisgIH07CisKKworYm9vbAoraTM4Nl9jb3JlX25vdGUgKG5hbWUsIHR5cGUsIGRlc2NzeiwgZGVzYykKKyAgICAgY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CisgICAgIHVpbnQzMl90IHR5cGU7CisgICAgIHVpbnQzMl90IGRlc2NzejsKKyAgICAgY29uc3QgY2hhciAqZGVzYzsKK3sKKyAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgTlRfUFJTVEFUVVM6CisgICAgICBpZiAoZGVzY3N6IDwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3Byc3RhdHVzKSkKKwkvKiBOb3QgZW5vdWdoIGRhdGEuICAqLworCWJyZWFrOworCisgICAgICBzdHJ1Y3QgZWxmX3Byc3RhdHVzICpzdGF0ID0gKHN0cnVjdCBlbGZfcHJzdGF0dXMgKikgZGVzYzsKKworICAgICAgcHJpbnRmICgiICAgIFNJR0lORk86ICBzaWdubzogJSIgUFJJZDMyICIsIGNvZGUgPSAlIiBQUklkMzIKKwkgICAgICAiLCBlcnJubyA9ICUiIFBSSWQzMiAiXG4iCisJICAgICAgIiAgICBzaWduYWw6ICUiIFBSSWQxNiAiLCBwZW5kaW5nOiAlMDgiIFBSSXgzMgorCSAgICAgICIsIGhvbGRpbmc6ICU4IiBQUkl4MzIgIlxuIgorCSAgICAgICIgICAgcGlkOiAlIiBQUklkMzIgIiwgcHBpZCA9ICUiIFBSSWQzMiAiLCBwZ3JwID0gJSIgUFJJZDMyCisJICAgICAgIiwgc2lkID0gJSIgIFBSSWQzMiAiXG4iCisJICAgICAgIiAgICAgdXRpbWU6ICU2IiBQUklkMzIgIi4lMDYiIFBSSWQzMgorCSAgICAgICJzLCAgc3RpbWU6ICU2IiBQUklkMzIgIi4lMDYiIFBSSWQzMiAic1xuIgorCSAgICAgICIgICAgY3V0aW1lOiAlNiIgUFJJZDMyICIuJTA2IiBQUklkMzIKKwkgICAgICAicywgY3N0aW1lOiAlNiIgUFJJZDMyICIuJTA2IiBQUklkMzIgInNcbiIKKwkgICAgICAiICAgIGVheDogJTA4IiBQUkl4MzIgIiAgZWJ4OiAlMDgiIFBSSXgzMiAiICBlY3g6ICUwOCIgUFJJeDMyCisJICAgICAgIiAgZWR4OiAlMDgiIFBSSXgzMiAiXG4iCisJICAgICAgIiAgICBlc2k6ICUwOCIgUFJJeDMyICIgIGVkaTogJTA4IiBQUkl4MzIgIiAgZWJwOiAlMDgiIFBSSXgzMgorCSAgICAgICIgIGVzcDogJTA4IiBQUkl4MzIgIlxuIgorCSAgICAgICIgICAgZWlwOiAlMDgiIFBSSXgzMiAiICBlZmxhZ3M6ICUwOCIgUFJJeDMyCisJICAgICAgIiAgb3JpZ2luYWwgZWF4OiAlMDgiIFBSSXgzMiAiXG4iCisJICAgICAgIiAgICBjczogJTA0IiBQUkl4MzIgIiAgZHM6ICUwNCIgUFJJeDMyICIgIGVzOiAlMDQiIFBSSXgzMgorCSAgICAgICIgIGZzOiAlMDQiIFBSSXgzMiAiICBnczogJTA0IiBQUkl4MzIgIiAgc3M6ICUwNCIgUFJJeDMyICJcblxuIiwKKwkgICAgICBzdGF0LT5wcl9pbmZvLnNpX3NpZ25vLAorCSAgICAgIHN0YXQtPnByX2luZm8uc2lfY29kZSwKKwkgICAgICBzdGF0LT5wcl9pbmZvLnNpX2Vycm5vLAorCSAgICAgIHN0YXQtPnByX2N1cnNpZywKKwkgICAgICBzdGF0LT5wcl9zaWdwZW5kLCBzdGF0LT5wcl9zaWdob2xkLAorCSAgICAgIHN0YXQtPnByX3BpZCwgc3RhdC0+cHJfcHBpZCwgc3RhdC0+cHJfcGdycCwgc3RhdC0+cHJfc2lkLAorCSAgICAgIHN0YXQtPnByX3V0aW1lLnR2X3NlYywgc3RhdC0+cHJfdXRpbWUudHZfdXNlYywKKwkgICAgICBzdGF0LT5wcl9zdGltZS50dl9zZWMsIHN0YXQtPnByX3N0aW1lLnR2X3VzZWMsCisJICAgICAgc3RhdC0+cHJfY3V0aW1lLnR2X3NlYywgc3RhdC0+cHJfY3V0aW1lLnR2X3VzZWMsCisJICAgICAgc3RhdC0+cHJfY3N0aW1lLnR2X3NlYywgc3RhdC0+cHJfY3N0aW1lLnR2X3VzZWMsCisJICAgICAgc3RhdC0+cHJfcmVnWzZdLCBzdGF0LT5wcl9yZWdbMF0sIHN0YXQtPnByX3JlZ1sxXSwKKwkgICAgICBzdGF0LT5wcl9yZWdbMl0sIHN0YXQtPnByX3JlZ1szXSwgc3RhdC0+cHJfcmVnWzRdLAorCSAgICAgIHN0YXQtPnByX3JlZ1s1XSwgc3RhdC0+cHJfcmVnWzE1XSwgc3RhdC0+cHJfcmVnWzEyXSwKKwkgICAgICBzdGF0LT5wcl9yZWdbMTRdLCBzdGF0LT5wcl9yZWdbMTFdLCBzdGF0LT5wcl9yZWdbMTNdICYgMHhmZmZmLAorCSAgICAgIHN0YXQtPnByX3JlZ1s3XSAmIDB4ZmZmZiwgc3RhdC0+cHJfcmVnWzhdICYgMHhmZmZmLAorCSAgICAgIHN0YXQtPnByX3JlZ1s5XSAmIDB4ZmZmZiwgc3RhdC0+cHJfcmVnWzEwXSAmIDB4ZmZmZiwKKwkgICAgICBzdGF0LT5wcl9yZWdbMTZdKTsKKworICAgICAgLyogV2UgaGFuZGxlZCB0aGlzIGVudHJ5LiAgKi8KKyAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTlRfUFJQU0lORk86CisgICAgICBpZiAoZGVzY3N6IDwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3BycHNpbmZvKSkKKwkvKiBOb3QgZW5vdWdoIGRhdGEuICAqLworCWJyZWFrOworCisgICAgICBzdHJ1Y3QgZWxmX3BycHNpbmZvICppbmZvID0gKHN0cnVjdCBlbGZfcHJwc2luZm8gKikgZGVzYzsKKworICAgICAgcHJpbnRmICgiICAgIHN0YXRlOiAlYyAoJWhoZCksICB6b21iaWU6ICVoaGQsICBuaWNlOiAlaGhkXG4iCisJICAgICAgIiAgICBmbGFnczogJTA4IiBQUkl4MzIgIiwgIHVpZDogJSIgUFJJZDE2ICIsICBnaWQ6ICUiIFBSSWQxNiJcbiIKKwkgICAgICAiICAgIHBpZDogJSIgUFJJZDMyICIsICBwcGlkOiAlIiBQUklkMzIgIiwgIHBncnA6ICUiIFBSSWQzMgorCSAgICAgICIsICBzaWQ6ICUiIFBSSWQzMiAiXG4iCisJICAgICAgIiAgICBmbmFtZTogJS4xNnNcbiIKKwkgICAgICAiICAgICBhcmdzOiAlLjgwc1xuXG4iLAorCSAgICAgIGluZm8tPnByX3NuYW1lLCBpbmZvLT5wcl9zdGF0ZSwgaW5mby0+cHJfem9tYiwgaW5mby0+cHJfbmljZSwKKwkgICAgICBpbmZvLT5wcl9mbGFnLCBpbmZvLT5wcl91aWQsIGluZm8tPnByX2dpZCwKKwkgICAgICBpbmZvLT5wcl9waWQsIGluZm8tPnByX3BwaWQsIGluZm8tPnByX3BncnAsIGluZm8tPnByX3NpZCwKKwkgICAgICBpbmZvLT5wcl9mbmFtZSwgaW5mby0+cHJfcHNhcmdzKTsKKworICAgICAgLyogV2UgaGFuZGxlZCB0aGlzIGVudHJ5LiAgKi8KKyAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9pMzg2X2Rlc3RyLmMgYi9saWJlYmwvaTM4Nl9kZXN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzBmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvaTM4Nl9kZXN0ci5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIERlc3RydWN0b3IgZm9yIGkzODYgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWJsX2kzODYuaD4KKworCit2b2lkCitpMzg2X2Rlc3RyIChiaCkKKyAgICAgRWJsICpiaCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7Cit7CisgIC8qIE5vdGhpbmcgdG8gZG8gc28gZmFyLiAgKi8KK30KZGlmZiAtLWdpdCBhL2xpYmVibC9pMzg2X2luaXQuYyBiL2xpYmVibC9pMzg2X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRmM2VmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2kzODZfaW5pdC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIEluaXRpYWxpemF0aW9uIG9mIGkzODYgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWJsX2kzODYuaD4KKworCitjb25zdCBjaGFyICoKK2kzODZfaW5pdCAoZWxmLCBtYWNoaW5lLCBlaCwgZWhsZW4pCisgICAgIEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKyAgICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworICAgICBFYmwgKmVoOworICAgICBzaXplX3QgZWhsZW47Cit7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIEVsZl9CSCBvYmplY3QgaGFzIGEgc3VmZmljZW50IHNpemUuICAqLworICBpZiAoZWhsZW4gPCBzaXplb2YgKEVibCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogV2UgaGFuZGxlIGl0LiAgKi8KKyAgZWgtPm5hbWUgPSAiSW50ZWwgODAzODYiOworICBlaC0+cmVsb2NfdHlwZV9uYW1lID0gaTM4Nl9yZWxvY190eXBlX25hbWU7CisgIGVoLT5yZWxvY190eXBlX2NoZWNrID0gaTM4Nl9yZWxvY190eXBlX2NoZWNrOworICBlaC0+cmVsb2NfdmFsaWRfdXNlID0gaTM4Nl9yZWxvY192YWxpZF91c2U7CisgIGVoLT5yZWxvY19zaW1wbGVfdHlwZSA9IGkzODZfcmVsb2Nfc2ltcGxlX3R5cGU7CisgIGVoLT5nb3RwY19yZWxvY19jaGVjayA9IGkzODZfZ290cGNfcmVsb2NfY2hlY2s7CisgIGVoLT5jb3JlX25vdGUgPSBpMzg2X2NvcmVfbm90ZTsKKyAgZ2VuZXJpY19kZWJ1Z3Njbl9wID0gZWgtPmRlYnVnc2NuX3A7CisgIGVoLT5kZWJ1Z3Njbl9wID0gaTM4Nl9kZWJ1Z3Njbl9wOworICBlaC0+Y29weV9yZWxvY19wID0gaTM4Nl9jb3B5X3JlbG9jX3A7CisgIGVoLT5kZXN0ciA9IGkzODZfZGVzdHI7CisKKyAgcmV0dXJuIE1PRFZFUlNJT047Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvaTM4Nl9zeW1ib2wuYyBiL2xpYmVibC9pMzg2X3N5bWJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZWRlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvaTM4Nl9zeW1ib2wuYwpAQCAtMCwwICsxLDE2MyBAQAorLyogaTM4NiBzcGVjaWZpYyBzeW1ib2xpYyBuYW1lIGhhbmRsaW5nLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaWJlYmxfaTM4Ni5oPgorCisKKy8qIFJldHVybiBvZiB0aGUgYmFja2VuZC4gICovCitjb25zdCBjaGFyICoKK2kzODZfYmFja2VuZF9uYW1lICh2b2lkKQoreworICByZXR1cm4gImkzODYiOworfQorCisKKy8qIFJlbG9jYXRpb24gbWFwcGluZyB0YWJsZS4gICovCitzdGF0aWMgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGVudW0geyBib3RoID0gMCwgcmVsID0gMSwgZXhlYyA9IDIgfSBhcHBlYXI7Cit9IHJlbG9jX21hcF90YWJsZVtdID0KKyAgeworICAgIFtSXzM4Nl9OT05FXSA9IHsgIlJfMzg2X05PTkUiLCBib3RoIH0sCisgICAgW1JfMzg2XzMyXSA9IHsgIlJfMzg2XzMyIiwgYm90aCB9LAorICAgIFtSXzM4Nl9QQzMyXSA9IHsgIlJfMzg2X1BDMzIiLCByZWwgfSwKKyAgICBbUl8zODZfR09UMzJdID0geyAiUl8zODZfR09UMzIiLCByZWwgfSwKKyAgICBbUl8zODZfUExUMzJdID0geyAiUl8zODZfUExUMzIiLCByZWwgfSwKKyAgICBbUl8zODZfQ09QWV0gPSB7ICJSXzM4Nl9DT1BZIiwgZXhlYyB9LAorICAgIFtSXzM4Nl9HTE9CX0RBVF0gPSB7ICJSXzM4Nl9HTE9CX0RBVCIsIGV4ZWMgfSwKKyAgICBbUl8zODZfSk1QX1NMT1RdID0geyAiUl8zODZfSk1QX1NMT1QiLCBleGVjIH0sCisgICAgW1JfMzg2X1JFTEFUSVZFXSA9IHsgIlJfMzg2X1JFTEFUSVZFIiwgZXhlYyB9LAorICAgIFtSXzM4Nl9HT1RPRkZdID0geyAiUl8zODZfR09UT0ZGIiwgcmVsIH0sCisgICAgW1JfMzg2X0dPVFBDXSA9IHsgIlJfMzg2X0dPVFBDIiwgcmVsIH0sCisgICAgW1JfMzg2XzMyUExUXSA9IHsgIlJfMzg2XzMyUExUIiwgcmVsIH0sCisgICAgW1JfMzg2X1RMU19UUE9GRl0gPSB7ICJSXzM4Nl9UTFNfVFBPRkYiLCByZWwgfSwKKyAgICBbUl8zODZfVExTX0lFXSA9IHsgIlJfMzg2X1RMU19JRSIsIHJlbCB9LAorICAgIFtSXzM4Nl9UTFNfR09USUVdID0geyAiUl8zODZfVExTX0dPVElFIiwgcmVsIH0sCisgICAgW1JfMzg2X1RMU19MRV0gPSB7ICJSXzM4Nl9UTFNfTEUiLCByZWwgfSwKKyAgICBbUl8zODZfVExTX0dEXSA9IHsgIlJfMzg2X1RMU19HRCIsIHJlbCB9LAorICAgIFtSXzM4Nl9UTFNfTERNXSA9IHsgIlJfMzg2X1RMU19MRE0iLCByZWwgfSwKKyAgICBbUl8zODZfMTZdID0geyAiUl8zODZfMTYiLCByZWwgfSwKKyAgICBbUl8zODZfUEMxNl0gPSB7ICJSXzM4Nl9QQzE2IiwgcmVsIH0sCisgICAgW1JfMzg2XzhdID0geyAiUl8zODZfOCIsIHJlbCB9LAorICAgIFtSXzM4Nl9QQzhdID0geyAiUl8zODZfUEM4IiwgcmVsIH0sCisgICAgW1JfMzg2X1RMU19HRF8zMl0gPSB7ICJSXzM4Nl9UTFNfR0RfMzIiLCByZWwgfSwKKyAgICBbUl8zODZfVExTX0dEX1BVU0hdID0geyAiUl8zODZfVExTX0dEX1BVU0giLCByZWwgfSwKKyAgICBbUl8zODZfVExTX0dEX0NBTExdID0geyAiUl8zODZfVExTX0dEX0NBTEwiLCByZWwgfSwKKyAgICBbUl8zODZfVExTX0dEX1BPUF0gPSB7ICJSXzM4Nl9UTFNfR0RfUE9QIiwgcmVsIH0sCisgICAgW1JfMzg2X1RMU19MRE1fMzJdID0geyAiUl8zODZfVExTX0xETV8zMiIsIHJlbCB9LAorICAgIFtSXzM4Nl9UTFNfTERNX1BVU0hdID0geyAiUl8zODZfVExTX0xETV9QVVNIIiwgcmVsIH0sCisgICAgW1JfMzg2X1RMU19MRE1fQ0FMTF0gPSB7ICJSXzM4Nl9UTFNfTERNX0NBTEwiLCByZWwgfSwKKyAgICBbUl8zODZfVExTX0xETV9QT1BdID0geyAiUl8zODZfVExTX0xETV9QT1AiLCByZWwgfSwKKyAgICBbUl8zODZfVExTX0xET18zMl0gPSB7ICJSXzM4Nl9UTFNfTERPXzMyIiwgcmVsIH0sCisgICAgW1JfMzg2X1RMU19JRV8zMl0gPSB7ICJSXzM4Nl9UTFNfSUVfMzIiLCByZWwgfSwKKyAgICBbUl8zODZfVExTX0xFXzMyXSA9IHsgIlJfMzg2X1RMU19MRV8zMiIsIHJlbCB9LAorICAgIFtSXzM4Nl9UTFNfRFRQTU9EMzJdID0geyAiUl8zODZfVExTX0RUUE1PRDMyIiwgcmVsIH0sCisgICAgW1JfMzg2X1RMU19EVFBPRkYzMl0gPSB7ICJSXzM4Nl9UTFNfRFRQT0ZGMzIiLCByZWwgfSwKKyAgICBbUl8zODZfVExTX1RQT0ZGMzJdID0geyAiUl8zODZfVExTX1RQT0ZGMzIiLCByZWwgfQorICB9OworCisKKy8qIERldGVybWluZSByZWxvY2F0aW9uIHR5cGUgc3RyaW5nIGZvciB4ODYuICAqLworY29uc3QgY2hhciAqCitpMzg2X3JlbG9jX3R5cGVfbmFtZSAoaW50IHR5cGUsIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBSXzM4Nl9OVU0pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlbG9jX21hcF90YWJsZVt0eXBlXS5uYW1lOworfQorCisKKy8qIENoZWNrIGZvciBjb3JyZWN0IHJlbG9jYXRpb24gdHlwZS4gICovCitib29sCitpMzg2X3JlbG9jX3R5cGVfY2hlY2sgKGludCB0eXBlKQoreworICByZXR1cm4gKHR5cGUgPj0gUl8zODZfTk9ORSAmJiB0eXBlIDwgUl8zODZfTlVNCisJICAmJiByZWxvY19tYXBfdGFibGVbdHlwZV0ubmFtZSAhPSBOVUxMKSA/IHRydWUgOiBmYWxzZTsKK30KKworCisvKiBDaGVjayBmb3IgY29ycmVjdCByZWxvY2F0aW9uIHR5cGUgdXNlLiAgKi8KK2Jvb2wKK2kzODZfcmVsb2NfdmFsaWRfdXNlIChFbGYgKmVsZiwgaW50IHR5cGUpCit7CisgIGlmICh0eXBlIDwgUl8zODZfTk9ORSB8fCB0eXBlID49IFJfMzg2X05VTQorICAgICAgfHwgcmVsb2NfbWFwX3RhYmxlW3R5cGVdLm5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRWxmMzJfRWhkciAqZWhkciA9IGVsZjMyX2dldGVoZHIgKGVsZik7CisgIGFzc2VydCAoZWhkciAhPSBOVUxMKTsKKworICBpZiAocmVsb2NfbWFwX3RhYmxlW3R5cGVdLmFwcGVhciA9PSByZWwpCisgICAgcmV0dXJuIGVoZHItPmVfdHlwZSA9PSBFVF9SRUw7CisKKyAgaWYgKHJlbG9jX21hcF90YWJsZVt0eXBlXS5hcHBlYXIgPT0gZXhlYykKKyAgICByZXR1cm4gZWhkci0+ZV90eXBlICE9IEVUX1JFTDsKKworICBhc3NlcnQgKHJlbG9jX21hcF90YWJsZVt0eXBlXS5hcHBlYXIgPT0gYm90aCk7CisgIHJldHVybiB0cnVlOworfQorCisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBzeW1ib2wgdHlwZSBpcyB0aGF0IHJlZmVyZW5jaW5nIHRoZSBHT1QuICAqLworYm9vbAoraTM4Nl9nb3RwY19yZWxvY19jaGVjayAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgdHlwZSkKK3sKKyAgcmV0dXJuIHR5cGUgPT0gUl8zODZfR09UUEM7Cit9CisKKy8qIENoZWNrIGZvciB0aGUgc2ltcGxlIHJlbG9jIHR5cGVzLiAgKi8KK0VsZl9UeXBlCitpMzg2X3JlbG9jX3NpbXBsZV90eXBlIChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGludCB0eXBlKQoreworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgUl8zODZfMzI6CisgICAgICByZXR1cm4gRUxGX1RfU1dPUkQ7CisgICAgY2FzZSBSXzM4Nl8xNjoKKyAgICAgIHJldHVybiBFTEZfVF9IQUxGOworICAgIGNhc2UgUl8zODZfODoKKyAgICAgIHJldHVybiBFTEZfVF9CWVRFOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRUxGX1RfTlVNOworICAgIH0KK30KKworLyogQ2hlY2sgc2VjdGlvbiBuYW1lIGZvciBiZWluZyB0aGF0IG9mIGEgZGVidWcgaW5mb3JtYXRpbm8gc2VjdGlvbi4gICovCitib29sICgqZ2VuZXJpY19kZWJ1Z3Njbl9wKSAoY29uc3QgY2hhciAqKTsKK2Jvb2wKK2kzODZfZGVidWdzY25fcCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgcmV0dXJuIChnZW5lcmljX2RlYnVnc2NuX3AgKG5hbWUpCisJICB8fCBzdHJjbXAgKG5hbWUsICIuc3RhYiIpID09IDAKKwkgIHx8IHN0cmNtcCAobmFtZSwgIi5zdGFic3RyIikgPT0gMCk7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gcmVsb2NhdGlvbiBpcyBhIGNvcHkgcmVsb2NhdGlvbi4gICovCitib29sCitpMzg2X2NvcHlfcmVsb2NfcCAoaW50IHJlbG9jKQoreworICByZXR1cm4gcmVsb2MgPT0gUl8zODZfQ09QWTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9pYTY0X2Rlc3RyLmMgYi9saWJlYmwvaWE2NF9kZXN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTA1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvaWE2NF9kZXN0ci5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIERlc3RydWN0b3IgZm9yIElBLTY0IHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVibF9pYTY0Lmg+CisKKwordm9pZAoraWE2NF9kZXN0ciAoYmgpCisgICAgIEVibCAqYmggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworeworICAvKiBOb3RoaW5nIHRvIGRvIHNvIGZhci4gICovCit9CmRpZmYgLS1naXQgYS9saWJlYmwvaWE2NF9pbml0LmMgYi9saWJlYmwvaWE2NF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhZmU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9pYTY0X2luaXQuYwpAQCAtMCwwICsxLDQzIEBACisvKiBJbml0aWFsaXphdGlvbiBvZiBJQS02NCBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxfaWE2NC5oPgorCisKK2NvbnN0IGNoYXIgKgoraWE2NF9pbml0IChlbGYsIG1hY2hpbmUsIGVoLCBlaGxlbikKKyAgICAgRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworICAgICBHRWxmX0hhbGYgbWFjaGluZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CisgICAgIEVibCAqZWg7CisgICAgIHNpemVfdCBlaGxlbjsKK3sKKyAgLyogQ2hlY2sgd2hldGhlciB0aGUgRWxmX0JIIG9iamVjdCBoYXMgYSBzdWZmaWNlbnQgc2l6ZS4gICovCisgIGlmIChlaGxlbiA8IHNpemVvZiAoRWJsKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBXZSBoYW5kbGUgaXQuICAqLworICBlaC0+bmFtZSA9ICJJbnRlbCBJQS02NCI7CisgIGVoLT5yZWxvY190eXBlX25hbWUgPSBpYTY0X3JlbG9jX3R5cGVfbmFtZTsKKyAgZWgtPnJlbG9jX3R5cGVfY2hlY2sgPSBpYTY0X3JlbG9jX3R5cGVfY2hlY2s7CisgIGVoLT5zZWdtZW50X3R5cGVfbmFtZSA9IGlhNjRfc2VnbWVudF90eXBlX25hbWU7CisgIGVoLT5keW5hbWljX3RhZ19uYW1lID0gaWE2NF9keW5hbWljX3RhZ19uYW1lOworICBlaC0+Y29weV9yZWxvY19wID0gaWE2NF9jb3B5X3JlbG9jX3A7CisgIGVoLT5kZXN0ciA9IGlhNjRfZGVzdHI7CisKKyAgcmV0dXJuIE1PRFZFUlNJT047Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvaWE2NF9zeW1ib2wuYyBiL2xpYmVibC9pYTY0X3N5bWJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Y2VkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvaWE2NF9zeW1ib2wuYwpAQCAtMCwwICsxLDE4NyBAQAorLyogSUEtNjQgc3BlY2lmaWMgc3ltYm9saWMgbmFtZSBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8bGliZWJsX2lhNjQuaD4KKworCisvKiBSZXR1cm4gb2YgdGhlIGJhY2tlbmQuICAqLworY29uc3QgY2hhciAqCitpYTY0X2JhY2tlbmRfbmFtZSAodm9pZCkKK3sKKyAgcmV0dXJuICJpYTY0IjsKK30KKworCisvKiBSZWxvY2F0aW9uIG1hcHBpbmcgdGFibGUuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKnJlbG9jX21hcF90YWJsZVtdID0KKyAgeworICAgIFtSX0lBNjRfTk9ORV0gPSAiUl9JQTY0X05PTkUiLAorICAgIFtSX0lBNjRfSU1NMTRdID0gIlJfSUE2NF9JTU0xNCIsCisgICAgW1JfSUE2NF9JTU0yMl0gPSAiUl9JQTY0X0lNTTIyIiwKKyAgICBbUl9JQTY0X0lNTTY0XSA9ICJSX0lBNjRfSU1NNjQiLAorICAgIFtSX0lBNjRfRElSMzJNU0JdID0gIlJfSUE2NF9ESVIzMk1TQiIsCisgICAgW1JfSUE2NF9ESVIzMkxTQl0gPSAiUl9JQTY0X0RJUjMyTFNCIiwKKyAgICBbUl9JQTY0X0RJUjY0TVNCXSA9ICJSX0lBNjRfRElSNjRNU0IiLAorICAgIFtSX0lBNjRfRElSNjRMU0JdID0gIlJfSUE2NF9ESVI2NExTQiIsCisgICAgW1JfSUE2NF9HUFJFTDIyXSA9ICJSX0lBNjRfR1BSRUwyMiIsCisgICAgW1JfSUE2NF9HUFJFTDY0SV0gPSAiUl9JQTY0X0dQUkVMNjRJIiwKKyAgICBbUl9JQTY0X0dQUkVMMzJNU0JdID0gIlJfSUE2NF9HUFJFTDMyTVNCIiwKKyAgICBbUl9JQTY0X0dQUkVMMzJMU0JdID0gIlJfSUE2NF9HUFJFTDMyTFNCIiwKKyAgICBbUl9JQTY0X0dQUkVMNjRNU0JdID0gIlJfSUE2NF9HUFJFTDY0TVNCIiwKKyAgICBbUl9JQTY0X0dQUkVMNjRMU0JdID0gIlJfSUE2NF9HUFJFTDY0TFNCIiwKKyAgICBbUl9JQTY0X0xUT0ZGMjJdID0gIlJfSUE2NF9MVE9GRjIyIiwKKyAgICBbUl9JQTY0X0xUT0ZGNjRJXSA9ICJSX0lBNjRfTFRPRkY2NEkiLAorICAgIFtSX0lBNjRfUExUT0ZGMjJdID0gIlJfSUE2NF9QTFRPRkYyMiIsCisgICAgW1JfSUE2NF9QTFRPRkY2NEldID0gIlJfSUE2NF9QTFRPRkY2NEkiLAorICAgIFtSX0lBNjRfUExUT0ZGNjRNU0JdID0gIlJfSUE2NF9QTFRPRkY2NE1TQiIsCisgICAgW1JfSUE2NF9QTFRPRkY2NExTQl0gPSAiUl9JQTY0X1BMVE9GRjY0TFNCIiwKKyAgICBbUl9JQTY0X0ZQVFI2NEldID0gIlJfSUE2NF9GUFRSNjRJIiwKKyAgICBbUl9JQTY0X0ZQVFIzMk1TQl0gPSAiUl9JQTY0X0ZQVFIzMk1TQiIsCisgICAgW1JfSUE2NF9GUFRSMzJMU0JdID0gIlJfSUE2NF9GUFRSMzJMU0IiLAorICAgIFtSX0lBNjRfRlBUUjY0TVNCXSA9ICJSX0lBNjRfRlBUUjY0TVNCIiwKKyAgICBbUl9JQTY0X0ZQVFI2NExTQl0gPSAiUl9JQTY0X0ZQVFI2NExTQiIsCisgICAgW1JfSUE2NF9QQ1JFTDYwQl0gPSAiUl9JQTY0X1BDUkVMNjBCIiwKKyAgICBbUl9JQTY0X1BDUkVMMjFCXSA9ICJSX0lBNjRfUENSRUwyMUIiLAorICAgIFtSX0lBNjRfUENSRUwyMU1dID0gIlJfSUE2NF9QQ1JFTDIxTSIsCisgICAgW1JfSUE2NF9QQ1JFTDIxRl0gPSAiUl9JQTY0X1BDUkVMMjFGIiwKKyAgICBbUl9JQTY0X1BDUkVMMzJNU0JdID0gIlJfSUE2NF9QQ1JFTDMyTVNCIiwKKyAgICBbUl9JQTY0X1BDUkVMMzJMU0JdID0gIlJfSUE2NF9QQ1JFTDMyTFNCIiwKKyAgICBbUl9JQTY0X1BDUkVMNjRNU0JdID0gIlJfSUE2NF9QQ1JFTDY0TVNCIiwKKyAgICBbUl9JQTY0X1BDUkVMNjRMU0JdID0gIlJfSUE2NF9QQ1JFTDY0TFNCIiwKKyAgICBbUl9JQTY0X0xUT0ZGX0ZQVFIyMl0gPSAiUl9JQTY0X0xUT0ZGX0ZQVFIyMiIsCisgICAgW1JfSUE2NF9MVE9GRl9GUFRSNjRJXSA9ICJSX0lBNjRfTFRPRkZfRlBUUjY0SSIsCisgICAgW1JfSUE2NF9MVE9GRl9GUFRSMzJNU0JdID0gIlJfSUE2NF9MVE9GRl9GUFRSMzJNU0IiLAorICAgIFtSX0lBNjRfTFRPRkZfRlBUUjMyTFNCXSA9ICJSX0lBNjRfTFRPRkZfRlBUUjMyTFNCIiwKKyAgICBbUl9JQTY0X0xUT0ZGX0ZQVFI2NE1TQl0gPSAiUl9JQTY0X0xUT0ZGX0ZQVFI2NE1TQiIsCisgICAgW1JfSUE2NF9MVE9GRl9GUFRSNjRMU0JdID0gIlJfSUE2NF9MVE9GRl9GUFRSNjRMU0IiLAorICAgIFtSX0lBNjRfU0VHUkVMMzJNU0JdID0gIlJfSUE2NF9TRUdSRUwzMk1TQiIsCisgICAgW1JfSUE2NF9TRUdSRUwzMkxTQl0gPSAiUl9JQTY0X1NFR1JFTDMyTFNCIiwKKyAgICBbUl9JQTY0X1NFR1JFTDY0TVNCXSA9ICJSX0lBNjRfU0VHUkVMNjRNU0IiLAorICAgIFtSX0lBNjRfU0VHUkVMNjRMU0JdID0gIlJfSUE2NF9TRUdSRUw2NExTQiIsCisgICAgW1JfSUE2NF9TRUNSRUwzMk1TQl0gPSAiUl9JQTY0X1NFQ1JFTDMyTVNCIiwKKyAgICBbUl9JQTY0X1NFQ1JFTDMyTFNCXSA9ICJSX0lBNjRfU0VDUkVMMzJMU0IiLAorICAgIFtSX0lBNjRfU0VDUkVMNjRNU0JdID0gIlJfSUE2NF9TRUNSRUw2NE1TQiIsCisgICAgW1JfSUE2NF9TRUNSRUw2NExTQl0gPSAiUl9JQTY0X1NFQ1JFTDY0TFNCIiwKKyAgICBbUl9JQTY0X1JFTDMyTVNCXSA9ICJSX0lBNjRfUkVMMzJNU0IiLAorICAgIFtSX0lBNjRfUkVMMzJMU0JdID0gIlJfSUE2NF9SRUwzMkxTQiIsCisgICAgW1JfSUE2NF9SRUw2NE1TQl0gPSAiUl9JQTY0X1JFTDY0TVNCIiwKKyAgICBbUl9JQTY0X1JFTDY0TFNCXSA9ICJSX0lBNjRfUkVMNjRMU0IiLAorICAgIFtSX0lBNjRfTFRWMzJNU0JdID0gIlJfSUE2NF9MVFYzMk1TQiIsCisgICAgW1JfSUE2NF9MVFYzMkxTQl0gPSAiUl9JQTY0X0xUVjMyTFNCIiwKKyAgICBbUl9JQTY0X0xUVjY0TVNCXSA9ICJSX0lBNjRfTFRWNjRNU0IiLAorICAgIFtSX0lBNjRfTFRWNjRMU0JdID0gIlJfSUE2NF9MVFY2NExTQiIsCisgICAgW1JfSUE2NF9QQ1JFTDIxQkldID0gIlJfSUE2NF9QQ1JFTDIxQkkiLAorICAgIFtSX0lBNjRfUENSRUwyMl0gPSAiUl9JQTY0X1BDUkVMMjIiLAorICAgIFtSX0lBNjRfUENSRUw2NEldID0gIlJfSUE2NF9QQ1JFTDY0SSIsCisgICAgW1JfSUE2NF9JUExUTVNCXSA9ICJSX0lBNjRfSVBMVE1TQiIsCisgICAgW1JfSUE2NF9JUExUTFNCXSA9ICJSX0lBNjRfSVBMVExTQiIsCisgICAgW1JfSUE2NF9DT1BZXSA9ICJSX0lBNjRfQ09QWSIsCisgICAgW1JfSUE2NF9TVUJdID0gIlJfSUE2NF9TVUIiLAorICAgIFtSX0lBNjRfTFRPRkYyMlhdID0gIlJfSUE2NF9MVE9GRjIyWCIsCisgICAgW1JfSUE2NF9MRFhNT1ZdID0gIlJfSUE2NF9MRFhNT1YiLAorICAgIFtSX0lBNjRfVFBSRUwxNF0gPSAiUl9JQTY0X1RQUkVMMTQiLAorICAgIFtSX0lBNjRfVFBSRUwyMl0gPSAiUl9JQTY0X1RQUkVMMjIiLAorICAgIFtSX0lBNjRfVFBSRUw2NEldID0gIlJfSUE2NF9UUFJFTDY0SSIsCisgICAgW1JfSUE2NF9UUFJFTDY0TVNCXSA9ICJSX0lBNjRfVFBSRUw2NE1TQiIsCisgICAgW1JfSUE2NF9UUFJFTDY0TFNCXSA9ICJSX0lBNjRfVFBSRUw2NExTQiIsCisgICAgW1JfSUE2NF9MVE9GRl9UUFJFTDIyXSA9ICJSX0lBNjRfTFRPRkZfVFBSRUwyMiIsCisgICAgW1JfSUE2NF9EVFBNT0Q2NE1TQl0gPSAiUl9JQTY0X0RUUE1PRDY0TVNCIiwKKyAgICBbUl9JQTY0X0RUUE1PRDY0TFNCXSA9ICJSX0lBNjRfRFRQTU9ENjRMU0IiLAorICAgIFtSX0lBNjRfTFRPRkZfRFRQTU9EMjJdID0gIlJfSUE2NF9MVE9GRl9EVFBNT0QyMiIsCisgICAgW1JfSUE2NF9EVFBSRUwxNF0gPSAiUl9JQTY0X0RUUFJFTDE0IiwKKyAgICBbUl9JQTY0X0RUUFJFTDIyXSA9ICJSX0lBNjRfRFRQUkVMMjIiLAorICAgIFtSX0lBNjRfRFRQUkVMNjRJXSA9ICJSX0lBNjRfRFRQUkVMNjRJIiwKKyAgICBbUl9JQTY0X0RUUFJFTDMyTVNCXSA9ICJSX0lBNjRfRFRQUkVMMzJNU0IiLAorICAgIFtSX0lBNjRfRFRQUkVMMzJMU0JdID0gIlJfSUE2NF9EVFBSRUwzMkxTQiIsCisgICAgW1JfSUE2NF9EVFBSRUw2NE1TQl0gPSAiUl9JQTY0X0RUUFJFTDY0TVNCIiwKKyAgICBbUl9JQTY0X0RUUFJFTDY0TFNCXSA9ICJSX0lBNjRfRFRQUkVMNjRMU0IiLAorICAgIFtSX0lBNjRfTFRPRkZfRFRQUkVMMjJdID0gIlJfSUE2NF9MVE9GRl9EVFBSRUwyMiIKKyAgfTsKKworCisvKiBEZXRlcm1pbmUgcmVsb2NhdGlvbiB0eXBlIHN0cmluZyBmb3IgSUEtNjQuICAqLworY29uc3QgY2hhciAqCitpYTY0X3JlbG9jX3R5cGVfbmFtZSAoaW50IHR5cGUsIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBpZiAodHlwZSA8IDAKKyAgICAgIHx8ICgoc2l6ZV90KSB0eXBlCisJICA+PSBzaXplb2YgKHJlbG9jX21hcF90YWJsZSkgLyBzaXplb2YgKHJlbG9jX21hcF90YWJsZVswXSkpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiByZWxvY19tYXBfdGFibGVbdHlwZV07Cit9CisKKworLyogQ2hlY2sgZm9yIGNvcnJlY3QgcmVsb2NhdGlvbiB0eXBlLiAgKi8KK2Jvb2wKK2lhNjRfcmVsb2NfdHlwZV9jaGVjayAoaW50IHR5cGUpCit7CisgIHJldHVybiAodHlwZSA+PSBSX0lBNjRfTk9ORQorCSAgJiYgKChzaXplX3QpIHR5cGUKKwkgICAgICA8IHNpemVvZiAocmVsb2NfbWFwX3RhYmxlKSAvIHNpemVvZiAocmVsb2NfbWFwX3RhYmxlWzBdKSkKKwkgICYmIHJlbG9jX21hcF90YWJsZVt0eXBlXSAhPSBOVUxMKSA/IHRydWUgOiBmYWxzZTsKK30KKworCitjb25zdCBjaGFyICoKK2lhNjRfc2VnbWVudF90eXBlX25hbWUgKGludCBzZWdtZW50LCBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHN3aXRjaCAoc2VnbWVudCkKKyAgICB7CisgICAgY2FzZSBQVF9JQV82NF9BUkNIRVhUOgorICAgICAgcmV0dXJuICJJQV82NF9BUkNIRVhUIjsKKyAgICBjYXNlIFBUX0lBXzY0X1VOV0lORDoKKyAgICAgIHJldHVybiAiSUFfNjRfVU5XSU5EIjsKKyAgICBjYXNlIFBUX0lBXzY0X0hQX09QVF9BTk9UOgorICAgICAgcmV0dXJuICJJQV82NF9IUF9PUFRfQU5PVCI7CisgICAgY2FzZSBQVF9JQV82NF9IUF9IU0xfQU5PVDoKKyAgICAgIHJldHVybiAiSUFfNjRfSFBfSFNMX0FOT1QiOworICAgIGNhc2UgUFRfSUFfNjRfSFBfU1RBQ0s6CisgICAgICByZXR1cm4gIklBXzY0X0hQX1NUQUNLIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworCitjb25zdCBjaGFyICoKK2lhNjRfZHluYW1pY190YWdfbmFtZSAoaW50NjRfdCB0YWcsIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgc3dpdGNoICh0YWcpCisgICAgeworICAgIGNhc2UgRFRfSUFfNjRfUExUX1JFU0VSVkU6CisgICAgICByZXR1cm4gIklBXzY0X1BMVF9SRVNFUlZFIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgY29weSByZWxvY2F0aW9uLiAgKi8KK2Jvb2wKK2lhNjRfY29weV9yZWxvY19wIChpbnQgcmVsb2MpCit7CisgIHJldHVybiByZWxvYyA9PSBSX0lBNjRfQ09QWTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9saWJlYmwuaCBiL2xpYmVibC9saWJlYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmY5Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2xpYmVibC5oCkBAIC0wLDAgKzEsMjA4IEBACisvKiBJbnRlcmZhY2UgZm9yIGxpYmVibC4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9MSUJFQkxfSAorI2RlZmluZSBfTElCRUJMX0ggMQorCisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGVsZi1rbm93bGVkZ2UuaD4KKworCisvKiBPcGFxdWUgdHlwZSBmb3IgdGhlIGhhbmRsZS4gICovCit0eXBlZGVmIHN0cnVjdCBlYmwgRWJsOworCisKKy8qIEdldCBiYWNrZW5kIGhhbmRsZSBmb3Igb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBFTEYgaGFuZGxlLiAgKi8KK2V4dGVybiBFYmwgKmVibF9vcGVuYmFja2VuZCAoRWxmICplbGYpOworLyogU2ltaWxhciBidXQgd2l0aG91dCB1bmRlcmx5aW5nIEVMRiBmaWxlLiAgKi8KK2V4dGVybiBFYmwgKmVibF9vcGVuYmFja2VuZF9tYWNoaW5lIChHRWxmX0hhbGYgbWFjaGluZSk7CisvKiBTaW1pbGFyIGJ1dCB3aXRoIGVtdWxhdGlvbiBuYW1lIGdpdmVuLiAgKi8KK2V4dGVybiBFYmwgKmVibF9vcGVuYmFja2VuZF9lbXVsYXRpb24gKGNvbnN0IGNoYXIgKmVtdWxhdGlvbik7CisKKy8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgYmFja2VuZCBoYW5kbGUuICAqLworZXh0ZXJuIHZvaWQgZWJsX2Nsb3NlYmFja2VuZCAoRWJsICpiaCk7CisKKworLyogRnVuY3Rpb24gdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGluY2x1ZGluZyBkZWZhdWx0IEVMRgorICAgaGFuZGxpbmcuICAqLworCisvKiBSZXR1cm4gYmFja2VuZCBuYW1lLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICplYmxfYmFja2VuZF9uYW1lIChFYmwgKmVibCk7CisKKy8qIFJldHVybiByZWxvY2F0aW9uIHR5cGUgbmFtZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqZWJsX29iamVjdF90eXBlX25hbWUgKEVibCAqZWJsLCBpbnQgb2JqZWN0LAorCQkJCQkgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKworLyogUmV0dXJuIHJlbG9jYXRpb24gdHlwZSBuYW1lLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICplYmxfcmVsb2NfdHlwZV9uYW1lIChFYmwgKmVibCwgaW50IHJlbG9jLAorCQkJCQljaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBDaGVjayByZWxvY2F0aW9uIHR5cGUuICAqLworZXh0ZXJuIGJvb2wgZWJsX3JlbG9jX3R5cGVfY2hlY2sgKEVibCAqZWJsLCBpbnQgcmVsb2MpOworCisvKiBDaGVjayByZWxvY2F0aW9uIHR5cGUgdXNlLiAgKi8KK2V4dGVybiBib29sIGVibF9yZWxvY192YWxpZF91c2UgKEVibCAqZWJsLCBpbnQgcmVsb2MpOworCisvKiBDaGVjayBpZiByZWxvY2F0aW9uIHR5cGUgaXMgZm9yIHNpbXBsZSBhYnNvbHV0ZSByZWxvY2F0aW9ucy4KKyAgIFJldHVybiBFTEZfVF97QllURSxIQUxGLFNXT1JELFNYV09SRH0gZm9yIGEgc2ltcGxlIHR5cGUsIGVsc2UgRUxGX1RfTlVNLiAgKi8KK2V4dGVybiBFbGZfVHlwZSBlYmxfcmVsb2Nfc2ltcGxlX3R5cGUgKEVibCAqZWJsLCBpbnQgcmVsb2MpOworCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3ltYm9sIHR5cGUgaXMgdGhhdCByZWZlcmVuY2luZyB0aGUgR09ULiAgRS5nLiwKKyAgIFJfMzg2X0dPVFBDLiAgKi8KK2V4dGVybiBib29sIGVibF9nb3RwY19yZWxvY19jaGVjayAoRWJsICplYmwsIGludCByZWxvYyk7CisKKy8qIFJldHVybiBzZWdtZW50IHR5cGUgbmFtZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqZWJsX3NlZ21lbnRfdHlwZV9uYW1lIChFYmwgKmVibCwgaW50IHNlZ21lbnQsCisJCQkJCSAgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKworLyogUmV0dXJuIHNlY3Rpb24gdHlwZSBuYW1lLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICplYmxfc2VjdGlvbl90eXBlX25hbWUgKEVibCAqZWJsLCBpbnQgc2VjdGlvbiwKKwkJCQkJICBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBSZXR1cm4gc2VjdGlvbiBuYW1lLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICplYmxfc2VjdGlvbl9uYW1lIChFYmwgKmVibCwgaW50IHNlY3Rpb24sIGludCB4c2VjdGlvbiwKKwkJCQkgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnNjbm5hbWVzW10sIHNpemVfdCBzaG51bSk7CisKKy8qIFJldHVybiBtYWNoaW5lIGZsYWcgbmFtZXMuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9tYWNoaW5lX2ZsYWdfbmFtZSAoRWJsICplYmwsIEdFbGZfV29yZCBmbGFncywKKwkJCQkJICBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBDaGVjayB3aGV0aGVyIG1hY2hpbmUgZmxhZyBpcyB2YWxpZC4gICovCitleHRlcm4gYm9vbCBlYmxfbWFjaGluZV9mbGFnX2NoZWNrIChFYmwgKmVibCwgR0VsZl9Xb3JkIGZsYWdzKTsKKworLyogUmV0dXJuIHN5bWJvbCB0eXBlIG5hbWUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9zeW1ib2xfdHlwZV9uYW1lIChFYmwgKmVibCwgaW50IHN5bWJvbCwKKwkJCQkJIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qIFJldHVybiBzeW1ib2wgYmluZGluZyBuYW1lLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICplYmxfc3ltYm9sX2JpbmRpbmdfbmFtZSAoRWJsICplYmwsIGludCBiaW5kaW5nLAorCQkJCQkgICAgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKworLyogUmV0dXJuIGR5bmFtaWMgdGFnIG5hbWUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9keW5hbWljX3RhZ19uYW1lIChFYmwgKmVibCwgaW50NjRfdCB0YWcsCisJCQkJCSBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBDaGVjayBkeW5hbWljIHRhZy4gICovCitleHRlcm4gYm9vbCBlYmxfZHluYW1pY190YWdfY2hlY2sgKEVibCAqZWJsLCBpbnQ2NF90IHRhZyk7CisKKy8qIFJldHVybiBjb21iaW5lZCBzZWN0aW9uIGhlYWRlciBmbGFncyB2YWx1ZS4gICovCitleHRlcm4gR0VsZl9Xb3JkIGVibF9zaF9mbGFnc19jb21iaW5lIChFYmwgKmVibCwgR0VsZl9Xb3JkIGZsYWdzMSwKKwkJCQkgICAgICAgR0VsZl9Xb3JkIGZsYWdzMik7CisKKy8qIFJldHVybiBzeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBPUyBBQkkuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9vc2FiaV9uYW1lIChFYmwgKmVibCwgaW50IG9zYWJpLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisKKy8qIFJldHVybiBuYW1lIG9mIHRoZSBub3RlIHNlY3Rpb24gdHlwZSBmb3IgYSBjb3JlIGZpbGUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9jb3JlX25vdGVfdHlwZV9uYW1lIChFYmwgKmVibCwgdWludDMyX3QgdHlwZSwgY2hhciAqYnVmLAorCQkJCQkgICAgc2l6ZV90IGxlbik7CisKKy8qIFJldHVybiBuYW1lIG9mIHRoZSBub3RlIHNlY3Rpb24gdHlwZSBmb3IgYW4gb2JqZWN0IGZpbGUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9vYmplY3Rfbm90ZV90eXBlX25hbWUgKEVibCAqZWJsLCB1aW50MzJfdCB0eXBlLAorCQkJCQkgICAgICBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBQcmludCBpbmZvcm1hdGlvbiBhYm91dCBjb3JlIG5vdGUgaWYgYXZhaWxhYmxlLiAgKi8KK2V4dGVybiB2b2lkIGVibF9jb3JlX25vdGUgKEVibCAqZWJsLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCB0eXBlLAorCQkJICAgdWludDMyX3QgZGVzY3N6LCBjb25zdCBjaGFyICpkZXNjKTsKKworLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgb2JqZWN0IG5vdGUgaWYgYXZhaWxhYmxlLiAgKi8KK2V4dGVybiB2b2lkIGVibF9vYmplY3Rfbm90ZSAoRWJsICplYmwsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHR5cGUsCisJCQkgICAgIHVpbnQzMl90IGRlc2NzeiwgY29uc3QgY2hhciAqZGVzYyk7CisKKy8qIENoZWNrIHNlY3Rpb24gbmFtZSBmb3IgYmVpbmcgdGhhdCBvZiBhIGRlYnVnIGluZm9ybWF0aW5vIHNlY3Rpb24uICAqLworZXh0ZXJuIGJvb2wgZWJsX2RlYnVnc2NuX3AgKEVibCAqZWJsLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgY29weSByZWxvY2F0aW9uLiAgKi8KK2V4dGVybiBib29sIGVibF9jb3B5X3JlbG9jX3AgKEVibCAqZWJsLCBpbnQgcmVsb2MpOworCisKKy8qIENIZWNrIHdoZXRoZXIgc2VjdGlvbiBzaG91bGQgYmUgc3RyaXBwZWQuICAqLworZXh0ZXJuIGJvb2wgZWJsX3NlY3Rpb25fc3RyaXBfcCAoRWJsICplYmwsIGNvbnN0IEdFbGZfRWhkciAqZWhkciwKKwkJCQkgY29uc3QgR0VsZl9TaGRyICpzaGRyLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSBib29sIHJlbW92ZV9jb21tZW50LCBib29sIG9ubHlfcmVtb3ZlX2RlYnVnKTsKKworCisvKiBFTEYgc3RyaW5nIHRhYmxlIGhhbmRsaW5nLiAgKi8KK3N0cnVjdCBFYmxfU3RydGFiOworc3RydWN0IEVibF9TdHJlbnQ7CisKKy8qIENyZWF0ZSBuZXcgRUxGIHN0cmluZyB0YWJsZSBvYmplY3QgaW4gbWVtb3J5LiAgKi8KK2V4dGVybiBzdHJ1Y3QgRWJsX1N0cnRhYiAqZWJsX3N0cnRhYmluaXQgKGJvb2wgbnVsbHN0cik7CisKKy8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgRUxGIHN0cmluZyB0YWJsZSBTVC4gICovCitleHRlcm4gdm9pZCBlYmxfc3RydGFiZnJlZSAoc3RydWN0IEVibF9TdHJ0YWIgKnN0KTsKKworLyogQWRkIHN0cmluZyBTVFIgKGxlbmd0aCBMRU4gaXMgIT0gMCkgdG8gRUxGIHN0cmluZyB0YWJsZSBTVC4gICovCitleHRlcm4gc3RydWN0IEVibF9TdHJlbnQgKmVibF9zdHJ0YWJhZGQgKHN0cnVjdCBFYmxfU3RydGFiICpzdCwKKwkJCQkJIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbik7CisKKy8qIEZpbmFsaXplIHN0cmluZyB0YWJsZSBTVCBhbmQgc3RvcmUgc2l6ZSBhbmQgbWVtb3J5IGxvY2F0aW9uIGluZm9ybWF0aW9uCisgICBpbiBEQVRBLiAgKi8KK2V4dGVybiB2b2lkIGVibF9zdHJ0YWJmaW5hbGl6ZSAoc3RydWN0IEVibF9TdHJ0YWIgKnN0LCBFbGZfRGF0YSAqZGF0YSk7CisKKy8qIEdldCBvZmZzZXQgaW4gc3RyaW5nIHRhYmxlIGZvciBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIFNFLiAgKi8KK2V4dGVybiBzaXplX3QgZWJsX3N0cnRhYm9mZnNldCAoc3RydWN0IEVibF9TdHJlbnQgKnNlKTsKKworLyogUmV0dXJuIHRoZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIFNFLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICplYmxfc3RyaW5nIChzdHJ1Y3QgRWJsX1N0cmVudCAqc2UpOworCisKKy8qIEVMRiB3aWRlIGNoYXIgc3RyaW5nIHRhYmxlIGhhbmRsaW5nLiAgKi8KK3N0cnVjdCBFYmxfV1N0cnRhYjsKK3N0cnVjdCBFYmxfV1N0cmVudDsKKworLyogQ3JlYXRlIG5ldyBFTEYgd2lkZSBjaGFyIHN0cmluZyB0YWJsZSBvYmplY3QgaW4gbWVtb3J5LiAgKi8KK2V4dGVybiBzdHJ1Y3QgRWJsX1dTdHJ0YWIgKmVibF93c3RydGFiaW5pdCAoYm9vbCBudWxsc3RyKTsKKworLyogRnJlZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBFTEYgd2lkZSBjaGFyIHN0cmluZyB0YWJsZSBTVC4gICovCitleHRlcm4gdm9pZCBlYmxfd3N0cnRhYmZyZWUgKHN0cnVjdCBFYmxfV1N0cnRhYiAqc3QpOworCisvKiBBZGQgc3RyaW5nIFNUUiAobGVuZ3RoIExFTiBpcyAhPSAwKSB0byBFTEYgc3RyaW5nIHRhYmxlIFNULiAgKi8KK2V4dGVybiBzdHJ1Y3QgRWJsX1dTdHJlbnQgKmVibF93c3RydGFiYWRkIChzdHJ1Y3QgRWJsX1dTdHJ0YWIgKnN0LAorCQkJCQkgICBjb25zdCB3Y2hhcl90ICpzdHIsIHNpemVfdCBsZW4pOworCisvKiBGaW5hbGl6ZSBzdHJpbmcgdGFibGUgU1QgYW5kIHN0b3JlIHNpemUgYW5kIG1lbW9yeSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICAgaW4gREFUQS4gICovCitleHRlcm4gdm9pZCBlYmxfd3N0cnRhYmZpbmFsaXplIChzdHJ1Y3QgRWJsX1dTdHJ0YWIgKnN0LCBFbGZfRGF0YSAqZGF0YSk7CisKKy8qIEdldCBvZmZzZXQgaW4gd2lkZSBjaGFyIHN0cmluZyB0YWJsZSBmb3Igc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBTRS4gICovCitleHRlcm4gc2l6ZV90IGVibF93c3RydGFib2Zmc2V0IChzdHJ1Y3QgRWJsX1dTdHJlbnQgKnNlKTsKKworCisvKiBHZW5lcmljIHN0cmluZyB0YWJsZSBoYW5kbGluZy4gICovCitzdHJ1Y3QgRWJsX0dTdHJ0YWI7CitzdHJ1Y3QgRWJsX0dTdHJlbnQ7CisKKy8qIENyZWF0ZSBuZXcgc3RyaW5nIHRhYmxlIG9iamVjdCBpbiBtZW1vcnkuICAqLworZXh0ZXJuIHN0cnVjdCBFYmxfR1N0cnRhYiAqZWJsX2dzdHJ0YWJpbml0ICh1bnNpZ25lZCBpbnQgd2lkdGgsIGJvb2wgbnVsbHN0cik7CisKKy8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3Igc3RyaW5nIHRhYmxlIFNULiAgKi8KK2V4dGVybiB2b2lkIGVibF9nc3RydGFiZnJlZSAoc3RydWN0IEVibF9HU3RydGFiICpzdCk7CisKKy8qIEFkZCBzdHJpbmcgU1RSIChsZW5ndGggTEVOIGlzICE9IDApIHRvIHN0cmluZyB0YWJsZSBTVC4gICovCitleHRlcm4gc3RydWN0IEVibF9HU3RyZW50ICplYmxfZ3N0cnRhYmFkZCAoc3RydWN0IEVibF9HU3RydGFiICpzdCwKKwkJCQkJICAgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKKworLyogRmluYWxpemUgc3RyaW5nIHRhYmxlIFNUIGFuZCBzdG9yZSBzaXplIGFuZCBtZW1vcnkgbG9jYXRpb24gaW5mb3JtYXRpb24KKyAgIGluIERBVEEuICAqLworZXh0ZXJuIHZvaWQgZWJsX2dzdHJ0YWJmaW5hbGl6ZSAoc3RydWN0IEVibF9HU3RydGFiICpzdCwgRWxmX0RhdGEgKmRhdGEpOworCisvKiBHZXQgb2Zmc2V0IGluIHdpZGUgY2hhciBzdHJpbmcgdGFibGUgZm9yIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggU0UuICAqLworZXh0ZXJuIHNpemVfdCBlYmxfZ3N0cnRhYm9mZnNldCAoc3RydWN0IEVibF9HU3RyZW50ICpzZSk7CisKKyNlbmRpZgkvKiBsaWJlYmwuaCAqLwpkaWZmIC0tZ2l0IGEvbGliZWJsL2xpYmVibFAuaCBiL2xpYmVibC9saWJlYmxQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiYjhmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9saWJlYmxQLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qIEludGVybmFsIGRlZmluaXRpb25zIGZvciBpbnRlcmZhY2UgZm9yIGxpYmVibC4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9MSUJFQkxQX0gKKyNkZWZpbmUgX0xJQkVCTFBfSCAxCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8bGliZWJsLmg+CisjaW5jbHVkZSA8bGliaW50bC5oPgorCisKKy8qIEJhY2tlbmQgaGFuZGxlLiAgKi8KK3N0cnVjdCBlYmwKK3sKKyAgLyogTWFjaGluZSBuYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKworICAvKiBFbXVsYXRpb24gbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKmVtdWxhdGlvbjsKKworICAvKiBUaGUgbGliZWxmIGhhbmRsZSAoaWYga25vd24pLiAgKi8KKyAgRWxmICplbGY7CisKKyAgLyogUmV0dXJuIHN5bWJvbCByZXByZXNlbnRhdG9uIG9mIG9iamVjdCBmaWxlIHR5cGUuICAqLworICBjb25zdCBjaGFyICooKm9iamVjdF90eXBlX25hbWUpIChpbnQsIGNoYXIgKiwgc2l6ZV90KTsKKworICAvKiBSZXR1cm4gc3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiB0eXBlLiAgKi8KKyAgY29uc3QgY2hhciAqKCpyZWxvY190eXBlX25hbWUpIChpbnQsIGNoYXIgKiwgc2l6ZV90KTsKKworICAvKiBDaGVjayByZWxvY2F0aW9uIHR5cGUuICAqLworICBib29sICgqcmVsb2NfdHlwZV9jaGVjaykgKGludCk7CisKKyAgLyogQ2hlY2sgaWYgcmVsb2NhdGlvbiB0eXBlIGlzIGZvciBzaW1wbGUgYWJzb2x1dGUgcmVsb2NhdGlvbnMuICAqLworICBFbGZfVHlwZSAoKnJlbG9jX3NpbXBsZV90eXBlKSAoRWxmICosIGludCk7CisKKyAgLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlIHVzZS4gICovCisgIGJvb2wgKCpyZWxvY192YWxpZF91c2UpIChFbGYgKiwgaW50KTsKKworICAvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3ltYm9sIHR5cGUgaXMgdGhhdCByZWZlcmVuY2luZyB0aGUgR09ULiAgKi8KKyAgYm9vbCAoKmdvdHBjX3JlbG9jX2NoZWNrKSAoRWxmICosIGludCk7CisKKyAgLyogUmV0dXJuIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIHNlZ21lbnQgdHlwZS4gICovCisgIGNvbnN0IGNoYXIgKigqc2VnbWVudF90eXBlX25hbWUpIChpbnQsIGNoYXIgKiwgc2l6ZV90KTsKKworICAvKiBSZXR1cm4gc3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2Ygc2VjdGlvbiB0eXBlLiAgKi8KKyAgY29uc3QgY2hhciAqKCpzZWN0aW9uX3R5cGVfbmFtZSkgKGludCwgY2hhciAqLCBzaXplX3QpOworCisgIC8qIFJldHVybiBzZWN0aW9uIG5hbWUuICAqLworICBjb25zdCBjaGFyICooKnNlY3Rpb25fbmFtZSkgKGludCwgaW50LCBjaGFyICosIHNpemVfdCk7CisKKyAgLyogUmV0dXJuIG5leHQgbWFjaGluZSBmbGFnIG5hbWUuICAqLworICBjb25zdCBjaGFyICooKm1hY2hpbmVfZmxhZ19uYW1lKSAoR0VsZl9Xb3JkICopOworCisgIC8qIENoZWNrIHdoZXRoZXIgbWFjaGluZSBmbGFncyBhcmUgdmFsaWQuICAqLworICBib29sICgqbWFjaGluZV9mbGFnX2NoZWNrKSAoR0VsZl9Xb3JkKTsKKworICAvKiBSZXR1cm4gc3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2Ygc3ltYm9sIHR5cGUuICAqLworICBjb25zdCBjaGFyICooKnN5bWJvbF90eXBlX25hbWUpIChpbnQsIGNoYXIgKiwgc2l6ZV90KTsKKworICAvKiBSZXR1cm4gc3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2Ygc3ltYm9sIGJpbmRpbmcuICAqLworICBjb25zdCBjaGFyICooKnN5bWJvbF9iaW5kaW5nX25hbWUpIChpbnQsIGNoYXIgKiwgc2l6ZV90KTsKKworICAvKiBSZXR1cm4gc3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2YgZHluYW1pYyB0YWcuICAqLworICBjb25zdCBjaGFyICooKmR5bmFtaWNfdGFnX25hbWUpIChpbnQ2NF90LCBjaGFyICosIHNpemVfdCk7CisKKyAgLyogQ2hlY2sgZHluYW1pYyB0YWcuICAqLworICBib29sICgqZHluYW1pY190YWdfY2hlY2spIChpbnQ2NF90KTsKKworICAvKiBDb21iaW5lIHNlY3Rpb24gaGVhZGVyIGZsYWdzIHZhbHVlcy4gICovCisgIEdFbGZfV29yZCAoKnNoX2ZsYWdzX2NvbWJpbmUpIChHRWxmX1dvcmQsIEdFbGZfV29yZCk7CisKKyAgLyogUmV0dXJuIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIE9TIEFCSS4gICovCisgIGNvbnN0IGNoYXIgKigqb3NhYmlfbmFtZSkgKGludCwgY2hhciAqLCBzaXplX3QpOworCisgIC8qIE5hbWUgb2YgYSBub3RlIGVudHJ5IHR5cGUgZm9yIGNvcmUgZmlsZXMuICAqLworICBjb25zdCBjaGFyICooKmNvcmVfbm90ZV90eXBlX25hbWUpICh1aW50MzJfdCwgY2hhciAqLCBzaXplX3QpOworCisgIC8qIE5hbWUgb2YgYSBub3RlIGVudHJ5IHR5cGUgZm9yIG9iamVjdCBmaWxlcy4gICovCisgIGNvbnN0IGNoYXIgKigqb2JqZWN0X25vdGVfdHlwZV9uYW1lKSAodWludDMyX3QsIGNoYXIgKiwgc2l6ZV90KTsKKworICAvKiBIYW5kbGUgY29yZSBub3RlLiAgKi8KKyAgYm9vbCAoKmNvcmVfbm90ZSkgKGNvbnN0IGNoYXIgKiwgdWludDMyX3QsIHVpbnQzMl90LCBjb25zdCBjaGFyICopOworCisgIC8qIEhhbmRsZSBvYmplY3QgZmlsZSBub3RlLiAgKi8KKyAgYm9vbCAoKm9iamVjdF9ub3RlKSAoY29uc3QgY2hhciAqLCB1aW50MzJfdCwgdWludDMyX3QsIGNvbnN0IGNoYXIgKik7CisKKyAgLyogQ2hlY2sgc2VjdGlvbiBuYW1lIGZvciBiZWluZyB0aGF0IG9mIGEgZGVidWcgaW5mb3JtYXRpbm8gc2VjdGlvbi4gICovCisgIGJvb2wgKCpkZWJ1Z3Njbl9wKSAoY29uc3QgY2hhciAqKTsKKworICAvKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSBjb3B5IHJlbG9jYXRpb24uICAqLworICBib29sICgqY29weV9yZWxvY19wKSAoaW50KTsKKworICAvKiBEZXN0cnVjdG9yIGZvciBFTEYgYmFja2VuZCBoYW5kbGUuICAqLworICB2b2lkICgqZGVzdHIpIChzdHJ1Y3QgZWJsICopOworCisgIC8qIEludGVybmFsIGRhdGEuICAqLworICB2b2lkICpkbGhhbmRsZTsKK307CisKKworLyogVHlwZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGluIHRoZSBiYWNrZW5kIG1vZHVsZXMuICAqLwordHlwZWRlZiBjb25zdCBjaGFyICooKmVibF9iaGluaXRfdCkgKEVsZiAqLCBHRWxmX0hhbGYsIEVibCAqLCBzaXplX3QpOworCisKKy8qIGdldHRleHQgaGVscGVyIG1hY3Jvcy4gICovCisjZGVmaW5lIF8oU3RyKSBkZ2V0dGV4dCAoImVsZnV0aWxzIiwgU3RyKQorCisjZW5kaWYJLyogbGliZWJsUC5oICovCmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX2FscGhhLmggYi9saWJlYmwvbGliZWJsX2FscGhhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5MGQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9saWJlYmxfYWxwaGEuaApAQCAtMCwwICsxLDM3IEBACisvKiBJbnRlcmZhY2UgZm9yIGxpYmVibF9hbHBoYSBtb2R1bGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBfTElCRUJMX0FMUEhBX0gKKyNkZWZpbmUgX0xJQkVCTF9BTFBIQV9IIDEKKworI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCisvKiBDb25zdHJ1Y3Rvci4gICovCitleHRlcm4gY29uc3QgY2hhciAqYWxwaGFfaW5pdCAoRWxmICplbGYsIEdFbGZfSGFsZiBtYWNoaW5lLCBFYmwgKmVoLAorCQkJICAgICAgIHNpemVfdCBlaGxlbik7CisKKy8qIERlc3RydWN0b3IuICAqLworZXh0ZXJuIHZvaWQgYWxwaGFfZGVzdHIgKEVibCAqYmgpOworCisKKy8qIEZ1bmN0aW9uIHRvIGdldCByZWxvY2F0aW9uIHR5cGUgbmFtZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqYWxwaGFfcmVsb2NfdHlwZV9uYW1lIChpbnQgdHlwZSwgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKworLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlLiAgKi8KK2V4dGVybiBib29sIGFscGhhX3JlbG9jX3R5cGVfY2hlY2sgKGludCB0eXBlKTsKKworLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgY29weSByZWxvY2F0aW9uLiAgKi8KK2V4dGVybiBib29sIGFscGhhX2NvcHlfcmVsb2NfcCAoaW50IHJlbG9jKTsKKworI2VuZGlmCS8qIGxpYmVibF9hbHBoYS5oICovCmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX2FscGhhLm1hcCBiL2xpYmVibC9saWJlYmxfYWxwaGEubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjZhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvbGliZWJsX2FscGhhLm1hcApAQCAtMCwwICsxLDExIEBACitFTEZVVElMU18xLjAgeworICBnbG9iYWw6CisgICAgYWxwaGFfYmFja2VuZF9uYW1lOworICAgIGFscGhhX2Rlc3RyOworICAgIGFscGhhX2luaXQ7CisgICAgYWxwaGFfcmVsb2NfdHlwZV9jaGVjazsKKyAgICBhbHBoYV9yZWxvY190eXBlX25hbWU7CisKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX2FybS5oIGIvbGliZWJsL2xpYmVibF9hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGJiOTljCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2xpYmVibF9hcm0uaApAQCAtMCwwICsxLDM3IEBACisvKiBJbnRlcmZhY2UgZm9yIGxpYmVibF9hcm0gbW9kdWxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZm5kZWYgX0xJQkVCTF9BUk1fSAorI2RlZmluZSBfTElCRUJMX0FSTV9IIDEKKworI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCisvKiBDb25zdHJ1Y3Rvci4gICovCitleHRlcm4gY29uc3QgY2hhciAqYXJtX2luaXQgKEVsZiAqZWxmLCBHRWxmX0hhbGYgbWFjaGluZSwgRWJsICplaCwKKwkJCSAgICAgc2l6ZV90IGVobGVuKTsKKworLyogRGVzdHJ1Y3Rvci4gICovCitleHRlcm4gdm9pZCBhcm1fZGVzdHIgKEVibCAqYmgpOworCisKKy8qIEZ1bmN0aW9uIHRvIGdldCByZWxvY2F0aW9uIHR5cGUgbmFtZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqYXJtX3JlbG9jX3R5cGVfbmFtZSAoaW50IHR5cGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qIENoZWNrIHJlbG9jYXRpb24gdHlwZS4gICovCitleHRlcm4gYm9vbCBhcm1fcmVsb2NfdHlwZV9jaGVjayAoaW50IHR5cGUpOworCisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSBjb3B5IHJlbG9jYXRpb24uICAqLworZXh0ZXJuIGJvb2wgYXJtX2NvcHlfcmVsb2NfcCAoaW50IHJlbG9jKTsKKworI2VuZGlmCS8qIGxpYmVibF9hcm0uaCAqLwpkaWZmIC0tZ2l0IGEvbGliZWJsL2xpYmVibF9hcm0ubWFwIGIvbGliZWJsL2xpYmVibF9hcm0ubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODk1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvbGliZWJsX2FybS5tYXAKQEAgLTAsMCArMSwxMSBAQAorRUxGVVRJTFNfMS4wIHsKKyAgZ2xvYmFsOgorICAgIGFybV9iYWNrZW5kX25hbWU7CisgICAgYXJtX2Rlc3RyOworICAgIGFybV9pbml0OworICAgIGFybV9yZWxvY190eXBlX2NoZWNrOworICAgIGFybV9yZWxvY190eXBlX25hbWU7CisKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX2kzODYuaCBiL2xpYmVibC9saWJlYmxfaTM4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmIzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvbGliZWJsX2kzODYuaApAQCAtMCwwICsxLDU0IEBACisvKiBJbnRlcmZhY2UgZm9yIGxpYmVibF9pMzg2IG1vZHVsZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9MSUJFQkxfSTM4Nl9ICisjZGVmaW5lIF9MSUJFQkxfSTM4Nl9IIDEKKworI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCisvKiBDb25zdHJ1Y3Rvci4gICovCitleHRlcm4gY29uc3QgY2hhciAqaTM4Nl9pbml0IChFbGYgKmVsZiwgR0VsZl9IYWxmIG1hY2hpbmUsIEVibCAqZWgsCisJCQkgICAgICBzaXplX3QgZWhsZW4pOworCisvKiBEZXN0cnVjdG9yLiAgKi8KK2V4dGVybiB2b2lkIGkzODZfZGVzdHIgKEVibCAqYmgpOworCisKKy8qIEZ1bmN0aW9uIHRvIGdldCByZWxvY2F0aW9uIHR5cGUgbmFtZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqaTM4Nl9yZWxvY190eXBlX25hbWUgKGludCB0eXBlLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBDaGVjayByZWxvY2F0aW9uIHR5cGUuICAqLworZXh0ZXJuIGJvb2wgaTM4Nl9yZWxvY190eXBlX2NoZWNrIChpbnQgdHlwZSk7CisKKy8qIENoZWNrIHJlbG9jYXRpb24gdHlwZSB1c2UuICAqLworZXh0ZXJuIGJvb2wgaTM4Nl9yZWxvY192YWxpZF91c2UgKEVsZiAqZWxmLCBpbnQgdHlwZSk7CisKKy8qIENoZWNrIGZvciB0aGUgc2ltcGxlIHJlbG9jIHR5cGVzLiAgKi8KK2V4dGVybiBFbGZfVHlwZSBpMzg2X3JlbG9jX3NpbXBsZV90eXBlIChFbGYgKmVsZiwgaW50IHR5cGUpOworCisvKiBDaGVjayByZWxvY2F0aW9uIHR5cGUgdXNlLiAgKi8KK2V4dGVybiBib29sIGkzODZfZ290cGNfcmVsb2NfY2hlY2sgKEVsZiAqZWxmLCBpbnQgdHlwZSk7CisKKy8qIENvZGUgbm90ZSBoYW5kbGluZy4gICovCitleHRlcm4gYm9vbCBpMzg2X2NvcmVfbm90ZSAoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgZGVzY3N6LAorCQkJICAgIGNvbnN0IGNoYXIgKmRlc2MpOworCisvKiBDaGVjayBzZWN0aW9uIG5hbWUgZm9yIGJlaW5nIHRoYXQgb2YgYSBkZWJ1ZyBpbmZvcm1hdGlubyBzZWN0aW9uLiAgKi8KK2V4dGVybiBib29sIGkzODZfZGVidWdzY25fcCAoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gYm9vbCAoKmdlbmVyaWNfZGVidWdzY25fcCkgKGNvbnN0IGNoYXIgKik7CisKKy8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gcmVsb2NhdGlvbiBpcyBhIGNvcHkgcmVsb2NhdGlvbi4gICovCitleHRlcm4gYm9vbCBpMzg2X2NvcHlfcmVsb2NfcCAoaW50IHJlbG9jKTsKKworI2VuZGlmCS8qIGxpYmVibF9pMzg2LmggKi8KZGlmZiAtLWdpdCBhL2xpYmVibC9saWJlYmxfaTM4Ni5tYXAgYi9saWJlYmwvbGliZWJsX2kzODYubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzkxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvbGliZWJsX2kzODYubWFwCkBAIC0wLDAgKzEsMTQgQEAKK0VMRlVUSUxTXzEuMCB7CisgIGdsb2JhbDoKKyAgICBpMzg2X2JhY2tlbmRfbmFtZTsKKyAgICBpMzg2X2NvcmVfbm90ZTsKKyAgICBpMzg2X2Rlc3RyOworICAgIGkzODZfaW5pdDsKKyAgICBpMzg2X3JlbG9jX3R5cGVfY2hlY2s7CisgICAgaTM4Nl9yZWxvY190eXBlX25hbWU7CisgICAgaTM4Nl9yZWxvY192YWxpZF91c2U7CisgICAgaTM4Nl9yZWxvY19zaW1wbGVfdHlwZTsKKworICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL2xpYmVibC9saWJlYmxfaWE2NC5oIGIvbGliZWJsL2xpYmVibF9pYTY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYTY1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9saWJlYmxfaWE2NC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEludGVyZmFjZSBmb3IgbGliZWJsX2lhNjQgbW9kdWxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZm5kZWYgX0xJQkVCTF9JQTY0X0gKKyNkZWZpbmUgX0xJQkVCTF9JQTY0X0ggMQorCisjaW5jbHVkZSA8bGliZWJsUC5oPgorCisKKy8qIENvbnN0cnVjdG9yLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICppYTY0X2luaXQgKEVsZiAqZWxmLCBHRWxmX0hhbGYgbWFjaGluZSwgRWJsICplaCwKKwkJCSAgICAgIHNpemVfdCBlaGxlbik7CisKKy8qIERlc3RydWN0b3IuICAqLworZXh0ZXJuIHZvaWQgaWE2NF9kZXN0ciAoRWJsICpiaCk7CisKKworLyogRnVuY3Rpb24gdG8gZ2V0IHJlbG9jYXRpb24gdHlwZSBuYW1lLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICppYTY0X3JlbG9jX3R5cGVfbmFtZSAoaW50IHR5cGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qIENoZWNrIHJlbG9jYXRpb24gdHlwZS4gICovCitleHRlcm4gYm9vbCBpYTY0X3JlbG9jX3R5cGVfY2hlY2sgKGludCB0eXBlKTsKKworLyogTmFtZSBvZiBzZWdtZW50IHR5cGUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmlhNjRfc2VnbWVudF90eXBlX25hbWUgKGludCBzZWdtZW50LCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBOYW1lIG9mIGR5bmFtaWMgdGFnLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICppYTY0X2R5bmFtaWNfdGFnX25hbWUgKGludDY0X3QgdGFnLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSBjb3B5IHJlbG9jYXRpb24uICAqLworZXh0ZXJuIGJvb2wgaWE2NF9jb3B5X3JlbG9jX3AgKGludCByZWxvYyk7CisKKyNlbmRpZgkvKiBsaWJlYmxfaWE2NC5oICovCmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX2lhNjQubWFwIGIvbGliZWJsL2xpYmVibF9pYTY0Lm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjcwNDJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2xpYmVibF9pYTY0Lm1hcApAQCAtMCwwICsxLDExIEBACitFTEZVVElMU18xLjAgeworICBnbG9iYWw6CisgICAgaWE2NF9iYWNrZW5kX25hbWU7CisgICAgaWE2NF9kZXN0cjsKKyAgICBpYTY0X2luaXQ7CisgICAgaWE2NF9yZWxvY190eXBlX2NoZWNrOworICAgIGlhNjRfcmVsb2NfdHlwZV9uYW1lOworCisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvbGliZWJsL2xpYmVibF9wcGMuaCBiL2xpYmVibC9saWJlYmxfcHBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2NDZkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9saWJlYmxfcHBjLmgKQEAgLTAsMCArMSw0NyBAQAorLyogSW50ZXJmYWNlIGZvciBsaWJlYmxfUFBDIG1vZHVsZS4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9MSUJFQkxfUFBDX0gKKyNkZWZpbmUgX0xJQkVCTF9QUENfSCAxCisKKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworLyogQ29uc3RydWN0b3IuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKnBwY19pbml0IChFbGYgKmVsZiwgR0VsZl9IYWxmIG1hY2hpbmUsIEVibCAqZWgsCisJCQkgICAgIHNpemVfdCBlaGxlbik7CisKKy8qIERlc3RydWN0b3IuICAqLworZXh0ZXJuIHZvaWQgcHBjX2Rlc3RyIChFYmwgKmJoKTsKKworCisvKiBGdW5jdGlvbiB0byBnZXQgcmVsb2NhdGlvbiB0eXBlIG5hbWUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKnBwY19yZWxvY190eXBlX25hbWUgKGludCB0eXBlLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBDaGVjayByZWxvY2F0aW9uIHR5cGUuICAqLworZXh0ZXJuIGJvb2wgcHBjX3JlbG9jX3R5cGVfY2hlY2sgKGludCB0eXBlKTsKKworLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlIHVzZS4gICovCitleHRlcm4gYm9vbCBwcGNfcmVsb2NfdmFsaWRfdXNlIChFbGYgKmVsZiwgaW50IHR5cGUpOworCisvKiBDaGVjayBmb3IgdGhlIHNpbXBsZSByZWxvYyB0eXBlcy4gICovCitleHRlcm4gRWxmX1R5cGUgcHBjX3JlbG9jX3NpbXBsZV90eXBlIChFbGYgKmVsZiwgaW50IHR5cGUpOworCisvKiBDb2RlIG5vdGUgaGFuZGxpbmcuICAqLworZXh0ZXJuIGJvb2wgcHBjX2NvcmVfbm90ZSAoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgZGVzY3N6LAorCQkJICAgICAgY29uc3QgY2hhciAqZGVzYyk7CisKKy8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gcmVsb2NhdGlvbiBpcyBhIGNvcHkgcmVsb2NhdGlvbi4gICovCitleHRlcm4gYm9vbCBwcGNfY29weV9yZWxvY19wIChpbnQgcmVsb2MpOworCisjZW5kaWYJLyogbGliZWJsX3BwYy5oICovCmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX3BwYy5tYXAgYi9saWJlYmwvbGliZWJsX3BwYy5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0OWMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9saWJlYmxfcHBjLm1hcApAQCAtMCwwICsxLDEyIEBACitFTEZVVElMU18xLjAgeworICBnbG9iYWw6CisgICAgcHBjX2JhY2tlbmRfbmFtZTsKKyAgICBwcGNfZGVzdHI7CisgICAgcHBjX2luaXQ7CisgICAgcHBjX3JlbG9jX3R5cGVfY2hlY2s7CisgICAgcHBjX3JlbG9jX3R5cGVfbmFtZTsKKyAgICBwcGNfcmVsb2Nfc2ltcGxlX3R5cGU7CisKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX3BwYzY0LmggYi9saWJlYmwvbGliZWJsX3BwYzY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczN2M1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9saWJlYmxfcHBjNjQuaApAQCAtMCwwICsxLDUwIEBACisvKiBJbnRlcmZhY2UgZm9yIGxpYmVibF9QUEM2NCBtb2R1bGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBfTElCRUJMX1BQQzY0X0gKKyNkZWZpbmUgX0xJQkVCTF9QUEM2NF9IIDEKKworI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCisvKiBDb25zdHJ1Y3Rvci4gICovCitleHRlcm4gY29uc3QgY2hhciAqcHBjNjRfaW5pdCAoRWxmICplbGYsIEdFbGZfSGFsZiBtYWNoaW5lLCBFYmwgKmVoLAorCQkJICAgICAgIHNpemVfdCBlaGxlbik7CisKKy8qIERlc3RydWN0b3IuICAqLworZXh0ZXJuIHZvaWQgcHBjNjRfZGVzdHIgKEVibCAqYmgpOworCisKKy8qIEZ1bmN0aW9uIHRvIGdldCByZWxvY2F0aW9uIHR5cGUgbmFtZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqcHBjNjRfcmVsb2NfdHlwZV9uYW1lIChpbnQgdHlwZSwgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKworLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlLiAgKi8KK2V4dGVybiBib29sIHBwYzY0X3JlbG9jX3R5cGVfY2hlY2sgKGludCB0eXBlKTsKKworLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlIHVzZS4gICovCitleHRlcm4gYm9vbCBwcGM2NF9yZWxvY192YWxpZF91c2UgKEVsZiAqZWxmLCBpbnQgdHlwZSk7CisKKy8qIENoZWNrIGZvciB0aGUgc2ltcGxlIHJlbG9jIHR5cGVzLiAgKi8KK2V4dGVybiBFbGZfVHlwZSBwcGM2NF9yZWxvY19zaW1wbGVfdHlwZSAoRWxmICplbGYsIGludCB0eXBlKTsKKworLyogQ29kZSBub3RlIGhhbmRsaW5nLiAgKi8KK2V4dGVybiBib29sIHBwYzY0X2NvcmVfbm90ZSAoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgZGVzY3N6LAorCQkJICAgICAgY29uc3QgY2hhciAqZGVzYyk7CisKKy8qIE5hbWUgb2YgZHluYW1pYyB0YWcuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKnBwYzY0X2R5bmFtaWNfdGFnX25hbWUgKGludDY0X3QgdGFnLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSBjb3B5IHJlbG9jYXRpb24uICAqLworZXh0ZXJuIGJvb2wgcHBjNjRfY29weV9yZWxvY19wIChpbnQgcmVsb2MpOworCisjZW5kaWYJLyogbGliZWJsX3BwYy5oICovCmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX3BwYzY0Lm1hcCBiL2xpYmVibC9saWJlYmxfcHBjNjQubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDgwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvbGliZWJsX3BwYzY0Lm1hcApAQCAtMCwwICsxLDEyIEBACitFTEZVVElMU18xLjAgeworICBnbG9iYWw6CisgICAgcHBjNjRfYmFja2VuZF9uYW1lOworICAgIHBwYzY0X2Rlc3RyOworICAgIHBwYzY0X2luaXQ7CisgICAgcHBjNjRfcmVsb2NfdHlwZV9jaGVjazsKKyAgICBwcGM2NF9yZWxvY190eXBlX25hbWU7CisgICAgcHBjNjRfcmVsb2Nfc2ltcGxlX3R5cGU7CisKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX3NoLmggYi9saWJlYmwvbGliZWJsX3NoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMDI5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9saWJlYmxfc2guaApAQCAtMCwwICsxLDM0IEBACisvKiBJbnRlcmZhY2UgZm9yIGxpYmVibF9zaCBtb2R1bGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBfTElCRUJMX1NIX0gKKyNkZWZpbmUgX0xJQkVCTF9TSF9IIDEKKworI2luY2x1ZGUgPGxpYmVibFAuaD4KKworCisvKiBDb25zdHJ1Y3Rvci4gICovCitleHRlcm4gY29uc3QgY2hhciAqc2hfaW5pdCAoRWxmICplbGYsIEdFbGZfSGFsZiBtYWNoaW5lLCBFYmwgKmVoLAorCQkJICAgIHNpemVfdCBlaGxlbik7CisKKy8qIERlc3RydWN0b3IuICAqLworZXh0ZXJuIHZvaWQgc2hfZGVzdHIgKEVibCAqYmgpOworCisKKy8qIEZ1bmN0aW9uIHRvIGdldCByZWxvY2F0aW9uIHR5cGUgbmFtZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqc2hfcmVsb2NfdHlwZV9uYW1lIChpbnQgdHlwZSwgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKworLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgY29weSByZWxvY2F0aW9uLiAgKi8KK2V4dGVybiBib29sIHNoX2NvcHlfcmVsb2NfcCAoaW50IHJlbG9jKTsKKworI2VuZGlmCS8qIGxpYmVibF9zaC5oICovCmRpZmYgLS1naXQgYS9saWJlYmwvbGliZWJsX3NoLm1hcCBiL2xpYmVibC9saWJlYmxfc2gubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjcyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvbGliZWJsX3NoLm1hcApAQCAtMCwwICsxLDEwIEBACitFTEZVVElMU18xLjAgeworICBnbG9iYWw6CisgICAgc2hfYmFja2VuZF9uYW1lOworICAgIHNoX2Rlc3RyOworICAgIHNoX2luaXQ7CisgICAgc2hfcmVsb2NfdHlwZV9uYW1lOworCisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvbGliZWJsL2xpYmVibF9zcGFyYy5oIGIvbGliZWJsL2xpYmVibF9zcGFyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2RiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvbGliZWJsX3NwYXJjLmgKQEAgLTAsMCArMSw0MSBAQAorLyogSW50ZXJmYWNlIGZvciBsaWJlYmxfc3BhcmMgbW9kdWxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZm5kZWYgX0xJQkVCTF9TUEFSQ19ICisjZGVmaW5lIF9MSUJFQkxfU1BBUkNfSCAxCisKKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworLyogQ29uc3RydWN0b3IuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2luaXQgKEVsZiAqZWxmLCBHRWxmX0hhbGYgbWFjaGluZSwgRWJsICplaCwKKwkJCSAgICAgICBzaXplX3QgZWhsZW4pOworCisvKiBEZXN0cnVjdG9yLiAgKi8KK2V4dGVybiB2b2lkIHNwYXJjX2Rlc3RyIChFYmwgKmJoKTsKKworCisvKiBGdW5jdGlvbiB0byBnZXQgcmVsb2NhdGlvbiB0eXBlIG5hbWUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX3JlbG9jX3R5cGVfbmFtZSAoaW50IHR5cGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qIENoZWNrIHJlbG9jYXRpb24gdHlwZS4gICovCitleHRlcm4gYm9vbCBzcGFyY19yZWxvY190eXBlX2NoZWNrIChpbnQgdHlwZSk7CisKKy8qIENvZGUgbm90ZSBoYW5kbGluZy4gICovCitleHRlcm4gYm9vbCBzcGFyY19jb3JlX25vdGUgKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGRlc2NzeiwKKwkJCSAgICAgY29uc3QgY2hhciAqZGVzYyk7CisKKy8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gcmVsb2NhdGlvbiBpcyBhIGNvcHkgcmVsb2NhdGlvbi4gICovCitleHRlcm4gYm9vbCBzcGFyY19jb3B5X3JlbG9jX3AgKGludCByZWxvYyk7CisKKyNlbmRpZgkvKiBsaWJlYmxfc3BhcmMuaCAqLwpkaWZmIC0tZ2l0IGEvbGliZWJsL2xpYmVibF9zcGFyYy5tYXAgYi9saWJlYmwvbGliZWJsX3NwYXJjLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2E2MDM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2xpYmVibF9zcGFyYy5tYXAKQEAgLTAsMCArMSwxMSBAQAorRUxGVVRJTFNfMS4wIHsKKyAgZ2xvYmFsOgorICAgIHNwYXJjX2JhY2tlbmRfbmFtZTsKKyAgICBzcGFyY19kZXN0cjsKKyAgICBzcGFyY19pbml0OworICAgIHNwYXJjX3JlbG9jX3R5cGVfY2hlY2s7CisgICAgc3BhcmNfcmVsb2NfdHlwZV9uYW1lOworCisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvbGliZWJsL2xpYmVibF94ODZfNjQuaCBiL2xpYmVibC9saWJlYmxfeDg2XzY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1ZWRiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9saWJlYmxfeDg2XzY0LmgKQEAgLTAsMCArMSw0NyBAQAorLyogSW50ZXJmYWNlIGZvciBsaWJlYmxfeDg2XzY0IG1vZHVsZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9MSUJFQkxfWDg2XzY0X0gKKyNkZWZpbmUgX0xJQkVCTF9YODZfNjRfSCAxCisKKyNpbmNsdWRlIDxsaWJlYmxQLmg+CisKKworLyogQ29uc3RydWN0b3IuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKng4Nl82NF9pbml0IChFbGYgKmVsZiwgR0VsZl9IYWxmIG1hY2hpbmUsIEVibCAqZWgsCisJCQkJc2l6ZV90IGVobGVuKTsKKworLyogRGVzdHJ1Y3Rvci4gICovCitleHRlcm4gdm9pZCB4ODZfNjRfZGVzdHIgKEVibCAqYmgpOworCisKKy8qIEZ1bmN0aW9uIHRvIGdldCByZWxvY2F0aW9uIHR5cGUgbmFtZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqeDg2XzY0X3JlbG9jX3R5cGVfbmFtZSAoaW50IHR5cGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qIENoZWNrIHJlbG9jYXRpb24gdHlwZS4gICovCitleHRlcm4gYm9vbCB4ODZfNjRfcmVsb2NfdHlwZV9jaGVjayAoaW50IHR5cGUpOworCisvKiBDaGVjayByZWxvY2F0aW9uIHR5cGUgdXNlLiAgKi8KK2V4dGVybiBib29sIHg4Nl82NF9yZWxvY192YWxpZF91c2UgKEVsZiAqZWxmLCBpbnQgdHlwZSk7CisKKy8qIENoZWNrIGZvciB0aGUgc2ltcGxlIHJlbG9jIHR5cGVzLiAgKi8KK2V4dGVybiBFbGZfVHlwZSB4ODZfNjRfcmVsb2Nfc2ltcGxlX3R5cGUgKEVsZiAqZWxmLCBpbnQgdHlwZSk7CisKKy8qIENvZGUgbm90ZSBoYW5kbGluZy4gICovCitleHRlcm4gYm9vbCB4ODZfNjRfY29yZV9ub3RlIChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBkZXNjc3osCisJCQkgICAgICBjb25zdCBjaGFyICpkZXNjKTsKKworLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgY29weSByZWxvY2F0aW9uLiAgKi8KK2V4dGVybiBib29sIHg4Nl82NF9jb3B5X3JlbG9jX3AgKGludCByZWxvYyk7CisKKyNlbmRpZgkvKiBsaWJlYmxfeDg2XzY0LmggKi8KZGlmZiAtLWdpdCBhL2xpYmVibC9saWJlYmxfeDg2XzY0Lm1hcCBiL2xpYmVibC9saWJlYmxfeDg2XzY0Lm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQxYzdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL2xpYmVibF94ODZfNjQubWFwCkBAIC0wLDAgKzEsMTMgQEAKK0VMRlVUSUxTXzEuMCB7CisgIGdsb2JhbDoKKyAgICB4ODZfNjRfYmFja2VuZF9uYW1lOworICAgIHg4Nl82NF9jb3JlX25vdGU7CisgICAgeDg2XzY0X2Rlc3RyOworICAgIHg4Nl82NF9pbml0OworICAgIHg4Nl82NF9yZWxvY190eXBlX2NoZWNrOworICAgIHg4Nl82NF9yZWxvY190eXBlX25hbWU7CisgICAgeDg2XzY0X3JlbG9jX3NpbXBsZV90eXBlOworCisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvbGliZWJsL3BwYzY0X2Rlc3RyLmMgYi9saWJlYmwvcHBjNjRfZGVzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGE2YThmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL3BwYzY0X2Rlc3RyLmMKQEAgLTAsMCArMSwyNyBAQAorLyogRGVzdHJ1Y3RvciBmb3IgUFBDNjQgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWJsX3BwYzY0Lmg+CisKKwordm9pZAorcHBjNjRfZGVzdHIgKGJoKQorICAgICBFYmwgKmJoIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKK3sKKyAgLyogTm90aGluZyB0byBkbyBzbyBmYXIuICAqLworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL3BwYzY0X2luaXQuYyBiL2xpYmVibC9wcGM2NF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzMWEzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9wcGM2NF9pbml0LmMKQEAgLTAsMCArMSw0NCBAQAorLyogSW5pdGlhbGl6YXRpb24gb2YgUFBDNjQgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWJsX3BwYzY0Lmg+CisKKworY29uc3QgY2hhciAqCitwcGM2NF9pbml0IChlbGYsIG1hY2hpbmUsIGVoLCBlaGxlbikKKyAgICAgRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworICAgICBHRWxmX0hhbGYgbWFjaGluZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CisgICAgIEVibCAqZWg7CisgICAgIHNpemVfdCBlaGxlbjsKK3sKKyAgLyogQ2hlY2sgd2hldGhlciB0aGUgRWxmX0JIIG9iamVjdCBoYXMgYSBzdWZmaWNlbnQgc2l6ZS4gICovCisgIGlmIChlaGxlbiA8IHNpemVvZiAoRWJsKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBXZSBoYW5kbGUgaXQuICAqLworICBlaC0+bmFtZSA9ICJQb3dlclBDIDY0LWJpdCI7CisgIGVoLT5yZWxvY190eXBlX25hbWUgPSBwcGM2NF9yZWxvY190eXBlX25hbWU7CisgIGVoLT5yZWxvY190eXBlX2NoZWNrID0gcHBjNjRfcmVsb2NfdHlwZV9jaGVjazsKKyAgZWgtPnJlbG9jX3ZhbGlkX3VzZSA9IHBwYzY0X3JlbG9jX3ZhbGlkX3VzZTsKKyAgZWgtPnJlbG9jX3NpbXBsZV90eXBlID0gcHBjNjRfcmVsb2Nfc2ltcGxlX3R5cGU7CisgIGVoLT5keW5hbWljX3RhZ19uYW1lID0gcHBjNjRfZHluYW1pY190YWdfbmFtZTsKKyAgZWgtPmNvcHlfcmVsb2NfcCA9IHBwYzY0X2NvcHlfcmVsb2NfcDsKKyAgZWgtPmRlc3RyID0gcHBjNjRfZGVzdHI7CisKKyAgcmV0dXJuIE1PRFZFUlNJT047Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvcHBjNjRfc3ltYm9sLmMgYi9saWJlYmwvcHBjNjRfc3ltYm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0NDgxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9wcGM2NF9zeW1ib2wuYwpAQCAtMCwwICsxLDIzNSBAQAorLyogUFBDNjQgc3BlY2lmaWMgc3ltYm9saWMgbmFtZSBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8bGliZWJsX3BwYzY0Lmg+CisKKworLyogUmV0dXJuIG9mIHRoZSBiYWNrZW5kLiAgKi8KK2NvbnN0IGNoYXIgKgorcHBjNjRfYmFja2VuZF9uYW1lICh2b2lkKQoreworICByZXR1cm4gInBwYzY0IjsKK30KKworCisvKiBSZWxvY2F0aW9uIG1hcHBpbmcgdGFibGUuICAqLworc3RhdGljIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBlbnVtIHsgYm90aCA9IDAsIHJlbCA9IDEsIGV4ZWMgPSAyIH0gYXBwZWFyOworfSByZWxvY19tYXBfdGFibGVbXSA9CisgIHsKKyAgICAvLyBYWFggQ2hlY2sgYWxsIHRoZSBhcHBlYXIgdmFsdWVzLgorICAgIFtSX1BQQzY0X05PTkVdID0geyAiUl9QUEM2NF9OT05FIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0FERFIzMl0gPSB7ICJSX1BQQzY0X0FERFIzMiIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9BRERSMjRdID0geyAiUl9QUEM2NF9BRERSMjQiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfQUREUjE2XSA9IHsgIlJfUFBDNjRfQUREUjE2IiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0FERFIxNl9MT10gPSB7ICJSX1BQQzY0X0FERFIxNl9MTyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9BRERSMTZfSEldID0geyAiUl9QUEM2NF9BRERSMTZfSEkiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfQUREUjE2X0hBXSA9IHsgIlJfUFBDNjRfQUREUjE2X0hBIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0FERFIxNF0gPSB7ICJSX1BQQzY0X0FERFIxNCIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9BRERSMTRfQlJUQUtFTl0gPSB7ICJSX1BQQzY0X0FERFIxNF9CUlRBS0VOIiwgZXhlYyB9LAorICAgIFtSX1BQQzY0X0FERFIxNF9CUk5UQUtFTl0gPSB7ICJSX1BQQzY0X0FERFIxNF9CUk5UQUtFTiIsIGV4ZWMgfSwKKyAgICBbUl9QUEM2NF9SRUwyNF0gPSB7ICJSX1BQQzY0X1JFTDI0IiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1JFTDE0XSA9IHsgIlJfUFBDNjRfUkVMMTQiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfUkVMMTRfQlJUQUtFTl0gPSB7ICJSX1BQQzY0X1JFTDE0X0JSVEFLRU4iLCBleGVjIH0sCisgICAgW1JfUFBDNjRfUkVMMTRfQlJOVEFLRU5dID0geyAiUl9QUEM2NF9SRUwxNF9CUk5UQUtFTiIsIGV4ZWMgfSwKKyAgICBbUl9QUEM2NF9HT1QxNl0gPSB7ICJSX1BQQzY0X0dPVDE2IiwgcmVsIH0sCisgICAgW1JfUFBDNjRfR09UMTZfTE9dID0geyAiUl9QUEM2NF9HT1QxNl9MTyIsIHJlbCB9LAorICAgIFtSX1BQQzY0X0dPVDE2X0hJXSA9IHsgIlJfUFBDNjRfR09UMTZfSEkiLCByZWwgfSwKKyAgICBbUl9QUEM2NF9HT1QxNl9IQV0gPSB7ICJSX1BQQzY0X0dPVDE2X0hBIiwgcmVsIH0sCisgICAgW1JfUFBDNjRfQ09QWV0gPSB7ICJSX1BQQzY0X0NPUFkiLCBleGVjIH0sCisgICAgW1JfUFBDNjRfR0xPQl9EQVRdID0geyAiUl9QUEM2NF9HTE9CX0RBVCIsIGV4ZWMgfSwKKyAgICBbUl9QUEM2NF9KTVBfU0xPVF0gPSB7ICJSX1BQQzY0X0pNUF9TTE9UIiwgZXhlYyB9LAorICAgIFtSX1BQQzY0X1JFTEFUSVZFXSA9IHsgIlJfUFBDNjRfUkVMQVRJVkUiLCBleGVjIH0sCisgICAgW1JfUFBDNjRfVUFERFIzMl0gPSB7ICJSX1BQQzY0X1VBRERSMzIiLCBleGVjIH0sCisgICAgW1JfUFBDNjRfVUFERFIxNl0gPSB7ICJSX1BQQzY0X1VBRERSMTYiLCBleGVjIH0sCisgICAgW1JfUFBDNjRfUkVMMzJdID0geyAiUl9QUEM2NF9SRUwzMiIsIGV4ZWMgfSwKKyAgICBbUl9QUEM2NF9QTFQzMl0gPSB7ICJSX1BQQzY0X1BMVDMyIiwgZXhlYyB9LAorICAgIFtSX1BQQzY0X1BMVFJFTDMyXSA9IHsgIlJfUFBDNjRfUExUUkVMMzIiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfUExUMTZfTE9dID0geyAiUl9QUEM2NF9QTFQxNl9MTyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9QTFQxNl9ISV0gPSB7ICJSX1BQQzY0X1BMVDE2X0hJIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1BMVDE2X0hBXSA9IHsgIlJfUFBDNjRfUExUMTZfSEEiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfU0VDVE9GRl0gPSB7ICJSX1BQQzY0X1NFQ1RPRkYiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfU0VDVE9GRl9MT10gPSB7ICJSX1BQQzY0X1NFQ1RPRkZfTE8iLCBib3RoIH0sCisgICAgW1JfUFBDNjRfU0VDVE9GRl9ISV0gPSB7ICJSX1BQQzY0X1NFQ1RPRkZfSEkiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfU0VDVE9GRl9IQV0gPSB7ICJSX1BQQzY0X1NFQ1RPRkZfSEEiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfQUREUjMwXSA9IHsgIlJfUFBDNjRfQUREUjMwIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0FERFI2NF0gPSB7ICJSX1BQQzY0X0FERFI2NCIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9BRERSMTZfSElHSEVSXSA9IHsgIlJfUFBDNjRfQUREUjE2X0hJR0hFUiIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9BRERSMTZfSElHSEVSQV0gPSB7ICJSX1BQQzY0X0FERFIxNl9ISUdIRVJBIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0FERFIxNl9ISUdIRVNUXSA9IHsgIlJfUFBDNjRfQUREUjE2X0hJR0hFU1QiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfQUREUjE2X0hJR0hFU1RBXSA9IHsgIlJfUFBDNjRfQUREUjE2X0hJR0hFU1RBIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1VBRERSNjRdID0geyAiUl9QUEM2NF9VQUREUjY0IiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1JFTDY0XSA9IHsgIlJfUFBDNjRfUkVMNjQiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfUExUNjRdID0geyAiUl9QUEM2NF9QTFQ2NCIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9QTFRSRUw2NF0gPSB7ICJSX1BQQzY0X1BMVFJFTDY0IiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RPQzE2XSA9IHsgIlJfUFBDNjRfVE9DMTYiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfVE9DMTZfTE9dID0geyAiUl9QUEM2NF9UT0MxNl9MTyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9UT0MxNl9ISV0gPSB7ICJSX1BQQzY0X1RPQzE2X0hJIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RPQzE2X0hBXSA9IHsgIlJfUFBDNjRfVE9DMTZfSEEiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfVE9DXSA9IHsgIlJfUFBDNjRfVE9DIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1BMVEdPVDE2XSA9IHsgIlJfUFBDNjRfUExUR09UMTYiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfUExUR09UMTZfTE9dID0geyAiUl9QUEM2NF9QTFRHT1QxNl9MTyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9QTFRHT1QxNl9ISV0gPSB7ICJSX1BQQzY0X1BMVEdPVDE2X0hJIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1BMVEdPVDE2X0hBXSA9IHsgIlJfUFBDNjRfUExUR09UMTZfSEEiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfQUREUjE2X0RTXSA9IHsgIlJfUFBDNjRfQUREUjE2X0RTIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0FERFIxNl9MT19EU10gPSB7ICJSX1BQQzY0X0FERFIxNl9MT19EUyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9HT1QxNl9EU10gPSB7ICJSX1BQQzY0X0dPVDE2X0RTIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0dPVDE2X0xPX0RTXSA9IHsgIlJfUFBDNjRfR09UMTZfTE9fRFMiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfUExUMTZfTE9fRFNdID0geyAiUl9QUEM2NF9QTFQxNl9MT19EUyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9TRUNUT0ZGX0RTXSA9IHsgIlJfUFBDNjRfU0VDVE9GRl9EUyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9TRUNUT0ZGX0xPX0RTXSA9IHsgIlJfUFBDNjRfU0VDVE9GRl9MT19EUyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9UT0MxNl9EU10gPSB7ICJSX1BQQzY0X1RPQzE2X0RTIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RPQzE2X0xPX0RTXSA9IHsgIlJfUFBDNjRfVE9DMTZfTE9fRFMiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfUExUR09UMTZfRFNdID0geyAiUl9QUEM2NF9QTFRHT1QxNl9EUyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9QTFRHT1QxNl9MT19EU10gPSB7ICJSX1BQQzY0X1BMVEdPVDE2X0xPX0RTIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RMU10gPSB7ICJSX1BQQzY0X1RMUyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9EVFBNT0Q2NF0gPSB7ICJSX1BQQzY0X0RUUE1PRDY0IiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RQUkVMMTZdID0geyAiUl9QUEM2NF9UUFJFTDE2IiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RQUkVMMTZfTE9dID0geyAiUl9QUEM2NF9UUFJFTDE2X0xPIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RQUkVMMTZfSEldID0geyAiUl9QUEM2NF9UUFJFTDE2X0hJIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RQUkVMMTZfSEFdID0geyAiUl9QUEM2NF9UUFJFTDE2X0hBIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RQUkVMNjRdID0geyAiUl9QUEM2NF9UUFJFTDY0IiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0RUUFJFTDE2XSA9IHsgIlJfUFBDNjRfRFRQUkVMMTYiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfRFRQUkVMMTZfTE9dID0geyAiUl9QUEM2NF9EVFBSRUwxNl9MTyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9EVFBSRUwxNl9ISV0gPSB7ICJSX1BQQzY0X0RUUFJFTDE2X0hJIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0RUUFJFTDE2X0hBXSA9IHsgIlJfUFBDNjRfRFRQUkVMMTZfSEEiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfRFRQUkVMNjRdID0geyAiUl9QUEM2NF9EVFBSRUw2NCIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9HT1RfVExTR0QxNl0gPSB7ICJSX1BQQzY0X0dPVF9UTFNHRDE2IiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0dPVF9UTFNHRDE2X0xPXSA9IHsgIlJfUFBDNjRfR09UX1RMU0dEMTZfTE8iLCBib3RoIH0sCisgICAgW1JfUFBDNjRfR09UX1RMU0dEMTZfSEldID0geyAiUl9QUEM2NF9HT1RfVExTR0QxNl9ISSIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9HT1RfVExTR0QxNl9IQV0gPSB7ICJSX1BQQzY0X0dPVF9UTFNHRDE2X0hBIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0dPVF9UTFNMRDE2XSA9IHsgIlJfUFBDNjRfR09UX1RMU0xEMTYiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfR09UX1RMU0xEMTZfTE9dID0geyAiUl9QUEM2NF9HT1RfVExTTEQxNl9MTyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9HT1RfVExTTEQxNl9ISV0gPSB7ICJSX1BQQzY0X0dPVF9UTFNMRDE2X0hJIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0dPVF9UTFNMRDE2X0hBXSA9IHsgIlJfUFBDNjRfR09UX1RMU0xEMTZfSEEiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfR09UX1RQUkVMMTZfRFNdID0geyAiUl9QUEM2NF9HT1RfVFBSRUwxNl9EUyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9HT1RfVFBSRUwxNl9MT19EU10gPSB7ICJSX1BQQzY0X0dPVF9UUFJFTDE2X0xPX0RTIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0dPVF9UUFJFTDE2X0hJXSA9IHsgIlJfUFBDNjRfR09UX1RQUkVMMTZfSEkiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfR09UX1RQUkVMMTZfSEFdID0geyAiUl9QUEM2NF9HT1RfVFBSRUwxNl9IQSIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9HT1RfRFRQUkVMMTZfRFNdID0geyAiUl9QUEM2NF9HT1RfRFRQUkVMMTZfRFMiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfR09UX0RUUFJFTDE2X0xPX0RTXSA9IHsgIlJfUFBDNjRfR09UX0RUUFJFTDE2X0xPX0RTIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0dPVF9EVFBSRUwxNl9ISV0gPSB7ICJSX1BQQzY0X0dPVF9EVFBSRUwxNl9ISSIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEFdID0geyAiUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEEiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfVFBSRUwxNl9EU10gPSB7ICJSX1BQQzY0X1RQUkVMMTZfRFMiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfVFBSRUwxNl9MT19EU10gPSB7ICJSX1BQQzY0X1RQUkVMMTZfTE9fRFMiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfVFBSRUwxNl9ISUdIRVJdID0geyAiUl9QUEM2NF9UUFJFTDE2X0hJR0hFUiIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9UUFJFTDE2X0hJR0hFUkFdID0geyAiUl9QUEM2NF9UUFJFTDE2X0hJR0hFUkEiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfVFBSRUwxNl9ISUdIRVNUXSA9IHsgIlJfUFBDNjRfVFBSRUwxNl9ISUdIRVNUIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X1RQUkVMMTZfSElHSEVTVEFdID0geyAiUl9QUEM2NF9UUFJFTDE2X0hJR0hFU1RBIiwgYm90aCB9LAorICAgIFtSX1BQQzY0X0RUUFJFTDE2X0RTXSA9IHsgIlJfUFBDNjRfRFRQUkVMMTZfRFMiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfRFRQUkVMMTZfTE9fRFNdID0geyAiUl9QUEM2NF9EVFBSRUwxNl9MT19EUyIsIGJvdGggfSwKKyAgICBbUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVJdID0geyAiUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVIiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfRFRQUkVMMTZfSElHSEVSQV0gPSB7ICJSX1BQQzY0X0RUUFJFTDE2X0hJR0hFUkEiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfRFRQUkVMMTZfSElHSEVTVF0gPSB7ICJSX1BQQzY0X0RUUFJFTDE2X0hJR0hFU1QiLCBib3RoIH0sCisgICAgW1JfUFBDNjRfRFRQUkVMMTZfSElHSEVTVEFdID0geyAiUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVNUQSIsIGJvdGggfQorIH07CisKKworLyogRGV0ZXJtaW5lIHJlbG9jYXRpb24gdHlwZSBzdHJpbmcgZm9yIFBQQy4gICovCitjb25zdCBjaGFyICoKK3BwYzY0X3JlbG9jX3R5cGVfbmFtZSAoaW50IHR5cGUsIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgaWYgKHR5cGUgPCBSX1BQQzY0X05PTkUgfHwgdHlwZSA+PSBSX1BQQzY0X05VTSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcmVsb2NfbWFwX3RhYmxlW3R5cGVdLm5hbWU7Cit9CisKKworLyogQ2hlY2sgZm9yIGNvcnJlY3QgcmVsb2NhdGlvbiB0eXBlLiAgKi8KK2Jvb2wKK3BwYzY0X3JlbG9jX3R5cGVfY2hlY2sgKGludCB0eXBlKQoreworICByZXR1cm4gKHR5cGUgPj0gUl9QUEM2NF9OT05FICYmIHR5cGUgPCBSX1BQQzY0X05VTQorCSAgJiYgcmVsb2NfbWFwX3RhYmxlW3R5cGVdLm5hbWUgIT0gTlVMTCkgPyB0cnVlIDogZmFsc2U7Cit9CisKKworLyogQ2hlY2sgZm9yIGNvcnJlY3QgcmVsb2NhdGlvbiB0eXBlIHVzZS4gICovCitib29sCitwcGM2NF9yZWxvY192YWxpZF91c2UgKEVsZiAqZWxmLCBpbnQgdHlwZSkKK3sKKyAgaWYgKHR5cGUgPCBSX1BQQzY0X05PTkUgfHwgdHlwZSA+PSBSX1BQQzY0X05VTQorICAgICAgfHwgcmVsb2NfbWFwX3RhYmxlW3R5cGVdLm5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRWxmNjRfRWhkciAqZWhkciA9IGVsZjY0X2dldGVoZHIgKGVsZik7CisgIGFzc2VydCAoZWhkciAhPSBOVUxMKTsKKworICBpZiAocmVsb2NfbWFwX3RhYmxlW3R5cGVdLmFwcGVhciA9PSByZWwpCisgICAgcmV0dXJuIGVoZHItPmVfdHlwZSA9PSBFVF9SRUw7CisKKyAgaWYgKHJlbG9jX21hcF90YWJsZVt0eXBlXS5hcHBlYXIgPT0gZXhlYykKKyAgICByZXR1cm4gZWhkci0+ZV90eXBlICE9IEVUX1JFTDsKKworICBhc3NlcnQgKHJlbG9jX21hcF90YWJsZVt0eXBlXS5hcHBlYXIgPT0gYm90aCk7CisgIHJldHVybiB0cnVlOworfQorCisKKy8qIENoZWNrIGZvciB0aGUgc2ltcGxlIHJlbG9jIHR5cGVzLiAgKi8KK0VsZl9UeXBlCitwcGM2NF9yZWxvY19zaW1wbGVfdHlwZSAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIFJfUFBDNjRfQUREUjY0OgorICAgIGNhc2UgUl9QUEM2NF9VQUREUjY0OgorICAgICAgcmV0dXJuIEVMRl9UX1hXT1JEOworICAgIGNhc2UgUl9QUEM2NF9BRERSMzI6CisgICAgY2FzZSBSX1BQQzY0X1VBRERSMzI6CisgICAgICByZXR1cm4gRUxGX1RfV09SRDsKKyAgICBjYXNlIFJfUFBDNjRfVUFERFIxNjoKKyAgICAgIHJldHVybiBFTEZfVF9IQUxGOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRUxGX1RfTlVNOworICAgIH0KK30KKworCitjb25zdCBjaGFyICoKK3BwYzY0X2R5bmFtaWNfdGFnX25hbWUgKGludDY0X3QgdGFnLCBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHN3aXRjaCAodGFnKQorICAgIHsKKyAgICBjYXNlIERUX1BQQzY0X0dMSU5LOgorICAgICAgcmV0dXJuICJQUEM2NF9HTElOSyI7CisgICAgY2FzZSBEVF9QUEM2NF9PUEQ6CisgICAgICByZXR1cm4gIlBQQzY0X09QRCI7CisgICAgY2FzZSBEVF9QUEM2NF9PUERTWjoKKyAgICAgIHJldHVybiAiUFBDNjRfT1BEU1oiOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSBjb3B5IHJlbG9jYXRpb24uICAqLworYm9vbAorcHBjNjRfY29weV9yZWxvY19wIChpbnQgcmVsb2MpCit7CisgIHJldHVybiByZWxvYyA9PSBSX1BQQzY0X0NPUFk7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvcHBjX2Rlc3RyLmMgYi9saWJlYmwvcHBjX2Rlc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViYjgxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9wcGNfZGVzdHIuYwpAQCAtMCwwICsxLDI3IEBACisvKiBEZXN0cnVjdG9yIGZvciBQUEMgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWJsX3BwYy5oPgorCisKK3ZvaWQKK3BwY19kZXN0ciAoYmgpCisgICAgIEVibCAqYmggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworeworICAvKiBOb3RoaW5nIHRvIGRvIHNvIGZhci4gICovCit9CmRpZmYgLS1naXQgYS9saWJlYmwvcHBjX2luaXQuYyBiL2xpYmVibC9wcGNfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzJjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvcHBjX2luaXQuYwpAQCAtMCwwICsxLDQzIEBACisvKiBJbml0aWFsaXphdGlvbiBvZiBQUEMgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWJsX3BwYy5oPgorCisKK2NvbnN0IGNoYXIgKgorcHBjX2luaXQgKGVsZiwgbWFjaGluZSwgZWgsIGVobGVuKQorICAgICBFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CisgICAgIEdFbGZfSGFsZiBtYWNoaW5lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKyAgICAgRWJsICplaDsKKyAgICAgc2l6ZV90IGVobGVuOworeworICAvKiBDaGVjayB3aGV0aGVyIHRoZSBFbGZfQkggb2JqZWN0IGhhcyBhIHN1ZmZpY2VudCBzaXplLiAgKi8KKyAgaWYgKGVobGVuIDwgc2l6ZW9mIChFYmwpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFdlIGhhbmRsZSBpdC4gICovCisgIGVoLT5uYW1lID0gIlBvd2VyUEMiOworICBlaC0+cmVsb2NfdHlwZV9uYW1lID0gcHBjX3JlbG9jX3R5cGVfbmFtZTsKKyAgZWgtPnJlbG9jX3R5cGVfY2hlY2sgPSBwcGNfcmVsb2NfdHlwZV9jaGVjazsKKyAgZWgtPnJlbG9jX3ZhbGlkX3VzZSA9IHBwY19yZWxvY192YWxpZF91c2U7CisgIGVoLT5yZWxvY19zaW1wbGVfdHlwZSA9IHBwY19yZWxvY19zaW1wbGVfdHlwZTsKKyAgZWgtPmNvcHlfcmVsb2NfcCA9IHBwY19jb3B5X3JlbG9jX3A7CisgIGVoLT5kZXN0ciA9IHBwY19kZXN0cjsKKworICByZXR1cm4gTU9EVkVSU0lPTjsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9wcGNfc3ltYm9sLmMgYi9saWJlYmwvcHBjX3N5bWJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmVhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvcHBjX3N5bWJvbC5jCkBAIC0wLDAgKzEsMTc0IEBACisvKiBQUEMgc3BlY2lmaWMgc3ltYm9saWMgbmFtZSBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8bGliZWJsX3BwYy5oPgorCisKKy8qIFJldHVybiBvZiB0aGUgYmFja2VuZC4gICovCitjb25zdCBjaGFyICoKK3BwY19iYWNrZW5kX25hbWUgKHZvaWQpCit7CisgIHJldHVybiAicHBjIjsKK30KKworCisvKiBSZWxvY2F0aW9uIG1hcHBpbmcgdGFibGUuICAqLworc3RhdGljIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBlbnVtIHsgYm90aCA9IDAsIHJlbCA9IDEsIGV4ZWMgPSAyIH0gYXBwZWFyOworfSByZWxvY19tYXBfdGFibGVbXSA9CisgIHsKKyAgICAvLyBYWFggQ2hlY2sgYWxsIHRoZSBhcHBlYXIgdmFsdWVzLgorICAgIFtSX1BQQ19OT05FXSA9IHsgIlJfUFBDX05PTkUiLCBib3RoIH0sCisgICAgW1JfUFBDX0FERFIzMl0gPSB7ICJSX1BQQ19BRERSMzIiLCBib3RoIH0sCisgICAgW1JfUFBDX0FERFIyNF0gPSB7ICJSX1BQQ19BRERSMjQiLCBib3RoIH0sCisgICAgW1JfUFBDX0FERFIxNl0gPSB7ICJSX1BQQ19BRERSMTYiLCBib3RoIH0sCisgICAgW1JfUFBDX0FERFIxNl9MT10gPSB7ICJSX1BQQ19BRERSMTZfTE8iLCBib3RoIH0sCisgICAgW1JfUFBDX0FERFIxNl9ISV0gPSB7ICJSX1BQQ19BRERSMTZfSEkiLCBib3RoIH0sCisgICAgW1JfUFBDX0FERFIxNl9IQV0gPSB7ICJSX1BQQ19BRERSMTZfSEEiLCBib3RoIH0sCisgICAgW1JfUFBDX0FERFIxNF0gPSB7ICJSX1BQQ19BRERSMTQiLCBleGVjIH0sCisgICAgW1JfUFBDX0FERFIxNF9CUlRBS0VOXSA9IHsgIlJfUFBDX0FERFIxNF9CUlRBS0VOIiwgZXhlYyB9LAorICAgIFtSX1BQQ19BRERSMTRfQlJOVEFLRU5dID0geyAiUl9QUENfQUREUjE0X0JSTlRBS0VOIiwgZXhlYyB9LAorICAgIFtSX1BQQ19SRUwyNF0gPSB7ICJSX1BQQ19SRUwyNCIsIGJvdGggfSwKKyAgICBbUl9QUENfUkVMMTRdID0geyAiUl9QUENfUkVMMTQiLCBib3RoIH0sCisgICAgW1JfUFBDX1JFTDE0X0JSVEFLRU5dID0geyAiUl9QUENfUkVMMTRfQlJUQUtFTiIsIGV4ZWMgfSwKKyAgICBbUl9QUENfUkVMMTRfQlJOVEFLRU5dID0geyAiUl9QUENfUkVMMTRfQlJOVEFLRU4iLCBleGVjIH0sCisgICAgW1JfUFBDX0dPVDE2XSA9IHsgIlJfUFBDX0dPVDE2IiwgcmVsIH0sCisgICAgW1JfUFBDX0dPVDE2X0xPXSA9IHsgIlJfUFBDX0dPVDE2X0xPIiwgcmVsIH0sCisgICAgW1JfUFBDX0dPVDE2X0hJXSA9IHsgIlJfUFBDX0dPVDE2X0hJIiwgcmVsIH0sCisgICAgW1JfUFBDX0dPVDE2X0hBXSA9IHsgIlJfUFBDX0dPVDE2X0hBIiwgcmVsIH0sCisgICAgW1JfUFBDX1BMVFJFTDI0XSA9IHsgIlJfUFBDX1BMVFJFTDI0IiwgcmVsIH0sCisgICAgW1JfUFBDX0NPUFldID0geyAiUl9QUENfQ09QWSIsIGV4ZWMgfSwKKyAgICBbUl9QUENfR0xPQl9EQVRdID0geyAiUl9QUENfR0xPQl9EQVQiLCBleGVjIH0sCisgICAgW1JfUFBDX0pNUF9TTE9UXSA9IHsgIlJfUFBDX0pNUF9TTE9UIiwgZXhlYyB9LAorICAgIFtSX1BQQ19SRUxBVElWRV0gPSB7ICJSX1BQQ19SRUxBVElWRSIsIGV4ZWMgfSwKKyAgICBbUl9QUENfTE9DQUwyNFBDXSA9IHsgIlJfUFBDX0xPQ0FMMjRQQyIsIHJlbCB9LAorICAgIFtSX1BQQ19VQUREUjMyXSA9IHsgIlJfUFBDX1VBRERSMzIiLCBleGVjIH0sCisgICAgW1JfUFBDX1VBRERSMTZdID0geyAiUl9QUENfVUFERFIxNiIsIGV4ZWMgfSwKKyAgICBbUl9QUENfUkVMMzJdID0geyAiUl9QUENfUkVMMzIiLCBleGVjIH0sCisgICAgW1JfUFBDX1BMVDMyXSA9IHsgIlJfUFBDX1BMVDMyIiwgZXhlYyB9LAorICAgIFtSX1BQQ19QTFRSRUwzMl0gPSB7ICJSX1BQQ19QTFRSRUwzMiIsIGJvdGggfSwKKyAgICBbUl9QUENfUExUMTZfTE9dID0geyAiUl9QUENfUExUMTZfTE8iLCBib3RoIH0sCisgICAgW1JfUFBDX1BMVDE2X0hJXSA9IHsgIlJfUFBDX1BMVDE2X0hJIiwgYm90aCB9LAorICAgIFtSX1BQQ19QTFQxNl9IQV0gPSB7ICJSX1BQQ19QTFQxNl9IQSIsIGJvdGggfSwKKyAgICBbUl9QUENfU0RBUkVMMTZdID0geyAiUl9QUENfU0RBUkVMMTYiLCBib3RoIH0sCisgICAgW1JfUFBDX1NFQ1RPRkZdID0geyAiUl9QUENfU0VDVE9GRiIsIGJvdGggfSwKKyAgICBbUl9QUENfU0VDVE9GRl9MT10gPSB7ICJSX1BQQ19TRUNUT0ZGX0xPIiwgYm90aCB9LAorICAgIFtSX1BQQ19TRUNUT0ZGX0hJXSA9IHsgIlJfUFBDX1NFQ1RPRkZfSEkiLCBib3RoIH0sCisgICAgW1JfUFBDX1NFQ1RPRkZfSEFdID0geyAiUl9QUENfU0VDVE9GRl9IQSIsIGJvdGggfSwKKyAgICBbUl9QUENfVExTXSA9IHsgIlJfUFBDX1RMUyIsIGJvdGggfSwKKyAgICBbUl9QUENfRFRQTU9EMzJdID0geyAiUl9QUENfRFRQTU9EMzIiLCBleGVjIH0sCisgICAgW1JfUFBDX1RQUkVMMTZdID0geyAiUl9QUENfVFBSRUwxNiIsIHJlbCB9LAorICAgIFtSX1BQQ19UUFJFTDE2X0xPXSA9IHsgIlJfUFBDX1RQUkVMMTZfTE8iLCByZWwgfSwKKyAgICBbUl9QUENfVFBSRUwxNl9ISV0gPSB7ICJSX1BQQ19UUFJFTDE2X0hJIiwgcmVsIH0sCisgICAgW1JfUFBDX1RQUkVMMTZfSEFdID0geyAiUl9QUENfVFBSRUwxNl9IQSIsIHJlbCB9LAorICAgIFtSX1BQQ19UUFJFTDMyXSA9IHsgIlJfUFBDX1RQUkVMMzIiLCBleGVjIH0sCisgICAgW1JfUFBDX0RUUFJFTDE2XSA9IHsgIlJfUFBDX0RUUFJFTDE2IiwgcmVsIH0sCisgICAgW1JfUFBDX0RUUFJFTDE2X0xPXSA9IHsgIlJfUFBDX0RUUFJFTDE2X0xPIiwgcmVsIH0sCisgICAgW1JfUFBDX0RUUFJFTDE2X0hJXSA9IHsgIlJfUFBDX0RUUFJFTDE2X0hJIiwgcmVsIH0sCisgICAgW1JfUFBDX0RUUFJFTDE2X0hBXSA9IHsgIlJfUFBDX0RUUFJFTDE2X0hBIiwgcmVsIH0sCisgICAgW1JfUFBDX0RUUFJFTDMyXSA9IHsgIlJfUFBDX0RUUFJFTDMyIiwgZXhlYyB9LAorICAgIFtSX1BQQ19HT1RfVExTR0QxNl0gPSB7ICJSX1BQQ19HT1RfVExTR0QxNiIsIGV4ZWMgfSwKKyAgICBbUl9QUENfR09UX1RMU0dEMTZfTE9dID0geyAiUl9QUENfR09UX1RMU0dEMTZfTE8iLCBleGVjIH0sCisgICAgW1JfUFBDX0dPVF9UTFNHRDE2X0hJXSA9IHsgIlJfUFBDX0dPVF9UTFNHRDE2X0hJIiwgZXhlYyB9LAorICAgIFtSX1BQQ19HT1RfVExTR0QxNl9IQV0gPSB7ICJSX1BQQ19HT1RfVExTR0QxNl9IQSIsIGV4ZWMgfSwKKyAgICBbUl9QUENfR09UX1RMU0xEMTZdID0geyAiUl9QUENfR09UX1RMU0xEMTYiLCBleGVjIH0sCisgICAgW1JfUFBDX0dPVF9UTFNMRDE2X0xPXSA9IHsgIlJfUFBDX0dPVF9UTFNMRDE2X0xPIiwgZXhlYyB9LAorICAgIFtSX1BQQ19HT1RfVExTTEQxNl9ISV0gPSB7ICJSX1BQQ19HT1RfVExTTEQxNl9ISSIsIGV4ZWMgfSwKKyAgICBbUl9QUENfR09UX1RMU0xEMTZfSEFdID0geyAiUl9QUENfR09UX1RMU0xEMTZfSEEiLCBleGVjIH0sCisgICAgW1JfUFBDX0dPVF9UUFJFTDE2XSA9IHsgIlJfUFBDX0dPVF9UUFJFTDE2IiwgZXhlYyB9LAorICAgIFtSX1BQQ19HT1RfVFBSRUwxNl9MT10gPSB7ICJSX1BQQ19HT1RfVFBSRUwxNl9MTyIsIGV4ZWMgfSwKKyAgICBbUl9QUENfR09UX1RQUkVMMTZfSEldID0geyAiUl9QUENfR09UX1RQUkVMMTZfSEkiLCBleGVjIH0sCisgICAgW1JfUFBDX0dPVF9UUFJFTDE2X0hBXSA9IHsgIlJfUFBDX0dPVF9UUFJFTDE2X0hBIiwgZXhlYyB9LAorICAgIFtSX1BQQ19HT1RfRFRQUkVMMTZdID0geyAiUl9QUENfR09UX0RUUFJFTDE2IiwgZXhlYyB9LAorICAgIFtSX1BQQ19HT1RfRFRQUkVMMTZfTE9dID0geyAiUl9QUENfR09UX0RUUFJFTDE2X0xPIiwgZXhlYyB9LAorICAgIFtSX1BQQ19HT1RfRFRQUkVMMTZfSEldID0geyAiUl9QUENfR09UX0RUUFJFTDE2X0hJIiwgZXhlYyB9LAorICAgIFtSX1BQQ19HT1RfRFRQUkVMMTZfSEFdID0geyAiUl9QUENfR09UX0RUUFJFTDE2X0hBIiwgZXhlYyB9CisgIH07CisKKworLyogRGV0ZXJtaW5lIHJlbG9jYXRpb24gdHlwZSBzdHJpbmcgZm9yIFBQQy4gICovCitjb25zdCBjaGFyICoKK3BwY19yZWxvY190eXBlX25hbWUgKGludCB0eXBlLCBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBSX1BQQ19OVU0pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlbG9jX21hcF90YWJsZVt0eXBlXS5uYW1lOworfQorCisKKy8qIENoZWNrIGZvciBjb3JyZWN0IHJlbG9jYXRpb24gdHlwZS4gICovCitib29sCitwcGNfcmVsb2NfdHlwZV9jaGVjayAoaW50IHR5cGUpCit7CisgIHJldHVybiAodHlwZSA+PSBSX1BQQ19OT05FICYmIHR5cGUgPCBSX1BQQ19OVU0KKwkgICYmIHJlbG9jX21hcF90YWJsZVt0eXBlXS5uYW1lICE9IE5VTEwpID8gdHJ1ZSA6IGZhbHNlOworfQorCisKKy8qIENoZWNrIGZvciBjb3JyZWN0IHJlbG9jYXRpb24gdHlwZSB1c2UuICAqLworYm9vbAorcHBjX3JlbG9jX3ZhbGlkX3VzZSAoRWxmICplbGYsIGludCB0eXBlKQoreworICBpZiAodHlwZSA8IFJfUFBDX05PTkUgfHwgdHlwZSA+PSBSX1BQQ19OVU0KKyAgICAgIHx8IHJlbG9jX21hcF90YWJsZVt0eXBlXS5uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEVsZjMyX0VoZHIgKmVoZHIgPSBlbGYzMl9nZXRlaGRyIChlbGYpOworICBhc3NlcnQgKGVoZHIgIT0gTlVMTCk7CisKKyAgaWYgKHJlbG9jX21hcF90YWJsZVt0eXBlXS5hcHBlYXIgPT0gcmVsKQorICAgIHJldHVybiBlaGRyLT5lX3R5cGUgPT0gRVRfUkVMOworCisgIGlmIChyZWxvY19tYXBfdGFibGVbdHlwZV0uYXBwZWFyID09IGV4ZWMpCisgICAgcmV0dXJuIGVoZHItPmVfdHlwZSAhPSBFVF9SRUw7CisKKyAgYXNzZXJ0IChyZWxvY19tYXBfdGFibGVbdHlwZV0uYXBwZWFyID09IGJvdGgpOworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBDaGVjayBmb3IgdGhlIHNpbXBsZSByZWxvYyB0eXBlcy4gICovCitFbGZfVHlwZQorcHBjX3JlbG9jX3NpbXBsZV90eXBlIChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGludCB0eXBlKQoreworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgUl9QUENfQUREUjMyOgorICAgIGNhc2UgUl9QUENfVUFERFIzMjoKKyAgICAgIHJldHVybiBFTEZfVF9XT1JEOworICAgIGNhc2UgUl9QUENfVUFERFIxNjoKKyAgICAgIHJldHVybiBFTEZfVF9IQUxGOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRUxGX1RfTlVNOworICAgIH0KK30KKworLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgY29weSByZWxvY2F0aW9uLiAgKi8KK2Jvb2wKK3BwY19jb3B5X3JlbG9jX3AgKGludCByZWxvYykKK3sKKyAgcmV0dXJuIHJlbG9jID09IFJfUFBDX0NPUFk7Cit9CmRpZmYgLS1naXQgYS9saWJlYmwvc2hfZGVzdHIuYyBiL2xpYmVibC9zaF9kZXN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDY1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwvc2hfZGVzdHIuYwpAQCAtMCwwICsxLDI3IEBACisvKiBEZXN0cnVjdG9yIGZvciBTSCBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAuIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxfc2guaD4KKworCit2b2lkCitzaF9kZXN0ciAoYmgpCisgICAgIEVibCAqYmggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworeworICAvKiBOb3RoaW5nIHRvIGRvIHNvIGZhci4gICovCit9CmRpZmYgLS1naXQgYS9saWJlYmwvc2hfaW5pdC5jIGIvbGliZWJsL3NoX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjZjOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL3NoX2luaXQuYwpAQCAtMCwwICsxLDQwIEBACisvKiBJbml0aWFsaXphdGlvbiBvZiBTSCBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxfc2guaD4KKworCitjb25zdCBjaGFyICoKK3NoX2luaXQgKGVsZiwgbWFjaGluZSwgZWgsIGVobGVuKQorICAgICBFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CisgICAgIEdFbGZfSGFsZiBtYWNoaW5lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKyAgICAgRWJsICplaDsKKyAgICAgc2l6ZV90IGVobGVuOworeworICAvKiBDaGVjayB3aGV0aGVyIHRoZSBFbGZfQkggb2JqZWN0IGhhcyBhIHN1ZmZpY2VudCBzaXplLiAgKi8KKyAgaWYgKGVobGVuIDwgc2l6ZW9mIChFYmwpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFdlIGhhbmRsZSBpdC4gICovCisgIGVoLT5uYW1lID0gIkhpdGFjaGkgU0giOworICBlaC0+cmVsb2NfdHlwZV9uYW1lID0gc2hfcmVsb2NfdHlwZV9uYW1lOworICBlaC0+Y29weV9yZWxvY19wID0gc2hfY29weV9yZWxvY19wOworICBlaC0+ZGVzdHIgPSBzaF9kZXN0cjsKKworICByZXR1cm4gTU9EVkVSU0lPTjsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9zaF9zeW1ib2wuYyBiL2xpYmVibC9zaF9zeW1ib2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmZmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL3NoX3N5bWJvbC5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIFNIIHNwZWNpZmljIHJlbG9jYXRpb24gaGFuZGxpbmcuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGxpYmVibF9zaC5oPgorCisKKy8qIFJldHVybiBvZiB0aGUgYmFja2VuZC4gICovCitjb25zdCBjaGFyICoKK3NoX2JhY2tlbmRfbmFtZSAodm9pZCkKK3sKKyAgcmV0dXJuICJzaCI7Cit9CisKKworLyogRGV0ZXJtaW5lIHJlbG9jYXRpb24gdHlwZSBzdHJpbmcgZm9yIFNILiAgKi8KK2NvbnN0IGNoYXIgKgorc2hfcmVsb2NfdHlwZV9uYW1lIChpbnQgdHlwZSwgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJICAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqbWFwX3RhYmxlMVtdID0KKyAgeworICAgIFtSX1NIX05PTkVdID0gIlJfU0hfTk9ORSIsCisgICAgW1JfU0hfRElSMzJdID0gIlJfU0hfRElSMzIiLAorICAgIFtSX1NIX1JFTDMyXSA9ICJSX1NIX1JFTDMyIiwKKyAgICBbUl9TSF9ESVI4V1BOXSA9ICJSX1NIX0RJUjhXUE4iLAorICAgIFtSX1NIX0lORDEyV10gPSAiUl9TSF9JTkQxMlciLAorICAgIFtSX1NIX0RJUjhXUExdID0gIlJfU0hfRElSOFdQTCIsCisgICAgW1JfU0hfRElSOFdQWl0gPSAiUl9TSF9ESVI4V1BaIiwKKyAgICBbUl9TSF9ESVI4QlBdID0gIlJfU0hfRElSOEJQIiwKKyAgICBbUl9TSF9ESVI4V10gPSAiUl9TSF9ESVI4VyIsCisgICAgW1JfU0hfRElSOExdID0gIlJfU0hfRElSOEwiLAorICAgIFtSX1NIX1NXSVRDSDE2XSA9ICJSX1NIX1NXSVRDSDE2IiwKKyAgICBbUl9TSF9TV0lUQ0gzMl0gPSAiUl9TSF9TV0lUQ0gzMiIsCisgICAgW1JfU0hfVVNFU10gPSAiUl9TSF9VU0VTIiwKKyAgICBbUl9TSF9DT1VOVF0gPSAiUl9TSF9DT1VOVCIsCisgICAgW1JfU0hfQUxJR05dID0gIlJfU0hfQUxJR04iLAorICAgIFtSX1NIX0NPREVdID0gIlJfU0hfQ09ERSIsCisgICAgW1JfU0hfREFUQV0gPSAiUl9TSF9EQVRBIiwKKyAgICBbUl9TSF9MQUJFTF0gPSAiUl9TSF9MQUJFTCIsCisgICAgW1JfU0hfU1dJVENIOF0gPSAiUl9TSF9TV0lUQ0g4IiwKKyAgICBbUl9TSF9HTlVfVlRJTkhFUklUXSA9IlJfU0hfR05VX1ZUSU5IRVJJVCIsCisgICAgW1JfU0hfR05VX1ZURU5UUlldID0gIlJfU0hfR05VX1ZURU5UUlkiCisgIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICptYXBfdGFibGUyW10gPQorICB7CisgICAgW1JfU0hfVExTX0dEXzMyXSA9ICJSX1NIX1RMU19HRF8zMiIsCisgICAgW1JfU0hfVExTX0xEXzMyXSA9ICJSX1NIX1RMU19MRF8zMiIsCisgICAgW1JfU0hfVExTX0xET18zMl0gPSAiUl9TSF9UTFNfTERPXzMyIiwKKyAgICBbUl9TSF9UTFNfSUVfMzJdID0gIlJfU0hfVExTX0lFXzMyIiwKKyAgICBbUl9TSF9UTFNfTEVfMzJdID0gIlJfU0hfVExTX0xFXzMyIiwKKyAgICBbUl9TSF9UTFNfRFRQTU9EMzJdID0gIlJfU0hfVExTX0RUUE1PRDMyIiwKKyAgICBbUl9TSF9UTFNfRFRQT0ZGMzJdID0gIlJfU0hfVExTX0RUUE9GRjMyIiwKKyAgICBbUl9TSF9UTFNfVFBPRkYzMl0gPSAiUl9TSF9UTFNfVFBPRkYzMiIsCisgICAgW1JfU0hfR09UMzIgLSBSX1NIX0dPVDMyXSA9ICJSX1NIX0dPVDMyIiwKKyAgICBbUl9TSF9QTFQzMiAtIFJfU0hfR09UMzJdID0gIlJfU0hfUExUMzIiLAorICAgIFtSX1NIX0NPUFkgLSBSX1NIX0dPVDMyXSA9ICJSX1NIX0NPUFkiLAorICAgIFtSX1NIX0dMT0JfREFUIC0gUl9TSF9HT1QzMl0gPSAiUl9TSF9HTE9CX0RBVCIsCisgICAgW1JfU0hfSk1QX1NMT1QgLSBSX1NIX0dPVDMyXSA9ICJSX1NIX0pNUF9TTE9UIiwKKyAgICBbUl9TSF9SRUxBVElWRSAtIFJfU0hfR09UMzJdID0gIlJfU0hfUkVMQVRJVkUiLAorICAgIFtSX1NIX0dPVE9GRiAtIFJfU0hfR09UMzJdID0gIlJfU0hfR09UT0ZGIiwKKyAgICBbUl9TSF9HT1RQQyAtIFJfU0hfR09UMzJdID0gIlJfU0hfR09UUEMiCisgIH07CisKKyAgaWYgKHR5cGUgPj0gMAorICAgICAgJiYgKHNpemVfdCkgdHlwZSA8IHNpemVvZiAobWFwX3RhYmxlMSkgLyBzaXplb2YgKG1hcF90YWJsZTFbMF0pKQorICAgIHJldHVybiBtYXBfdGFibGUxW3R5cGVdOworCisgIGlmICgodHlwZSAtIFJfU0hfVExTX0dEXzMyKSA+PSAwCisgICAgICAmJiAoKHNpemVfdCkgKHR5cGUgLSBSX1NIX1RMU19HRF8zMikKKwkgIDwgc2l6ZW9mIChtYXBfdGFibGUyKSAvIHNpemVvZiAobWFwX3RhYmxlMlswXSkpKQorICAgIHJldHVybiBtYXBfdGFibGUyW3R5cGUgLSBSX1NIX1RMU19HRF8zMl07CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gcmVsb2NhdGlvbiBpcyBhIGNvcHkgcmVsb2NhdGlvbi4gICovCitib29sCitzaF9jb3B5X3JlbG9jX3AgKGludCByZWxvYykKK3sKKyAgcmV0dXJuIHJlbG9jID09IFJfU0hfQ09QWTsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9zcGFyY19kZXN0ci5jIGIvbGliZWJsL3NwYXJjX2Rlc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5ZjM2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9zcGFyY19kZXN0ci5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qIERlc3RydWN0b3IgZm9yIFNQQVJDIHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWJsX3NwYXJjLmg+CisKKwordm9pZAorc3BhcmNfZGVzdHIgKGJoKQorICAgICBFYmwgKmJoIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKK3sKKyAgLyogTm90aGluZyB0byBkbyBzbyBmYXIuICAqLworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL3NwYXJjX2luaXQuYyBiL2xpYmVibC9zcGFyY19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0NjFhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC9zcGFyY19pbml0LmMKQEAgLTAsMCArMSw0NiBAQAorLyogSW5pdGlhbGl6YXRpb24gb2YgU1BBUkMgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxfc3BhcmMuaD4KKworCitjb25zdCBjaGFyICoKK3NwYXJjX2luaXQgKGVsZiwgbWFjaGluZSwgZWgsIGVobGVuKQorICAgICBFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CisgICAgIEdFbGZfSGFsZiBtYWNoaW5lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKyAgICAgRWJsICplaDsKKyAgICAgc2l6ZV90IGVobGVuOworeworICAvKiBDaGVjayB3aGV0aGVyIHRoZSBFbGZfQkggb2JqZWN0IGhhcyBhIHN1ZmZpY2VudCBzaXplLiAgKi8KKyAgaWYgKGVobGVuIDwgc2l6ZW9mIChFYmwpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFdlIGhhbmRsZSBpdC4gICovCisgIGlmIChtYWNoaW5lID09IEVNX1NQQVJDVjkpCisgICAgZWgtPm5hbWUgPSAiU1BBUkMgdjkiOworICBlbHNlIGlmIChtYWNoaW5lID09IEVNX1NQQVJDMzJQTFVTKQorICAgIGVoLT5uYW1lID0gIlNQQVJDIHY4KyI7CisgIGVsc2UKKyAgICBlaC0+bmFtZSA9ICJTUEFSQyI7CisgIGVoLT5yZWxvY190eXBlX25hbWUgPSBzcGFyY19yZWxvY190eXBlX25hbWU7CisgIGVoLT5yZWxvY190eXBlX2NoZWNrID0gc3BhcmNfcmVsb2NfdHlwZV9jaGVjazsKKyAgLy9laC0+Y29yZV9ub3RlID0gc3BhcmNfY29yZV9ub3RlOworICBlaC0+Y29weV9yZWxvY19wID0gc3BhcmNfY29weV9yZWxvY19wOworICBlaC0+ZGVzdHIgPSBzcGFyY19kZXN0cjsKKworICByZXR1cm4gTU9EVkVSU0lPTjsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC9zcGFyY19zeW1ib2wuYyBiL2xpYmVibC9zcGFyY19zeW1ib2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNlZDUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL3NwYXJjX3N5bWJvbC5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBTUEFSQyBzcGVjaWZpYyBzeW1ib2xpYyBuYW1lIGhhbmRsaW5nLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxsaWJlYmxfc3BhcmMuaD4KKworCisvKiBSZXR1cm4gb2YgdGhlIGJhY2tlbmQuICAqLworY29uc3QgY2hhciAqCitzcGFyY19iYWNrZW5kX25hbWUgKHZvaWQpCit7CisgIHJldHVybiAic3BhcmMiOworfQorCisKKy8qIFJlbG9jYXRpb24gbWFwcGluZyB0YWJsZS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqcmVsb2NfbWFwX3RhYmxlW10gPQorICB7CisgICAgW1JfU1BBUkNfTk9ORV0gPSAiUl9TUEFSQ19OT05FIiwKKyAgICBbUl9TUEFSQ184XSA9ICJSX1NQQVJDXzgiLAorICAgIFtSX1NQQVJDXzE2XSA9ICJSX1NQQVJDXzE2IiwKKyAgICBbUl9TUEFSQ18zMl0gPSAiUl9TUEFSQ18zMiIsCisgICAgW1JfU1BBUkNfRElTUDhdID0gIlJfU1BBUkNfRElTUDgiLAorICAgIFtSX1NQQVJDX0RJU1AxNl0gPSAiUl9TUEFSQ19ESVNQMTYiLAorICAgIFtSX1NQQVJDX0RJU1AzMl0gPSAiUl9TUEFSQ19ESVNQMzIiLAorICAgIFtSX1NQQVJDX1dESVNQMzBdID0gIlJfU1BBUkNfV0RJU1AzMCIsCisgICAgW1JfU1BBUkNfV0RJU1AyMl0gPSAiUl9TUEFSQ19XRElTUDIyIiwKKyAgICBbUl9TUEFSQ19ISTIyXSA9ICJSX1NQQVJDX0hJMjIiLAorICAgIFtSX1NQQVJDXzIyXSA9ICJSX1NQQVJDXzIyIiwKKyAgICBbUl9TUEFSQ18xM10gPSAiUl9TUEFSQ18xMyIsCisgICAgW1JfU1BBUkNfTE8xMF0gPSAiUl9TUEFSQ19MTzEwIiwKKyAgICBbUl9TUEFSQ19HT1QxMF0gPSAiUl9TUEFSQ19HT1QxMCIsCisgICAgW1JfU1BBUkNfR09UMTNdID0gIlJfU1BBUkNfR09UMTMiLAorICAgIFtSX1NQQVJDX0dPVDIyXSA9ICJSX1NQQVJDX0dPVDIyIiwKKyAgICBbUl9TUEFSQ19QQzEwXSA9ICJSX1NQQVJDX1BDMTAiLAorICAgIFtSX1NQQVJDX1BDMjJdID0gIlJfU1BBUkNfUEMyMiIsCisgICAgW1JfU1BBUkNfV1BMVDMwXSA9ICJSX1NQQVJDX1dQTFQzMCIsCisgICAgW1JfU1BBUkNfQ09QWV0gPSAiUl9TUEFSQ19DT1BZIiwKKyAgICBbUl9TUEFSQ19HTE9CX0RBVF0gPSAiUl9TUEFSQ19HTE9CX0RBVCIsCisgICAgW1JfU1BBUkNfSk1QX1NMT1RdID0gIlJfU1BBUkNfSk1QX1NMT1QiLAorICAgIFtSX1NQQVJDX1JFTEFUSVZFXSA9ICJSX1NQQVJDX1JFTEFUSVZFIiwKKyAgICBbUl9TUEFSQ19VQTMyXSA9ICJSX1NQQVJDX1VBMzIiLAorICAgIFtSX1NQQVJDX1BMVDMyXSA9ICJSX1NQQVJDX1BMVDMyIiwKKyAgICBbUl9TUEFSQ19ISVBMVDIyXSA9ICJSX1NQQVJDX0hJUExUMjIiLAorICAgIFtSX1NQQVJDX0xPUExUMTBdID0gIlJfU1BBUkNfTE9QTFQxMCIsCisgICAgW1JfU1BBUkNfUENQTFQzMl0gPSAiUl9TUEFSQ19QQ1BMVDMyIiwKKyAgICBbUl9TUEFSQ19QQ1BMVDIyXSA9ICJSX1NQQVJDX1BDUExUMjIiLAorICAgIFtSX1NQQVJDX1BDUExUMTBdID0gIlJfU1BBUkNfUENQTFQxMCIsCisgICAgW1JfU1BBUkNfMTBdID0gIlJfU1BBUkNfMTAiLAorICAgIFtSX1NQQVJDXzExXSA9ICJSX1NQQVJDXzExIiwKKyAgICBbUl9TUEFSQ182NF0gPSAiUl9TUEFSQ182NCIsCisgICAgW1JfU1BBUkNfT0xPMTBdID0gIlJfU1BBUkNfT0xPMTAiLAorICAgIFtSX1NQQVJDX0hIMjJdID0gIlJfU1BBUkNfSEgyMiIsCisgICAgW1JfU1BBUkNfSE0xMF0gPSAiUl9TUEFSQ19ITTEwIiwKKyAgICBbUl9TUEFSQ19MTTIyXSA9ICJSX1NQQVJDX0xNMjIiLAorICAgIFtSX1NQQVJDX1BDX0hIMjJdID0gIlJfU1BBUkNfUENfSEgyMiIsCisgICAgW1JfU1BBUkNfUENfSE0xMF0gPSAiUl9TUEFSQ19QQ19ITTEwIiwKKyAgICBbUl9TUEFSQ19QQ19MTTIyXSA9ICJSX1NQQVJDX1BDX0xNMjIiLAorICAgIFtSX1NQQVJDX1dESVNQMTZdID0gIlJfU1BBUkNfV0RJU1AxNiIsCisgICAgW1JfU1BBUkNfV0RJU1AxOV0gPSAiUl9TUEFSQ19XRElTUDE5IiwKKyAgICBbUl9TUEFSQ183XSA9ICJSX1NQQVJDXzciLAorICAgIFtSX1NQQVJDXzVdID0gIlJfU1BBUkNfNSIsCisgICAgW1JfU1BBUkNfNl0gPSAiUl9TUEFSQ182IiwKKyAgICBbUl9TUEFSQ19ESVNQNjRdID0gIlJfU1BBUkNfRElTUDY0IiwKKyAgICBbUl9TUEFSQ19QTFQ2NF0gPSAiUl9TUEFSQ19QTFQ2NCIsCisgICAgW1JfU1BBUkNfSElYMjJdID0gIlJfU1BBUkNfSElYMjIiLAorICAgIFtSX1NQQVJDX0xPWDEwXSA9ICJSX1NQQVJDX0xPWDEwIiwKKyAgICBbUl9TUEFSQ19INDRdID0gIlJfU1BBUkNfSDQ0IiwKKyAgICBbUl9TUEFSQ19NNDRdID0gIlJfU1BBUkNfTTQ0IiwKKyAgICBbUl9TUEFSQ19MNDRdID0gIlJfU1BBUkNfTDQ0IiwKKyAgICBbUl9TUEFSQ19SRUdJU1RFUl0gPSAiUl9TUEFSQ19SRUdJU1RFUiIsCisgICAgW1JfU1BBUkNfVUE2NF0gPSAiUl9TUEFSQ19VQTY0IiwKKyAgICBbUl9TUEFSQ19VQTE2XSA9ICJSX1NQQVJDX1VBMTYiLAorICAgIFtSX1NQQVJDX1RMU19HRF9ISTIyXSA9ICJSX1NQQVJDX1RMU19HRF9ISTIyIiwKKyAgICBbUl9TUEFSQ19UTFNfR0RfTE8xMF0gPSAiUl9TUEFSQ19UTFNfR0RfTE8xMCIsCisgICAgW1JfU1BBUkNfVExTX0dEX0FERF0gPSAiUl9TUEFSQ19UTFNfR0RfQUREIiwKKyAgICBbUl9TUEFSQ19UTFNfR0RfQ0FMTF0gPSAiUl9TUEFSQ19UTFNfR0RfQ0FMTCIsCisgICAgW1JfU1BBUkNfVExTX0xETV9ISTIyXSA9ICJSX1NQQVJDX1RMU19MRE1fSEkyMiIsCisgICAgW1JfU1BBUkNfVExTX0xETV9MTzEwXSA9ICJSX1NQQVJDX1RMU19MRE1fTE8xMCIsCisgICAgW1JfU1BBUkNfVExTX0xETV9BRERdID0gIlJfU1BBUkNfVExTX0xETV9BREQiLAorICAgIFtSX1NQQVJDX1RMU19MRE1fQ0FMTF0gPSAiUl9TUEFSQ19UTFNfTERNX0NBTEwiLAorICAgIFtSX1NQQVJDX1RMU19MRE9fSElYMjJdID0gIlJfU1BBUkNfVExTX0xET19ISVgyMiIsCisgICAgW1JfU1BBUkNfVExTX0xET19MT1gxMF0gPSAiUl9TUEFSQ19UTFNfTERPX0xPWDEwIiwKKyAgICBbUl9TUEFSQ19UTFNfTERPX0FERF0gPSAiUl9TUEFSQ19UTFNfTERPX0FERCIsCisgICAgW1JfU1BBUkNfVExTX0lFX0hJMjJdID0gIlJfU1BBUkNfVExTX0lFX0hJMjIiLAorICAgIFtSX1NQQVJDX1RMU19JRV9MTzEwXSA9ICJSX1NQQVJDX1RMU19JRV9MTzEwIiwKKyAgICBbUl9TUEFSQ19UTFNfSUVfTERdID0gIlJfU1BBUkNfVExTX0lFX0xEIiwKKyAgICBbUl9TUEFSQ19UTFNfSUVfTERYXSA9ICJSX1NQQVJDX1RMU19JRV9MRFgiLAorICAgIFtSX1NQQVJDX1RMU19JRV9BRERdID0gIlJfU1BBUkNfVExTX0lFX0FERCIsCisgICAgW1JfU1BBUkNfVExTX0xFX0hJWDIyXSA9ICJSX1NQQVJDX1RMU19MRV9ISVgyMiIsCisgICAgW1JfU1BBUkNfVExTX0xFX0xPWDEwXSA9ICJSX1NQQVJDX1RMU19MRV9MT1gxMCIsCisgICAgW1JfU1BBUkNfVExTX0RUUE1PRDMyXSA9ICJSX1NQQVJDX1RMU19EVFBNT0QzMiIsCisgICAgW1JfU1BBUkNfVExTX0RUUE1PRDY0XSA9ICJSX1NQQVJDX1RMU19EVFBNT0Q2NCIsCisgICAgW1JfU1BBUkNfVExTX0RUUE9GRjMyXSA9ICJSX1NQQVJDX1RMU19EVFBPRkYzMiIsCisgICAgW1JfU1BBUkNfVExTX0RUUE9GRjY0XSA9ICJSX1NQQVJDX1RMU19EVFBPRkY2NCIsCisgICAgW1JfU1BBUkNfVExTX1RQT0ZGMzJdID0gIlJfU1BBUkNfVExTX1RQT0ZGMzIiLAorICAgIFtSX1NQQVJDX1RMU19UUE9GRjY0XSA9ICJSX1NQQVJDX1RMU19UUE9GRjY0IgorICB9OworCisKKy8qIERldGVybWluZSByZWxvY2F0aW9uIHR5cGUgc3RyaW5nIGZvciBzcGFyYy4gICovCitjb25zdCBjaGFyICoKK3NwYXJjX3JlbG9jX3R5cGVfbmFtZSAoaW50IHR5cGUsIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgLyogSGlnaCAyNCBiaXRzIG9mIHJfdHlwZSBhcmUgdXNlZCBmb3Igc2Vjb25kIGFkZGVuZCBpbiBSX1NQQVJDX09MTzEwLiAgKi8KKyAgaWYgKCh0eXBlICYgMHhmZikgPT0gUl9TUEFSQ19PTE8xMCkKKyAgICByZXR1cm4gcmVsb2NfbWFwX3RhYmxlW3R5cGUgJiAweGZmXTsKKworICBpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBSX1NQQVJDX05VTSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcmVsb2NfbWFwX3RhYmxlW3R5cGVdOworfQorCisKKy8qIENoZWNrIGZvciBjb3JyZWN0IHJlbG9jYXRpb24gdHlwZS4gICovCitib29sCitzcGFyY19yZWxvY190eXBlX2NoZWNrIChpbnQgdHlwZSkKK3sKKyAgaWYgKCh0eXBlICYgMHhmZikgPT0gUl9TUEFSQ19PTE8xMCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuICh0eXBlID49IFJfU1BBUkNfTk9ORSAmJiB0eXBlIDwgUl9TUEFSQ19OVU0KKwkgICYmIHJlbG9jX21hcF90YWJsZVt0eXBlXSAhPSBOVUxMKSA/IHRydWUgOiBmYWxzZTsKK30KKworLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgY29weSByZWxvY2F0aW9uLiAgKi8KK2Jvb2wKK3NwYXJjX2NvcHlfcmVsb2NfcCAoaW50IHJlbG9jKQoreworICByZXR1cm4gcmVsb2MgPT0gUl9TUEFSQ19DT1BZOworfQpkaWZmIC0tZ2l0IGEvbGliZWJsL3g4Nl82NF9jb3Jlbm90ZS5jIGIvbGliZWJsL3g4Nl82NF9jb3Jlbm90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZTdjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwveDg2XzY0X2NvcmVub3RlLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qIHg4Ni02NCBzcGVjaWZpYyBjb3JlIG5vdGUgaGFuZGxpbmcuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPGxpYmVibF94ODZfNjQuaD4KKworCisvKiBXZSBjYW5ub3QgaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPiBzaW5jZSB0aGUgZGVmaW5pdGlvbiB3b3VsZCBiZSBmb3IKKyAgIHRoZSBob3N0IHBsYXRmb3JtIGFuZCBub3QgYWx3YXlzIHg4Ni02NCBhcyByZXF1aXJlZCBoZXJlLiAgKi8KK3N0cnVjdCBlbGZfcHJzdGF0dXMKKyAgeworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIGludDMyX3Qgc2lfc2lnbm87CQkJLyogU2lnbmFsIG51bWJlci4gICovCisgICAgICBpbnQzMl90IHNpX2NvZGU7CQkJLyogRXh0cmEgY29kZS4gICovCisgICAgICBpbnQzMl90IHNpX2Vycm5vOwkJCS8qIEVycm5vLiAgKi8KKyAgICB9IHByX2luZm87CQkJCS8qIEluZm8gYXNzb2NpYXRlZCB3aXRoIHNpZ25hbC4gICovCisgICAgaW50MTZfdCBwcl9jdXJzaWc7CQkJLyogQ3VycmVudCBzaWduYWwuICAqLworICAgIHVpbnQ2NF90IHByX3NpZ3BlbmQ7CQkvKiBTZXQgb2YgcGVuZGluZyBzaWduYWxzLiAgKi8KKyAgICB1aW50NjRfdCBwcl9zaWdob2xkOwkJLyogU2V0IG9mIGhlbGQgc2lnbmFscy4gICovCisgICAgaW50MzJfdCBwcl9waWQ7CisgICAgaW50MzJfdCBwcl9wcGlkOworICAgIGludDMyX3QgcHJfcGdycDsKKyAgICBpbnQzMl90IHByX3NpZDsKKyAgICBzdHJ1Y3QgeDg2XzY0X3RpbWV2YWwKKyAgICB7CisgICAgICBpbnQ2NF90IHR2X3NlYzsKKyAgICAgIGludDMyX3QgdHZfdXNlYzsKKyAgICB9IHByX3V0aW1lOwkJCQkvKiBVc2VyIHRpbWUuICAqLworICAgIHN0cnVjdCB4ODZfNjRfdGltZXZhbCBwcl9zdGltZTsJLyogU3lzdGVtIHRpbWUuICAqLworICAgIHN0cnVjdCB4ODZfNjRfdGltZXZhbCBwcl9jdXRpbWU7CS8qIEN1bXVsYXRpdmUgdXNlciB0aW1lLiAgKi8KKyAgICBzdHJ1Y3QgeDg2XzY0X3RpbWV2YWwgcHJfY3N0aW1lOwkvKiBDdW11bGF0aXZlIHN5c3RlbSB0aW1lLiAgKi8KKyAgICB1aW50NjRfdCBwcl9yZWdbMjddOwkvKiBHUCByZWdpc3RlcnMuICAqLworICAgIGludDMyX3QgcHJfZnB2YWxpZDsJCQkvKiBUcnVlIGlmIG1hdGggY29wcm8gYmVpbmcgdXNlZC4gICovCisgIH07CisKKworc3RydWN0IGVsZl9wcnBzaW5mbworICB7CisgICAgY2hhciBwcl9zdGF0ZTsJCQkvKiBOdW1lcmljIHByb2Nlc3Mgc3RhdGUuICAqLworICAgIGNoYXIgcHJfc25hbWU7CQkJLyogQ2hhciBmb3IgcHJfc3RhdGUuICAqLworICAgIGNoYXIgcHJfem9tYjsJCQkvKiBab21iaWUuICAqLworICAgIGNoYXIgcHJfbmljZTsJCQkvKiBOaWNlIHZhbC4gICovCisgICAgdWludDY0X3QgcHJfZmxhZzsJCQkvKiBGbGFncy4gICovCisgICAgdWludDMyX3QgcHJfdWlkOworICAgIHVpbnQzMl90IHByX2dpZDsKKyAgICBpbnQzMl90IHByX3BpZDsKKyAgICBpbnQzMl90IHByX3BwaWQ7CisgICAgaW50MzJfdCBwcl9wZ3JwOworICAgIGludDMyX3QgcHJfc2lkOworICAgIC8qIExvdHMgbWlzc2luZyAqLworICAgIGNoYXIgcHJfZm5hbWVbMTZdOwkJCS8qIEZpbGVuYW1lIG9mIGV4ZWN1dGFibGUuICAqLworICAgIGNoYXIgcHJfcHNhcmdzWzgwXTsJCQkvKiBJbml0aWFsIHBhcnQgb2YgYXJnIGxpc3QuICAqLworICB9OworCisKK2Jvb2wKK3g4Nl82NF9jb3JlX25vdGUgKG5hbWUsIHR5cGUsIGRlc2NzeiwgZGVzYykKKyAgICAgY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CisgICAgIHVpbnQzMl90IHR5cGU7CisgICAgIHVpbnQzMl90IGRlc2NzejsKKyAgICAgY29uc3QgY2hhciAqZGVzYzsKK3sKKyAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgTlRfUFJTVEFUVVM6CisgICAgICBpZiAoZGVzY3N6IDwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3Byc3RhdHVzKSkKKwkvKiBOb3QgZW5vdWdoIGRhdGEuICAqLworCWJyZWFrOworCisgICAgICBzdHJ1Y3QgZWxmX3Byc3RhdHVzICpzdGF0ID0gKHN0cnVjdCBlbGZfcHJzdGF0dXMgKikgZGVzYzsKKworICAgICAgcHJpbnRmICgiICAgIFNJR0lORk86ICBzaWdubzogJSIgUFJJZDMyICIsIGNvZGUgPSAlIiBQUklkMzIKKwkgICAgICAiLCBlcnJubyA9ICUiIFBSSWQzMiAiXG4iCisJICAgICAgIiAgICBzaWduYWw6ICUiIFBSSWQxNiAiLCBwZW5kaW5nOiAlIzA4IiBQUkl4NjQgIiwgaG9sZGluZzogJSMwOCIKKwkgICAgICBQUkl4NjQgIlxuIgorCSAgICAgICIgICAgcGlkOiAlIiBQUklkMzIgIiwgcHBpZCA9ICUiIFBSSWQzMiAiLCBwZ3JwID0gJSIgUFJJZDMyCisJICAgICAgIiwgc2lkID0gJSIgUFJJZDMyICJcbiIKKwkgICAgICAiICAgICB1dGltZTogJTYiIFBSSWQ2NCAiLiUwNiIgUFJJZDMyCisJICAgICAgInMsICBzdGltZTogJTYiIFBSSWQ2NCAiLiUwNiIgUFJJZDMyICJzXG4iCisJICAgICAgIiAgICBjdXRpbWU6ICU2IiBQUklkNjQgIi4lMDYiIFBSSWQzMgorCSAgICAgICJzLCBjc3RpbWU6ICU2IiBQUklkNjQgIi4lMDYiIFBSSWQzMiAic1xuIgorCSAgICAgICIgICAgcmF4OiAlMDE2IiBQUkl4NjQgIiAgcmJ4OiAlMDE2IiBQUkl4NjQgIlxuIgorCSAgICAgICIgICAgcmN4OiAlMDE2IiBQUkl4NjQgIiAgcmR4OiAlMDE2IiBQUkl4NjQgIlxuIgorCSAgICAgICIgICAgcnNpOiAlMDE2IiBQUkl4NjQgIiAgcmRpOiAlMDE2IiBQUkl4NjQgIlxuIgorCSAgICAgICIgICAgcmJwOiAlMDE2IiBQUkl4NjQgIiAgcnNwOiAlMDE2IiBQUkl4NjQgIlxuIgorCSAgICAgICIgICAgcjg6ICAlMDE2IiBQUkl4NjQgIiAgcjk6ICAlMDE2IiBQUkl4NjQgIlxuIgorCSAgICAgICIgICAgcjEwOiAlMDE2IiBQUkl4NjQgIiAgcjExOiAlMDE2IiBQUkl4NjQgIlxuIgorCSAgICAgICIgICAgcjEyOiAlMDE2IiBQUkl4NjQgIiAgcjEzOiAlMDE2IiBQUkl4NjQgIlxuIgorCSAgICAgICIgICAgcjE0OiAlMDE2IiBQUkl4NjQgIiAgcjE1OiAlMDE2IiBQUkl4NjQgIlxuIgorCSAgICAgICIgICAgcmlwOiAlMDE2IiBQUkl4NjQgIiAgZWZsYWdzOiAlMDgiIFBSSXg2NCAiXG4iCisJICAgICAgIiAgICBvcmlnaW5hbCByYXg6ICUwMTYiIFBSSXg2NCAiXG4iCisJICAgICAgIiAgICBjczogJTA0IiBQUkl4NjQgIiAgZHM6ICUwNCIgUFJJeDY0ICIgIGVzOiAlMDQiIFBSSXg2NAorCSAgICAgICIgIHNzOiAlMDQiIFBSSXg2NCAiXG4iCisJICAgICAgIiAgICBmczogJTA0IiBQUkl4NjQgIiAgZnNfYmFzZTogJTAxNiIgUFJJeDY0CisJICAgICAgIiAgZ3M6ICUwNCIgUFJJeDY0ICIgIGdzX2Jhc2U6ICUwMTYiIFBSSXg2NCAiXG5cbiIsCisJICAgICAgc3RhdC0+cHJfaW5mby4gc2lfc2lnbm8sCisJICAgICAgc3RhdC0+cHJfaW5mby4gc2lfY29kZSwKKwkgICAgICBzdGF0LT5wcl9pbmZvLiBzaV9lcnJubywKKwkgICAgICBzdGF0LT5wcl9jdXJzaWcsCisJICAgICAgc3RhdC0+cHJfc2lncGVuZCwgc3RhdC0+cHJfc2lnaG9sZCwKKwkgICAgICBzdGF0LT5wcl9waWQsIHN0YXQtPnByX3BwaWQsIHN0YXQtPnByX3BncnAsIHN0YXQtPnByX3NpZCwKKwkgICAgICBzdGF0LT5wcl91dGltZS50dl9zZWMsIHN0YXQtPnByX3V0aW1lLnR2X3VzZWMsCisJICAgICAgc3RhdC0+cHJfc3RpbWUudHZfc2VjLCBzdGF0LT5wcl9zdGltZS50dl91c2VjLAorCSAgICAgIHN0YXQtPnByX2N1dGltZS50dl9zZWMsIHN0YXQtPnByX2N1dGltZS50dl91c2VjLAorCSAgICAgIHN0YXQtPnByX2NzdGltZS50dl9zZWMsIHN0YXQtPnByX2NzdGltZS50dl91c2VjLAorCSAgICAgIHN0YXQtPnByX3JlZ1sxMF0sIHN0YXQtPnByX3JlZ1s1XSwgc3RhdC0+cHJfcmVnWzExXSwKKwkgICAgICBzdGF0LT5wcl9yZWdbMTJdLCBzdGF0LT5wcl9yZWdbMTNdLCBzdGF0LT5wcl9yZWdbMTRdLAorCSAgICAgIHN0YXQtPnByX3JlZ1s0XSwgc3RhdC0+cHJfcmVnWzEwXSwgc3RhdC0+cHJfcmVnWzldLAorCSAgICAgIHN0YXQtPnByX3JlZ1s3XSwgc3RhdC0+cHJfcmVnWzZdLCBzdGF0LT5wcl9yZWdbNV0sCisJICAgICAgc3RhdC0+cHJfcmVnWzNdLCBzdGF0LT5wcl9yZWdbMl0sIHN0YXQtPnByX3JlZ1sxXSwKKwkgICAgICBzdGF0LT5wcl9yZWdbMF0sIHN0YXQtPnByX3JlZ1sxNl0sIHN0YXQtPnByX3JlZ1sxOF0sCisJICAgICAgc3RhdC0+cHJfcmVnWzE1XSwgc3RhdC0+cHJfcmVnWzE3XSwgc3RhdC0+cHJfcmVnWzIzXSwKKwkgICAgICBzdGF0LT5wcl9yZWdbMjRdLCBzdGF0LT5wcl9yZWdbMjBdLAorCSAgICAgIHN0YXQtPnByX3JlZ1syNV0sIHN0YXQtPnByX3JlZ1syMV0sCisJICAgICAgc3RhdC0+cHJfcmVnWzI2XSwgc3RhdC0+cHJfcmVnWzIyXSk7CisKKyAgICAgIC8qIFdlIGhhbmRsZWQgdGhpcyBlbnRyeS4gICovCisgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5UX1BSUFNJTkZPOgorICAgICAgaWYgKGRlc2NzeiA8IHNpemVvZiAoc3RydWN0IGVsZl9wcnBzaW5mbykpCisJLyogTm90IGVub3VnaCBkYXRhLiAgKi8KKwlicmVhazsKKworICAgICAgc3RydWN0IGVsZl9wcnBzaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWxmX3BycHNpbmZvICopIGRlc2M7CisKKyAgICAgIHByaW50ZiAoIiAgICBzdGF0ZTogJWMgKCVoaGQpLCAgem9tYmllOiAlaGhkLCAgbmljZTogJWhoZFxuIgorCSAgICAgICIgICAgZmxhZ3M6ICUwOCIgUFJJeDY0ICIgIHVpZDogJSIgUFJJdTMyICIgIGdpZDogJSIgUFJJdTMyICJcbiIKKwkgICAgICAiICAgIHBpZDogJSIgUFJJZDMyICIgIHBwaWQ6ICUiIFBSSWQzMiAiICBwZ3JwOiAlIiBQUklkMzIKKwkgICAgICAiICBzaWQ6ICUiIFBSSWQzMiAiXG4iCisJICAgICAgIiAgICBmbmFtZTogJS4xNnNcbiIKKwkgICAgICAiICAgICBhcmdzOiAlLjgwc1xuXG4iLAorCSAgICAgIGluZm8tPnByX3NuYW1lLCBpbmZvLT5wcl9zdGF0ZSwgaW5mby0+cHJfem9tYiwgaW5mby0+cHJfbmljZSwKKwkgICAgICBpbmZvLT5wcl9mbGFnLCBpbmZvLT5wcl91aWQsIGluZm8tPnByX2dpZCwKKwkgICAgICBpbmZvLT5wcl9waWQsIGluZm8tPnByX3BwaWQsIGluZm8tPnByX3BncnAsIGluZm8tPnByX3NpZCwKKwkgICAgICBpbmZvLT5wcl9mbmFtZSwgaW5mby0+cHJfcHNhcmdzKTsKKworICAgICAgLyogV2UgaGFuZGxlZCB0aGlzIGVudHJ5LiAgKi8KKyAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC94ODZfNjRfZGVzdHIuYyBiL2xpYmVibC94ODZfNjRfZGVzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA1ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWJsL3g4Nl82NF9kZXN0ci5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIERlc3RydWN0b3IgZm9yIHg4Nl82NCBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxfeDg2XzY0Lmg+CisKKwordm9pZAoreDg2XzY0X2Rlc3RyIChiaCkKKyAgICAgRWJsICpiaCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7Cit7CisgIC8qIE5vdGhpbmcgdG8gZG8gc28gZmFyLiAgKi8KK30KZGlmZiAtLWdpdCBhL2xpYmVibC94ODZfNjRfaW5pdC5jIGIvbGliZWJsL3g4Nl82NF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1YTY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVibC94ODZfNjRfaW5pdC5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIEluaXRpYWxpemF0aW9uIG9mIHg4Ni02NCBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlYmxfeDg2XzY0Lmg+CisKKworY29uc3QgY2hhciAqCit4ODZfNjRfaW5pdCAoZWxmLCBtYWNoaW5lLCBlaCwgZWhsZW4pCisgICAgIEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKyAgICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworICAgICBFYmwgKmVoOworICAgICBzaXplX3QgZWhsZW47Cit7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIEVsZl9CSCBvYmplY3QgaGFzIGEgc3VmZmljZW50IHNpemUuICAqLworICBpZiAoZWhsZW4gPCBzaXplb2YgKEVibCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogV2UgaGFuZGxlIGl0LiAgKi8KKyAgZWgtPm5hbWUgPSAiQU1EIHg4Ni02NCI7CisgIGVoLT5yZWxvY190eXBlX25hbWUgPSB4ODZfNjRfcmVsb2NfdHlwZV9uYW1lOworICBlaC0+cmVsb2NfdHlwZV9jaGVjayA9IHg4Nl82NF9yZWxvY190eXBlX2NoZWNrOworICBlaC0+cmVsb2NfdmFsaWRfdXNlID0geDg2XzY0X3JlbG9jX3ZhbGlkX3VzZTsKKyAgZWgtPnJlbG9jX3NpbXBsZV90eXBlID0geDg2XzY0X3JlbG9jX3NpbXBsZV90eXBlOworICBlaC0+Y29yZV9ub3RlID0geDg2XzY0X2NvcmVfbm90ZTsKKyAgZWgtPmNvcHlfcmVsb2NfcCA9IHg4Nl82NF9jb3B5X3JlbG9jX3A7CisgIGVoLT5kZXN0ciA9IHg4Nl82NF9kZXN0cjsKKworICByZXR1cm4gTU9EVkVSU0lPTjsKK30KZGlmZiAtLWdpdCBhL2xpYmVibC94ODZfNjRfc3ltYm9sLmMgYi9saWJlYmwveDg2XzY0X3N5bWJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZDM1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlYmwveDg2XzY0X3N5bWJvbC5jCkBAIC0wLDAgKzEsMTM2IEBACisvKiB4ODZfNjQgc3BlY2lmaWMgc3ltYm9saWMgbmFtZSBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8bGliZWJsX3g4Nl82NC5oPgorCisKKy8qIFJldHVybiBvZiB0aGUgYmFja2VuZC4gICovCitjb25zdCBjaGFyICoKK3g4Nl82NF9iYWNrZW5kX25hbWUgKHZvaWQpCit7CisgIHJldHVybiAieDg2LTY0IjsKK30KKworCisvKiBSZWxvY2F0aW9uIG1hcHBpbmcgdGFibGUuICAqLworc3RhdGljIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBlbnVtIHsgYm90aCA9IDAsIHJlbCA9IDEsIGV4ZWMgPSAyIH0gYXBwZWFyOworfSByZWxvY19tYXBfdGFibGVbXSA9CisgIHsKKyAgICBbUl9YODZfNjRfTk9ORV0gPSB7ICJSX1g4Nl82NF9OT05FIiwgYm90aCB9LAorICAgIFtSX1g4Nl82NF82NF0gPSB7ICJSX1g4Nl82NF82NCIsIGJvdGggfSwKKyAgICBbUl9YODZfNjRfUEMzMl0gPSB7ICJSX1g4Nl82NF9QQzMyIiwgcmVsIH0sCisgICAgW1JfWDg2XzY0X0dPVDMyXSA9IHsgIlJfWDg2XzY0X0dPVDMyIiwgcmVsIH0sCisgICAgW1JfWDg2XzY0X1BMVDMyXSA9IHsgIlJfWDg2XzY0X1BMVDMyIiwgcmVsIH0sCisgICAgW1JfWDg2XzY0X0NPUFldID0geyAiUl9YODZfNjRfQ09QWSIsIGV4ZWMgfSwKKyAgICBbUl9YODZfNjRfR0xPQl9EQVRdID0geyAiUl9YODZfNjRfR0xPQl9EQVQiLCBleGVjIH0sCisgICAgW1JfWDg2XzY0X0pVTVBfU0xPVF0gPSB7ICJSX1g4Nl82NF9KVU1QX1NMT1QiLCBleGVjIH0sCisgICAgW1JfWDg2XzY0X1JFTEFUSVZFXSA9IHsgIlJfWDg2XzY0X1JFTEFUSVZFIiwgZXhlYyB9LAorICAgIFtSX1g4Nl82NF9HT1RQQ1JFTF0gPSB7ICJSX1g4Nl82NF9HT1RQQ1JFTCIsIGV4ZWMgfSwKKyAgICBbUl9YODZfNjRfMzJdID0geyAiUl9YODZfNjRfMzIiLCBib3RoIH0sCisgICAgW1JfWDg2XzY0XzMyU10gPSB7ICJSX1g4Nl82NF8zMlMiLCByZWwgfSwKKyAgICBbUl9YODZfNjRfMTZdID0geyAiUl9YODZfNjRfMTYiLCByZWwgfSwKKyAgICBbUl9YODZfNjRfUEMxNl0gPSB7ICJSX1g4Nl82NF9QQzE2IiwgcmVsIH0sCisgICAgW1JfWDg2XzY0XzhdID0geyAiUl9YODZfNjRfOCIsIHJlbCB9LAorICAgIFtSX1g4Nl82NF9QQzhdID0geyAiUl9YODZfNjRfUEM4IiwgcmVsIH0sCisgICAgW1JfWDg2XzY0X0RUUE1PRDY0XSA9IHsgIlJfWDg2XzY0X0RUUE1PRDY0IiwgcmVsIH0sCisgICAgW1JfWDg2XzY0X0RUUE9GRjY0XSA9IHsgIlJfWDg2XzY0X0RUUE9GRjY0IiwgcmVsIH0sCisgICAgW1JfWDg2XzY0X1RQT0ZGNjRdID0geyAiUl9YODZfNjRfVFBPRkY2NCIsIHJlbCB9LAorICAgIFtSX1g4Nl82NF9UTFNHRF0gPSB7ICJSX1g4Nl82NF9UTFNHRCIsIHJlbCB9LAorICAgIFtSX1g4Nl82NF9UTFNMRF0gPSB7ICJSX1g4Nl82NF9UTFNMRCIsIHJlbCB9LAorICAgIFtSX1g4Nl82NF9EVFBPRkYzMl0gPSB7ICJSX1g4Nl82NF9EVFBPRkYzMiIsIHJlbCB9LAorICAgIFtSX1g4Nl82NF9HT1RUUE9GRl0gPSB7ICJSX1g4Nl82NF9HT1RUUE9GRiIsIHJlbCB9LAorICAgIFtSX1g4Nl82NF9UUE9GRjMyXSA9IHsgIlJfWDg2XzY0X1RQT0ZGMzIiLCByZWwgfQorICB9OworCisKKy8qIERldGVybWluZSByZWxvY2F0aW9uIHR5cGUgc3RyaW5nIGZvciB4ODYtNjQuICAqLworY29uc3QgY2hhciAqCit4ODZfNjRfcmVsb2NfdHlwZV9uYW1lIChpbnQgdHlwZSwgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCXNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBSX1g4Nl82NF9OVU0pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlbG9jX21hcF90YWJsZVt0eXBlXS5uYW1lOworfQorCisKKy8qIENoZWNrIGZvciBjb3JyZWN0IHJlbG9jYXRpb24gdHlwZS4gICovCitib29sCit4ODZfNjRfcmVsb2NfdHlwZV9jaGVjayAoaW50IHR5cGUpCit7CisgIHJldHVybiAodHlwZSA+PSBSX1g4Nl82NF9OT05FICYmIHR5cGUgPCBSX1g4Nl82NF9OVU0KKwkgICYmIHJlbG9jX21hcF90YWJsZVt0eXBlXS5uYW1lICE9IE5VTEwpID8gdHJ1ZSA6IGZhbHNlOworfQorCisKKy8qIENoZWNrIGZvciBjb3JyZWN0IHJlbG9jYXRpb24gdHlwZSB1c2UuICAqLworYm9vbAoreDg2XzY0X3JlbG9jX3ZhbGlkX3VzZSAoRWxmICplbGYsIGludCB0eXBlKQoreworICBpZiAodHlwZSA8IFJfWDg2XzY0X05PTkUgfHwgdHlwZSA+PSBSX1g4Nl82NF9OVU0KKyAgICAgIHx8IHJlbG9jX21hcF90YWJsZVt0eXBlXS5uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEVsZjY0X0VoZHIgKmVoZHIgPSBlbGY2NF9nZXRlaGRyIChlbGYpOworICBhc3NlcnQgKGVoZHIgIT0gTlVMTCk7CisKKyAgaWYgKHJlbG9jX21hcF90YWJsZVt0eXBlXS5hcHBlYXIgPT0gcmVsKQorICAgIHJldHVybiBlaGRyLT5lX3R5cGUgPT0gRVRfUkVMOworCisgIGlmIChyZWxvY19tYXBfdGFibGVbdHlwZV0uYXBwZWFyID09IGV4ZWMpCisgICAgcmV0dXJuIGVoZHItPmVfdHlwZSAhPSBFVF9SRUw7CisKKyAgYXNzZXJ0IChyZWxvY19tYXBfdGFibGVbdHlwZV0uYXBwZWFyID09IGJvdGgpOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ2hlY2sgZm9yIHRoZSBzaW1wbGUgcmVsb2MgdHlwZXMuICAqLworRWxmX1R5cGUKK3g4Nl82NF9yZWxvY19zaW1wbGVfdHlwZSAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIFJfWDg2XzY0XzY0OgorICAgICAgcmV0dXJuIEVMRl9UX1hXT1JEOworICAgIGNhc2UgUl9YODZfNjRfMzI6CisgICAgICByZXR1cm4gRUxGX1RfV09SRDsKKyAgICBjYXNlIFJfWDg2XzY0XzMyUzoKKyAgICAgIHJldHVybiBFTEZfVF9TV09SRDsKKyAgICBjYXNlIFJfWDg2XzY0XzE2OgorICAgICAgcmV0dXJuIEVMRl9UX0hBTEY7CisgICAgY2FzZSBSX1g4Nl82NF84OgorICAgICAgcmV0dXJuIEVMRl9UX0JZVEU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBFTEZfVF9OVU07CisgICAgfQorfQorCisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSBjb3B5IHJlbG9jYXRpb24uICAqLworYm9vbAoreDg2XzY0X2NvcHlfcmVsb2NfcCAoaW50IHJlbG9jKQoreworICByZXR1cm4gcmVsb2MgPT0gUl9YODZfNjRfQ09QWTsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi1wby8uY3ZzaWdub3JlIGIvbGliZWxmLXBvLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiY2I2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi1wby8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK2xpYmVsZi5wb3QKZGlmZiAtLWdpdCBhL2xpYmVsZi1wby9DaGFuZ2VMb2cgYi9saWJlbGYtcG8vQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjUwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYtcG8vQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTUgQEAKKzIwMDUtMDUtMDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5pbi5pbiAoWEdFVFRFWFRfT1BUSU9OUyk6IERlZmluZS4KKworMjAwNC0wMS0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmluLmluOiBTZXQgUEFDS0FHRSB0byBsaWJlbGYuCisKKzIwMDQtMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5pbi5pbjogRmluZCBta2luc3RhbGxkaXJzIHNjcmlwdCBpbiByaWdodCBkaXJlY3RvcnkuCisKKzIwMDMtMDgtMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNb3ZlZCB0byBDVlMgYXJjaGl2ZS4KZGlmZiAtLWdpdCBhL2xpYmVsZi1wby9NYWtlZmlsZS5pbi5pbiBiL2xpYmVsZi1wby9NYWtlZmlsZS5pbi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWUzMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmLXBvL01ha2VmaWxlLmluLmluCkBAIC0wLDAgKzEsMzAyIEBACisjIE1ha2VmaWxlIGZvciBQTyBkaXJlY3RvcnkgaW4gYW55IHBhY2thZ2UgdXNpbmcgR05VIGdldHRleHQuCisjIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDIgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+CisjCisjIFRoaXMgZmlsZSBjYW4gYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorIyBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiBHTlUgZ2V0dGV4dCBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgaXMgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK1BBQ0tBR0UgPSBsaWJlbGYKK1ZFUlNJT04gPSBAVkVSU0lPTkAKKworU0hFTEwgPSAvYmluL3NoCitAU0VUX01BS0VACisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2xvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCitnZXR0ZXh0c3JjZGlyID0gJChkYXRhZGlyKS9nZXR0ZXh0L3BvCit0b3BfYnVpbGRkaXIgPSAuLgorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpIGBjYXNlICIkKE1LSU5TVEFMTERJUlMpIiBpbiAvKikgZWNobyAiJChNS0lOU1RBTExESVJTKSIgOzsgKikgZWNobyAiJCh0b3BfYnVpbGRkaXIpLyQoTUtJTlNUQUxMRElSUykiIDs7IGVzYWNgCisKK0dNU0dGTVQgPSBAR01TR0ZNVEAKK01TR0ZNVCA9IEBNU0dGTVRACitYR0VUVEVYVCA9IEBYR0VUVEVYVEAKK1hHRVRURVhUX09QVElPTlMgPSAtLWZsYWc9ZXJyb3I6MzpjLWZvcm1hdAorTVNHTUVSR0UgPSBtc2dtZXJnZQorTVNHTUVSR0VfVVBEQVRFID0gQE1TR01FUkdFQCAtLXVwZGF0ZQorTVNHSU5JVCA9IG1zZ2luaXQKK01TR0NPTlYgPSBtc2djb252CitNU0dGSUxURVIgPSBtc2dmaWx0ZXIKKworUE9GSUxFUyA9IEBQT0ZJTEVTQAorR01PRklMRVMgPSBAR01PRklMRVNACitVUERBVEVQT0ZJTEVTID0gQFVQREFURVBPRklMRVNACitEVU1NWVBPRklMRVMgPSBARFVNTVlQT0ZJTEVTQAorRElTVEZJTEVTLmNvbW1vbiA9IE1ha2VmaWxlLmluLmluIE1ha2V2YXJzIFwKKyQoRElTVEZJTEVTLmNvbW1vbi5leHRyYTEpICQoRElTVEZJTEVTLmNvbW1vbi5leHRyYTIpICQoRElTVEZJTEVTLmNvbW1vbi5leHRyYTMpCitESVNURklMRVMgPSAkKERJU1RGSUxFUy5jb21tb24pIFBPVEZJTEVTLmluICQoRE9NQUlOKS5wb3QgXAorJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSBcCiskKERJU1RGSUxFUy5leHRyYTEpICQoRElTVEZJTEVTLmV4dHJhMikgJChESVNURklMRVMuZXh0cmEzKQorCitQT1RGSUxFUyA9IFwKKworQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACisKKyMgTWFrZXZhcnMgZ2V0cyBpbnNlcnRlZCBoZXJlLiAoRG9uJ3QgcmVtb3ZlIHRoaXMgbGluZSEpCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLnBvIC5nbW8gLm1vIC5ub3AgLnBvLXVwZGF0ZQorCisucG8ubW86CisJJChNU0dGTVQpIC1jIC1vICRAICQ8CisKKy5wby5nbW86CisJQGxhbmc9YGVjaG8gJCogfCBzZWQgLWUgJ3MsLiovLCwnYDsgXAorCXRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAorCWVjaG8gIiQke2NkY21kfXJtIC1mICQke2xhbmd9LmdtbyAmJiAkKEdNU0dGTVQpIC1jIC0tc3RhdGlzdGljcyAtbyAkJHtsYW5nfS5nbW8gJCR7bGFuZ30ucG8iOyBcCisJY2QgJChzcmNkaXIpICYmIHJtIC1mICQke2xhbmd9LmdtbyAmJiAkKEdNU0dGTVQpIC1jIC0tc3RhdGlzdGljcyAtbyAkJHtsYW5nfS5nbW8gJCR7bGFuZ30ucG8KKworCithbGw6IGFsbC1AVVNFX05MU0AKKworYWxsLXllczogJChDQVRBTE9HUykKK2FsbC1ubzoKKworIyBOb3RlOiBUYXJnZXQgJ2FsbCcgbXVzdCBub3QgZGVwZW5kIG9uIHRhcmdldCAnJChET01BSU4pLnBvdC11cGRhdGUnLAorIyBvdGhlcndpc2UgcGFja2FnZXMgbGlrZSBHQ0MgY2FuIG5vdCBiZSBidWlsdCBpZiBvbmx5IHBhcnRzIG9mIHRoZSBzb3VyY2UKKyMgaGF2ZSBiZWVuIGRvd25sb2FkZWQuCisKKyQoRE9NQUlOKS5wb3QtdXBkYXRlOiAkKFBPVEZJTEVTKSAkKHNyY2RpcikvUE9URklMRVMuaW4KKwkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoRE9NQUlOKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKKwkgIC0tYWRkLWNvbW1lbnRzPVRSQU5TTEFUT1JTOiAkKFhHRVRURVhUX09QVElPTlMpIFwKKwkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4gXAorCSAgLS1jb3B5cmlnaHQtaG9sZGVyPSckKENPUFlSSUdIVF9IT0xERVIpJyBcCisJJiYgdGVzdCAhIC1mICQoRE9NQUlOKS5wbyBcCisJICAgfHwgKCBybSAtZiAkKHNyY2RpcikvJChET01BSU4pLnBvdCBcCisJCSYmIG12ICQoRE9NQUlOKS5wbyAkKHNyY2RpcikvJChET01BSU4pLnBvdCApCisKKyQoc3JjZGlyKS8kKERPTUFJTikucG90OgorCSQoTUFLRSkgJChET01BSU4pLnBvdC11cGRhdGUKKworJChQT0ZJTEVTKTogJChzcmNkaXIpLyQoRE9NQUlOKS5wb3QKKwlAbGFuZz1gZWNobyAkQCB8IHNlZCAtZSAncywuKi8sLCcgLWUgJ3MvXC5wbyQkLy8nYDsgXAorCXRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAorCWVjaG8gIiQke2NkY21kfSQoTVNHTUVSR0VfVVBEQVRFKSAkJHtsYW5nfS5wbyAkKERPTUFJTikucG90IjsgXAorCWNkICQoc3JjZGlyKSAmJiAkKE1TR01FUkdFX1VQREFURSkgJCR7bGFuZ30ucG8gJChET01BSU4pLnBvdAorCisKK2luc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKK2luc3RhbGwtZXhlYzoKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKKwkgIGZvciBmaWxlIGluICQoRElTVEZJTEVTLmNvbW1vbik7IGRvIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGZpbGUgXAorCQkJICAgICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQoraW5zdGFsbC1kYXRhLW5vOiBhbGwKK2luc3RhbGwtZGF0YS15ZXM6IGFsbAorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGF0YWRpcikKKwlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgLWUgJ3MvXC5nbW8kJC8vJ2A7IFwKKwkgIGRpcj0kKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTOyBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkJGRpcjsgXAorCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiByZWFsY2F0PSQkY2F0OyBlbHNlIHJlYWxjYXQ9JChzcmNkaXIpLyQkY2F0OyBmaTsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkcmVhbGNhdCAkKERFU1RESVIpJCRkaXIvJChET01BSU4pLm1vOyBcCisJICBlY2hvICJpbnN0YWxsaW5nICQkcmVhbGNhdCBhcyAkKERFU1RESVIpJCRkaXIvJChET01BSU4pLm1vIjsgXAorCSAgZm9yIGxjIGluICcnICQoRVhUUkFfTE9DQUxFX0NBVEVHT1JJRVMpOyBkbyBcCisJICAgIGlmIHRlc3QgLW4gIiQkbGMiOyB0aGVuIFwKKwkgICAgICBpZiAoY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcgJiYgTENfQUxMPUMgbHMgLWwgLWQgJCRsYyAyPi9kZXYvbnVsbCkgfCBncmVwICcgLT4gJyA+L2Rldi9udWxsOyB0aGVuIFwKKwkgICAgICAgIGxpbms9YGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nICYmIExDX0FMTD1DIGxzIC1sIC1kICQkbGMgfCBzZWQgLWUgJ3MvXi4qIC0+IC8vJ2A7IFwKKwkgICAgICAgIG12ICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQ7IFwKKwkgICAgICAgIG1rZGlyICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKKwkgICAgICAgIChjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZCAmJiBcCisJICAgICAgICAgZm9yIGZpbGUgaW4gKjsgZG8gXAorCSAgICAgICAgICAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gXAorCSAgICAgICAgICAgICBsbiAtcyAuLi8kJGxpbmsvJCRmaWxlICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJCRmaWxlOyBcCisJICAgICAgICAgICBmaTsgXAorCSAgICAgICAgIGRvbmUpOyBcCisJICAgICAgICBybSAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZDsgXAorCSAgICAgIGVsc2UgXAorCSAgICAgICAgaWYgdGVzdCAtZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyB0aGVuIFwKKwkgICAgICAgICAgOjsgXAorCSAgICAgICAgZWxzZSBcCisJICAgICAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKKwkgICAgICAgICAgbWtkaXIgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgXAorCSAgICAgICAgZmk7IFwKKwkgICAgICBmaTsgXAorCSAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vOyBcCisJICAgICAgbG4gLXMgLi4vTENfTUVTU0FHRVMvJChET01BSU4pLm1vICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgICBsbiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKERPTUFJTikubW8gJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW8gMj4vZGV2L251bGwgfHwgXAorCSAgICAgIGNwIC1wICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoRE9NQUlOKS5tbyAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQoRE9NQUlOKS5tbzsgXAorCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJCRyZWFsY2F0IGxpbmsgYXMgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW8iOyBcCisJICAgIGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCitpbnN0YWxsLXN0cmlwOiBpbnN0YWxsCisKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1leGVjIGluc3RhbGxkaXJzLWRhdGEKK2luc3RhbGxkaXJzLWV4ZWM6CitpbnN0YWxsZGlycy1kYXRhOiBpbnN0YWxsZGlycy1kYXRhLUBVU0VfTkxTQAorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKK2luc3RhbGxkaXJzLWRhdGEtbm86CitpbnN0YWxsZGlycy1kYXRhLXllczoKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGRhdGFkaXIpCisJQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkIC1lICdzL1wuZ21vJCQvLydgOyBcCisJICBkaXI9JChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJCRkaXI7IFwKKwkgIGZvciBsYyBpbiAnJyAkKEVYVFJBX0xPQ0FMRV9DQVRFR09SSUVTKTsgZG8gXAorCSAgICBpZiB0ZXN0IC1uICIkJGxjIjsgdGhlbiBcCisJICAgICAgaWYgKGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nICYmIExDX0FMTD1DIGxzIC1sIC1kICQkbGMgMj4vZGV2L251bGwpIHwgZ3JlcCAnIC0+ICcgPi9kZXYvbnVsbDsgdGhlbiBcCisJICAgICAgICBsaW5rPWBjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZyAmJiBMQ19BTEw9QyBscyAtbCAtZCAkJGxjIHwgc2VkIC1lICdzL14uKiAtPiAvLydgOyBcCisJICAgICAgICBtdiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMub2xkOyBcCisJICAgICAgICBta2RpciAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCisJICAgICAgICAoY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQgJiYgXAorCSAgICAgICAgIGZvciBmaWxlIGluICo7IGRvIFwKKwkgICAgICAgICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIFwKKwkgICAgICAgICAgICAgbG4gLXMgLi4vJCRsaW5rLyQkZmlsZSAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQkZmlsZTsgXAorCSAgICAgICAgICAgZmk7IFwKKwkgICAgICAgICBkb25lKTsgXAorCSAgICAgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQ7IFwKKwkgICAgICBlbHNlIFwKKwkgICAgICAgIGlmIHRlc3QgLWQgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgdGhlbiBcCisJICAgICAgICAgIDo7IFwKKwkgICAgICAgIGVsc2UgXAorCSAgICAgICAgICBybSAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCisJICAgICAgICAgIG1rZGlyICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKKwkgICAgICAgIGZpOyBcCisJICAgICAgZmk7IFwKKwkgICAgZmk7IFwKKwkgIGRvbmU7IFwKKwlkb25lCisKKyMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KK2luc3RhbGxjaGVjazoKKwordW5pbnN0YWxsOiB1bmluc3RhbGwtZXhlYyB1bmluc3RhbGwtZGF0YQordW5pbnN0YWxsLWV4ZWM6Cit1bmluc3RhbGwtZGF0YTogdW5pbnN0YWxsLWRhdGEtQFVTRV9OTFNACisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAorCSAgZm9yIGZpbGUgaW4gJChESVNURklMRVMuY29tbW9uKTsgZG8gXAorCSAgICBybSAtZiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKK3VuaW5zdGFsbC1kYXRhLW5vOgordW5pbnN0YWxsLWRhdGEteWVzOgorCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkIC1lICdzL1wuZ21vJCQvLydgOyBcCisJICBmb3IgbGMgaW4gTENfTUVTU0FHRVMgJChFWFRSQV9MT0NBTEVfQ0FURUdPUklFUyk7IGRvIFwKKwkgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW87IFwKKwkgIGRvbmU7IFwKKwlkb25lCisKK2NoZWNrOiBhbGwKKworZHZpIGluZm8gdGFncyBUQUdTIElEOgorCittb3N0bHljbGVhbjoKKwlybSAtZiBjb3JlIGNvcmUuKiAkKERPTUFJTikucG8gKi5uZXcucG8KKwlybSAtZnIgKi5vCisKK2NsZWFuOiBtb3N0bHljbGVhbgorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbworCittYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwlybSAtZiAkKEdNT0ZJTEVTKQorCitkaXN0ZGlyID0gJCh0b3BfYnVpbGRkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKK2Rpc3QgZGlzdGRpcjoKKwkkKE1BS0UpIHVwZGF0ZS1wbworCUAkKE1BS0UpIGRpc3QyCisjIFRoaXMgaXMgYSBzZXBhcmF0ZSB0YXJnZXQgYmVjYXVzZSAndXBkYXRlLXBvJyBtdXN0IGJlIGV4ZWN1dGVkIGJlZm9yZS4KK2Rpc3QyOiAkKERJU1RGSUxFUykKKwlkaXN0cz0iJChESVNURklMRVMpIjsgXAorCWlmIHRlc3QgLWYgJChzcmNkaXIpL0NoYW5nZUxvZzsgdGhlbiBkaXN0cz0iJCRkaXN0cyBDaGFuZ2VMb2ciOyBmaTsgXAorCWlmIHRlc3QgLWYgJChzcmNkaXIpL0xJTkdVQVM7IHRoZW4gZGlzdHM9IiQkZGlzdHMgTElOR1VBUyI7IGZpOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gXAorCSAgICBjcCAtcCAkJGZpbGUgJChkaXN0ZGlyKTsgXAorCSAgZWxzZSBcCisJICAgIGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAorCSAgZmk7IFwKKwlkb25lCisKK3VwZGF0ZS1wbzogTWFrZWZpbGUKKwkkKE1BS0UpICQoRE9NQUlOKS5wb3QtdXBkYXRlCisJJChNQUtFKSAkKFVQREFURVBPRklMRVMpCisJJChNQUtFKSB1cGRhdGUtZ21vCisKKyMgR2VuZXJhbCBydWxlIGZvciB1cGRhdGluZyBQTyBmaWxlcy4KKworLm5vcC5wby11cGRhdGU6CisJQGxhbmc9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXC5wby11cGRhdGUkJC8vJ2A7IFwKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IGZpOyBcCisJdG1wZGlyPWBwd2RgOyBcCisJZWNobyAiJCRsYW5nOiI7IFwKKwl0ZXN0ICIkKHNyY2RpcikiID0gLiAmJiBjZGNtZD0iIiB8fCBjZGNtZD0iY2QgJChzcmNkaXIpICYmICI7IFwKKwllY2hvICIkJHtjZGNtZH0kKE1TR01FUkdFKSAkJGxhbmcucG8gJChET01BSU4pLnBvdCAtbyAkJGxhbmcubmV3LnBvIjsgXAorCWNkICQoc3JjZGlyKTsgXAorCWlmICQoTVNHTUVSR0UpICQkbGFuZy5wbyAkKERPTUFJTikucG90IC1vICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IHRoZW4gXAorCSAgaWYgY21wICQkbGFuZy5wbyAkJHRtcGRpci8kJGxhbmcubmV3LnBvID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICAgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKwkgIGVsc2UgXAorCSAgICBpZiBtdiAtZiAkJHRtcGRpci8kJGxhbmcubmV3LnBvICQkbGFuZy5wbzsgdGhlbiBcCisJICAgICAgOjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRsYW5nLnBvIGZhaWxlZDogY2Fubm90IG1vdmUgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbyB0byAkJGxhbmcucG8iIDE+JjI7IFwKKwkgICAgICBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJZWxzZSBcCisJICBlY2hvICJtc2dtZXJnZSBmb3IgJCRsYW5nLnBvIGZhaWxlZCEiIDE+JjI7IFwKKwkgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKwlmaQorCiskKERVTU1ZUE9GSUxFUyk6CisKK3VwZGF0ZS1nbW86IE1ha2VmaWxlICQoR01PRklMRVMpCisJQDoKKworTWFrZWZpbGU6IE1ha2VmaWxlLmluLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzIFBPVEZJTEVTLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAuaW4gQ09ORklHX0hFQURFUlM9IFwKKwkgICAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKK2ZvcmNlOgorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9saWJlbGYtcG8vTWFrZXZhcnMgYi9saWJlbGYtcG8vTWFrZXZhcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjY2I3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi1wby9NYWtldmFycwpAQCAtMCwwICsxLDI1IEBACisjIE1ha2VmaWxlIHZhcmlhYmxlcyBmb3IgUE8gZGlyZWN0b3J5IGluIGFueSBwYWNrYWdlIHVzaW5nIEdOVSBnZXR0ZXh0LgorCisjIFVzdWFsbHkgdGhlIG1lc3NhZ2UgZG9tYWluIGlzIHRoZSBzYW1lIGFzIHRoZSBwYWNrYWdlIG5hbWUuCitET01BSU4gPSAkKFBBQ0tBR0UpCisKKyMgVGhlc2UgdHdvIHZhcmlhYmxlcyBkZXBlbmQgb24gdGhlIGxvY2F0aW9uIG9mIHRoaXMgZGlyZWN0b3J5Lgorc3ViZGlyID0gcG8KK3RvcF9idWlsZGRpciA9IC4uCisKKyMgVGhlc2Ugb3B0aW9ucyBnZXQgcGFzc2VkIHRvIHhnZXR0ZXh0LgorWEdFVFRFWFRfT1BUSU9OUyA9IC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXworCisjIFRoaXMgaXMgdGhlIGNvcHlyaWdodCBob2xkZXIgdGhhdCBnZXRzIGluc2VydGVkIGludG8gdGhlIGhlYWRlciBvZiB0aGUKKyMgJChET01BSU4pLnBvdCBmaWxlLiAgU2V0IHRoaXMgdG8gdGhlIGNvcHlyaWdodCBob2xkZXIgb2YgdGhlIHN1cnJvdW5kaW5nCisjIHBhY2thZ2UuICAoTm90ZSB0aGF0IHRoZSBtc2dzdHIgc3RyaW5ncywgZXh0cmFjdGVkIGZyb20gdGhlIHBhY2thZ2UncworIyBzb3VyY2VzLCBiZWxvbmcgdG8gdGhlIGNvcHlyaWdodCBob2xkZXIgb2YgdGhlIHBhY2thZ2UuKSAgVHJhbnNsYXRvcnMgYXJlCisjIGV4cGVjdGVkIHRvIHRyYW5zZmVyIHRoZSBjb3B5cmlnaHQgZm9yIHRoZWlyIHRyYW5zbGF0aW9ucyB0byB0aGlzIHBlcnNvbgorIyBvciBlbnRpdHksIG9yIHRvIGRpc2NsYWltIHRoZWlyIGNvcHlyaWdodC4gIFRoZSBlbXB0eSBzdHJpbmcgc3RhbmRzIGZvcgorIyB0aGUgcHVibGljIGRvbWFpbjsgaW4gdGhpcyBjYXNlIHRoZSB0cmFuc2xhdG9ycyBhcmUgZXhwZWN0ZWQgdG8gZGlzY2xhaW0KKyMgdGhlaXIgY29weXJpZ2h0LgorQ09QWVJJR0hUX0hPTERFUiA9IFJlZCBIYXQsIEluYy4KKworIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGxvY2FsZSBjYXRlZ29yaWVzLCBiZXlvbmQgTENfTUVTU0FHRVMsIGZvciB3aGljaCB0aGUKKyMgbWVzc2FnZSBjYXRhbG9ncyBzaGFsbCBiZSB1c2VkLiAgSXQgaXMgdXN1YWxseSBlbXB0eS4KK0VYVFJBX0xPQ0FMRV9DQVRFR09SSUVTID0KZGlmZiAtLWdpdCBhL2xpYmVsZi1wby9QT1RGSUxFUy5pbiBiL2xpYmVsZi1wby9QT1RGSUxFUy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQyODE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmLXBvL1BPVEZJTEVTLmluCkBAIC0wLDAgKzEsNSBAQAorIyBMaXN0IG9mIGZpbGVzIHdoaWNoIGNvbnRhaW5pbmcgdHJhbnNsYXRhYmxlIHN0cmluZ3MuCisjIENvcHlyaWdodCAoQykgMjAwMCwgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyMgTGlicmFyeSBzb3VyY2VzCitsaWJlbGYvZWxmX2Vycm9yLmMKZGlmZiAtLWdpdCBhL2xpYmVsZi1wby9SdWxlcy1xdW90IGIvbGliZWxmLXBvL1J1bGVzLXF1b3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0NmQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi1wby9SdWxlcy1xdW90CkBAIC0wLDAgKzEsNDIgQEAKKyMgU3BlY2lhbCBNYWtlZmlsZSBydWxlcyBmb3IgRW5nbGlzaCBtZXNzYWdlIGNhdGFsb2dzIHdpdGggcXVvdGF0aW9uIG1hcmtzLgorCitESVNURklMRVMuY29tbW9uLmV4dHJhMSA9IHF1b3Quc2VkIGJvbGRxdW90LnNlZCBlbkBxdW90LmhlYWRlciBlbkBib2xkcXVvdC5oZWFkZXIgaW5zZXJ0LWhlYWRlci5zaW4gUnVsZXMtcXVvdAorCisuU1VGRklYRVM6IC5pbnNlcnQtaGVhZGVyIC5wby11cGRhdGUtZW4KKworZW5AcXVvdC5wby11cGRhdGU6IGVuQHF1b3QucG8tdXBkYXRlLWVuCitlbkBib2xkcXVvdC5wby11cGRhdGU6IGVuQGJvbGRxdW90LnBvLXVwZGF0ZS1lbgorCisuaW5zZXJ0LWhlYWRlci5wby11cGRhdGUtZW46CisJQGxhbmc9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXC5wby11cGRhdGUtZW4kJC8vJ2A7IFwKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IEdFVFRFWFRMSUJESVI9YGNkICQodG9wX3NyY2Rpcikvc3JjICYmIHB3ZGA7IGV4cG9ydCBHRVRURVhUTElCRElSOyBmaTsgXAorCXRtcGRpcj1gcHdkYDsgXAorCWVjaG8gIiQkbGFuZzoiOyBcCisJbGw9YGVjaG8gJCRsYW5nIHwgc2VkIC1lICdzL0AuKi8vJ2A7IFwKKwlMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgXAorCWNkICQoc3JjZGlyKTsgXAorCWlmICQoTVNHSU5JVCkgLWkgJChET01BSU4pLnBvdCAtLW5vLXRyYW5zbGF0b3IgLWwgJCRsbCAtbyAtIDI+L2Rldi9udWxsIHwgc2VkIC1mICQkdG1wZGlyLyQkbGFuZy5pbnNlcnQtaGVhZGVyIHwgJChNU0dDT05WKSAtdCBVVEYtOCB8ICQoTVNHRklMVEVSKSBzZWQgLWYgYGVjaG8gJCRsYW5nIHwgc2VkIC1lICdzLy4qQC8vJ2Auc2VkIDI+L2Rldi9udWxsID4gJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgdGhlbiBcCisJICBpZiBjbXAgJCRsYW5nLnBvICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgICAgcm0gLWYgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgXAorCSAgZWxzZSBcCisJICAgIGlmIG12IC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gJCRsYW5nLnBvOyB0aGVuIFwKKwkgICAgICA6OyBcCisJICAgIGVsc2UgXAorCSAgICAgIGVjaG8gImNyZWF0aW9uIG9mICQkbGFuZy5wbyBmYWlsZWQ6IGNhbm5vdCBtb3ZlICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gdG8gJCRsYW5nLnBvIiAxPiYyOyBcCisJICAgICAgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICBmaTsgXAorCWVsc2UgXAorCSAgZWNobyAiY3JlYXRpb24gb2YgJCRsYW5nLnBvIGZhaWxlZCEiIDE+JjI7IFwKKwkgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKwlmaQorCitlbkBxdW90Lmluc2VydC1oZWFkZXI6IGluc2VydC1oZWFkZXIuc2luCisJc2VkIC1lICcvXiMvZCcgLWUgJ3MvSEVBREVSL2VuQHF1b3QuaGVhZGVyL2cnICQoc3JjZGlyKS9pbnNlcnQtaGVhZGVyLnNpbiA+IGVuQHF1b3QuaW5zZXJ0LWhlYWRlcgorCitlbkBib2xkcXVvdC5pbnNlcnQtaGVhZGVyOiBpbnNlcnQtaGVhZGVyLnNpbgorCXNlZCAtZSAnL14jL2QnIC1lICdzL0hFQURFUi9lbkBib2xkcXVvdC5oZWFkZXIvZycgJChzcmNkaXIpL2luc2VydC1oZWFkZXIuc2luID4gZW5AYm9sZHF1b3QuaW5zZXJ0LWhlYWRlcgorCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcXVvdAorbW9zdGx5Y2xlYW4tcXVvdDoKKwlybSAtZiAqLmluc2VydC1oZWFkZXIKZGlmZiAtLWdpdCBhL2xpYmVsZi1wby9ib2xkcXVvdC5zZWQgYi9saWJlbGYtcG8vYm9sZHF1b3Quc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTM3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYtcG8vYm9sZHF1b3Quc2VkCkBAIC0wLDAgKzEsMTAgQEAKK3MvIlwoW14iXSpcKSIv4oCcXDHigJ0vZworcy9gXChbXmAnXSpcKScv4oCYXDHigJkvZworcy8gJ1woW15gJ10qXCknIC8g4oCYXDHigJkgL2cKK3MvICdcKFteYCddKlwpJyQvIOKAmFwx4oCZL2cKK3MvXidcKFteYCddKlwpJyAv4oCYXDHigJkgL2cKK3Mv4oCc4oCdLyIiL2cKK3Mv4oCcL+KAnBtbMW0vZworcy/igJ0vG1swbeKAnS9nCitzL+KAmC/igJgbWzFtL2cKK3Mv4oCZLxtbMG3igJkvZwpkaWZmIC0tZ2l0IGEvbGliZWxmLXBvL2VuQGJvbGRxdW90LmhlYWRlciBiL2xpYmVsZi1wby9lbkBib2xkcXVvdC5oZWFkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkYjZhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi1wby9lbkBib2xkcXVvdC5oZWFkZXIKQEAgLTAsMCArMSwyNSBAQAorIyBBbGwgdGhpcyBjYXRhbG9nICJ0cmFuc2xhdGVzIiBhcmUgcXVvdGF0aW9uIGNoYXJhY3RlcnMuCisjIFRoZSBtc2dpZHMgbXVzdCBiZSBBU0NJSSBhbmQgdGhlcmVmb3JlIGNhbm5vdCBjb250YWluIHJlYWwgcXVvdGF0aW9uCisjIGNoYXJhY3RlcnMsIG9ubHkgc3Vic3RpdHV0ZXMgbGlrZSBncmF2ZSBhY2NlbnQgKDB4NjApLCBhcG9zdHJvcGhlICgweDI3KQorIyBhbmQgZG91YmxlIHF1b3RlICgweDIyKS4gVGhlc2Ugc3Vic3RpdHV0ZXMgbG9vayBzdHJhbmdlOyBzZWUKKyMgaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3Vjcy9xdW90ZXMuaHRtbAorIworIyBUaGlzIGNhdGFsb2cgdHJhbnNsYXRlcyBncmF2ZSBhY2NlbnQgKDB4NjApIGFuZCBhcG9zdHJvcGhlICgweDI3KSB0bworIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpLgorIyBJdCBhbHNvIHRyYW5zbGF0ZXMgcGFpcnMgb2YgYXBvc3Ryb3BoZSAoMHgyNykgdG8KKyMgbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOCkgYW5kIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE5KQorIyBhbmQgcGFpcnMgb2YgcXVvdGF0aW9uIG1hcmsgKDB4MjIpIHRvCisjIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIChVKzIwMUMpIGFuZCByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxRCkuCisjCisjIFdoZW4gb3V0cHV0IHRvIGFuIFVURi04IHRlcm1pbmFsLCB0aGUgcXVvdGF0aW9uIGNoYXJhY3RlcnMgYXBwZWFyIHBlcmZlY3RseS4KKyMgV2hlbiBvdXRwdXQgdG8gYW4gSVNPLTg4NTktMSB0ZXJtaW5hbCwgdGhlIHNpbmdsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIGFwb3N0cm9waGVzIChieSBpY29udiBpbiBnbGliYyAyLjIgb3IgbmV3ZXIpIG9yIHRvCisjIGdyYXZlL2FjdXRlIGFjY2VudCAoYnkgbGliaWNvbnYpLCBhbmQgdGhlIGRvdWJsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIDB4MjIuCisjIFdoZW4gb3V0cHV0IHRvIGFuIEFTQ0lJIHRlcm1pbmFsLCB0aGUgc2luZ2xlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gYXBvc3Ryb3BoZXMsIGFuZCB0aGUgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gMHgyMi4KKyMKKyMgVGhpcyBjYXRhbG9nIGZ1cnRoZXJtb3JlIGRpc3BsYXlzIHRoZSB0ZXh0IGJldHdlZW4gdGhlIHF1b3RhdGlvbiBtYXJrcyBpbgorIyBib2xkIGZhY2UsIGFzc3VtaW5nIHRoZSBWVDEwMC9YVGVybSBlc2NhcGUgc2VxdWVuY2VzLgorIwpkaWZmIC0tZ2l0IGEvbGliZWxmLXBvL2VuQHF1b3QuaGVhZGVyIGIvbGliZWxmLXBvL2VuQHF1b3QuaGVhZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjQ3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYtcG8vZW5AcXVvdC5oZWFkZXIKQEAgLTAsMCArMSwyMiBAQAorIyBBbGwgdGhpcyBjYXRhbG9nICJ0cmFuc2xhdGVzIiBhcmUgcXVvdGF0aW9uIGNoYXJhY3RlcnMuCisjIFRoZSBtc2dpZHMgbXVzdCBiZSBBU0NJSSBhbmQgdGhlcmVmb3JlIGNhbm5vdCBjb250YWluIHJlYWwgcXVvdGF0aW9uCisjIGNoYXJhY3RlcnMsIG9ubHkgc3Vic3RpdHV0ZXMgbGlrZSBncmF2ZSBhY2NlbnQgKDB4NjApLCBhcG9zdHJvcGhlICgweDI3KQorIyBhbmQgZG91YmxlIHF1b3RlICgweDIyKS4gVGhlc2Ugc3Vic3RpdHV0ZXMgbG9vayBzdHJhbmdlOyBzZWUKKyMgaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3Vjcy9xdW90ZXMuaHRtbAorIworIyBUaGlzIGNhdGFsb2cgdHJhbnNsYXRlcyBncmF2ZSBhY2NlbnQgKDB4NjApIGFuZCBhcG9zdHJvcGhlICgweDI3KSB0bworIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpLgorIyBJdCBhbHNvIHRyYW5zbGF0ZXMgcGFpcnMgb2YgYXBvc3Ryb3BoZSAoMHgyNykgdG8KKyMgbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOCkgYW5kIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE5KQorIyBhbmQgcGFpcnMgb2YgcXVvdGF0aW9uIG1hcmsgKDB4MjIpIHRvCisjIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIChVKzIwMUMpIGFuZCByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxRCkuCisjCisjIFdoZW4gb3V0cHV0IHRvIGFuIFVURi04IHRlcm1pbmFsLCB0aGUgcXVvdGF0aW9uIGNoYXJhY3RlcnMgYXBwZWFyIHBlcmZlY3RseS4KKyMgV2hlbiBvdXRwdXQgdG8gYW4gSVNPLTg4NTktMSB0ZXJtaW5hbCwgdGhlIHNpbmdsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIGFwb3N0cm9waGVzIChieSBpY29udiBpbiBnbGliYyAyLjIgb3IgbmV3ZXIpIG9yIHRvCisjIGdyYXZlL2FjdXRlIGFjY2VudCAoYnkgbGliaWNvbnYpLCBhbmQgdGhlIGRvdWJsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIDB4MjIuCisjIFdoZW4gb3V0cHV0IHRvIGFuIEFTQ0lJIHRlcm1pbmFsLCB0aGUgc2luZ2xlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gYXBvc3Ryb3BoZXMsIGFuZCB0aGUgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gMHgyMi4KKyMKZGlmZiAtLWdpdCBhL2xpYmVsZi1wby9pbnNlcnQtaGVhZGVyLnNpbiBiL2xpYmVsZi1wby9pbnNlcnQtaGVhZGVyLnNpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjZkZTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmLXBvL2luc2VydC1oZWFkZXIuc2luCkBAIC0wLDAgKzEsMjMgQEAKKyMgU2VkIHNjcmlwdCB0aGF0IGluc2VydHMgdGhlIGZpbGUgY2FsbGVkIEhFQURFUiBiZWZvcmUgdGhlIGhlYWRlciBlbnRyeS4KKyMKKyMgQXQgZWFjaCBvY2N1cnJlbmNlIG9mIGEgbGluZSBzdGFydGluZyB3aXRoICJtc2dpZCAiLCB3ZSBleGVjdXRlIHRoZSBmb2xsb3dpbmcKKyMgY29tbWFuZHMuIEF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlLCBpbnNlcnQgdGhlIGZpbGUuIEF0IHRoZSBmb2xsb3dpbmcKKyMgb2NjdXJyZW5jZXMsIGRvIG5vdGhpbmcuIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgdGhlIGZvbGxvd2luZworIyBvY2N1cnJlbmNlcyBpcyBhY2hpZXZlZCBieSBsb29raW5nIGF0IHRoZSBob2xkIHNwYWNlLgorL15tc2dpZCAveworeAorIyBUZXN0IGlmIHRoZSBob2xkIHNwYWNlIGlzIGVtcHR5Lgorcy9tL20vCit0YQorIyBZZXMgaXQgd2FzIGVtcHR5LiBGaXJzdCBvY2N1cnJlbmNlLiBSZWFkIHRoZSBmaWxlLgorciBIRUFERVIKKyMgT3V0cHV0IHRoZSBmaWxlJ3MgY29udGVudHMgYnkgcmVhZGluZyB0aGUgbmV4dCBsaW5lLiBCdXQgZG9uJ3QgbG9zZSB0aGUKKyMgY3VycmVudCBsaW5lIHdoaWxlIGRvaW5nIHRoaXMuCitnCitOCitiYgorOmEKKyMgVGhlIGhvbGQgc3BhY2Ugd2FzIG5vbmVtcHR5LiBGb2xsb3dpbmcgb2NjdXJyZW5jZXMuIERvIG5vdGhpbmcuCit4Cis6YgorfQpkaWZmIC0tZ2l0IGEvbGliZWxmLXBvL3F1b3Quc2VkIGIvbGliZWxmLXBvL3F1b3Quc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjJjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYtcG8vcXVvdC5zZWQKQEAgLTAsMCArMSw2IEBACitzLyJcKFteIl0qXCkiL+KAnFwx4oCdL2cKK3MvYFwoW15gJ10qXCknL+KAmFwx4oCZL2cKK3MvICdcKFteYCddKlwpJyAvIOKAmFwx4oCZIC9nCitzLyAnXChbXmAnXSpcKSckLyDigJhcMeKAmS9nCitzL14nXChbXmAnXSpcKScgL+KAmFwx4oCZIC9nCitzL+KAnOKAnS8iIi9nCmRpZmYgLS1naXQgYS9saWJlbGYvLmN2c2lnbm9yZSBiL2xpYmVsZi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODQ1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbGliZWxmL0NoYW5nZUxvZyBiL2xpYmVsZi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhMmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxNDEgQEAKKzIwMDUtMDctMjMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBlbGYta25vd2xlZGdlLmggKFNFQ1RJT05fU1RSSVBfUCk6IERvbid0IGhhbmRsZSByZW1vdmFsIG9mIGRlYnVnCisJc2VjdGlvbnMgaGVyZSBhbnltb3JlLgorCSogZWxmMzJfY2hlY2tzdW0uYzogQWRqdXN0IGZvciBjaGFuZ2UgaW4gU0VDVElPTl9TVFJJUF9QIGludGVyZmFjZS4KKworCSogZWxmX3VwZGF0ZS5jIChlbGZfdXBkYXRlKTogR2V0IHdyaXRlIGxvY2ssIG5vdCByZWFkIGxvY2suCisKKwkqIGVsZjMyX3VwZGF0ZW51bGwuYyAodXBkYXRlbnVsbCk6IEdldCBzZWN0aW9uIGhlYWRlcnMgaWYgbmVjZXNzYXJ5CisJYW5kIHBvc3NpYmxlLgorCisyMDA1LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmMzJfdXBkYXRlbnVsbC5jICh1cGRhdGVudWxsKTogSWYgcHJvZ3JhbSBoZWFkZXIgaGFzbid0IGJlZW4gbG9hZGVkCisJeWV0LCB0cnkgdG8gZG8gaXQgbm93LgorCURvbid0IHVubmVjZXNzYXJpbHkgdXBkYXRlIG92ZXJmbG93IG9mIHNlY3Rpb24gY291bnQgaW4gemVyb3RoIHNlY3Rpb24KKwlzaF9zaXplIGZpZWxkLgorCUlmIHNlY3Rpb24gY29udGVudCBoYXNuJ3QgYmVlbiByZWFkIHlldCwgZG8gaXQgYmVmb3JlIGxvb2tpbmcgZm9yIHRoZQorCWJsb2NrIHNpemUuICBJZiBubyBzZWN0aW9uIGRhdGEgcHJlc2VudCwgaW5mZXIgc2l6ZSBvZiBzZWN0aW9uIGhlYWRlci4KKworMjAwNS0wNS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVsZi5oOiBVcGRhdGUgYWdhaW4uCisKKzIwMDUtMDUtMDkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuCisKKzIwMDUtMDUtMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIGVsZl9iZWdpbi5jIChyZWFkX2ZpbGUpIFtfTVVERkxBUF06IERvbid0IHVzZSBtbWFwIGZvciBub3cuCisJKiBlbGZfdXBkYXRlLmMgKHdyaXRlX2ZpbGUpIFtfTVVERkxBUF06IExpa2V3aXNlLgorCisyMDA1LTAzLTI5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmMzJfY2hlY2tzdW0uYzogVXNlIElOVFVTRSBhbmQgSU5UREVGIHRvIGF2b2lkIFBMVHMuCisJKiBlbGZfZW5kLmM6IExpa2V3aXNlLgorCSogZWxmX2dldGRhdGEuYzogTGlrZXdpc2UuCisJKiBnZWxmX2dldGVoZHIuYzogTGlrZXdpc2UuCisJKiBubGlzdC5jOiBMaWtld2lzZS4KKwkqIGxpYmVsZlAuaDogQWRkIGRlY2xhcmF0aW9ucyBvZiBpbnRlcm5hbCBmdW5jdGlvbnMuCisKKzIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBjb21tb24uaCAoQ09OVkVSVCk6IE1ha2Ugc3VyZSBhbGwgdmFsdWVzIGFyZSB1bnNpZ25lZC4KKwkoQ09OVkVSVF9UTyk6IExpa2V3aXNlLgorCisJKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1XZm9ybWF0PTIuCisJRml4IHJ1bGUgdG8gYnVpbGQgbGliZWxmLnNvLgorCisyMDA1LTAyLTA2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IENsZWFudXAgQU1fQ0ZMQUdTIGhhbmRsaW5nLiAgQWRkIC1XdW51c2VkIC1XZXh0cmEuCisJUmVtb3ZlIGxpbnQgaGFuZGxpbmcuCisJKiBlbGYzMl9nZXRwaGRyLmM6IE1pbm9yIGNsZWFudXBzLgorCSogZWxmMzJfZ2V0c2hkci5jOiBMaWtld2lzZS4KKwkqIGVsZjMyX3VwZGF0ZWZpbGUuYzogTGlrZXdpc2UuCisJKiBlbGYzMl91cGRhdGVudWxsLmM6IExpa2V3aXNlLgorCSogZWxmX2JlZ2luLmM6IExpa2V3aXNlLgorCSogZWxmX2Vycm9yLmM6IExpa2V3aXNlLgorCSogZWxmX2dldGFyc3ltLmM6IExpa2V3aXNlLgorCSogZWxmX2dldGRhdGEuYzogTGlrZXdpc2UuCisJKiBlbGZfdXBkYXRlLmM6IExpa2V3aXNlLgorCSogZ2VsZl94bGF0ZS5jOiBMaWtld2lzZS4KKworMjAwNS0wMi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBDaGVjayBmb3IgdGV4dCByZWxvY2F0aW9ucyBpbiBjb25zdHJ1Y3RlZCBEU08uCisKKwkqIE1ha2VmaWxlLmFtIFtNVURGTEFQXSAoQU1fQ0ZMQUdTKTogQWRkIC1XZXJyb3IgLWZwaWMgLWZtdWRmbGFwLgorCisyMDA1LTAyLTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZ2VsZl9nZXRlaGRyLmMgKGdlbGZfZ2V0ZWhkcik6IFNsaWdodCBvcHRpbWl6YXRpb24uCisKKwkqIGVsZjMyX2NoZWNrc3VtLmMgKGNoZWNrc3VtKTogRG8gbm90IGxvb2sgYXQgTk9CSVRTIHNlY3Rpb25zLgorCisJKiBnZWxmLmg6IEFkZCBnZWxmX2NoZWNrc3VtIHByb3RvdHlwZS4KKworMjAwNC0wOS0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVsZjMyX2NoZWNrc3VtLmM6IE1ha2UgY29tcGlsZSB3aXRoIGdjYyA0LjAuCisJKiBlbGYzMl91cGRhdGVmaWxlLmM6IExpa2V3aXNlLgorCSogZWxmMzJfdXBkYXRlbnVsbC5jOiBMaWtld2lzZS4KKwkqIGVsZl9iZWdpbi5jOiBMaWtld2lzZS4KKwkqIGVsZl9lcnJvci5jOiBMaWtld2lzZS4KKwkqIGVsZl9nZXRkYXRhLmM6IExpa2V3aXNlLgorCSogZWxmX2dldGlkZW50LmM6IExpa2V3aXNlLgorCisyMDA0LTA0LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgorCisyMDA0LTAxLTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmX3VwZGF0ZS5jOiBGaXggbG9ja2luZy4KKwkqIGVsZl9jbG9uZS5jOiBMaWtld2lzZS4KKworCSogbGliZWxmLmg6IERlZmluZSBFTEZfVF9MSUIuCisJKiBnZWxmX2dldGxpYi5jOiBOZXcgZmlsZS4KKwkqIGdlbGZfdXBkYXRlX2xpYi5jOiBOZXcgZmlsZS4KKwkqIGdlbGYuaDogRGVjbGFyZSB0aGUgbmV3IGZ1bmN0aW9ucy4gIERlZmluZSBHRWxmX0xpYi4KKwkqIGFic3RyYWN0Lmg6IERlZmluZSBMaWIsIExpYjMyLCBMaWI2NC4KKwkqIGdlbGZfeGxhdGUuYyAoX19lbGZfeGZjdHN0b20pOiBBZGQgRUxGX1RfTElCIGVudHJ5LgorCSogZ2VsZl94bGF0ZS5oOiBBZGQgZW50cnkgZm9yIEVsZlhYX0xpYi4KKwkqIGVsZl9nZXRkYXRhLmM6IFJlY29nbml6ZSBTSFRfR05VX0xJQkxJU1QgYXMgYSBrbm93biBzZWN0aW9uIHR5cGUuCisJKiBsaWJlbGYubWFwOiBBZGQgbmV3IHN5bWJvbHMgdG8gRUxGVVRJTFNfMS4xLgorCSogTWFrZWZpbGUuYW0gKGxpYmVsZl9hX1NPVVJDRVMpOiBBZGQgZ2VsZl9nZXRsaWIuYyBhbmQKKwlnZWxmX3VwZGF0ZV9saWIuYy4KKworMjAwNC0wMS0xNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggbXVkZmxhcC4KKworCSogZ2VsZl94bGF0ZS5jIChJTkxJTkUzKTogQXZvaWQgdXNpbmcgY2FzdCBhcyBsdmFsdWUuCisJKiBkbC1oYXNoLmggKF9kbF9lbGZfaGFzaCk6IExpa2V3aXNlLgorCisyMDA0LTAxLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmLWtub3dsZWRnZS5oOiBOZXcgZmlsZS4gIEZyb20gbGliZWxmIHN1YmRpci4KKwkqIE1ha2VmaWxlLmFtIChldWluY2x1ZGVkaXIpOiBEZWZpbmUuCisJKGV1aW5jbHVkZV9IRUFERVJTKTogQWRkIGVsZi1rbm93bGVkZ2UuaC4KKworMjAwMy0wOS0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGVsZi5oOiBEZWZpbmUgc29tZSBQVF9JQV82NF9IUF8qIGNvbnN0YW50cy4KKworMjAwMy0wOS0yMyAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIGxpYmVsZlAuaCAoc3RydWN0IEVsZik6IE1vdmUgc3RhdGUuZWxmNjQuc2l6ZXN0cl9vZmZzZXQgYWZ0ZXIKKwlzdGF0ZS5lbGY2NC5zY25pbmNyIHRvIG1hdGNoIHN0YXRlLmVsZnssMzJ9LgorCisyMDAzLTA4LTEyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmMzJfdXBkYXRlZmlsZS5jIChfX3VwZGF0ZW1tYXApOiBXaGVuIHdyaXRpbmcgYmFjayBmaWxlIHdoZXJlCisJc29tZSBzZWN0aW9ucyBoYXZlIG5vdCBiZWVuIHJlYWQgaW4sIGNvdW50IHRoZWlyIHNpemVzIGJhc2VkIG9uCisJdGhlIHNlY3Rpb24gaGVhZGVyLgorCisyMDAzLTA4LTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworICAgICAgICAqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvbGliZWxmL01ha2VmaWxlLmFtIGIvbGliZWxmL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNTgxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMjAgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCisjIworIyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIworIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIyBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIyMKK0RFRlMgPSAtRF9HTlVfU09VUkNFIC1ESEFWRV9DT05GSUdfSAoraWYgTVVERkxBUAorQU1fQ0ZMQUdTID0gLWZwaWMgLWZtdWRmbGFwCitlbHNlCitBTV9DRkxBR1MgPQorZW5kaWYKK0FNX0NGTEFHUyArPSAtV2FsbCAtV3NoYWRvdyAtV2Vycm9yIC1XdW51c2VkIC1XZXh0cmEgLVdmb3JtYXQ9MiAtc3RkPWdudTk5IFwKKwkgICAgICQoJCgqRilfQ0ZMQUdTKQorSU5DTFVERVMgPSAtSSQoc3JjZGlyKSAtSSQodG9wX3NyY2RpcikvbGliIC1JLi4KK0dDQ19JTkNMVURFID0gLUkkKHNoZWxsICQoQ0MpIC1wcmludC1maWxlLW5hbWU9aW5jbHVkZSkKK1ZFUlNJT04gPSAxCitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorCitsaWJfTElCUkFSSUVTID0gbGliZWxmLmEKK2lmICFNVURGTEFQCitub2luc3RfTElCUkFSSUVTID0gbGliZWxmX3BpYy5hCitub2luc3RfUFJPR1JBTVMgPSAkKG5vaW5zdF9MSUJSQVJJRVM6X3BpYy5hPS5zbykKK2VuZGlmCitpbmNsdWRlX0hFQURFUlMgPSBsaWJlbGYuaCBnZWxmLmggbmxpc3QuaAorCitldWluY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL2VsZnV0aWxzCitldWluY2x1ZGVfSEVBREVSUyA9IGVsZi1rbm93bGVkZ2UuaAorCitsaWJlbGZfYV9TT1VSQ0VTID0gZWxmX3ZlcnNpb24uYyBlbGZfaGFzaC5jIGVsZl9lcnJvci5jIGVsZl9maWxsLmMgXAorCQkgICBlbGZfYmVnaW4uYyBlbGZfbmV4dC5jIGVsZl9yYW5kLmMgZWxmX2VuZC5jIGVsZl9raW5kLmMgXAorCQkgICBnZWxmX2dldGNsYXNzLmMgZWxmX2dldGJhc2UuYyBlbGZfZ2V0aWRlbnQuYyBcCisJCSAgIGVsZjMyX2ZzaXplLmMgZWxmNjRfZnNpemUuYyBnZWxmX2ZzaXplLmMgXAorCQkgICBlbGYzMl94bGF0ZXRvZi5jIGVsZjMyX3hsYXRldG9tLmMgZWxmNjRfeGxhdGV0b2YuYyBcCisJCSAgIGVsZjY0X3hsYXRldG9tLmMgZ2VsZl94bGF0ZS5jIFwKKwkJICAgZWxmMzJfZ2V0ZWhkci5jIGVsZjY0X2dldGVoZHIuYyBnZWxmX2dldGVoZHIuYyBcCisJCSAgIGVsZjMyX25ld2VoZHIuYyBlbGY2NF9uZXdlaGRyLmMgZ2VsZl9uZXdlaGRyLmMgXAorCQkgICBnZWxmX3VwZGF0ZV9laGRyLmMgXAorCQkgICBlbGYzMl9nZXRwaGRyLmMgZWxmNjRfZ2V0cGhkci5jIGdlbGZfZ2V0cGhkci5jIFwKKwkJICAgZWxmMzJfbmV3cGhkci5jIGVsZjY0X25ld3BoZHIuYyBnZWxmX25ld3BoZHIuYyBcCisJCSAgIGdlbGZfdXBkYXRlX3BoZHIuYyBcCisJCSAgIGVsZl9nZXRhcmhkci5jIGVsZl9nZXRhcnN5bS5jIFwKKwkJICAgZWxmX3Jhd2ZpbGUuYyBlbGZfcmVhZGFsbC5jIGVsZl9jbnRsLmMgXAorCQkgICBlbGZfZ2V0c2NuLmMgZWxmX25leHRzY24uYyBlbGZfbmR4c2NuLmMgZWxmX25ld3Njbi5jIFwKKwkJICAgZWxmMzJfZ2V0c2hkci5jIGVsZjY0X2dldHNoZHIuYyBnZWxmX2dldHNoZHIuYyBcCisJCSAgIGdlbGZfdXBkYXRlX3NoZHIuYyBcCisJCSAgIGVsZl9zdHJwdHIuYyBlbGZfcmF3ZGF0YS5jIGVsZl9nZXRkYXRhLmMgZWxmX25ld2RhdGEuYyBcCisJCSAgIGVsZl9mbGFnZWxmLmMgZWxmX2ZsYWdlaGRyLmMgZWxmX2ZsYWdwaGRyLmMgZWxmX2ZsYWdzY24uYyBcCisJCSAgIGVsZl9mbGFnc2hkci5jIGVsZl9mbGFnZGF0YS5jIGVsZl9tZW1vcnkuYyBcCisJCSAgIGVsZl91cGRhdGUuYyBlbGYzMl91cGRhdGVudWxsLmMgZWxmNjRfdXBkYXRlbnVsbC5jIFwKKwkJICAgZWxmMzJfdXBkYXRlZmlsZS5jIGVsZjY0X3VwZGF0ZWZpbGUuYyBcCisJCSAgIGdlbGZfZ2V0c3ltLmMgZ2VsZl91cGRhdGVfc3ltLmMgXAorCQkgICBnZWxmX2dldHZlcnN5bS5jIGdlbGZfZ2V0dmVybmVlZC5jIGdlbGZfZ2V0dmVybmF1eC5jIFwKKwkJICAgZ2VsZl9nZXR2ZXJkZWYuYyBnZWxmX2dldHZlcmRhdXguYyBcCisJCSAgIGdlbGZfZ2V0cmVsLmMgZ2VsZl9nZXRyZWxhLmMgXAorCQkgICBnZWxmX3VwZGF0ZV9yZWwuYyBnZWxmX3VwZGF0ZV9yZWxhLmMgXAorCQkgICBnZWxmX2dldGR5bi5jIGdlbGZfdXBkYXRlX2R5bi5jIFwKKwkJICAgZ2VsZl9nZXRtb3ZlLmMgZ2VsZl91cGRhdGVfbW92ZS5jIFwKKwkJICAgZ2VsZl9nZXRzeW1pbmZvLmMgZ2VsZl91cGRhdGVfc3ltaW5mby5jIFwKKwkJICAgZ2VsZl94bGF0ZXRvZi5jIGdlbGZfeGxhdGV0b20uYyBcCisJCSAgIG5saXN0LmMgXAorCQkgICBnZWxmX2dldHN5bXNobmR4LmMgZ2VsZl91cGRhdGVfc3ltc2huZHguYyBcCisJCSAgIGdlbGZfdXBkYXRlX3ZlcnN5bS5jIGdlbGZfdXBkYXRlX3Zlcm5lZWQuYyBcCisJCSAgIGdlbGZfdXBkYXRlX3Zlcm5hdXguYyBnZWxmX3VwZGF0ZV92ZXJkZWYuYyBcCisJCSAgIGdlbGZfdXBkYXRlX3ZlcmRhdXguYyBcCisJCSAgIGVsZl9nZXRzaG51bS5jIGVsZl9nZXRzaHN0cm5keC5jIFwKKwkJICAgZ2VsZl9jaGVja3N1bS5jIGVsZjMyX2NoZWNrc3VtLmMgZWxmNjRfY2hlY2tzdW0uYyBcCisJCSAgIGdlbGZfcmF3Y2h1bmsuYyBnZWxmX2ZyZWVjaHVuay5jIFwKKwkJICAgbGliZWxmX2NyYzMyLmMgbGliZWxmX25leHRfcHJpbWUuYyBcCisJCSAgIGVsZl9jbG9uZS5jIFwKKwkJICAgZ2VsZl9nZXRsaWIuYyBnZWxmX3VwZGF0ZV9saWIuYworCitpZiAhTVVERkxBUAorbGliZWxmX3BpY19hX1NPVVJDRVMgPQorYW1fbGliZWxmX3BpY19hX09CSkVDVFMgPSAkKGxpYmVsZl9hX1NPVVJDRVM6LmM9Lm9zKQorCitsaWJlbGZfc29fU09VUkNFUyA9CitsaWJlbGYuc286IGxpYmVsZl9waWMuYSBsaWJlbGYubWFwCisJJChDQykgLXNoYXJlZCAtbyAkQCAtV2wsLS13aG9sZS1hcmNoaXZlLCQ8LC0tbm8td2hvbGUtYXJjaGl2ZSBcCisJICAgICAgLVdsLC0tdmVyc2lvbi1zY3JpcHQsJChzcmNkaXIpL2xpYmVsZi5tYXAsLS1uby11bmRlZmluZWQgXAorCSAgICAgIC1XbCwtLXNvbmFtZSwkQC4kKFZFUlNJT04pLC16LC1kZWZzCisJaWYgcmVhZGVsZiAtZCAkQCB8IGZncmVwIC1xIFRFWFRSRUw7IHRoZW4gZXhpdCAxOyBmaQorCWxuIC1mcyAkQCAkQC4kKFZFUlNJT04pCisKKyUub3M6ICUuYyAlLm8KKwlpZiAkKENPTVBJTEUpIC1jIC1vICRAIC1mcGljIC1EUElDIC1EU0hBUkVEIC1NVCAkQCAtTUQgLU1QIFwKKwkgIC1NRiAiJChERVBESVIpLyQqLlRwbyIgYHRlc3QgLWYgJyQ8JyB8fCBlY2hvICckKHNyY2RpcikvJ2AkPDsgXAorCXRoZW4gY2F0ICIkKERFUERJUikvJCouVHBvIiA+PiAiJChERVBESVIpLyQqLlBvIjsgXAorCSAgICAgcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBcCisJZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgXAorCWZpCisKK2luc3RhbGw6IGluc3RhbGwtYW0gbGliZWxmLnNvCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCisJJChJTlNUQUxMX1BST0dSQU0pIGxpYmVsZi5zbyAkKERFU1RESVIpJChsaWJkaXIpL2xpYmVsZi0kKFBBQ0tBR0VfVkVSU0lPTikuc28KKwlsbiAtZnMgbGliZWxmLSQoUEFDS0FHRV9WRVJTSU9OKS5zbyAkKERFU1RESVIpJChsaWJkaXIpL2xpYmVsZi5zby4kKFZFUlNJT04pCisJbG4gLWZzIGxpYmVsZi5zby4kKFZFUlNJT04pICQoREVTVERJUikkKGxpYmRpcikvbGliZWxmLnNvCisKK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisJcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJlbGYtJChQQUNLQUdFX1ZFUlNJT04pLnNvCisJcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJlbGYuc28uJChWRVJTSU9OKQorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZWxmLnNvCitlbmRpZgorCitub2luc3RfSEVBREVSUyA9IGVsZi5oIGFic3RyYWN0LmggY29tbW9uLmggZXh0dHlwZXMuaCBnZWxmX3hsYXRlLmggbGliZWxmUC5oIFwKKwkJIHZlcnNpb25feGxhdGUuaCBkbC1oYXNoLmgKK0VYVFJBX0RJU1QgPSBsaWJlbGYubWFwCisKK0NMRUFORklMRVMgPSAkKGFtX2xpYmVsZl9waWNfYV9PQkpFQ1RTKQpkaWZmIC0tZ2l0IGEvbGliZWxmL2Fic3RyYWN0LmggYi9saWJlbGYvYWJzdHJhY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQwMzRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2Fic3RyYWN0LmgKQEAgLTAsMCArMSwyODMgQEAKKy8qIEFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGNvbXBvbmVudCBFTEYgdHlwZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEVMRiBoZWFkZXIuICAqLworI2RlZmluZSBFaGRyKEJpdHMsIEV4dCkgXAorU1RBUlQgKEJpdHMsIEVoZHIsIEV4dCMjRWhkcikJCQkJCQkgICAgICBcCisgIFRZUEVfRVhUUkEgKHVuc2lnbmVkIGNoYXIgZV9pZGVudFtFSV9OSURFTlRdOykJCQkgICAgICBcCisgIFRZUEVfWExBVEUgKG1lbW1vdmUgKHRkZXN0LT5lX2lkZW50LCB0c3JjLT5lX2lkZW50LCBFSV9OSURFTlQpOykJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIGVfdHlwZSkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIGVfbWFjaGluZSkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIGVfdmVyc2lvbikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjQWRkciksIGVfZW50cnkpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI09mZiksIGVfcGhvZmYpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI09mZiksIGVfc2hvZmYpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCBlX2ZsYWdzKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgZV9laHNpemUpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI0hhbGYpLCBlX3BoZW50c2l6ZSkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgZV9waG51bSkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIGVfc2hlbnRzaXplKQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI0hhbGYpLCBlX3NobnVtKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgZV9zaHN0cm5keCkJCQkgICAgICBcCitFTkQgKEJpdHMsIEV4dCMjRWhkcikKKworI2RlZmluZSBFaGRyMzIoRXh0KSBcCisgIEVoZHIoMzIsIEV4dCkKKyNkZWZpbmUgRWhkcjY0KEV4dCkgXAorICBFaGRyKDY0LCBFeHQpCisKKworLyogUHJvZ3JhbSBoZWFkZXIuICAqLworI2RlZmluZSBQaGRyMzIoRXh0KSBcCitTVEFSVCAoMzIsIFBoZHIsIEV4dCMjUGhkcikJCQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHBfdHlwZSkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI09mZiksIHBfb2Zmc2V0KQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjQWRkciksIHBfdmFkZHIpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNBZGRyKSwgcF9wYWRkcikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBwX2ZpbGVzeikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBwX21lbXN6KQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHBfZmxhZ3MpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgcF9hbGlnbikJCQkJICAgICAgXAorRU5EICgzMiwgRXh0IyNQaGRyKQorI2RlZmluZSBQaGRyNjQoRXh0KSBcCitTVEFSVCAoNjQsIFBoZHIsIEV4dCMjUGhkcikJCQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjV29yZCksIHBfdHlwZSkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1dvcmQpLCBwX2ZsYWdzKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjT2ZmKSwgcF9vZmZzZXQpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNBZGRyKSwgcF92YWRkcikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCBwX3BhZGRyKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjWHdvcmQpLCBwX2ZpbGVzeikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgcF9tZW1zeikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgcF9hbGlnbikJCQkJICAgICAgXAorRU5EICg2NCwgRXh0IyNQaGRyKQorCisKKy8qIFNlY3Rpb24gaGVhZGVyLiAgKi8KKyNkZWZpbmUgU2hkcjMyKEV4dCkgXAorU1RBUlQgKDMyLCBTaGRyLCBFeHQjI1NoZHIpCQkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBzaF9uYW1lKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHNoX3R5cGUpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgc2hfZmxhZ3MpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNBZGRyKSwgc2hfYWRkcikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI09mZiksIHNoX29mZnNldCkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBzaF9zaXplKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHNoX2xpbmspCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgc2hfaW5mbykJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBzaF9hZGRyYWxpZ24pCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBzaF9lbnRzaXplKQkJCQkgICAgICBcCitFTkQgKDMyLCBFeHQjI1NoZHIpCisjZGVmaW5lIFNoZHI2NChFeHQpIFwKK1NUQVJUICg2NCwgU2hkciwgRXh0IyNTaGRyKQkJCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNXb3JkKSwgc2hfbmFtZSkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1dvcmQpLCBzaF90eXBlKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjWHdvcmQpLCBzaF9mbGFncykJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCBzaF9hZGRyKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjT2ZmKSwgc2hfb2Zmc2V0KQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjWHdvcmQpLCBzaF9zaXplKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjV29yZCksIHNoX2xpbmspCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNXb3JkKSwgc2hfaW5mbykJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgc2hfYWRkcmFsaWduKQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNYd29yZCksIHNoX2VudHNpemUpCQkJCSAgICAgIFwKK0VORCAoNjQsIEV4dCMjU2hkcikKKworCisvKiBTeW1ib2wgdGFibGUuICAqLworI2RlZmluZSBTeW0zMihFeHQpIFwKK1NUQVJUICgzMiwgU3ltLCBFeHQjI1N5bSkJCQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHN0X25hbWUpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNBZGRyKSwgc3RfdmFsdWUpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgc3Rfc2l6ZSkJCQkJICAgICAgXAorICBUWVBFX0VYVFJBICh1bnNpZ25lZCBjaGFyIHN0X2luZm87KQkJCQkJICAgICAgXAorICBUWVBFX1hMQVRFICh0ZGVzdC0+c3RfaW5mbyA9IHRzcmMtPnN0X2luZm87KQkJCQkgICAgICBcCisgIFRZUEVfRVhUUkEgKHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7KQkJCQkJICAgICAgXAorICBUWVBFX1hMQVRFICh0ZGVzdC0+c3Rfb3RoZXIgPSB0c3JjLT5zdF9vdGhlcjspCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI0hhbGYpLCBzdF9zaG5keCkJCQkJICAgICAgXAorRU5EICgzMiwgRXh0IyNTeW0pCisjZGVmaW5lIFN5bTY0KEV4dCkgXAorU1RBUlQgKDY0LCBTeW0sIEV4dCMjU3ltKQkJCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNXb3JkKSwgc3RfbmFtZSkJCQkJICAgICAgXAorICBUWVBFX0VYVFJBICh1bnNpZ25lZCBjaGFyIHN0X2luZm87KQkJCQkJICAgICAgXAorICBUWVBFX1hMQVRFICh0ZGVzdC0+c3RfaW5mbyA9IHRzcmMtPnN0X2luZm87KQkJCQkgICAgICBcCisgIFRZUEVfRVhUUkEgKHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7KQkJCQkJICAgICAgXAorICBUWVBFX1hMQVRFICh0ZGVzdC0+c3Rfb3RoZXIgPSB0c3JjLT5zdF9vdGhlcjspCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0hhbGYpLCBzdF9zaG5keCkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCBzdF92YWx1ZSkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgc3Rfc2l6ZSkJCQkJICAgICAgXAorRU5EICg2NCwgRXh0IyNTeW0pCisKKworLyogUmVsb2NhdGlvbi4gICovCisjZGVmaW5lIFJlbDMyKEV4dCkgXAorU1RBUlQgKDMyLCBSZWwsIEV4dCMjUmVsKQkJCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNBZGRyKSwgcl9vZmZzZXQpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgcl9pbmZvKQkJCQkgICAgICBcCitFTkQgKDMyLCBFeHQjI1JlbCkKKyNkZWZpbmUgUmVsNjQoRXh0KSBcCitTVEFSVCAoNjQsIFJlbCwgRXh0IyNSZWwpCQkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCByX29mZnNldCkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgcl9pbmZvKQkJCQkgICAgICBcCitFTkQgKDY0LCBFeHQjI1JlbCkKKworI2RlZmluZSBSZWxhMzIoRXh0KSBcCitTVEFSVCAoMzIsIFJlbGEsIEV4dCMjUmVsYSkJCQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjQWRkciksIHJfb2Zmc2V0KQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHJfaW5mbykJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1N3b3JkKSwgcl9hZGRlbmQpCQkJCSAgICAgIFwKK0VORCAoMzIsIEV4dCMjUmVsYSkKKyNkZWZpbmUgUmVsYTY0KEV4dCkgXAorU1RBUlQgKDY0LCBSZWxhLCBFeHQjI1JlbGEpCQkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCByX29mZnNldCkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgcl9pbmZvKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjU3h3b3JkKSwgcl9hZGRlbmQpCQkJCSAgICAgIFwKK0VORCAoNjQsIEV4dCMjUmVsYSkKKworCisvKiBOb3RlIGVudHJ5IGhlYWRlci4gICovCisjZGVmaW5lIE5vdGUoQml0cywgRXh0KSBcCitTVEFSVCAoQml0cywgTmhkciwgRXh0IyNOaGRyKQkJCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCBuX25hbWVzeikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIG5fZGVzY3N6KQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgbl90eXBlKQkJCQkgICAgICBcCitFTkQgKEJpdHMsIEV4dCMjTmhkcikKKworI2RlZmluZSBOb3RlMzIoRXh0KSBcCisgIE5vdGUgKDMyLCBFeHQpCisjZGVmaW5lIE5vdGU2NChFeHQpIFwKKyAgTm90ZSAoNjQsIEV4dCkKKworCisvKiBEeW5hbWljIHNlY3Rpb24gZGF0YS4gICovCisjZGVmaW5lIER5bjMyKEV4dCkgXAorU1RBUlQgKDMyLCBEeW4sIEV4dCMjRHluKQkJCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNTd29yZCksIGRfdGFnKQkJCQkgICAgICBcCisgIFRZUEVfRVhUUkEgKHVuaW9uIHspCQkJCQkJCSAgICAgIFwKKyAgVFlQRV9FWFRSQSAoRWxmVzIoMzIsIEV4dCMjV29yZCkgZF92YWw7KQkJCQkgICAgICBcCisgIFRZUEVfRVhUUkEgKEVsZlcyKDMyLCBFeHQjI0FkZHIpIGRfcHRyOykJCQkJICAgICAgXAorICBUWVBFX1hMQVRFIChFbGYzMl9jdnRfQWRkcjEgKCZ0ZGVzdC0+ZF91bi5kX3ZhbCwgJnRzcmMtPmRfdW4uZF92YWwpOykJICAgICAgXAorICBUWVBFX0VYVFJBIChFbGZXMigzMiwgRXh0IyNPZmYpIGRfb2ZmOykJCQkJICAgICAgXAorICBUWVBFX0VYVFJBICh9IGRfdW47KQkJCQkJCQkgICAgICBcCitFTkQgKDMyLCBFeHQjI0R5bikKKyNkZWZpbmUgRHluNjQoRXh0KSBcCitTVEFSVCAoNjQsIER5biwgRXh0IyNEeW4pCQkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgZF90YWcpCQkJCSAgICAgIFwKKyAgVFlQRV9FWFRSQSAodW5pb24geykJCQkJCQkJICAgICAgXAorICBUWVBFX0VYVFJBIChFbGZXMig2NCwgRXh0IyNYd29yZCkgZF92YWw7KQkJCQkgICAgICBcCisgIFRZUEVfRVhUUkEgKEVsZlcyKDY0LCBFeHQjI0FkZHIpIGRfcHRyOykJCQkJICAgICAgXAorICBUWVBFX1hMQVRFIChFbGY2NF9jdnRfQWRkcjEgKCZ0ZGVzdC0+ZF91bi5kX3ZhbCwgJnRzcmMtPmRfdW4uZF92YWwpOykJICAgICAgXAorICBUWVBFX0VYVFJBICh9IGRfdW47KQkJCQkJCQkgICAgICBcCitFTkQgKDY0LCBFeHQjI0R5bikKKworCisjaWZuZGVmIEdFTkVSQVRFX0NPTlZFUlNJT04KKy8qIFZlcnNpb24gZGVmaW5pdGlvbnMuICAqLworIyBkZWZpbmUgVmVyZGVmKEJpdHMsIEV4dCkgXAorU1RBUlQgKEJpdHMsIFZlcmRlZiwgRXh0IyNWZXJkZWYpCQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgdmRfdmVyc2lvbikJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgdmRfZmxhZ3MpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI0hhbGYpLCB2ZF9uZHgpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI0hhbGYpLCB2ZF9jbnQpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCB2ZF9oYXNoKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgdmRfYXV4KQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgdmRfbmV4dCkJCQkJICAgICAgXAorRU5EIChCaXRzLCBFeHQjI1ZlcmRlZikKKworIyBkZWZpbmUgVmVyZGVmMzIoRXh0KSBcCisgIFZlcmRlZiAoMzIsIEV4dCkKKyMgZGVmaW5lIFZlcmRlZjY0KEV4dCkgXAorICBWZXJkZWYgKDY0LCBFeHQpCisKKyMgZGVmaW5lIFZlcmRhdXgoQml0cywgRXh0KSBcCitTVEFSVCAoQml0cywgVmVyZGF1eCwgRXh0IyNWZXJkYXV4KQkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIHZkYV9uYW1lKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgdmRhX25leHQpCQkJCSAgICAgIFwKK0VORCAoQml0cywgRXh0IyNWZXJkYXV4KQorCisjIGRlZmluZSBWZXJkYXV4MzIoRXh0KSBcCisgIFZlcmRhdXggKDMyLCBFeHQpCisjIGRlZmluZSBWZXJkYXV4NjQoRXh0KSBcCisgIFZlcmRhdXggKDY0LCBFeHQpCisKKy8qIFJlcXVpcmVkIHZlcnNpb25zLiAgKi8KKyMgZGVmaW5lIFZlcm5lZWQoQml0cywgRXh0KSBcCitTVEFSVCAoQml0cywgVmVybmVlZCwgRXh0IyNWZXJuZWVkKQkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIHZuX3ZlcnNpb24pCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIHZuX2NudCkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIHZuX2ZpbGUpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCB2bl9hdXgpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCB2bl9uZXh0KQkJCQkgICAgICBcCitFTkQgKEJpdHMsIEV4dCMjVmVybmVlZCkKKworIyBkZWZpbmUgVmVybmVlZDMyKEV4dCkgXAorICBWZXJuZWVkICgzMiwgRXh0KQorIyBkZWZpbmUgVmVybmVlZDY0KEV4dCkgXAorICBWZXJuZWVkICg2NCwgRXh0KQorCisjIGRlZmluZSBWZXJuYXV4KEJpdHMsIEV4dCkgXAorU1RBUlQgKEJpdHMsIFZlcm5hdXgsIEV4dCMjVmVybmF1eCkJCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCB2bmFfaGFzaCkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIHZuYV9mbGFncykJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIHZuYV9vdGhlcikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIHZuYV9uYW1lKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgdm5hX25leHQpCQkJCSAgICAgIFwKK0VORCAoQml0cywgRXh0IyNWZXJuYXV4KQorCisjIGRlZmluZSBWZXJuYXV4MzIoRXh0KSBcCisgIFZlcm5hdXggKDMyLCBFeHQpCisjIGRlZmluZSBWZXJuYXV4NjQoRXh0KSBcCisgIFZlcm5hdXggKDY0LCBFeHQpCisjZW5kaWYKKworLyogU3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgU3ltaW5mbyhCaXRzLCBFeHQpIFwKK1NUQVJUIChCaXRzLCBTeW1pbmZvLCBFeHQjI1N5bWluZm8pCQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgc2lfYm91bmR0bykJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgc2lfZmxhZ3MpCQkJCSAgICAgIFwKK0VORCAoQml0cywgRXh0IyNTeW1pbmZvKQorCisjZGVmaW5lIFN5bWluZm8zMihFeHQpIFwKKyAgU3ltaW5mbyAoMzIsIEV4dCkKKyNkZWZpbmUgU3ltaW5mbzY0KEV4dCkgXAorICBTeW1pbmZvICg2NCwgRXh0KQorCisvKiBNb3ZlIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgTW92ZShCaXRzLCBFeHQpIFwKK1NUQVJUIChCaXRzLCBNb3ZlLCBFeHQjI01vdmUpCQkJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjWHdvcmQpLCBtX3ZhbHVlKQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNYd29yZCksIG1faW5mbykJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjWHdvcmQpLCBtX3BvZmZzZXQpCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIG1fcmVwZWF0KQkJCQkgICAgICBcCisgIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgbV9zdHJpZGUpCQkJCSAgICAgIFwKK0VORCAoQml0cywgRXh0IyNNb3ZlKQorCisjZGVmaW5lIE1vdmUzMihFeHQpIFwKKyAgTW92ZSAoMzIsIEV4dCkKKyNkZWZpbmUgTW92ZTY0KEV4dCkgXAorICBNb3ZlICg2NCwgRXh0KQorCisjZGVmaW5lIExpYihCaXRzLCBFeHQpIFwKK1NUQVJUIChCaXRzLCBMaWIsIEV4dCMjTGliKQkJCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCBsX25hbWUpCQkJCSAgICAgIFwKKyAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCBsX3RpbWVfc3RhbXApCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIGxfY2hlY2tzdW0pCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIGxfdmVyc2lvbikJCQkJICAgICAgXAorICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIGxfZmxhZ3MpCQkJCSAgICAgIFwKK0VORCAoQml0cywgRXh0IyNMaWIpCisKKyNkZWZpbmUgTGliMzIoRXh0KSBcCisgIExpYiAoMzIsIEV4dCkKKyNkZWZpbmUgTGliNjQoRXh0KSBcCisgIExpYiAoNjQsIEV4dCkKZGlmZiAtLWdpdCBhL2xpYmVsZi9jb21tb24uaCBiL2xpYmVsZi9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzFjNjFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2NvbW1vbi5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBDb21tb24gZGVmaW5pdGlvbnMgZm9yIGhhbmRsaW5nIGZpbGVzIGluIG1lbW9yeSBvciBvbmx5IG9uIGRpc2suCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0NPTU1PTl9ICisjZGVmaW5lIF9DT01NT05fSCAgICAgICAxCisKKyNpbmNsdWRlIDxhci5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKworc3RhdGljIGlubGluZSBFbGZfS2luZAorZGV0ZXJtaW5lX2tpbmQgKHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgLyogRmlyc3QgdGVzdCBmb3IgYW4gYXJjaGl2ZS4gICovCisgIGlmIChsZW4gPj0gU0FSTUFHICYmIG1lbWNtcCAoYnVmLCBBUk1BRywgU0FSTUFHKSA9PSAwKQorICAgIHJldHVybiBFTEZfS19BUjsKKworICAvKiBOZXh0IHRyeSBFTEYgZmlsZXMuICAqLworICBpZiAobGVuID49IEVJX05JREVOVCAmJiBtZW1jbXAgKGJ1ZiwgRUxGTUFHLCBTRUxGTUFHKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIENvdWxkIGJlIGFuIEVMRiBmaWxlLiAgKi8KKyAgICAgIGludCBlY2xhc3MgPSAoaW50KSAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKVtFSV9DTEFTU107CisgICAgICBpbnQgZGF0YSA9IChpbnQpICgodW5zaWduZWQgY2hhciAqKSBidWYpW0VJX0RBVEFdOworICAgICAgaW50IHZlcnNpb24gPSAoaW50KSAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKVtFSV9WRVJTSU9OXTsKKworICAgICAgaWYgKGVjbGFzcyA+IEVMRkNMQVNTTk9ORSAmJiBlY2xhc3MgPCBFTEZDTEFTU05VTQorCSAgJiYgZGF0YSA+IEVMRkRBVEFOT05FICYmIGRhdGEgPCBFTEZEQVRBTlVNCisJICAmJiB2ZXJzaW9uID4gRVZfTk9ORSAmJiB2ZXJzaW9uIDwgRVZfTlVNKQorCXJldHVybiBFTEZfS19FTEY7CisgICAgfQorCisgIC8qIFdlIGRvIG5vdCBrbm93IHRoaXMgZmlsZSB0eXBlLiAgKi8KKyAgcmV0dXJuIEVMRl9LX05PTkU7Cit9CisKKworLyogQWxsb2NhdGUgYW4gRWxmIGRlc2NyaXB0b3IgYW5kIGZpbGwgaW4gdGhlIGdlbmVyaWMgaW5mb3JtYXRpb24uICAqLworc3RhdGljIGlubGluZSBFbGYgKgorYWxsb2NhdGVfZWxmIChpbnQgZmlsZGVzLCB2b2lkICptYXBfYWRkcmVzcywgb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbWF4c2l6ZSwKKyAgICAgICAgICAgICAgRWxmX0NtZCBjbWQsIEVsZiAqcGFyZW50LCBFbGZfS2luZCBraW5kLCBzaXplX3QgZXh0cmEpCit7CisgIEVsZiAqcmVzdWx0ID0gKEVsZiAqKSBjYWxsb2MgKDEsIHNpemVvZiAoRWxmKSArIGV4dHJhKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7CisgIGVsc2UKKyAgICB7CisgICAgICByZXN1bHQtPmtpbmQgPSBraW5kOworICAgICAgcmVzdWx0LT5yZWZfY291bnQgPSAxOworICAgICAgcmVzdWx0LT5jbWQgPSBjbWQ7CisgICAgICByZXN1bHQtPmZpbGRlcyA9IGZpbGRlczsKKyAgICAgIHJlc3VsdC0+c3RhcnRfb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgcmVzdWx0LT5tYXhpbXVtX3NpemUgPSBtYXhzaXplOworICAgICAgcmVzdWx0LT5tYXBfYWRkcmVzcyA9IG1hcF9hZGRyZXNzOworICAgICAgcmVzdWx0LT5wYXJlbnQgPSBwYXJlbnQ7CisKKyAgICAgIHJ3bG9ja19pbml0IChyZXN1bHQtPmxvY2spOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIEFjcXVpcmUgbG9jayBmb3IgdGhlIGRlc2NyaXB0b3IgYW5kIGFsbCBjaGlsZHJlbi4gICovCitzdGF0aWMgdm9pZAorbGliZWxmX2FjcXVpcmVfYWxsIChFbGYgKmVsZikKK3sKKyAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICBpZiAoZWxmLT5raW5kID09IEVMRl9LX0FSKQorICAgIHsKKyAgICAgIEVsZiAqY2hpbGQgPSBlbGYtPnN0YXRlLmFyLmNoaWxkcmVuOworCisgICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkKKwl7CisJICBpZiAoY2hpbGQtPnJlZl9jb3VudCAhPSAwKQorCSAgICBsaWJlbGZfYWNxdWlyZV9hbGwgKGNoaWxkKTsKKwkgIGNoaWxkID0gY2hpbGQtPm5leHQ7CisJfQorICAgIH0KK30KKworLyogUmVsZWFzZSBvd24gbG9jayBhbmQgdGhvc2Ugb2YgdGhlIGNoaWxkcmVuLiAgKi8KK3N0YXRpYyB2b2lkCitsaWJlbGZfcmVsZWFzZV9hbGwgKEVsZiAqZWxmKQoreworICBpZiAoZWxmLT5raW5kID09IEVMRl9LX0FSKQorICAgIHsKKyAgICAgIEVsZiAqY2hpbGQgPSBlbGYtPnN0YXRlLmFyLmNoaWxkcmVuOworCisgICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkKKwl7CisJICBpZiAoY2hpbGQtPnJlZl9jb3VudCAhPSAwKQorCSAgICBsaWJlbGZfcmVsZWFzZV9hbGwgKGNoaWxkKTsKKwkgIGNoaWxkID0gY2hpbGQtPm5leHQ7CisJfQorICAgIH0KKworICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworfQorCisKKy8qIE1hY3JvIHRvIGNvbnZlcnQgZW5kaWFuZXNzIGluIHBsYWNlLiAgSXQgZGV0ZXJtaW5lcyB0aGUgZnVuY3Rpb24gaXQKKyAgIGhhcyB0byB1c2UgaXRzZWxmLiAgKi8KKyNkZWZpbmUgQ09OVkVSVChWYXIpIFwKKyAgKFZhcikgPSAoc2l6ZW9mIChWYXIpID09IDEJCQkJCQkgICAgICBcCisJICAgPyAodW5zaWduZWQgY2hhcikgKFZhcikJCQkJCSAgICAgIFwKKwkgICA6IChzaXplb2YgKFZhcikgPT0gMgkJCQkJCSAgICAgIFwKKwkgICAgICA/IGJzd2FwXzE2IChWYXIpCQkJCQkJICAgICAgXAorCSAgICAgIDogKHNpemVvZiAoVmFyKSA9PSA0CQkJCQkgICAgICBcCisJCSA/IGJzd2FwXzMyIChWYXIpCQkJCQkgICAgICBcCisJCSA6IGJzd2FwXzY0IChWYXIpKSkpCisKKyNkZWZpbmUgQ09OVkVSVF9UTyhEc3QsIFZhcikgXAorICAoRHN0KSA9IChzaXplb2YgKFZhcikgPT0gMQkJCQkJCSAgICAgIFwKKwkgICA/ICh1bnNpZ25lZCBjaGFyKSAoVmFyKQkJCQkJICAgICAgXAorCSAgIDogKHNpemVvZiAoVmFyKSA9PSAyCQkJCQkJICAgICAgXAorCSAgICAgID8gYnN3YXBfMTYgKFZhcikJCQkJCQkgICAgICBcCisJICAgICAgOiAoc2l6ZW9mIChWYXIpID09IDQJCQkJCSAgICAgIFwKKwkJID8gYnN3YXBfMzIgKFZhcikJCQkJCSAgICAgIFwKKwkJIDogYnN3YXBfNjQgKFZhcikpKSkKKworCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyBkZWZpbmUgTVlfRUxGREFUQQlFTEZEQVRBMkxTQgorI2Vsc2UKKyMgZGVmaW5lIE1ZX0VMRkRBVEEJRUxGREFUQTJNU0IKKyNlbmRpZgorCisjZW5kaWYJLyogY29tbW9uLmggKi8KZGlmZiAtLWdpdCBhL2xpYmVsZi9kbC1oYXNoLmggYi9saWJlbGYvZGwtaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTg5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZGwtaGFzaC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIENvbXB1dGUgaGFzaCB2YWx1ZSBmb3IgZ2l2ZW4gc3RyaW5nIGFjY29yZGluZyB0byBFTEYgc3RhbmRhcmQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9ETF9IQVNIX0gKKyNkZWZpbmUgX0RMX0hBU0hfSAkxCisKKworLyogVGhpcyBpcyB0aGUgaGFzaGluZyBmdW5jdGlvbiBzcGVjaWZpZWQgYnkgdGhlIEVMRiBBQkkuICBJbiB0aGUKKyAgIGZpcnN0IGZpdmUgb3BlcmF0aW9ucyBubyBvdmVyZmxvdyBpcyBwb3NzaWJsZSBzbyB3ZSBvcHRpbWl6ZWQgaXQgYQorICAgYml0LiAgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorX2RsX2VsZl9oYXNoIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbmFtZSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG5hbWU7CisgIHVuc2lnbmVkIGludCBoYXNoID0gKHVuc2lnbmVkIGludCkgKmluYW1lKys7CisgIGlmICgqaW5hbWUgIT0gJ1wwJykKKyAgICB7CisgICAgICBoYXNoID0gKGhhc2ggPDwgNCkgKyAodW5zaWduZWQgaW50KSAqaW5hbWUrKzsKKyAgICAgIGlmICgqaW5hbWUgIT0gJ1wwJykKKwl7CisJICBoYXNoID0gKGhhc2ggPDwgNCkgKyAodW5zaWduZWQgaW50KSAqaW5hbWUrKzsKKwkgIGlmICgqaW5hbWUgIT0gJ1wwJykKKwkgICAgeworCSAgICAgIGhhc2ggPSAoaGFzaCA8PCA0KSArICh1bnNpZ25lZCBpbnQpICppbmFtZSsrOworCSAgICAgIGlmICgqaW5hbWUgIT0gJ1wwJykKKwkJeworCQkgIGhhc2ggPSAoaGFzaCA8PCA0KSArICh1bnNpZ25lZCBpbnQpICppbmFtZSsrOworCQkgIHdoaWxlICgqaW5hbWUgIT0gJ1wwJykKKwkJICAgIHsKKwkJICAgICAgdW5zaWduZWQgaW50IGhpOworCQkgICAgICBoYXNoID0gKGhhc2ggPDwgNCkgKyAodW5zaWduZWQgaW50KSAqaW5hbWUrKzsKKwkJICAgICAgaGkgPSBoYXNoICYgMHhmMDAwMDAwMDsKKworCQkgICAgICAvKiBUaGUgYWxnb3JpdGhtIHNwZWNpZmllZCBpbiB0aGUgRUxGIEFCSSBpcyBhcworCQkJIGZvbGxvd3M6CisKKwkJCSBpZiAoaGkgIT0gMCkKKwkJCSBoYXNoIF49IGhpID4+IDI0OworCisJCQkgaGFzaCAmPSB+aGk7CisKKwkJCSBCdXQgdGhlIGZvbGxvd2luZyBpcyBlcXVpdmFsZW50IGFuZCBhIGxvdAorCQkJIGZhc3RlciwgZXNwZWNpYWxseSBvbiBtb2Rlcm4gcHJvY2Vzc29ycy4gICovCisKKwkJICAgICAgaGFzaCBePSBoaTsKKwkJICAgICAgaGFzaCBePSBoaSA+PiAyNDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIGhhc2g7Cit9CisKKyNlbmRpZiAvKiBkbC1oYXNoLmggKi8KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGYta25vd2xlZGdlLmggYi9saWJlbGYvZWxmLWtub3dsZWRnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MmZkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmLWtub3dsZWRnZS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qIEFjY3VtdWxhdGlvbiBvZiB2YXJpb3VzIHBpZWNlcyBvZiBrbm93bGVkZ2UgYWJvdXQgRUxGLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9FTEZfS05PV0xFREdFX0gKKyNkZWZpbmUgX0VMRl9LTk9XTEVER0VfSAkxCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKworLyogVGVzdCB3aGV0aGVyIGEgc2VjdGlvbiBjYW4gYmUgc3RyaXBwZWQgb3Igbm90LiAgKi8KKyNkZWZpbmUgU0VDVElPTl9TVFJJUF9QKHNoZHIsIG5hbWUsIHJlbW92ZV9jb21tZW50KSBcCisgIC8qIFNlY3Rpb25zIHdoaWNoIGFyZSBhbGxvY2F0ZWQgYXJlIG5vdCByZW1vdmVkLiAgKi8JCQkgICAgICBcCisgICgoKHNoZHIpLT5zaF9mbGFncyAmIFNIRl9BTExPQykgPT0gMAkJCQkJICAgICAgXAorICAgLyogV2UgbmV2ZXIgcmVtb3ZlIC5ub3RlIHNlY3Rpb25zLiAgKi8JCQkJICAgICAgXAorICAgJiYgKHNoZHIpLT5zaF90eXBlICE9IFNIVF9OT1RFCQkJCQkgICAgICBcCisgICAmJiAoKChzaGRyKS0+c2hfdHlwZSkgIT0gU0hUX1BST0dCSVRTCQkJCSAgICAgIFwKKyAgICAgICAvKiBOZXZlciByZW1vdmUgLmdudS53YXJuaW5nLiogc2VjdGlvbnMuICAqLwkJCSAgICAgIFwKKyAgICAgICB8fCAoc3RybmNtcCAobmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgIT0gMCAgIFwKKwkgICAvKiBXZSByZW1vdmUgLmNvbW1lbnQgc2VjdGlvbnMgb25seSBpZiBleHBsaWNpdGx5IHRvbGQgdG8gZG8gc28uICovXAorCSAgICYmIChyZW1vdmVfY29tbWVudAkJCQkJCSAgICAgIFwKKwkgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLmNvbW1lbnQiKSAhPSAwKSkpCQkJICAgICAgXAorICAgLyogU28gZmFyIHdlIGRvIG5vdCByZW1vdmUgYW55IG9mIHRoZSBub24tc3RhbmRhcmQgc2VjdGlvbnMuCQkgICAgICBcCisgICAgICBYWFggTWF5YmUgaW4gZnV0dXJlLiAgKi8JCQkJCQkgICAgICBcCisgICAmJiAoc2hkciktPnNoX3R5cGUgPCBTSFRfTlVNKQorCisKKy8qIFRlc3Qgd2hldGhlciBgc2hfaW5mbycgZmllbGQgaW4gc2VjdGlvbiBoZWFkZXIgY29udGFpbnMgYSBzZWN0aW9uCisgICBpbmRleC4gIFRoZXJlIGFyZSB0d28ga2luZHMgb2Ygc2VjdGlvbnMgZG9pbmcgdGhpczoKKworICAgLSB0aGUgc2VjdGlvbnMgY29udGFpbmluZyByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHJlZmVyZW5jZSBpbiB0aGlzCisgICAgIGZpZWxkIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoZSByZWxvY2F0aW9ucyBhcHBseTsKKworICAgLSBzZWN0aW9uIHdpdGggdGhlIFNIRl9JTkZPX0xJTksgZmxhZyBzZXQgdG8gc2lnbmFsIHRoYXQgYHNoX2luZm8nCisgICAgIHJlZmVyZW5jZXMgYSBzZWN0aW9uLiAgVGhpcyBhbGxvd3MgY29ycmVjdCBoYW5kbGluZyBvZiB1bmtub3duCisgICAgIHNlY3Rpb25zLiAgKi8KKyNkZWZpbmUgU0hfSU5GT19MSU5LX1AoU2hkcikgXAorICAoKFNoZHIpLT5zaF90eXBlID09IFNIVF9SRUwgfHwgKFNoZHIpLT5zaF90eXBlID09IFNIVF9SRUxBCQkgICAgICBcCisgICB8fCAoKFNoZHIpLT5zaF9mbGFncyAmIFNIRl9JTkZPX0xJTkspICE9IDApCisKKworLyogV2hlbiBjb21iaW5pbmcgRUxGIHNlY3Rpb24gZmxhZ3Mgd2UgbXVzdCBkaXN0aW5ndWlzaCB0d28ga2luZHM6CisKKyAgIC0gZmxhZ3Mgd2hpY2ggY2F1c2UgcHJvYmxlbSBpZiBub3QgYWRkZWQgdG8gdGhlIHJlc3VsdCBldmVuIGlmIG5vdAorICAgICBwcmVzZW50IGluIGFsbCBpbnB1dCBzZWN0aW9ucworCisgICAtIGZsYWdzIHdoaWNoIGNhdXNlIHByb2JsZW0gaWYgYWRkZWQgdG8gdGhlIHJlc3VsdCBpZiBub3QgcHJlc2VudAorICAgICBpbiBhbGwgaW5wdXQgc2VjdGlvbnMKKworICAgVGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGlzIGZvciB0aGUgZ2VuZXJhbCBjYXNlLiAgVGhlcmUgbWlnaHQgYmUKKyAgIG1hY2hpbmUgc3BlY2lmaWMgZXh0ZW5zaW9ucy4gICovCisjZGVmaW5lIFNIX0ZMQUdTX0NPTUJJTkUoRmxhZ3MxLCBGbGFnczIpIFwKKyAgKCgoRmxhZ3MxIHwgRmxhZ3MyKQkJCQkJCQkgICAgICBcCisgICAgJiAoU0hGX1dSSVRFIHwgU0hGX0FMTE9DIHwgU0hGX0VYRUNJTlNUUiB8IFNIRl9MSU5LX09SREVSCQkgICAgICBcCisgICAgICAgfCBTSEZfT1NfTk9OQ09ORk9STUlORyB8IFNIRl9HUk9VUCkpCQkJCSAgICAgIFwKKyAgIHwgKEZsYWdzMSAmIEZsYWdzMiAmIChTSEZfTUVSR0UgfCBTSEZfU1RSSU5HUyB8IFNIRl9JTkZPX0xJTkspKSkKKworLyogU2ltaWxhciBtYWNybzogcmV0dXJuIHRoZSBiaXRzIG9mIHRoZSBmbGFncyB3aGljaCBuZWNlc3NhcmlseSBtdXN0CisgICBtYXRjaCBpZiB0d28gc2VjdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgY29tYmluZWQuICBTZWN0aW9ucyBzdGlsbAorICAgY2FuIGJlIGZvcmNlZnVsbHkgY29tYmluZWQgaW4gd2hpY2ggY2FzZSBTSF9GTEFHU19DT01CSU5FIGNhbiBiZQorICAgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbWJpbmVkIGZsYWdzLiAgKi8KKyNkZWZpbmUgU0hfRkxBR1NfSU1QT1JUQU5UKEZsYWdzKSBcCisgICgoRmxhZ3MpICYgfigoR0VsZl9Yd29yZCkgMCB8IFNIRl9MSU5LX09SREVSIHwgU0hGX09TX05PTkNPTkZPUk1JTkcpKQorCisKKy8qIFNpemUgb2YgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUgRUxGIHNwZWNpZmljYXRpb24gc2F5cyBhbGwKKyAgIGVudHJpZXMgYXJlIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0gMzItYml0cyBpbiBzaXplLiAgRWFybHkgNjQtYml0CisgICBwb3J0cyAobmFtZWx5IEFscGhhIGZvciBMaW51eCkgZ290IHRoaXMgd3JvbmcuICBUaGUgd29yZGluZyB3YXMgbm90CisgICBjbGVhci4KKworICAgU2V2ZXJhbCB5ZWFycyBsYXRlciB0aGUgQUJJIGZvciB0aGUgNjQtYml0IFMzOTBzIHdhcyBkZXZlbG9wZWQuCisgICBNYW55IHRoaW5ncyB3ZXJlIGNvcGllZCBmcm9tIHRoZSBJQS02NCBBQkkgKHdoaWNoIHVzZXMgdGhlIGNvcnJlY3QKKyAgIDMyLWJpdCBlbnRyeSBzaXplKSBidXQgd2hhdCBkbyB0aGVzZSBwZW9wbGUgZG8/ICBUaGV5IHVzZSA2NC1iaXQKKyAgIGVudHJpZXMuICBJdCBpcyByZWFsbHkgc2hvY2tpbmcgdG8gc2VlIHdoYXQga2luZCBvZiBtb3JvbnMgYXJlIG91dAorICAgdGhlcmUuICBBbmQgZXZlbiB3b3JzZTogdGhleSBhcmUgYWxsb3dlZCB0byBkZXNpZ24gQUJJcy4gICovCisjZGVmaW5lIFNIX0VOVFNJWkVfSEFTSChFaGRyKSBcCisgICgoRWhkciktPmVfbWFjaGluZSA9PSBFTV9BTFBIQQkJCQkJICAgICAgXAorICAgfHwgKChFaGRyKS0+ZV9tYWNoaW5lID09IEVNX1MzOTAJCQkJCSAgICAgIFwKKyAgICAgICAmJiAoRWhkciktPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTNjQpID8gOCA6IDQpCisKKyNlbmRpZgkvKiBlbGYta25vd2xlZGdlLmggKi8KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGYuaCBiL2xpYmVsZi9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQ2NTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZi5oCkBAIC0wLDAgKzEsMjU3NyBAQAorLyogVGhpcyBmaWxlIGRlZmluZXMgc3RhbmRhcmQgRUxGIHR5cGVzLCBzdHJ1Y3R1cmVzLCBhbmQgbWFjcm9zLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0VMRl9ICisjZGVmaW5lCV9FTEZfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFN0YW5kYXJkIEVMRiB0eXBlcy4gICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogVHlwZSBmb3IgYSAxNi1iaXQgcXVhbnRpdHkuICAqLwordHlwZWRlZiB1aW50MTZfdCBFbGYzMl9IYWxmOwordHlwZWRlZiB1aW50MTZfdCBFbGY2NF9IYWxmOworCisvKiBUeXBlcyBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCAzMi1iaXQgcXVhbnRpdGllcy4gICovCit0eXBlZGVmIHVpbnQzMl90IEVsZjMyX1dvcmQ7Cit0eXBlZGVmCWludDMyX3QgIEVsZjMyX1N3b3JkOwordHlwZWRlZiB1aW50MzJfdCBFbGY2NF9Xb3JkOwordHlwZWRlZglpbnQzMl90ICBFbGY2NF9Td29yZDsKKworLyogVHlwZXMgZm9yIHNpZ25lZCBhbmQgdW5zaWduZWQgNjQtYml0IHF1YW50aXRpZXMuICAqLwordHlwZWRlZiB1aW50NjRfdCBFbGYzMl9Yd29yZDsKK3R5cGVkZWYJaW50NjRfdCAgRWxmMzJfU3h3b3JkOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9Yd29yZDsKK3R5cGVkZWYJaW50NjRfdCAgRWxmNjRfU3h3b3JkOworCisvKiBUeXBlIG9mIGFkZHJlc3Nlcy4gICovCit0eXBlZGVmIHVpbnQzMl90IEVsZjMyX0FkZHI7Cit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X0FkZHI7CisKKy8qIFR5cGUgb2YgZmlsZSBvZmZzZXRzLiAgKi8KK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfT2ZmOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9PZmY7CisKKy8qIFR5cGUgZm9yIHNlY3Rpb24gaW5kaWNlcywgd2hpY2ggYXJlIDE2LWJpdCBxdWFudGl0aWVzLiAgKi8KK3R5cGVkZWYgdWludDE2X3QgRWxmMzJfU2VjdGlvbjsKK3R5cGVkZWYgdWludDE2X3QgRWxmNjRfU2VjdGlvbjsKKworLyogVHlwZSBmb3IgdmVyc2lvbiBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBFbGYzMl9IYWxmIEVsZjMyX1ZlcnN5bTsKK3R5cGVkZWYgRWxmNjRfSGFsZiBFbGY2NF9WZXJzeW07CisKKworLyogVGhlIEVMRiBmaWxlIGhlYWRlci4gIFRoaXMgYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgRUxGIGZpbGUuICAqLworCisjZGVmaW5lIEVJX05JREVOVCAoMTYpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBNYWdpYyBudW1iZXIgYW5kIG90aGVyIGluZm8gKi8KKyAgRWxmMzJfSGFsZgllX3R5cGU7CQkJLyogT2JqZWN0IGZpbGUgdHlwZSAqLworICBFbGYzMl9IYWxmCWVfbWFjaGluZTsJCS8qIEFyY2hpdGVjdHVyZSAqLworICBFbGYzMl9Xb3JkCWVfdmVyc2lvbjsJCS8qIE9iamVjdCBmaWxlIHZlcnNpb24gKi8KKyAgRWxmMzJfQWRkcgllX2VudHJ5OwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCisgIEVsZjMyX09mZgllX3Bob2ZmOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KKyAgRWxmMzJfT2ZmCWVfc2hvZmY7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICBFbGYzMl9Xb3JkCWVfZmxhZ3M7CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KKyAgRWxmMzJfSGFsZgllX2Voc2l6ZTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLworICBFbGYzMl9IYWxmCWVfcGhlbnRzaXplOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICBFbGYzMl9IYWxmCWVfcGhudW07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLworICBFbGYzMl9IYWxmCWVfc2hlbnRzaXplOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICBFbGYzMl9IYWxmCWVfc2hudW07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLworICBFbGYzMl9IYWxmCWVfc2hzdHJuZHg7CQkvKiBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXggKi8KK30gRWxmMzJfRWhkcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhcgllX2lkZW50W0VJX05JREVOVF07CS8qIE1hZ2ljIG51bWJlciBhbmQgb3RoZXIgaW5mbyAqLworICBFbGY2NF9IYWxmCWVfdHlwZTsJCQkvKiBPYmplY3QgZmlsZSB0eXBlICovCisgIEVsZjY0X0hhbGYJZV9tYWNoaW5lOwkJLyogQXJjaGl0ZWN0dXJlICovCisgIEVsZjY0X1dvcmQJZV92ZXJzaW9uOwkJLyogT2JqZWN0IGZpbGUgdmVyc2lvbiAqLworICBFbGY2NF9BZGRyCWVfZW50cnk7CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmNjRfT2ZmCWVfcGhvZmY7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICBFbGY2NF9PZmYJZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X1dvcmQJZV9mbGFnczsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLworICBFbGY2NF9IYWxmCWVfZWhzaXplOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCisgIEVsZjY0X0hhbGYJZV9waGVudHNpemU7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCisgIEVsZjY0X0hhbGYJZV9waG51bTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgIEVsZjY0X0hhbGYJZV9zaGVudHNpemU7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCisgIEVsZjY0X0hhbGYJZV9zaG51bTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgIEVsZjY0X0hhbGYJZV9zaHN0cm5keDsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLworfSBFbGY2NF9FaGRyOworCisvKiBGaWVsZHMgaW4gdGhlIGVfaWRlbnQgYXJyYXkuICBUaGUgRUlfKiBtYWNyb3MgYXJlIGluZGljZXMgaW50byB0aGUKKyAgIGFycmF5LiAgVGhlIG1hY3JvcyB1bmRlciBlYWNoIEVJXyogbWFjcm8gYXJlIHRoZSB2YWx1ZXMgdGhlIGJ5dGUKKyAgIG1heSBoYXZlLiAgKi8KKworI2RlZmluZSBFSV9NQUcwCQkwCQkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMCBpbmRleCAqLworI2RlZmluZSBFTEZNQUcwCQkweDdmCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAwICovCisKKyNkZWZpbmUgRUlfTUFHMQkJMQkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDEgaW5kZXggKi8KKyNkZWZpbmUgRUxGTUFHMQkJJ0UnCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAxICovCisKKyNkZWZpbmUgRUlfTUFHMgkJMgkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDIgaW5kZXggKi8KKyNkZWZpbmUgRUxGTUFHMgkJJ0wnCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAyICovCisKKyNkZWZpbmUgRUlfTUFHMwkJMwkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDMgaW5kZXggKi8KKyNkZWZpbmUgRUxGTUFHMwkJJ0YnCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAzICovCisKKy8qIENvbmdsb21lcmF0aW9uIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBieXRlcywgZm9yIGVhc3kgdGVzdGluZyBhcyBhIHdvcmQuICAqLworI2RlZmluZQlFTEZNQUcJCSJcMTc3RUxGIgorI2RlZmluZQlTRUxGTUFHCQk0CisKKyNkZWZpbmUgRUlfQ0xBU1MJNAkJLyogRmlsZSBjbGFzcyBieXRlIGluZGV4ICovCisjZGVmaW5lIEVMRkNMQVNTTk9ORQkwCQkvKiBJbnZhbGlkIGNsYXNzICovCisjZGVmaW5lIEVMRkNMQVNTMzIJMQkJLyogMzItYml0IG9iamVjdHMgKi8KKyNkZWZpbmUgRUxGQ0xBU1M2NAkyCQkvKiA2NC1iaXQgb2JqZWN0cyAqLworI2RlZmluZSBFTEZDTEFTU05VTQkzCisKKyNkZWZpbmUgRUlfREFUQQkJNQkJLyogRGF0YSBlbmNvZGluZyBieXRlIGluZGV4ICovCisjZGVmaW5lIEVMRkRBVEFOT05FCTAJCS8qIEludmFsaWQgZGF0YSBlbmNvZGluZyAqLworI2RlZmluZSBFTEZEQVRBMkxTQgkxCQkvKiAyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBFTEZEQVRBMk1TQgkyCQkvKiAyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiAqLworI2RlZmluZSBFTEZEQVRBTlVNCTMKKworI2RlZmluZSBFSV9WRVJTSU9OCTYJCS8qIEZpbGUgdmVyc2lvbiBieXRlIGluZGV4ICovCisJCQkJCS8qIFZhbHVlIG11c3QgYmUgRVZfQ1VSUkVOVCAqLworCisjZGVmaW5lIEVJX09TQUJJCTcJCS8qIE9TIEFCSSBpZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSBFTEZPU0FCSV9OT05FCQkwCS8qIFVOSVggU3lzdGVtIFYgQUJJICovCisjZGVmaW5lIEVMRk9TQUJJX1NZU1YJCTAJLyogQWxpYXMuICAqLworI2RlZmluZSBFTEZPU0FCSV9IUFVYCQkxCS8qIEhQLVVYICovCisjZGVmaW5lIEVMRk9TQUJJX05FVEJTRAkJMgkvKiBOZXRCU0QuICAqLworI2RlZmluZSBFTEZPU0FCSV9MSU5VWAkJMwkvKiBMaW51eC4gICovCisjZGVmaW5lIEVMRk9TQUJJX1NPTEFSSVMJNgkvKiBTdW4gU29sYXJpcy4gICovCisjZGVmaW5lIEVMRk9TQUJJX0FJWAkJNwkvKiBJQk0gQUlYLiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfSVJJWAkJOAkvKiBTR0kgSXJpeC4gICovCisjZGVmaW5lIEVMRk9TQUJJX0ZSRUVCU0QJOQkvKiBGcmVlQlNELiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfVFJVNjQJCTEwCS8qIENvbXBhcSBUUlU2NCBVTklYLiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfTU9ERVNUTwkxMQkvKiBOb3ZlbGwgTW9kZXN0by4gICovCisjZGVmaW5lIEVMRk9TQUJJX09QRU5CU0QJMTIJLyogT3BlbkJTRC4gICovCisjZGVmaW5lIEVMRk9TQUJJX0FSTQkJOTcJLyogQVJNICovCisjZGVmaW5lIEVMRk9TQUJJX1NUQU5EQUxPTkUJMjU1CS8qIFN0YW5kYWxvbmUgKGVtYmVkZGVkKSBhcHBsaWNhdGlvbiAqLworCisjZGVmaW5lIEVJX0FCSVZFUlNJT04JOAkJLyogQUJJIHZlcnNpb24gKi8KKworI2RlZmluZSBFSV9QQUQJCTkJCS8qIEJ5dGUgaW5kZXggb2YgcGFkZGluZyBieXRlcyAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfdHlwZSAob2JqZWN0IGZpbGUgdHlwZSkuICAqLworCisjZGVmaW5lIEVUX05PTkUJCTAJCS8qIE5vIGZpbGUgdHlwZSAqLworI2RlZmluZSBFVF9SRUwJCTEJCS8qIFJlbG9jYXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVRfRVhFQwkJMgkJLyogRXhlY3V0YWJsZSBmaWxlICovCisjZGVmaW5lIEVUX0RZTgkJMwkJLyogU2hhcmVkIG9iamVjdCBmaWxlICovCisjZGVmaW5lIEVUX0NPUkUJCTQJCS8qIENvcmUgZmlsZSAqLworI2RlZmluZQlFVF9OVU0JCTUJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzICovCisjZGVmaW5lIEVUX0xPT1MJCTB4ZmUwMAkJLyogT1Mtc3BlY2lmaWMgcmFuZ2Ugc3RhcnQgKi8KKyNkZWZpbmUgRVRfSElPUwkJMHhmZWZmCQkvKiBPUy1zcGVjaWZpYyByYW5nZSBlbmQgKi8KKyNkZWZpbmUgRVRfTE9QUk9DCTB4ZmYwMAkJLyogUHJvY2Vzc29yLXNwZWNpZmljIHJhbmdlIHN0YXJ0ICovCisjZGVmaW5lIEVUX0hJUFJPQwkweGZmZmYJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyByYW5nZSBlbmQgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBlX21hY2hpbmUgKGFyY2hpdGVjdHVyZSkuICAqLworCisjZGVmaW5lIEVNX05PTkUJCSAwCQkvKiBObyBtYWNoaW5lICovCisjZGVmaW5lIEVNX00zMgkJIDEJCS8qIEFUJlQgV0UgMzIxMDAgKi8KKyNkZWZpbmUgRU1fU1BBUkMJIDIJCS8qIFNVTiBTUEFSQyAqLworI2RlZmluZSBFTV8zODYJCSAzCQkvKiBJbnRlbCA4MDM4NiAqLworI2RlZmluZSBFTV82OEsJCSA0CQkvKiBNb3Rvcm9sYSBtNjhrIGZhbWlseSAqLworI2RlZmluZSBFTV84OEsJCSA1CQkvKiBNb3Rvcm9sYSBtODhrIGZhbWlseSAqLworI2RlZmluZSBFTV84NjAJCSA3CQkvKiBJbnRlbCA4MDg2MCAqLworI2RlZmluZSBFTV9NSVBTCQkgOAkJLyogTUlQUyBSMzAwMCBiaWctZW5kaWFuICovCisjZGVmaW5lIEVNX1MzNzAJCSA5CQkvKiBJQk0gU3lzdGVtLzM3MCAqLworI2RlZmluZSBFTV9NSVBTX1JTM19MRQkxMAkJLyogTUlQUyBSMzAwMCBsaXR0bGUtZW5kaWFuICovCisKKyNkZWZpbmUgRU1fUEFSSVNDCTE1CQkvKiBIUFBBICovCisjZGVmaW5lIEVNX1ZQUDUwMAkxNwkJLyogRnVqaXRzdSBWUFA1MDAgKi8KKyNkZWZpbmUgRU1fU1BBUkMzMlBMVVMJMTgJCS8qIFN1bidzICJ2OHBsdXMiICovCisjZGVmaW5lIEVNXzk2MAkJMTkJCS8qIEludGVsIDgwOTYwICovCisjZGVmaW5lIEVNX1BQQwkJMjAJCS8qIFBvd2VyUEMgKi8KKyNkZWZpbmUgRU1fUFBDNjQJMjEJCS8qIFBvd2VyUEMgNjQtYml0ICovCisjZGVmaW5lIEVNX1MzOTAJCTIyCQkvKiBJQk0gUzM5MCAqLworCisjZGVmaW5lIEVNX1Y4MDAJCTM2CQkvKiBORUMgVjgwMCBzZXJpZXMgKi8KKyNkZWZpbmUgRU1fRlIyMAkJMzcJCS8qIEZ1aml0c3UgRlIyMCAqLworI2RlZmluZSBFTV9SSDMyCQkzOAkJLyogVFJXIFJILTMyICovCisjZGVmaW5lIEVNX1JDRQkJMzkJCS8qIE1vdG9yb2xhIFJDRSAqLworI2RlZmluZSBFTV9BUk0JCTQwCQkvKiBBUk0gKi8KKyNkZWZpbmUgRU1fRkFLRV9BTFBIQQk0MQkJLyogRGlnaXRhbCBBbHBoYSAqLworI2RlZmluZSBFTV9TSAkJNDIJCS8qIEhpdGFjaGkgU0ggKi8KKyNkZWZpbmUgRU1fU1BBUkNWOQk0MwkJLyogU1BBUkMgdjkgNjQtYml0ICovCisjZGVmaW5lIEVNX1RSSUNPUkUJNDQJCS8qIFNpZW1lbnMgVHJpY29yZSAqLworI2RlZmluZSBFTV9BUkMJCTQ1CQkvKiBBcmdvbmF1dCBSSVNDIENvcmUgKi8KKyNkZWZpbmUgRU1fSDhfMzAwCTQ2CQkvKiBIaXRhY2hpIEg4LzMwMCAqLworI2RlZmluZSBFTV9IOF8zMDBICTQ3CQkvKiBIaXRhY2hpIEg4LzMwMEggKi8KKyNkZWZpbmUgRU1fSDhTCQk0OAkJLyogSGl0YWNoaSBIOFMgKi8KKyNkZWZpbmUgRU1fSDhfNTAwCTQ5CQkvKiBIaXRhY2hpIEg4LzUwMCAqLworI2RlZmluZSBFTV9JQV82NAk1MAkJLyogSW50ZWwgTWVyY2VkICovCisjZGVmaW5lIEVNX01JUFNfWAk1MQkJLyogU3RhbmZvcmQgTUlQUy1YICovCisjZGVmaW5lIEVNX0NPTERGSVJFCTUyCQkvKiBNb3Rvcm9sYSBDb2xkZmlyZSAqLworI2RlZmluZSBFTV82OEhDMTIJNTMJCS8qIE1vdG9yb2xhIE02OEhDMTIgKi8KKyNkZWZpbmUgRU1fTU1BCQk1NAkJLyogRnVqaXRzdSBNTUEgTXVsdGltZWRpYSBBY2NlbGVyYXRvciovCisjZGVmaW5lIEVNX1BDUAkJNTUJCS8qIFNpZW1lbnMgUENQICovCisjZGVmaW5lIEVNX05DUFUJCTU2CQkvKiBTb255IG5DUFUgZW1iZWVkZWQgUklTQyAqLworI2RlZmluZSBFTV9ORFIxCQk1NwkJLyogRGVuc28gTkRSMSBtaWNyb3Byb2Nlc3NvciAqLworI2RlZmluZSBFTV9TVEFSQ09SRQk1OAkJLyogTW90b3JvbGEgU3RhcnQqQ29yZSBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fTUUxNgkJNTkJCS8qIFRveW90YSBNRTE2IHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9TVDEwMAk2MAkJLyogU1RNaWNyb2VsZWN0cm9uaWMgU1QxMDAgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1RJTllKCTYxCQkvKiBBZHZhbmNlZCBMb2dpYyBDb3JwLiBUaW55aiBlbWIuZmFtKi8KKyNkZWZpbmUgRU1fWDg2XzY0CTYyCQkvKiBBTUQgeDg2LTY0IGFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBFTV9QRFNQCQk2MwkJLyogU29ueSBEU1AgUHJvY2Vzc29yICovCisKKyNkZWZpbmUgRU1fRlg2NgkJNjYJCS8qIFNpZW1lbnMgRlg2NiBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fU1Q5UExVUwk2NwkJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUOSsgOC8xNiBtYyAqLworI2RlZmluZSBFTV9TVDcJCTY4CQkvKiBTVG1pY3JvZWxlY3Ryb25pY3MgU1Q3IDggYml0IG1jICovCisjZGVmaW5lIEVNXzY4SEMxNgk2OQkJLyogTW90b3JvbGEgTUM2OEhDMTYgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNXzY4SEMxMQk3MAkJLyogTW90b3JvbGEgTUM2OEhDMTEgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNXzY4SEMwOAk3MQkJLyogTW90b3JvbGEgTUM2OEhDMDggbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNXzY4SEMwNQk3MgkJLyogTW90b3JvbGEgTUM2OEhDMDUgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNX1NWWAkJNzMJCS8qIFNpbGljb24gR3JhcGhpY3MgU1Z4ICovCisjZGVmaW5lIEVNX1NUMTkJCTc0CQkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1QxOSA4IGJpdCBtYyAqLworI2RlZmluZSBFTV9WQVgJCTc1CQkvKiBEaWdpdGFsIFZBWCAqLworI2RlZmluZSBFTV9DUklTCQk3NgkJLyogQXhpcyBDb21tdW5pY2F0aW9ucyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0pBVkVMSU4JNzcJCS8qIEluZmluZW9uIFRlY2hub2xvZ2llcyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0ZJUkVQQVRICTc4CQkvKiBFbGVtZW50IDE0IDY0LWJpdCBEU1AgUHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1pTUAkJNzkJCS8qIExTSSBMb2dpYyAxNi1iaXQgRFNQIFByb2Nlc3NvciAqLworI2RlZmluZSBFTV9NTUlYCQk4MAkJLyogRG9uYWxkIEtudXRoJ3MgZWR1Y2F0aW9uYWwgNjQtYml0IHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9IVUFOWQk4MQkJLyogSGFydmFyZCBVbml2ZXJzaXR5IG1hY2hpbmUtaW5kZXBlbmRlbnQgb2JqZWN0IGZpbGVzICovCisjZGVmaW5lIEVNX1BSSVNNCTgyCQkvKiBTaVRlcmEgUHJpc20gKi8KKyNkZWZpbmUgRU1fQVZSCQk4MwkJLyogQXRtZWwgQVZSIDgtYml0IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV9GUjMwCQk4NAkJLyogRnVqaXRzdSBGUjMwICovCisjZGVmaW5lIEVNX0QxMFYJCTg1CQkvKiBNaXRzdWJpc2hpIEQxMFYgKi8KKyNkZWZpbmUgRU1fRDMwVgkJODYJCS8qIE1pdHN1YmlzaGkgRDMwViAqLworI2RlZmluZSBFTV9WODUwCQk4NwkJLyogTkVDIHY4NTAgKi8KKyNkZWZpbmUgRU1fTTMyUgkJODgJCS8qIE1pdHN1YmlzaGkgTTMyUiAqLworI2RlZmluZSBFTV9NTjEwMzAwCTg5CQkvKiBNYXRzdXNoaXRhIE1OMTAzMDAgKi8KKyNkZWZpbmUgRU1fTU4xMDIwMAk5MAkJLyogTWF0c3VzaGl0YSBNTjEwMjAwICovCisjZGVmaW5lIEVNX1BKCQk5MQkJLyogcGljb0phdmEgKi8KKyNkZWZpbmUgRU1fT1BFTlJJU0MJOTIJCS8qIE9wZW5SSVNDIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fQVJDX0E1CTkzCQkvKiBBUkMgQ29yZXMgVGFuZ2VudC1BNSAqLworI2RlZmluZSBFTV9YVEVOU0EJOTQJCS8qIFRlbnNpbGljYSBYdGVuc2EgQXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEVNX05VTQkJOTUKKworLyogSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFzc2lnbiBuZXcgdW5vZmZpY2lhbCBFTV8qIHZhbHVlcywgcGxlYXNlCisgICBwaWNrIGxhcmdlIHJhbmRvbSBudW1iZXJzICgweDg1MjMsIDB4YTdmMiwgZXRjLikgdG8gbWluaW1pemUgdGhlCisgICBjaGFuY2VzIG9mIGNvbGxpc2lvbiB3aXRoIG9mZmljaWFsIG9yIG5vbi1HTlUgdW5vZmZpY2lhbCB2YWx1ZXMuICAqLworCisjZGVmaW5lIEVNX0FMUEhBCTB4OTAyNgorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfdmVyc2lvbiAodmVyc2lvbikuICAqLworCisjZGVmaW5lIEVWX05PTkUJCTAJCS8qIEludmFsaWQgRUxGIHZlcnNpb24gKi8KKyNkZWZpbmUgRVZfQ1VSUkVOVAkxCQkvKiBDdXJyZW50IHZlcnNpb24gKi8KKyNkZWZpbmUgRVZfTlVNCQkyCisKKy8qIFNlY3Rpb24gaGVhZGVyLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZAlzaF9uYW1lOwkJLyogU2VjdGlvbiBuYW1lIChzdHJpbmcgdGJsIGluZGV4KSAqLworICBFbGYzMl9Xb3JkCXNoX3R5cGU7CQkvKiBTZWN0aW9uIHR5cGUgKi8KKyAgRWxmMzJfV29yZAlzaF9mbGFnczsJCS8qIFNlY3Rpb24gZmxhZ3MgKi8KKyAgRWxmMzJfQWRkcglzaF9hZGRyOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCisgIEVsZjMyX09mZglzaF9vZmZzZXQ7CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCisgIEVsZjMyX1dvcmQJc2hfc2l6ZTsJCS8qIFNlY3Rpb24gc2l6ZSBpbiBieXRlcyAqLworICBFbGYzMl9Xb3JkCXNoX2xpbms7CQkvKiBMaW5rIHRvIGFub3RoZXIgc2VjdGlvbiAqLworICBFbGYzMl9Xb3JkCXNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgRWxmMzJfV29yZAlzaF9hZGRyYWxpZ247CQkvKiBTZWN0aW9uIGFsaWdubWVudCAqLworICBFbGYzMl9Xb3JkCXNoX2VudHNpemU7CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KK30gRWxmMzJfU2hkcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZAlzaF9uYW1lOwkJLyogU2VjdGlvbiBuYW1lIChzdHJpbmcgdGJsIGluZGV4KSAqLworICBFbGY2NF9Xb3JkCXNoX3R5cGU7CQkvKiBTZWN0aW9uIHR5cGUgKi8KKyAgRWxmNjRfWHdvcmQJc2hfZmxhZ3M7CQkvKiBTZWN0aW9uIGZsYWdzICovCisgIEVsZjY0X0FkZHIJc2hfYWRkcjsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLworICBFbGY2NF9PZmYJc2hfb2Zmc2V0OwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLworICBFbGY2NF9Yd29yZAlzaF9zaXplOwkJLyogU2VjdGlvbiBzaXplIGluIGJ5dGVzICovCisgIEVsZjY0X1dvcmQJc2hfbGluazsJCS8qIExpbmsgdG8gYW5vdGhlciBzZWN0aW9uICovCisgIEVsZjY0X1dvcmQJc2hfaW5mbzsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLworICBFbGY2NF9Yd29yZAlzaF9hZGRyYWxpZ247CQkvKiBTZWN0aW9uIGFsaWdubWVudCAqLworICBFbGY2NF9Yd29yZAlzaF9lbnRzaXplOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCit9IEVsZjY0X1NoZHI7CisKKy8qIFNwZWNpYWwgc2VjdGlvbiBpbmRpY2VzLiAgKi8KKworI2RlZmluZSBTSE5fVU5ERUYJMAkJLyogVW5kZWZpbmVkIHNlY3Rpb24gKi8KKyNkZWZpbmUgU0hOX0xPUkVTRVJWRQkweGZmMDAJCS8qIFN0YXJ0IG9mIHJlc2VydmVkIGluZGljZXMgKi8KKyNkZWZpbmUgU0hOX0xPUFJPQwkweGZmMDAJCS8qIFN0YXJ0IG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTSE5fQkVGT1JFCTB4ZmYwMAkJLyogT3JkZXIgc2VjdGlvbiBiZWZvcmUgYWxsIG90aGVycworCQkJCQkgICAoU29sYXJpcykuICAqLworI2RlZmluZSBTSE5fQUZURVIJMHhmZjAxCQkvKiBPcmRlciBzZWN0aW9uIGFmdGVyIGFsbCBvdGhlcnMKKwkJCQkJICAgKFNvbGFyaXMpLiAgKi8KKyNkZWZpbmUgU0hOX0hJUFJPQwkweGZmMWYJCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hOX0xPT1MJMHhmZjIwCQkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTSE5fSElPUwkweGZmM2YJCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTSE5fQUJTCQkweGZmZjEJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIGlzIGFic29sdXRlICovCisjZGVmaW5lIFNITl9DT01NT04JMHhmZmYyCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBjb21tb24gKi8KKyNkZWZpbmUgU0hOX1hJTkRFWAkweGZmZmYJCS8qIEluZGV4IGlzIGluIGV4dHJhIHRhYmxlLiAgKi8KKyNkZWZpbmUgU0hOX0hJUkVTRVJWRQkweGZmZmYJCS8qIEVuZCBvZiByZXNlcnZlZCBpbmRpY2VzICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfdHlwZSAoc2VjdGlvbiB0eXBlKS4gICovCisKKyNkZWZpbmUgU0hUX05VTEwJICAwCQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSB1bnVzZWQgKi8KKyNkZWZpbmUgU0hUX1BST0dCSVRTCSAgMQkJLyogUHJvZ3JhbSBkYXRhICovCisjZGVmaW5lIFNIVF9TWU1UQUIJICAyCQkvKiBTeW1ib2wgdGFibGUgKi8KKyNkZWZpbmUgU0hUX1NUUlRBQgkgIDMJCS8qIFN0cmluZyB0YWJsZSAqLworI2RlZmluZSBTSFRfUkVMQQkgIDQJCS8qIFJlbG9jYXRpb24gZW50cmllcyB3aXRoIGFkZGVuZHMgKi8KKyNkZWZpbmUgU0hUX0hBU0gJICA1CQkvKiBTeW1ib2wgaGFzaCB0YWJsZSAqLworI2RlZmluZSBTSFRfRFlOQU1JQwkgIDYJCS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBTSFRfTk9URQkgIDcJCS8qIE5vdGVzICovCisjZGVmaW5lIFNIVF9OT0JJVFMJICA4CQkvKiBQcm9ncmFtIHNwYWNlIHdpdGggbm8gZGF0YSAoYnNzKSAqLworI2RlZmluZSBTSFRfUkVMCQkgIDkJCS8qIFJlbG9jYXRpb24gZW50cmllcywgbm8gYWRkZW5kcyAqLworI2RlZmluZSBTSFRfU0hMSUIJICAxMAkJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU0hUX0RZTlNZTQkgIDExCQkvKiBEeW5hbWljIGxpbmtlciBzeW1ib2wgdGFibGUgKi8KKyNkZWZpbmUgU0hUX0lOSVRfQVJSQVkJICAxNAkJLyogQXJyYXkgb2YgY29uc3RydWN0b3JzICovCisjZGVmaW5lIFNIVF9GSU5JX0FSUkFZCSAgMTUJCS8qIEFycmF5IG9mIGRlc3RydWN0b3JzICovCisjZGVmaW5lIFNIVF9QUkVJTklUX0FSUkFZIDE2CQkvKiBBcnJheSBvZiBwcmUtY29uc3RydWN0b3JzICovCisjZGVmaW5lIFNIVF9HUk9VUAkgIDE3CQkvKiBTZWN0aW9uIGdyb3VwICovCisjZGVmaW5lIFNIVF9TWU1UQUJfU0hORFggIDE4CQkvKiBFeHRlbmRlZCBzZWN0aW9uIGluZGVjZXMgKi8KKyNkZWZpbmUJU0hUX05VTQkJICAxOQkJLyogTnVtYmVyIG9mIGRlZmluZWQgdHlwZXMuICAqLworI2RlZmluZSBTSFRfTE9PUwkgIDB4NjAwMDAwMDAJLyogU3RhcnQgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hUX0dOVV9MSUJMSVNUCSAgMHg2ZmZmZmZmNwkvKiBQcmVsaW5rIGxpYnJhcnkgbGlzdCAqLworI2RlZmluZSBTSFRfQ0hFQ0tTVU0JICAweDZmZmZmZmY4CS8qIENoZWNrc3VtIGZvciBEU08gY29udGVudC4gICovCisjZGVmaW5lIFNIVF9MT1NVTlcJICAweDZmZmZmZmZhCS8qIFN1bi1zcGVjaWZpYyBsb3cgYm91bmQuICAqLworI2RlZmluZSBTSFRfU1VOV19tb3ZlCSAgMHg2ZmZmZmZmYQorI2RlZmluZSBTSFRfU1VOV19DT01EQVQgICAweDZmZmZmZmZiCisjZGVmaW5lIFNIVF9TVU5XX3N5bWluZm8gIDB4NmZmZmZmZmMKKyNkZWZpbmUgU0hUX0dOVV92ZXJkZWYJICAweDZmZmZmZmZkCS8qIFZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX0dOVV92ZXJuZWVkCSAgMHg2ZmZmZmZmZQkvKiBWZXJzaW9uIG5lZWRzIHNlY3Rpb24uICAqLworI2RlZmluZSBTSFRfR05VX3ZlcnN5bQkgIDB4NmZmZmZmZmYJLyogVmVyc2lvbiBzeW1ib2wgdGFibGUuICAqLworI2RlZmluZSBTSFRfSElTVU5XCSAgMHg2ZmZmZmZmZgkvKiBTdW4tc3BlY2lmaWMgaGlnaCBib3VuZC4gICovCisjZGVmaW5lIFNIVF9ISU9TCSAgMHg2ZmZmZmZmZgkvKiBFbmQgT1Mtc3BlY2lmaWMgdHlwZSAqLworI2RlZmluZSBTSFRfTE9QUk9DCSAgMHg3MDAwMDAwMAkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hUX0hJUFJPQwkgIDB4N2ZmZmZmZmYJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTSFRfTE9VU0VSCSAgMHg4MDAwMDAwMAkvKiBTdGFydCBvZiBhcHBsaWNhdGlvbi1zcGVjaWZpYyAqLworI2RlZmluZSBTSFRfSElVU0VSCSAgMHg4ZmZmZmZmZgkvKiBFbmQgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF9mbGFncyAoc2VjdGlvbiBmbGFncykuICAqLworCisjZGVmaW5lIFNIRl9XUklURQkgICAgICgxIDw8IDApCS8qIFdyaXRhYmxlICovCisjZGVmaW5lIFNIRl9BTExPQwkgICAgICgxIDw8IDEpCS8qIE9jY3VwaWVzIG1lbW9yeSBkdXJpbmcgZXhlY3V0aW9uICovCisjZGVmaW5lIFNIRl9FWEVDSU5TVFIJICAgICAoMSA8PCAyKQkvKiBFeGVjdXRhYmxlICovCisjZGVmaW5lIFNIRl9NRVJHRQkgICAgICgxIDw8IDQpCS8qIE1pZ2h0IGJlIG1lcmdlZCAqLworI2RlZmluZSBTSEZfU1RSSU5HUwkgICAgICgxIDw8IDUpCS8qIENvbnRhaW5zIG51bC10ZXJtaW5hdGVkIHN0cmluZ3MgKi8KKyNkZWZpbmUgU0hGX0lORk9fTElOSwkgICAgICgxIDw8IDYpCS8qIGBzaF9pbmZvJyBjb250YWlucyBTSFQgaW5kZXggKi8KKyNkZWZpbmUgU0hGX0xJTktfT1JERVIJICAgICAoMSA8PCA3KQkvKiBQcmVzZXJ2ZSBvcmRlciBhZnRlciBjb21iaW5pbmcgKi8KKyNkZWZpbmUgU0hGX09TX05PTkNPTkZPUk1JTkcgKDEgPDwgOCkJLyogTm9uLXN0YW5kYXJkIE9TIHNwZWNpZmljIGhhbmRsaW5nCisJCQkJCSAgIHJlcXVpcmVkICovCisjZGVmaW5lIFNIRl9HUk9VUAkgICAgICgxIDw8IDkpCS8qIFNlY3Rpb24gaXMgbWVtYmVyIG9mIGEgZ3JvdXAuICAqLworI2RlZmluZSBTSEZfVExTCQkgICAgICgxIDw8IDEwKQkvKiBTZWN0aW9uIGhvbGQgdGhyZWFkLWxvY2FsIGRhdGEuICAqLworI2RlZmluZSBTSEZfTUFTS09TCSAgICAgMHgwZmYwMDAwMAkvKiBPUy1zcGVjaWZpYy4gICovCisjZGVmaW5lIFNIRl9NQVNLUFJPQwkgICAgIDB4ZjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIFNIRl9PUkRFUkVECSAgICAgKDEgPDwgMzApCS8qIFNwZWNpYWwgb3JkZXJpbmcgcmVxdWlyZW1lbnQKKwkJCQkJICAgKFNvbGFyaXMpLiAgKi8KKyNkZWZpbmUgU0hGX0VYQ0xVREUJICAgICAoMSA8PCAzMSkJLyogU2VjdGlvbiBpcyBleGNsdWRlZCB1bmxlc3MKKwkJCQkJICAgcmVmZXJlbmNlZCBvciBhbGxvY2F0ZWQgKFNvbGFyaXMpLiovCisKKy8qIFNlY3Rpb24gZ3JvdXAgaGFuZGxpbmcuICAqLworI2RlZmluZSBHUlBfQ09NREFUCTB4MQkJLyogTWFyayBncm91cCBhcyBDT01EQVQuICAqLworCisvKiBTeW1ib2wgdGFibGUgZW50cnkuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkCXN0X25hbWU7CQkvKiBTeW1ib2wgbmFtZSAoc3RyaW5nIHRibCBpbmRleCkgKi8KKyAgRWxmMzJfQWRkcglzdF92YWx1ZTsJCS8qIFN5bWJvbCB2YWx1ZSAqLworICBFbGYzMl9Xb3JkCXN0X3NpemU7CQkvKiBTeW1ib2wgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyCXN0X2luZm87CQkvKiBTeW1ib2wgdHlwZSBhbmQgYmluZGluZyAqLworICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOwkJLyogU3ltYm9sIHZpc2liaWxpdHkgKi8KKyAgRWxmMzJfU2VjdGlvbglzdF9zaG5keDsJCS8qIFNlY3Rpb24gaW5kZXggKi8KK30gRWxmMzJfU3ltOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkCXN0X25hbWU7CQkvKiBTeW1ib2wgbmFtZSAoc3RyaW5nIHRibCBpbmRleCkgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9pbmZvOwkJLyogU3ltYm9sIHR5cGUgYW5kIGJpbmRpbmcgKi8KKyAgdW5zaWduZWQgY2hhciBzdF9vdGhlcjsJCS8qIFN5bWJvbCB2aXNpYmlsaXR5ICovCisgIEVsZjY0X1NlY3Rpb24Jc3Rfc2huZHg7CQkvKiBTZWN0aW9uIGluZGV4ICovCisgIEVsZjY0X0FkZHIJc3RfdmFsdWU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KKyAgRWxmNjRfWHdvcmQJc3Rfc2l6ZTsJCS8qIFN5bWJvbCBzaXplICovCit9IEVsZjY0X1N5bTsKKworLyogVGhlIHN5bWluZm8gc2VjdGlvbiBpZiBhdmFpbGFibGUgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dAorICAgZXZlcnkgZHluYW1pYyBzeW1ib2wuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9IYWxmIHNpX2JvdW5kdG87CQkvKiBEaXJlY3QgYmluZGluZ3MsIHN5bWJvbCBib3VuZCB0byAqLworICBFbGYzMl9IYWxmIHNpX2ZsYWdzOwkJCS8qIFBlciBzeW1ib2wgZmxhZ3MgKi8KK30gRWxmMzJfU3ltaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfSGFsZiBzaV9ib3VuZHRvOwkJLyogRGlyZWN0IGJpbmRpbmdzLCBzeW1ib2wgYm91bmQgdG8gKi8KKyAgRWxmNjRfSGFsZiBzaV9mbGFnczsJCQkvKiBQZXIgc3ltYm9sIGZsYWdzICovCit9IEVsZjY0X1N5bWluZm87CisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3Igc2lfYm91bmR0by4gICovCisjZGVmaW5lIFNZTUlORk9fQlRfU0VMRgkJMHhmZmZmCS8qIFN5bWJvbCBib3VuZCB0byBzZWxmICovCisjZGVmaW5lIFNZTUlORk9fQlRfUEFSRU5UCTB4ZmZmZQkvKiBTeW1ib2wgYm91bmQgdG8gcGFyZW50ICovCisjZGVmaW5lIFNZTUlORk9fQlRfTE9XUkVTRVJWRQkweGZmMDAJLyogQmVnaW5uaW5nIG9mIHJlc2VydmVkIGVudHJpZXMgKi8KKworLyogUG9zc2libGUgYml0bWFza3MgZm9yIHNpX2ZsYWdzLiAgKi8KKyNkZWZpbmUgU1lNSU5GT19GTEdfRElSRUNUCTB4MDAwMQkvKiBEaXJlY3QgYm91bmQgc3ltYm9sICovCisjZGVmaW5lIFNZTUlORk9fRkxHX1BBU1NUSFJVCTB4MDAwMgkvKiBQYXNzLXRocnUgc3ltYm9sIGZvciB0cmFuc2xhdG9yICovCisjZGVmaW5lIFNZTUlORk9fRkxHX0NPUFkJMHgwMDA0CS8qIFN5bWJvbCBpcyBhIGNvcHktcmVsb2MgKi8KKyNkZWZpbmUgU1lNSU5GT19GTEdfTEFaWUxPQUQJMHgwMDA4CS8qIFN5bWJvbCBib3VuZCB0byBvYmplY3QgdG8gYmUgbGF6eQorCQkJCQkgICBsb2FkZWQgKi8KKy8qIFN5bWluZm8gdmVyc2lvbiB2YWx1ZXMuICAqLworI2RlZmluZSBTWU1JTkZPX05PTkUJCTAKKyNkZWZpbmUgU1lNSU5GT19DVVJSRU5UCQkxCisjZGVmaW5lIFNZTUlORk9fTlVNCQkyCisKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSBzdF9pbmZvIGZpZWxkLiAgKi8KKworI2RlZmluZSBFTEYzMl9TVF9CSU5EKHZhbCkJCSgoKHVuc2lnbmVkIGNoYXIpICh2YWwpKSA+PiA0KQorI2RlZmluZSBFTEYzMl9TVF9UWVBFKHZhbCkJCSgodmFsKSAmIDB4ZikKKyNkZWZpbmUgRUxGMzJfU1RfSU5GTyhiaW5kLCB0eXBlKQkoKChiaW5kKSA8PCA0KSArICgodHlwZSkgJiAweGYpKQorCisvKiBCb3RoIEVsZjMyX1N5bSBhbmQgRWxmNjRfU3ltIHVzZSB0aGUgc2FtZSBvbmUtYnl0ZSBzdF9pbmZvIGZpZWxkLiAgKi8KKyNkZWZpbmUgRUxGNjRfU1RfQklORCh2YWwpCQlFTEYzMl9TVF9CSU5EICh2YWwpCisjZGVmaW5lIEVMRjY0X1NUX1RZUEUodmFsKQkJRUxGMzJfU1RfVFlQRSAodmFsKQorI2RlZmluZSBFTEY2NF9TVF9JTkZPKGJpbmQsIHR5cGUpCUVMRjMyX1NUX0lORk8gKChiaW5kKSwgKHR5cGUpKQorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX0JJTkQgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIGJpbmRpbmcpLiAgKi8KKworI2RlZmluZSBTVEJfTE9DQUwJMAkJLyogTG9jYWwgc3ltYm9sICovCisjZGVmaW5lIFNUQl9HTE9CQUwJMQkJLyogR2xvYmFsIHN5bWJvbCAqLworI2RlZmluZSBTVEJfV0VBSwkyCQkvKiBXZWFrIHN5bWJvbCAqLworI2RlZmluZQlTVEJfTlVNCQkzCQkvKiBOdW1iZXIgb2YgZGVmaW5lZCB0eXBlcy4gICovCisjZGVmaW5lIFNUQl9MT09TCTEwCQkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTVEJfSElPUwkxMgkJLyogRW5kIG9mIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFNUQl9MT1BST0MJMTMJCS8qIFN0YXJ0IG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTVEJfSElQUk9DCTE1CQkvKiBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgU1RfVFlQRSBzdWJmaWVsZCBvZiBzdF9pbmZvIChzeW1ib2wgdHlwZSkuICAqLworCisjZGVmaW5lIFNUVF9OT1RZUEUJMAkJLyogU3ltYm9sIHR5cGUgaXMgdW5zcGVjaWZpZWQgKi8KKyNkZWZpbmUgU1RUX09CSkVDVAkxCQkvKiBTeW1ib2wgaXMgYSBkYXRhIG9iamVjdCAqLworI2RlZmluZSBTVFRfRlVOQwkyCQkvKiBTeW1ib2wgaXMgYSBjb2RlIG9iamVjdCAqLworI2RlZmluZSBTVFRfU0VDVElPTgkzCQkvKiBTeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgc2VjdGlvbiAqLworI2RlZmluZSBTVFRfRklMRQk0CQkvKiBTeW1ib2wncyBuYW1lIGlzIGZpbGUgbmFtZSAqLworI2RlZmluZSBTVFRfQ09NTU9OCTUJCS8qIFN5bWJvbCBpcyBhIGNvbW1vbiBkYXRhIG9iamVjdCAqLworI2RlZmluZSBTVFRfVExTCQk2CQkvKiBTeW1ib2wgaXMgdGhyZWFkLWxvY2FsIGRhdGEgb2JqZWN0Ki8KKyNkZWZpbmUJU1RUX05VTQkJNwkJLyogTnVtYmVyIG9mIGRlZmluZWQgdHlwZXMuICAqLworI2RlZmluZSBTVFRfTE9PUwkxMAkJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RUX0hJT1MJMTIJCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTVFRfTE9QUk9DCTEzCQkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RUX0hJUFJPQwkxNQkJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworCisKKy8qIFN5bWJvbCB0YWJsZSBpbmRpY2VzIGFyZSBmb3VuZCBpbiB0aGUgaGFzaCBidWNrZXRzIGFuZCBjaGFpbiB0YWJsZQorICAgb2YgYSBzeW1ib2wgaGFzaCB0YWJsZSBzZWN0aW9uLiAgVGhpcyBzcGVjaWFsIGluZGV4IHZhbHVlIGluZGljYXRlcworICAgdGhlIGVuZCBvZiBhIGNoYWluLCBtZWFuaW5nIG5vIGZ1cnRoZXIgc3ltYm9scyBhcmUgZm91bmQgaW4gdGhhdCBidWNrZXQuICAqLworCisjZGVmaW5lIFNUTl9VTkRFRgkwCQkvKiBFbmQgb2YgYSBjaGFpbi4gICovCisKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSBzdF9vdGhlciBmaWVsZC4gICovCisKKyNkZWZpbmUgRUxGMzJfU1RfVklTSUJJTElUWShvKQkoKG8pICYgMHgwMykKKworLyogRm9yIEVMRjY0IHRoZSBkZWZpbml0aW9ucyBhcmUgdGhlIHNhbWUuICAqLworI2RlZmluZSBFTEY2NF9TVF9WSVNJQklMSVRZKG8pCUVMRjMyX1NUX1ZJU0lCSUxJVFkgKG8pCisKKy8qIFN5bWJvbCB2aXNpYmlsaXR5IHNwZWNpZmljYXRpb24gZW5jb2RlZCBpbiB0aGUgc3Rfb3RoZXIgZmllbGQuICAqLworI2RlZmluZSBTVFZfREVGQVVMVAkwCQkvKiBEZWZhdWx0IHN5bWJvbCB2aXNpYmlsaXR5IHJ1bGVzICovCisjZGVmaW5lIFNUVl9JTlRFUk5BTAkxCQkvKiBQcm9jZXNzb3Igc3BlY2lmaWMgaGlkZGVuIGNsYXNzICovCisjZGVmaW5lIFNUVl9ISURERU4JMgkJLyogU3ltIHVuYXZhaWxhYmxlIGluIG90aGVyIG1vZHVsZXMgKi8KKyNkZWZpbmUgU1RWX1BST1RFQ1RFRAkzCQkvKiBOb3QgcHJlZW1wdGlibGUsIG5vdCBleHBvcnRlZCAqLworCisKKy8qIFJlbG9jYXRpb24gdGFibGUgZW50cnkgd2l0aG91dCBhZGRlbmQgKGluIHNlY3Rpb24gb2YgdHlwZSBTSFRfUkVMKS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjMyX1dvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCit9IEVsZjMyX1JlbDsKKworLyogSSBoYXZlIHNlZW4gdHdvIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZiB0aGUgRWxmNjRfUmVsIGFuZAorICAgRWxmNjRfUmVsYSBzdHJ1Y3R1cmVzLCBzbyB3ZSdsbCBsZWF2ZSB0aGVtIG91dCB1bnRpbCBOb3ZlbGwgKG9yCisgICB3aG9ldmVyKSBnZXRzIHRoZWlyIGFjdCB0b2dldGhlci4gICovCisvKiBUaGUgZm9sbG93aW5nLCBhdCBsZWFzdCwgaXMgdXNlZCBvbiBTcGFyYyB2OSwgTUlQUywgYW5kIEFscGhhLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfQWRkcglyX29mZnNldDsJCS8qIEFkZHJlc3MgKi8KKyAgRWxmNjRfWHdvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCit9IEVsZjY0X1JlbDsKKworLyogUmVsb2NhdGlvbiB0YWJsZSBlbnRyeSB3aXRoIGFkZGVuZCAoaW4gc2VjdGlvbiBvZiB0eXBlIFNIVF9SRUxBKS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjMyX1dvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCisgIEVsZjMyX1N3b3JkCXJfYWRkZW5kOwkJLyogQWRkZW5kICovCit9IEVsZjMyX1JlbGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjY0X1h3b3JkCXJfaW5mbzsJCQkvKiBSZWxvY2F0aW9uIHR5cGUgYW5kIHN5bWJvbCBpbmRleCAqLworICBFbGY2NF9TeHdvcmQJcl9hZGRlbmQ7CQkvKiBBZGRlbmQgKi8KK30gRWxmNjRfUmVsYTsKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSByX2luZm8gZmllbGQuICAqLworCisjZGVmaW5lIEVMRjMyX1JfU1lNKHZhbCkJCSgodmFsKSA+PiA4KQorI2RlZmluZSBFTEYzMl9SX1RZUEUodmFsKQkJKCh2YWwpICYgMHhmZikKKyNkZWZpbmUgRUxGMzJfUl9JTkZPKHN5bSwgdHlwZSkJCSgoKHN5bSkgPDwgOCkgKyAoKHR5cGUpICYgMHhmZikpCisKKyNkZWZpbmUgRUxGNjRfUl9TWU0oaSkJCQkoKGkpID4+IDMyKQorI2RlZmluZSBFTEY2NF9SX1RZUEUoaSkJCQkoKGkpICYgMHhmZmZmZmZmZikKKyNkZWZpbmUgRUxGNjRfUl9JTkZPKHN5bSx0eXBlKQkJKCgoKEVsZjY0X1h3b3JkKSAoc3ltKSkgPDwgMzIpICsgKHR5cGUpKQorCisvKiBQcm9ncmFtIHNlZ21lbnQgaGVhZGVyLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZAlwX3R5cGU7CQkJLyogU2VnbWVudCB0eXBlICovCisgIEVsZjMyX09mZglwX29mZnNldDsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KKyAgRWxmMzJfQWRkcglwX3ZhZGRyOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmMzJfQWRkcglwX3BhZGRyOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCisgIEVsZjMyX1dvcmQJcF9maWxlc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLworICBFbGYzMl9Xb3JkCXBfbWVtc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCisgIEVsZjMyX1dvcmQJcF9mbGFnczsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KKyAgRWxmMzJfV29yZAlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQgKi8KK30gRWxmMzJfUGhkcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZAlwX3R5cGU7CQkJLyogU2VnbWVudCB0eXBlICovCisgIEVsZjY0X1dvcmQJcF9mbGFnczsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KKyAgRWxmNjRfT2ZmCXBfb2Zmc2V0OwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLworICBFbGY2NF9BZGRyCXBfdmFkZHI7CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLworICBFbGY2NF9BZGRyCXBfcGFkZHI7CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KKyAgRWxmNjRfWHdvcmQJcF9maWxlc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLworICBFbGY2NF9Yd29yZAlwX21lbXN6OwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLworICBFbGY2NF9Yd29yZAlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQgKi8KK30gRWxmNjRfUGhkcjsKKworLyogTGVnYWwgdmFsdWVzIGZvciBwX3R5cGUgKHNlZ21lbnQgdHlwZSkuICAqLworCisjZGVmaW5lCVBUX05VTEwJCTAJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLworI2RlZmluZSBQVF9MT0FECQkxCQkvKiBMb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgKi8KKyNkZWZpbmUgUFRfRFlOQU1JQwkyCQkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFRfSU5URVJQCTMJCS8qIFByb2dyYW0gaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgUFRfTk9URQkJNAkJLyogQXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCisjZGVmaW5lIFBUX1NITElCCTUJCS8qIFJlc2VydmVkICovCisjZGVmaW5lIFBUX1BIRFIJCTYJCS8qIEVudHJ5IGZvciBoZWFkZXIgdGFibGUgaXRzZWxmICovCisjZGVmaW5lIFBUX1RMUwkJNwkJLyogVGhyZWFkLWxvY2FsIHN0b3JhZ2Ugc2VnbWVudCAqLworI2RlZmluZQlQVF9OVU0JCTgJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzICovCisjZGVmaW5lIFBUX0xPT1MJCTB4NjAwMDAwMDAJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgUFRfR05VX0VIX0ZSQU1FCTB4NjQ3NGU1NTAJLyogR0NDIC5laF9mcmFtZV9oZHIgc2VnbWVudCAqLworI2RlZmluZSBQVF9HTlVfU1RBQ0sJMHg2NDc0ZTU1MQkvKiBJbmRpY2F0ZXMgc3RhY2sgZXhlY3V0YWJpbGl0eSAqLworI2RlZmluZSBQVF9HTlVfUkVMUk8JMHg2NDc0ZTU1MgkvKiBSZWFkLW9ubHkgYWZ0ZXIgcmVsb2NhdGlvbiAqLworI2RlZmluZSBQVF9MT1NVTlcJMHg2ZmZmZmZmYQorI2RlZmluZSBQVF9TVU5XQlNTCTB4NmZmZmZmZmEJLyogU3VuIFNwZWNpZmljIHNlZ21lbnQgKi8KKyNkZWZpbmUgUFRfU1VOV1NUQUNLCTB4NmZmZmZmZmIJLyogU3RhY2sgc2VnbWVudCAqLworI2RlZmluZSBQVF9ISVNVTlcJMHg2ZmZmZmZmZgorI2RlZmluZSBQVF9ISU9TCQkweDZmZmZmZmZmCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgUFRfSElQUk9DCTB4N2ZmZmZmZmYJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHBfZmxhZ3MgKHNlZ21lbnQgZmxhZ3MpLiAgKi8KKworI2RlZmluZSBQRl9YCQkoMSA8PCAwKQkvKiBTZWdtZW50IGlzIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgUEZfVwkJKDEgPDwgMSkJLyogU2VnbWVudCBpcyB3cml0YWJsZSAqLworI2RlZmluZSBQRl9SCQkoMSA8PCAyKQkvKiBTZWdtZW50IGlzIHJlYWRhYmxlICovCisjZGVmaW5lIFBGX01BU0tPUwkweDBmZjAwMDAwCS8qIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFBGX01BU0tQUk9DCTB4ZjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIGNvcmUgZmlsZXMuICovCisKKyNkZWZpbmUgTlRfUFJTVEFUVVMJMQkJLyogQ29udGFpbnMgY29weSBvZiBwcnN0YXR1cyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfRlBSRUdTRVQJMgkJLyogQ29udGFpbnMgY29weSBvZiBmcHJlZ3NldCBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJQU0lORk8JMwkJLyogQ29udGFpbnMgY29weSBvZiBwcnBzaW5mbyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJYUkVHCTQJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJ4cmVnc2V0IHN0cnVjdCAqLworI2RlZmluZSBOVF9UQVNLU1RSVUNUCTQJCS8qIENvbnRhaW5zIGNvcHkgb2YgdGFzayBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgTlRfUExBVEZPUk0JNQkJLyogU3RyaW5nIGZyb20gc3lzaW5mbyhTSV9QTEFURk9STSkgKi8KKyNkZWZpbmUgTlRfQVVYVgkJNgkJLyogQ29udGFpbnMgY29weSBvZiBhdXh2IGFycmF5ICovCisjZGVmaW5lIE5UX0dXSU5ET1dTCTcJCS8qIENvbnRhaW5zIGNvcHkgb2YgZ3dpbmRvd3Mgc3RydWN0ICovCisjZGVmaW5lIE5UX0FTUlMJCTgJCS8qIENvbnRhaW5zIGNvcHkgb2YgYXNyc2V0IHN0cnVjdCAqLworI2RlZmluZSBOVF9QU1RBVFVTCTEwCQkvKiBDb250YWlucyBjb3B5IG9mIHBzdGF0dXMgc3RydWN0ICovCisjZGVmaW5lIE5UX1BTSU5GTwkxMwkJLyogQ29udGFpbnMgY29weSBvZiBwc2luZm8gc3RydWN0ICovCisjZGVmaW5lIE5UX1BSQ1JFRAkxNAkJLyogQ29udGFpbnMgY29weSBvZiBwcmNyZWQgc3RydWN0ICovCisjZGVmaW5lIE5UX1VUU05BTUUJMTUJCS8qIENvbnRhaW5zIGNvcHkgb2YgdXRzbmFtZSBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfTFdQU1RBVFVTCTE2CQkvKiBDb250YWlucyBjb3B5IG9mIGx3cHN0YXR1cyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfTFdQU0lORk8JMTcJCS8qIENvbnRhaW5zIGNvcHkgb2YgbHdwaW5mbyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJGUFhSRUcJMjAJCS8qIENvbnRhaW5zIGNvcHkgb2YgZnByeHJlZ3NldCBzdHJ1Y3QqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHRoZSBub3RlIHNlZ21lbnQgZGVzY3JpcHRvciB0eXBlcyBmb3Igb2JqZWN0IGZpbGVzLiAgKi8KKworI2RlZmluZSBOVF9WRVJTSU9OCTEJCS8qIENvbnRhaW5zIGEgdmVyc2lvbiBzdHJpbmcuICAqLworCisKKy8qIER5bmFtaWMgc2VjdGlvbiBlbnRyeS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1N3b3JkCWRfdGFnOwkJCS8qIER5bmFtaWMgZW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIEVsZjMyX1dvcmQgZF92YWw7CQkJLyogSW50ZWdlciB2YWx1ZSAqLworICAgICAgRWxmMzJfQWRkciBkX3B0cjsJCQkvKiBBZGRyZXNzIHZhbHVlICovCisgICAgfSBkX3VuOworfSBFbGYzMl9EeW47CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1N4d29yZAlkX3RhZzsJCQkvKiBEeW5hbWljIGVudHJ5IHR5cGUgKi8KKyAgdW5pb24KKyAgICB7CisgICAgICBFbGY2NF9Yd29yZCBkX3ZhbDsJCS8qIEludGVnZXIgdmFsdWUgKi8KKyAgICAgIEVsZjY0X0FkZHIgZF9wdHI7CQkJLyogQWRkcmVzcyB2YWx1ZSAqLworICAgIH0gZF91bjsKK30gRWxmNjRfRHluOworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGRfdGFnIChkeW5hbWljIGVudHJ5IHR5cGUpLiAgKi8KKworI2RlZmluZSBEVF9OVUxMCQkwCQkvKiBNYXJrcyBlbmQgb2YgZHluYW1pYyBzZWN0aW9uICovCisjZGVmaW5lIERUX05FRURFRAkxCQkvKiBOYW1lIG9mIG5lZWRlZCBsaWJyYXJ5ICovCisjZGVmaW5lIERUX1BMVFJFTFNaCTIJCS8qIFNpemUgaW4gYnl0ZXMgb2YgUExUIHJlbG9jcyAqLworI2RlZmluZSBEVF9QTFRHT1QJMwkJLyogUHJvY2Vzc29yIGRlZmluZWQgdmFsdWUgKi8KKyNkZWZpbmUgRFRfSEFTSAkJNAkJLyogQWRkcmVzcyBvZiBzeW1ib2wgaGFzaCB0YWJsZSAqLworI2RlZmluZSBEVF9TVFJUQUIJNQkJLyogQWRkcmVzcyBvZiBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgRFRfU1lNVEFCCTYJCS8qIEFkZHJlc3Mgb2Ygc3ltYm9sIHRhYmxlICovCisjZGVmaW5lIERUX1JFTEEJCTcJCS8qIEFkZHJlc3Mgb2YgUmVsYSByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUkVMQVNaCTgJCS8qIFRvdGFsIHNpemUgb2YgUmVsYSByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUkVMQUVOVAk5CQkvKiBTaXplIG9mIG9uZSBSZWxhIHJlbG9jICovCisjZGVmaW5lIERUX1NUUlNaCTEwCQkvKiBTaXplIG9mIHN0cmluZyB0YWJsZSAqLworI2RlZmluZSBEVF9TWU1FTlQJMTEJCS8qIFNpemUgb2Ygb25lIHN5bWJvbCB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBEVF9JTklUCQkxMgkJLyogQWRkcmVzcyBvZiBpbml0IGZ1bmN0aW9uICovCisjZGVmaW5lIERUX0ZJTkkJCTEzCQkvKiBBZGRyZXNzIG9mIHRlcm1pbmF0aW9uIGZ1bmN0aW9uICovCisjZGVmaW5lIERUX1NPTkFNRQkxNAkJLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0ICovCisjZGVmaW5lIERUX1JQQVRICTE1CQkvKiBMaWJyYXJ5IHNlYXJjaCBwYXRoIChkZXByZWNhdGVkKSAqLworI2RlZmluZSBEVF9TWU1CT0xJQwkxNgkJLyogU3RhcnQgc3ltYm9sIHNlYXJjaCBoZXJlICovCisjZGVmaW5lIERUX1JFTAkJMTcJCS8qIEFkZHJlc3Mgb2YgUmVsIHJlbG9jcyAqLworI2RlZmluZSBEVF9SRUxTWgkxOAkJLyogVG90YWwgc2l6ZSBvZiBSZWwgcmVsb2NzICovCisjZGVmaW5lIERUX1JFTEVOVAkxOQkJLyogU2l6ZSBvZiBvbmUgUmVsIHJlbG9jICovCisjZGVmaW5lIERUX1BMVFJFTAkyMAkJLyogVHlwZSBvZiByZWxvYyBpbiBQTFQgKi8KKyNkZWZpbmUgRFRfREVCVUcJMjEJCS8qIEZvciBkZWJ1Z2dpbmc7IHVuc3BlY2lmaWVkICovCisjZGVmaW5lIERUX1RFWFRSRUwJMjIJCS8qIFJlbG9jIG1pZ2h0IG1vZGlmeSAudGV4dCAqLworI2RlZmluZSBEVF9KTVBSRUwJMjMJCS8qIEFkZHJlc3Mgb2YgUExUIHJlbG9jcyAqLworI2RlZmluZQlEVF9CSU5EX05PVwkyNAkJLyogUHJvY2VzcyByZWxvY2F0aW9ucyBvZiBvYmplY3QgKi8KKyNkZWZpbmUJRFRfSU5JVF9BUlJBWQkyNQkJLyogQXJyYXkgd2l0aCBhZGRyZXNzZXMgb2YgaW5pdCBmY3QgKi8KKyNkZWZpbmUJRFRfRklOSV9BUlJBWQkyNgkJLyogQXJyYXkgd2l0aCBhZGRyZXNzZXMgb2YgZmluaSBmY3QgKi8KKyNkZWZpbmUJRFRfSU5JVF9BUlJBWVNaCTI3CQkvKiBTaXplIGluIGJ5dGVzIG9mIERUX0lOSVRfQVJSQVkgKi8KKyNkZWZpbmUJRFRfRklOSV9BUlJBWVNaCTI4CQkvKiBTaXplIGluIGJ5dGVzIG9mIERUX0ZJTklfQVJSQVkgKi8KKyNkZWZpbmUgRFRfUlVOUEFUSAkyOQkJLyogTGlicmFyeSBzZWFyY2ggcGF0aCAqLworI2RlZmluZSBEVF9GTEFHUwkzMAkJLyogRmxhZ3MgZm9yIHRoZSBvYmplY3QgYmVpbmcgbG9hZGVkICovCisjZGVmaW5lIERUX0VOQ09ESU5HCTMyCQkvKiBTdGFydCBvZiBlbmNvZGVkIHJhbmdlICovCisjZGVmaW5lIERUX1BSRUlOSVRfQVJSQVkgMzIJCS8qIEFycmF5IHdpdGggYWRkcmVzc2VzIG9mIHByZWluaXQgZmN0Ki8KKyNkZWZpbmUgRFRfUFJFSU5JVF9BUlJBWVNaIDMzCQkvKiBzaXplIGluIGJ5dGVzIG9mIERUX1BSRUlOSVRfQVJSQVkgKi8KKyNkZWZpbmUJRFRfTlVNCQkzNAkJLyogTnVtYmVyIHVzZWQgKi8KKyNkZWZpbmUgRFRfTE9PUwkJMHg2MDAwMDAwZAkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBEVF9ISU9TCQkweDZmZmZmMDAwCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBEVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgRFRfSElQUk9DCTB4N2ZmZmZmZmYJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZQlEVF9QUk9DTlVNCURUX01JUFNfTlVNCS8qIE1vc3QgdXNlZCBieSBhbnkgcHJvY2Vzc29yICovCisKKy8qIERUXyogZW50cmllcyB3aGljaCBmYWxsIGJldHdlZW4gRFRfVkFMUk5HSEkgJiBEVF9WQUxSTkdMTyB1c2UgdGhlCisgICBEeW4uZF91bi5kX3ZhbCBmaWVsZCBvZiB0aGUgRWxmKl9EeW4gc3RydWN0dXJlLiAgVGhpcyBmb2xsb3dzIFN1bidzCisgICBhcHByb2FjaC4gICovCisjZGVmaW5lIERUX1ZBTFJOR0xPCTB4NmZmZmZkMDAKKyNkZWZpbmUgRFRfR05VX1BSRUxJTktFRCAweDZmZmZmZGY1CS8qIFByZWxpbmtpbmcgdGltZXN0YW1wICovCisjZGVmaW5lIERUX0dOVV9DT05GTElDVFNaIDB4NmZmZmZkZjYJLyogU2l6ZSBvZiBjb25mbGljdCBzZWN0aW9uICovCisjZGVmaW5lIERUX0dOVV9MSUJMSVNUU1ogMHg2ZmZmZmRmNwkvKiBTaXplIG9mIGxpYnJhcnkgbGlzdCAqLworI2RlZmluZSBEVF9DSEVDS1NVTQkweDZmZmZmZGY4CisjZGVmaW5lIERUX1BMVFBBRFNaCTB4NmZmZmZkZjkKKyNkZWZpbmUgRFRfTU9WRUVOVAkweDZmZmZmZGZhCisjZGVmaW5lIERUX01PVkVTWgkweDZmZmZmZGZiCisjZGVmaW5lIERUX0ZFQVRVUkVfMQkweDZmZmZmZGZjCS8qIEZlYXR1cmUgc2VsZWN0aW9uIChEVEZfKikuICAqLworI2RlZmluZSBEVF9QT1NGTEFHXzEJMHg2ZmZmZmRmZAkvKiBGbGFncyBmb3IgRFRfKiBlbnRyaWVzLCBlZmZlY3RpbmcKKwkJCQkJICAgdGhlIGZvbGxvd2luZyBEVF8qIGVudHJ5LiAgKi8KKyNkZWZpbmUgRFRfU1lNSU5TWgkweDZmZmZmZGZlCS8qIFNpemUgb2Ygc3ltaW5mbyB0YWJsZSAoaW4gYnl0ZXMpICovCisjZGVmaW5lIERUX1NZTUlORU5UCTB4NmZmZmZkZmYJLyogRW50cnkgc2l6ZSBvZiBzeW1pbmZvICovCisjZGVmaW5lIERUX1ZBTFJOR0hJCTB4NmZmZmZkZmYKKyNkZWZpbmUgRFRfVkFMVEFHSURYKHRhZykJKERUX1ZBTFJOR0hJIC0gKHRhZykpCS8qIFJldmVyc2Ugb3JkZXIhICovCisjZGVmaW5lIERUX1ZBTE5VTSAxMgorCisvKiBEVF8qIGVudHJpZXMgd2hpY2ggZmFsbCBiZXR3ZWVuIERUX0FERFJSTkdISSAmIERUX0FERFJSTkdMTyB1c2UgdGhlCisgICBEeW4uZF91bi5kX3B0ciBmaWVsZCBvZiB0aGUgRWxmKl9EeW4gc3RydWN0dXJlLgorCisgICBJZiBhbnkgYWRqdXN0bWVudCBpcyBtYWRlIHRvIHRoZSBFTEYgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuCisgICBidWlsdCB0aGVzZSBlbnRyaWVzIHdpbGwgbmVlZCB0byBiZSBhZGp1c3RlZC4gICovCisjZGVmaW5lIERUX0FERFJSTkdMTwkweDZmZmZmZTAwCisjZGVmaW5lIERUX0dOVV9DT05GTElDVAkweDZmZmZmZWY4CS8qIFN0YXJ0IG9mIGNvbmZsaWN0IHNlY3Rpb24gKi8KKyNkZWZpbmUgRFRfR05VX0xJQkxJU1QJMHg2ZmZmZmVmOQkvKiBMaWJyYXJ5IGxpc3QgKi8KKyNkZWZpbmUgRFRfQ09ORklHCTB4NmZmZmZlZmEJLyogQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIERUX0RFUEFVRElUCTB4NmZmZmZlZmIJLyogRGVwZW5kZW5jeSBhdWRpdGluZy4gICovCisjZGVmaW5lIERUX0FVRElUCTB4NmZmZmZlZmMJLyogT2JqZWN0IGF1ZGl0aW5nLiAgKi8KKyNkZWZpbmUJRFRfUExUUEFECTB4NmZmZmZlZmQJLyogUExUIHBhZGRpbmcuICAqLworI2RlZmluZQlEVF9NT1ZFVEFCCTB4NmZmZmZlZmUJLyogTW92ZSB0YWJsZS4gICovCisjZGVmaW5lIERUX1NZTUlORk8JMHg2ZmZmZmVmZgkvKiBTeW1pbmZvIHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfQUREUlJOR0hJCTB4NmZmZmZlZmYKKyNkZWZpbmUgRFRfQUREUlRBR0lEWCh0YWcpCShEVF9BRERSUk5HSEkgLSAodGFnKSkJLyogUmV2ZXJzZSBvcmRlciEgKi8KKyNkZWZpbmUgRFRfQUREUk5VTSAxMAorCisvKiBUaGUgdmVyc2lvbmluZyBlbnRyeSB0eXBlcy4gIFRoZSBuZXh0IGFyZSBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlCisgICBHTlUgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgRFRfVkVSU1lNCTB4NmZmZmZmZjAKKworI2RlZmluZSBEVF9SRUxBQ09VTlQJMHg2ZmZmZmZmOQorI2RlZmluZSBEVF9SRUxDT1VOVAkweDZmZmZmZmZhCisKKy8qIFRoZXNlIHdlcmUgY2hvc2VuIGJ5IFN1bi4gICovCisjZGVmaW5lIERUX0ZMQUdTXzEJMHg2ZmZmZmZmYgkvKiBTdGF0ZSBmbGFncywgc2VlIERGXzFfKiBiZWxvdy4gICovCisjZGVmaW5lCURUX1ZFUkRFRgkweDZmZmZmZmZjCS8qIEFkZHJlc3Mgb2YgdmVyc2lvbiBkZWZpbml0aW9uCisJCQkJCSAgIHRhYmxlICovCisjZGVmaW5lCURUX1ZFUkRFRk5VTQkweDZmZmZmZmZkCS8qIE51bWJlciBvZiB2ZXJzaW9uIGRlZmluaXRpb25zICovCisjZGVmaW5lCURUX1ZFUk5FRUQJMHg2ZmZmZmZmZQkvKiBBZGRyZXNzIG9mIHRhYmxlIHdpdGggbmVlZGVkCisJCQkJCSAgIHZlcnNpb25zICovCisjZGVmaW5lCURUX1ZFUk5FRUROVU0JMHg2ZmZmZmZmZgkvKiBOdW1iZXIgb2YgbmVlZGVkIHZlcnNpb25zICovCisjZGVmaW5lIERUX1ZFUlNJT05UQUdJRFgodGFnKQkoRFRfVkVSTkVFRE5VTSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLworI2RlZmluZSBEVF9WRVJTSU9OVEFHTlVNIDE2CisKKy8qIFN1biBhZGRlZCB0aGVzZSBtYWNoaW5lLWluZGVwZW5kZW50IGV4dGVuc2lvbnMgaW4gdGhlICJwcm9jZXNzb3Itc3BlY2lmaWMiCisgICByYW5nZS4gIEJlIGNvbXBhdGlibGUuICAqLworI2RlZmluZSBEVF9BVVhJTElBUlkgICAgMHg3ZmZmZmZmZCAgICAgIC8qIFNoYXJlZCBvYmplY3QgdG8gbG9hZCBiZWZvcmUgc2VsZiAqLworI2RlZmluZSBEVF9GSUxURVIgICAgICAgMHg3ZmZmZmZmZiAgICAgIC8qIFNoYXJlZCBvYmplY3QgdG8gZ2V0IHZhbHVlcyBmcm9tICovCisjZGVmaW5lIERUX0VYVFJBVEFHSURYKHRhZykJKChFbGYzMl9Xb3JkKS0oKEVsZjMyX1N3b3JkKSAodGFnKSA8PDE+PjEpLTEpCisjZGVmaW5lIERUX0VYVFJBTlVNCTMKKworLyogVmFsdWVzIG9mIGBkX3VuLmRfdmFsJyBpbiB0aGUgRFRfRkxBR1MgZW50cnkuICAqLworI2RlZmluZSBERl9PUklHSU4JMHgwMDAwMDAwMQkvKiBPYmplY3QgbWF5IHVzZSBERl9PUklHSU4gKi8KKyNkZWZpbmUgREZfU1lNQk9MSUMJMHgwMDAwMDAwMgkvKiBTeW1ib2wgcmVzb2x1dGlvbnMgc3RhcnRzIGhlcmUgKi8KKyNkZWZpbmUgREZfVEVYVFJFTAkweDAwMDAwMDA0CS8qIE9iamVjdCBjb250YWlucyB0ZXh0IHJlbG9jYXRpb25zICovCisjZGVmaW5lIERGX0JJTkRfTk9XCTB4MDAwMDAwMDgJLyogTm8gbGF6eSBiaW5kaW5nIGZvciB0aGlzIG9iamVjdCAqLworI2RlZmluZSBERl9TVEFUSUNfVExTCTB4MDAwMDAwMTAJLyogTW9kdWxlIHVzZXMgdGhlIHN0YXRpYyBUTFMgbW9kZWwgKi8KKworLyogU3RhdGUgZmxhZ3Mgc2VsZWN0YWJsZSBpbiB0aGUgYGRfdW4uZF92YWwnIGVsZW1lbnQgb2YgdGhlIERUX0ZMQUdTXzEKKyAgIGVudHJ5IGluIHRoZSBkeW5hbWljIHNlY3Rpb24uICAqLworI2RlZmluZSBERl8xX05PVwkweDAwMDAwMDAxCS8qIFNldCBSVExEX05PVyBmb3IgdGhpcyBvYmplY3QuICAqLworI2RlZmluZSBERl8xX0dMT0JBTAkweDAwMDAwMDAyCS8qIFNldCBSVExEX0dMT0JBTCBmb3IgdGhpcyBvYmplY3QuICAqLworI2RlZmluZSBERl8xX0dST1VQCTB4MDAwMDAwMDQJLyogU2V0IFJUTERfR1JPVVAgZm9yIHRoaXMgb2JqZWN0LiAgKi8KKyNkZWZpbmUgREZfMV9OT0RFTEVURQkweDAwMDAwMDA4CS8qIFNldCBSVExEX05PREVMRVRFIGZvciB0aGlzIG9iamVjdC4qLworI2RlZmluZSBERl8xX0xPQURGTFRSCTB4MDAwMDAwMTAJLyogVHJpZ2dlciBmaWx0ZWUgbG9hZGluZyBhdCBydW50aW1lLiovCisjZGVmaW5lIERGXzFfSU5JVEZJUlNUCTB4MDAwMDAwMjAJLyogU2V0IFJUTERfSU5JVEZJUlNUIGZvciB0aGlzIG9iamVjdCovCisjZGVmaW5lIERGXzFfTk9PUEVOCTB4MDAwMDAwNDAJLyogU2V0IFJUTERfTk9PUEVOIGZvciB0aGlzIG9iamVjdC4gICovCisjZGVmaW5lIERGXzFfT1JJR0lOCTB4MDAwMDAwODAJLyogJE9SSUdJTiBtdXN0IGJlIGhhbmRsZWQuICAqLworI2RlZmluZSBERl8xX0RJUkVDVAkweDAwMDAwMTAwCS8qIERpcmVjdCBiaW5kaW5nIGVuYWJsZWQuICAqLworI2RlZmluZSBERl8xX1RSQU5TCTB4MDAwMDAyMDAKKyNkZWZpbmUgREZfMV9JTlRFUlBPU0UJMHgwMDAwMDQwMAkvKiBPYmplY3QgaXMgdXNlZCB0byBpbnRlcnBvc2UuICAqLworI2RlZmluZSBERl8xX05PREVGTElCCTB4MDAwMDA4MDAJLyogSWdub3JlIGRlZmF1bHQgbGliIHNlYXJjaCBwYXRoLiAgKi8KKyNkZWZpbmUgREZfMV9OT0RVTVAJMHgwMDAwMTAwMAkvKiBPYmplY3QgY2FuJ3QgYmUgZGxkdW1wJ2VkLiAgKi8KKyNkZWZpbmUgREZfMV9DT05GQUxUCTB4MDAwMDIwMDAJLyogQ29uZmlndXJhdGlvbiBhbHRlcm5hdGl2ZSBjcmVhdGVkLiovCisjZGVmaW5lIERGXzFfRU5ERklMVEVFCTB4MDAwMDQwMDAJLyogRmlsdGVlIHRlcm1pbmF0ZXMgZmlsdGVycyBzZWFyY2guICovCisjZGVmaW5lCURGXzFfRElTUFJFTERORQkweDAwMDA4MDAwCS8qIERpc3AgcmVsb2MgYXBwbGllZCBhdCBidWlsZCB0aW1lLiAqLworI2RlZmluZQlERl8xX0RJU1BSRUxQTkQJMHgwMDAxMDAwMAkvKiBEaXNwIHJlbG9jIGFwcGxpZWQgYXQgcnVuLXRpbWUuICAqLworCisvKiBGbGFncyBmb3IgdGhlIGZlYXR1cmUgc2VsZWN0aW9uIGluIERUX0ZFQVRVUkVfMS4gICovCisjZGVmaW5lIERURl8xX1BBUklOSVQJMHgwMDAwMDAwMQorI2RlZmluZSBEVEZfMV9DT05GRVhQCTB4MDAwMDAwMDIKKworLyogRmxhZ3MgaW4gdGhlIERUX1BPU0ZMQUdfMSBlbnRyeSBlZmZlY3Rpbmcgb25seSB0aGUgbmV4dCBEVF8qIGVudHJ5LiAgKi8KKyNkZWZpbmUgREZfUDFfTEFaWUxPQUQJMHgwMDAwMDAwMQkvKiBMYXp5bG9hZCBmb2xsb3dpbmcgb2JqZWN0LiAgKi8KKyNkZWZpbmUgREZfUDFfR1JPVVBQRVJNCTB4MDAwMDAwMDIJLyogU3ltYm9scyBmcm9tIG5leHQgb2JqZWN0IGFyZSBub3QKKwkJCQkJICAgZ2VuZXJhbGx5IGF2YWlsYWJsZS4gICovCisKKy8qIFZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9ucy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX0hhbGYJdmRfdmVyc2lvbjsJCS8qIFZlcnNpb24gcmV2aXNpb24gKi8KKyAgRWxmMzJfSGFsZgl2ZF9mbGFnczsJCS8qIFZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgRWxmMzJfSGFsZgl2ZF9uZHg7CQkJLyogVmVyc2lvbiBJbmRleCAqLworICBFbGYzMl9IYWxmCXZkX2NudDsJCQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBhdXggZW50cmllcyAqLworICBFbGYzMl9Xb3JkCXZkX2hhc2g7CQkvKiBWZXJzaW9uIG5hbWUgaGFzaCB2YWx1ZSAqLworICBFbGYzMl9Xb3JkCXZkX2F1eDsJCQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdmVyZGF1eCBhcnJheSAqLworICBFbGYzMl9Xb3JkCXZkX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJkZWYKKwkJCQkJICAgZW50cnkgKi8KK30gRWxmMzJfVmVyZGVmOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9IYWxmCXZkX3ZlcnNpb247CQkvKiBWZXJzaW9uIHJldmlzaW9uICovCisgIEVsZjY0X0hhbGYJdmRfZmxhZ3M7CQkvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCisgIEVsZjY0X0hhbGYJdmRfbmR4OwkJCS8qIFZlcnNpb24gSW5kZXggKi8KKyAgRWxmNjRfSGFsZgl2ZF9jbnQ7CQkJLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgYXV4IGVudHJpZXMgKi8KKyAgRWxmNjRfV29yZAl2ZF9oYXNoOwkJLyogVmVyc2lvbiBuYW1lIGhhc2ggdmFsdWUgKi8KKyAgRWxmNjRfV29yZAl2ZF9hdXg7CQkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIHZlcmRhdXggYXJyYXkgKi8KKyAgRWxmNjRfV29yZAl2ZF9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVyZGVmCisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjY0X1ZlcmRlZjsKKworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHZkX3ZlcnNpb24gKHZlcnNpb24gcmV2aXNpb24pLiAgKi8KKyNkZWZpbmUgVkVSX0RFRl9OT05FCTAJCS8qIE5vIHZlcnNpb24gKi8KKyNkZWZpbmUgVkVSX0RFRl9DVVJSRU5UCTEJCS8qIEN1cnJlbnQgdmVyc2lvbiAqLworI2RlZmluZSBWRVJfREVGX05VTQkyCQkvKiBHaXZlbiB2ZXJzaW9uIG51bWJlciAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHZkX2ZsYWdzICh2ZXJzaW9uIGluZm9ybWF0aW9uIGZsYWdzKS4gICovCisjZGVmaW5lIFZFUl9GTEdfQkFTRQkweDEJCS8qIFZlcnNpb24gZGVmaW5pdGlvbiBvZiBmaWxlIGl0c2VsZiAqLworI2RlZmluZSBWRVJfRkxHX1dFQUsJMHgyCQkvKiBXZWFrIHZlcnNpb24gaWRlbnRpZmllciAqLworCisvKiBWZXJzeW0gc3ltYm9sIGluZGV4IHZhbHVlcy4gICovCisjZGVmaW5lCVZFUl9ORFhfTE9DQUwJCTAJLyogU3ltYm9sIGlzIGxvY2FsLiAgKi8KKyNkZWZpbmUJVkVSX05EWF9HTE9CQUwJCTEJLyogU3ltYm9sIGlzIGdsb2JhbC4gICovCisjZGVmaW5lCVZFUl9ORFhfTE9SRVNFUlZFCTB4ZmYwMAkvKiBCZWdpbm5pbmcgb2YgcmVzZXJ2ZWQgZW50cmllcy4gICovCisjZGVmaW5lCVZFUl9ORFhfRUxJTUlOQVRFCTB4ZmYwMQkvKiBTeW1ib2wgaXMgdG8gYmUgZWxpbWluYXRlZC4gICovCisKKy8qIEF1eGlhbGlhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQJdmRhX25hbWU7CQkvKiBWZXJzaW9uIG9yIGRlcGVuZGVuY3kgbmFtZXMgKi8KKyAgRWxmMzJfV29yZAl2ZGFfbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcmRhdXgKKwkJCQkJICAgZW50cnkgKi8KK30gRWxmMzJfVmVyZGF1eDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZAl2ZGFfbmFtZTsJCS8qIFZlcnNpb24gb3IgZGVwZW5kZW5jeSBuYW1lcyAqLworICBFbGY2NF9Xb3JkCXZkYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVyZGF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGY2NF9WZXJkYXV4OworCisKKy8qIFZlcnNpb24gZGVwZW5kZW5jeSBzZWN0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfSGFsZgl2bl92ZXJzaW9uOwkJLyogVmVyc2lvbiBvZiBzdHJ1Y3R1cmUgKi8KKyAgRWxmMzJfSGFsZgl2bl9jbnQ7CQkJLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgYXV4IGVudHJpZXMgKi8KKyAgRWxmMzJfV29yZAl2bl9maWxlOwkJLyogT2Zmc2V0IG9mIGZpbGVuYW1lIGZvciB0aGlzCisJCQkJCSAgIGRlcGVuZGVuY3kgKi8KKyAgRWxmMzJfV29yZAl2bl9hdXg7CQkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIHZlcm5hdXggYXJyYXkgKi8KKyAgRWxmMzJfV29yZAl2bl9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmVlZAorCQkJCQkgICBlbnRyeSAqLworfSBFbGYzMl9WZXJuZWVkOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9IYWxmCXZuX3ZlcnNpb247CQkvKiBWZXJzaW9uIG9mIHN0cnVjdHVyZSAqLworICBFbGY2NF9IYWxmCXZuX2NudDsJCQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBhdXggZW50cmllcyAqLworICBFbGY2NF9Xb3JkCXZuX2ZpbGU7CQkvKiBPZmZzZXQgb2YgZmlsZW5hbWUgZm9yIHRoaXMKKwkJCQkJICAgZGVwZW5kZW5jeSAqLworICBFbGY2NF9Xb3JkCXZuX2F1eDsJCQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdmVybmF1eCBhcnJheSAqLworICBFbGY2NF9Xb3JkCXZuX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJuZWVkCisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjY0X1Zlcm5lZWQ7CisKKworLyogTGVnYWwgdmFsdWVzIGZvciB2bl92ZXJzaW9uICh2ZXJzaW9uIHJldmlzaW9uKS4gICovCisjZGVmaW5lIFZFUl9ORUVEX05PTkUJIDAJCS8qIE5vIHZlcnNpb24gKi8KKyNkZWZpbmUgVkVSX05FRURfQ1VSUkVOVCAxCQkvKiBDdXJyZW50IHZlcnNpb24gKi8KKyNkZWZpbmUgVkVSX05FRURfTlVNCSAyCQkvKiBHaXZlbiB2ZXJzaW9uIG51bWJlciAqLworCisvKiBBdXhpbGlhcnkgbmVlZGVkIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkCXZuYV9oYXNoOwkJLyogSGFzaCB2YWx1ZSBvZiBkZXBlbmRlbmN5IG5hbWUgKi8KKyAgRWxmMzJfSGFsZgl2bmFfZmxhZ3M7CQkvKiBEZXBlbmRlbmN5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCisgIEVsZjMyX0hhbGYJdm5hX290aGVyOwkJLyogVW51c2VkICovCisgIEVsZjMyX1dvcmQJdm5hX25hbWU7CQkvKiBEZXBlbmRlbmN5IG5hbWUgc3RyaW5nIG9mZnNldCAqLworICBFbGYzMl9Xb3JkCXZuYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGYzMl9WZXJuYXV4OworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkCXZuYV9oYXNoOwkJLyogSGFzaCB2YWx1ZSBvZiBkZXBlbmRlbmN5IG5hbWUgKi8KKyAgRWxmNjRfSGFsZgl2bmFfZmxhZ3M7CQkvKiBEZXBlbmRlbmN5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCisgIEVsZjY0X0hhbGYJdm5hX290aGVyOwkJLyogVW51c2VkICovCisgIEVsZjY0X1dvcmQJdm5hX25hbWU7CQkvKiBEZXBlbmRlbmN5IG5hbWUgc3RyaW5nIG9mZnNldCAqLworICBFbGY2NF9Xb3JkCXZuYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGY2NF9WZXJuYXV4OworCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igdm5hX2ZsYWdzLiAgKi8KKyNkZWZpbmUgVkVSX0ZMR19XRUFLCTB4MgkJLyogV2VhayB2ZXJzaW9uIGlkZW50aWZpZXIgKi8KKworCisvKiBBdXhpbGlhcnkgdmVjdG9yLiAgKi8KKworLyogVGhpcyB2ZWN0b3IgaXMgbm9ybWFsbHkgb25seSB1c2VkIGJ5IHRoZSBwcm9ncmFtIGludGVycHJldGVyLiAgVGhlCisgICB1c3VhbCBkZWZpbml0aW9uIGluIGFuIEFCSSBzdXBwbGVtZW50IHVzZXMgdGhlIG5hbWUgYXV4dl90LiAgVGhlCisgICB2ZWN0b3IgaXMgbm90IHVzdWFsbHkgZGVmaW5lZCBpbiBhIHN0YW5kYXJkIDxlbGYuaD4gZmlsZSwgYnV0IGl0CisgICBjYW4ndCBodXJ0LiAgV2UgcmVuYW1lIGl0IHRvIGF2b2lkIGNvbmZsaWN0cy4gIFRoZSBzaXplcyBvZiB0aGVzZQorICAgdHlwZXMgYXJlIGFuIGFycmFuZ2VtZW50IGJldHdlZW4gdGhlIGV4ZWMgc2VydmVyIGFuZCB0aGUgcHJvZ3JhbQorICAgaW50ZXJwcmV0ZXIsIHNvIHdlIGRvbid0IGZ1bGx5IHNwZWNpZnkgdGhlbSBoZXJlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgYV90eXBlOwkJLyogRW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIHVpbnQzMl90IGFfdmFsOwkJLyogSW50ZWdlciB2YWx1ZSAqLworICAgICAgLyogV2UgdXNlIHRvIGhhdmUgcG9pbnRlciBlbGVtZW50cyBhZGRlZCBoZXJlLiAgV2UgY2Fubm90IGRvIHRoYXQsCisJIHRob3VnaCwgc2luY2UgaXQgZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIDMyLWJpdCBkZWZpbml0aW9ucworCSBvbiA2NC1iaXQgcGxhdGZvcm1zIGFuZCB2aWNlIHZlcnNhLiAgKi8KKyAgICB9IGFfdW47Cit9IEVsZjMyX2F1eHZfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDY0X3QgYV90eXBlOwkJLyogRW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIHVpbnQ2NF90IGFfdmFsOwkJLyogSW50ZWdlciB2YWx1ZSAqLworICAgICAgLyogV2UgdXNlIHRvIGhhdmUgcG9pbnRlciBlbGVtZW50cyBhZGRlZCBoZXJlLiAgV2UgY2Fubm90IGRvIHRoYXQsCisJIHRob3VnaCwgc2luY2UgaXQgZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIDMyLWJpdCBkZWZpbml0aW9ucworCSBvbiA2NC1iaXQgcGxhdGZvcm1zIGFuZCB2aWNlIHZlcnNhLiAgKi8KKyAgICB9IGFfdW47Cit9IEVsZjY0X2F1eHZfdDsKKworLyogTGVnYWwgdmFsdWVzIGZvciBhX3R5cGUgKGVudHJ5IHR5cGUpLiAgKi8KKworI2RlZmluZSBBVF9OVUxMCQkwCQkvKiBFbmQgb2YgdmVjdG9yICovCisjZGVmaW5lIEFUX0lHTk9SRQkxCQkvKiBFbnRyeSBzaG91bGQgYmUgaWdub3JlZCAqLworI2RlZmluZSBBVF9FWEVDRkQJMgkJLyogRmlsZSBkZXNjcmlwdG9yIG9mIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfUEhEUgkJMwkJLyogUHJvZ3JhbSBoZWFkZXJzIGZvciBwcm9ncmFtICovCisjZGVmaW5lIEFUX1BIRU5UCTQJCS8qIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgKi8KKyNkZWZpbmUgQVRfUEhOVU0JNQkJLyogTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyAqLworI2RlZmluZSBBVF9QQUdFU1oJNgkJLyogU3lzdGVtIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBBVF9CQVNFCQk3CQkvKiBCYXNlIGFkZHJlc3Mgb2YgaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgQVRfRkxBR1MJOAkJLyogRmxhZ3MgKi8KKyNkZWZpbmUgQVRfRU5UUlkJOQkJLyogRW50cnkgcG9pbnQgb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9OT1RFTEYJMTAJCS8qIFByb2dyYW0gaXMgbm90IEVMRiAqLworI2RlZmluZSBBVF9VSUQJCTExCQkvKiBSZWFsIHVpZCAqLworI2RlZmluZSBBVF9FVUlECQkxMgkJLyogRWZmZWN0aXZlIHVpZCAqLworI2RlZmluZSBBVF9HSUQJCTEzCQkvKiBSZWFsIGdpZCAqLworI2RlZmluZSBBVF9FR0lECQkxNAkJLyogRWZmZWN0aXZlIGdpZCAqLworI2RlZmluZSBBVF9DTEtUQ0sJMTcJCS8qIEZyZXF1ZW5jeSBvZiB0aW1lcygpICovCisKKy8qIFNvbWUgbW9yZSBzcGVjaWFsIGFfdHlwZSB2YWx1ZXMgZGVzY3JpYmluZyB0aGUgaGFyZHdhcmUuICAqLworI2RlZmluZSBBVF9QTEFURk9STQkxNQkJLyogU3RyaW5nIGlkZW50aWZ5aW5nIHBsYXRmb3JtLiAgKi8KKyNkZWZpbmUgQVRfSFdDQVAJMTYJCS8qIE1hY2hpbmUgZGVwZW5kZW50IGhpbnRzIGFib3V0CisJCQkJCSAgIHByb2Nlc3NvciBjYXBhYmlsaXRpZXMuICAqLworCisvKiBUaGlzIGVudHJ5IGdpdmVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEZQVSBpbml0aWFsaXphdGlvbgorICAgcGVyZm9ybWVkIGJ5IHRoZSBrZXJuZWwuICAqLworI2RlZmluZSBBVF9GUFVDVwkxOAkJLyogVXNlZCBGUFUgY29udHJvbCB3b3JkLiAgKi8KKworLyogQ2FjaGUgYmxvY2sgc2l6ZXMuICAqLworI2RlZmluZSBBVF9EQ0FDSEVCU0laRQkxOQkJLyogRGF0YSBjYWNoZSBibG9jayBzaXplLiAgKi8KKyNkZWZpbmUgQVRfSUNBQ0hFQlNJWkUJMjAJCS8qIEluc3RydWN0aW9uIGNhY2hlIGJsb2NrIHNpemUuICAqLworI2RlZmluZSBBVF9VQ0FDSEVCU0laRQkyMQkJLyogVW5pZmllZCBjYWNoZSBibG9jayBzaXplLiAgKi8KKworLyogQSBzcGVjaWFsIGlnbm9yZWQgdmFsdWUgZm9yIFBQQywgdXNlZCBieSB0aGUga2VybmVsIHRvIGNvbnRyb2wgdGhlCisgICBpbnRlcnByZXRhdGlvbiBvZiB0aGUgQVVYVi4gTXVzdCBiZSA+IDE2LiAgKi8KKyNkZWZpbmUgQVRfSUdOT1JFUFBDCTIyCQkvKiBFbnRyeSBzaG91bGQgYmUgaWdub3JlZC4gICovCisKKyNkZWZpbmUJQVRfU0VDVVJFCTIzCQkvKiBCb29sZWFuLCB3YXMgZXhlYyBzZXR1aWQtbGlrZT8gICovCisKKy8qIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBzeXN0ZW0gcGFnZSB1c2VkIGZvciBzeXN0ZW0gY2FsbHMgYW5kIG90aGVyCisgICBuaWNlIHRoaW5ncy4gICovCisjZGVmaW5lIEFUX1NZU0lORk8JMzIKKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCTMzCisKKy8qIFNoYXBlcyBvZiB0aGUgY2FjaGVzLiAgQml0cyAwLTMgY29udGFpbnMgYXNzb2NpYXRpdml0eTsgYml0cyA0LTcgY29udGFpbnMKKyAgIGxvZzIgb2YgbGluZSBzaXplOyBtYXNrIHRob3NlIHRvIGdldCBjYWNoZSBzaXplLiAgKi8KKyNkZWZpbmUgQVRfTDFJX0NBQ0hFU0hBUEUJMzQKKyNkZWZpbmUgQVRfTDFEX0NBQ0hFU0hBUEUJMzUKKyNkZWZpbmUgQVRfTDJfQ0FDSEVTSEFQRQkzNgorI2RlZmluZSBBVF9MM19DQUNIRVNIQVBFCTM3CisKKy8qIE5vdGUgc2VjdGlvbiBjb250ZW50cy4gIEVhY2ggZW50cnkgaW4gdGhlIG5vdGUgc2VjdGlvbiBiZWdpbnMgd2l0aAorICAgYSBoZWFkZXIgb2YgYSBmaXhlZCBmb3JtLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZCBuX25hbWVzejsJCQkvKiBMZW5ndGggb2YgdGhlIG5vdGUncyBuYW1lLiAgKi8KKyAgRWxmMzJfV29yZCBuX2Rlc2NzejsJCQkvKiBMZW5ndGggb2YgdGhlIG5vdGUncyBkZXNjcmlwdG9yLiAgKi8KKyAgRWxmMzJfV29yZCBuX3R5cGU7CQkJLyogVHlwZSBvZiB0aGUgbm90ZS4gICovCit9IEVsZjMyX05oZHI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1dvcmQgbl9uYW1lc3o7CQkJLyogTGVuZ3RoIG9mIHRoZSBub3RlJ3MgbmFtZS4gICovCisgIEVsZjY0X1dvcmQgbl9kZXNjc3o7CQkJLyogTGVuZ3RoIG9mIHRoZSBub3RlJ3MgZGVzY3JpcHRvci4gICovCisgIEVsZjY0X1dvcmQgbl90eXBlOwkJCS8qIFR5cGUgb2YgdGhlIG5vdGUuICAqLworfSBFbGY2NF9OaGRyOworCisvKiBLbm93biBuYW1lcyBvZiBub3Rlcy4gICovCisKKy8qIFNvbGFyaXMgZW50cmllcyBpbiB0aGUgbm90ZSBzZWN0aW9uIGhhdmUgdGhpcyBuYW1lLiAgKi8KKyNkZWZpbmUgRUxGX05PVEVfU09MQVJJUwkiU1VOVyBTb2xhcmlzIgorCisvKiBOb3RlIGVudHJpZXMgZm9yIEdOVSBzeXN0ZW1zIGhhdmUgdGhpcyBuYW1lLiAgKi8KKyNkZWZpbmUgRUxGX05PVEVfR05VCQkiR05VIgorCisKKy8qIERlZmluZWQgdHlwZXMgb2Ygbm90ZXMgZm9yIFNvbGFyaXMuICAqLworCisvKiBWYWx1ZSBvZiBkZXNjcmlwdG9yIChvbmUgd29yZCkgaXMgZGVzaXJlZCBwYWdlc2l6ZSBmb3IgdGhlIGJpbmFyeS4gICovCisjZGVmaW5lIEVMRl9OT1RFX1BBR0VTSVpFX0hJTlQJMQorCisKKy8qIERlZmluZWQgbm90ZSB0eXBlcyBmb3IgR05VIHN5c3RlbXMuICAqLworCisvKiBBQkkgaW5mb3JtYXRpb24uICBUaGUgZGVzY3JpcHRvciBjb25zaXN0cyBvZiB3b3JkczoKKyAgIHdvcmQgMDogT1MgZGVzY3JpcHRvcgorICAgd29yZCAxOiBtYWpvciB2ZXJzaW9uIG9mIHRoZSBBQkkKKyAgIHdvcmQgMjogbWlub3IgdmVyc2lvbiBvZiB0aGUgQUJJCisgICB3b3JkIDM6IHN1Ym1pbm9yIHZlcnNpb24gb2YgdGhlIEFCSQorKi8KKyNkZWZpbmUgRUxGX05PVEVfQUJJCQkxCisKKy8qIEtub3duIE9TZXMuICBUaGVzZSB2YWx1ZSBjYW4gYXBwZWFyIGluIHdvcmQgMCBvZiBhbiBFTEZfTk9URV9BQkkKKyAgIG5vdGUgc2VjdGlvbiBlbnRyeS4gICovCisjZGVmaW5lIEVMRl9OT1RFX09TX0xJTlVYCTAKKyNkZWZpbmUgRUxGX05PVEVfT1NfR05VCQkxCisjZGVmaW5lIEVMRl9OT1RFX09TX1NPTEFSSVMyCTIKKyNkZWZpbmUgRUxGX05PVEVfT1NfRlJFRUJTRAkzCisKKworLyogTW92ZSByZWNvcmRzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1h3b3JkIG1fdmFsdWU7CQkvKiBTeW1ib2wgdmFsdWUuICAqLworICBFbGYzMl9Xb3JkIG1faW5mbzsJCS8qIFNpemUgYW5kIGluZGV4LiAgKi8KKyAgRWxmMzJfV29yZCBtX3BvZmZzZXQ7CQkvKiBTeW1ib2wgb2Zmc2V0LiAgKi8KKyAgRWxmMzJfSGFsZiBtX3JlcGVhdDsJCS8qIFJlcGVhdCBjb3VudC4gICovCisgIEVsZjMyX0hhbGYgbV9zdHJpZGU7CQkvKiBTdHJpZGUgaW5mby4gICovCit9IEVsZjMyX01vdmU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1h3b3JkIG1fdmFsdWU7CQkvKiBTeW1ib2wgdmFsdWUuICAqLworICBFbGY2NF9Yd29yZCBtX2luZm87CQkvKiBTaXplIGFuZCBpbmRleC4gICovCisgIEVsZjY0X1h3b3JkIG1fcG9mZnNldDsJLyogU3ltYm9sIG9mZnNldC4gICovCisgIEVsZjY0X0hhbGYgbV9yZXBlYXQ7CQkvKiBSZXBlYXQgY291bnQuICAqLworICBFbGY2NF9IYWxmIG1fc3RyaWRlOwkJLyogU3RyaWRlIGluZm8uICAqLworfSBFbGY2NF9Nb3ZlOworCisvKiBNYWNybyB0byBjb25zdHJ1Y3QgbW92ZSByZWNvcmRzLiAgKi8KKyNkZWZpbmUgRUxGMzJfTV9TWU0oaW5mbykJKChpbmZvKSA+PiA4KQorI2RlZmluZSBFTEYzMl9NX1NJWkUoaW5mbykJKCh1bnNpZ25lZCBjaGFyKSAoaW5mbykpCisjZGVmaW5lIEVMRjMyX01fSU5GTyhzeW0sIHNpemUpCSgoKHN5bSkgPDwgOCkgKyAodW5zaWduZWQgY2hhcikgKHNpemUpKQorCisjZGVmaW5lIEVMRjY0X01fU1lNKGluZm8pCUVMRjMyX01fU1lNIChpbmZvKQorI2RlZmluZSBFTEY2NF9NX1NJWkUoaW5mbykJRUxGMzJfTV9TSVpFIChpbmZvKQorI2RlZmluZSBFTEY2NF9NX0lORk8oc3ltLCBzaXplKQlFTEYzMl9NX0lORk8gKHN5bSwgc2l6ZSkKKworCisvKiBNb3Rvcm9sYSA2OGsgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBWYWx1ZXMgZm9yIEVsZjMyX0VoZHIuZV9mbGFncy4gICovCisjZGVmaW5lIEVGX0NQVTMyCTB4MDA4MTAwMDAKKworLyogbTY4ayByZWxvY3MuICAqLworCisjZGVmaW5lIFJfNjhLX05PTkUJMAkJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl82OEtfMzIJMQkJLyogRGlyZWN0IDMyIGJpdCAgKi8KKyNkZWZpbmUgUl82OEtfMTYJMgkJLyogRGlyZWN0IDE2IGJpdCAgKi8KKyNkZWZpbmUgUl82OEtfOAkJMwkJLyogRGlyZWN0IDggYml0ICAqLworI2RlZmluZSBSXzY4S19QQzMyCTQJCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSXzY4S19QQzE2CTUJCS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSXzY4S19QQzgJNgkJLyogUEMgcmVsYXRpdmUgOCBiaXQgKi8KKyNkZWZpbmUgUl82OEtfR09UMzIJNwkJLyogMzIgYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSXzY4S19HT1QxNgk4CQkvKiAxNiBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfNjhLX0dPVDgJOQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfNjhLX0dPVDMyTwkxMAkJLyogMzIgYml0IEdPVCBvZmZzZXQgKi8KKyNkZWZpbmUgUl82OEtfR09UMTZPCTExCQkvKiAxNiBiaXQgR09UIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19HT1Q4TwkxMgkJLyogOCBiaXQgR09UIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19QTFQzMgkxMwkJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfNjhLX1BMVDE2CTE0CQkvKiAxNiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl82OEtfUExUOAkxNQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl82OEtfUExUMzJPCTE2CQkvKiAzMiBiaXQgUExUIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19QTFQxNk8JMTcJCS8qIDE2IGJpdCBQTFQgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX1BMVDhPCTE4CQkvKiA4IGJpdCBQTFQgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX0NPUFkJMTkJCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl82OEtfR0xPQl9EQVQJMjAJCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl82OEtfSk1QX1NMT1QJMjEJCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl82OEtfUkVMQVRJVkUJMjIJCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfNjhLX05VTQkyMworCisvKiBJbnRlbCA4MDM4NiBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisKKy8qIGkzODYgcmVsb2NzLiAgKi8KKworI2RlZmluZSBSXzM4Nl9OT05FCSAgIDAJCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfMzg2XzMyCSAgIDEJCS8qIERpcmVjdCAzMiBiaXQgICovCisjZGVmaW5lIFJfMzg2X1BDMzIJICAgMgkJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfMzg2X0dPVDMyCSAgIDMJCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl8zODZfUExUMzIJICAgNAkJLyogMzIgYml0IFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfMzg2X0NPUFkJICAgNQkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSXzM4Nl9HTE9CX0RBVAkgICA2CQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfMzg2X0pNUF9TTE9UCSAgIDcJCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl8zODZfUkVMQVRJVkUJICAgOAkJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSXzM4Nl9HT1RPRkYJICAgOQkJLyogMzIgYml0IG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl8zODZfR09UUEMJICAgMTAJCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfMzg2XzMyUExUCSAgIDExCisjZGVmaW5lIFJfMzg2X1RMU19UUE9GRgkgICAxNAkJLyogT2Zmc2V0IGluIHN0YXRpYyBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl8zODZfVExTX0lFCSAgIDE1CQkvKiBBZGRyZXNzIG9mIEdPVCBlbnRyeSBmb3Igc3RhdGljIFRMUworCQkJCQkgICBibG9jayBvZmZzZXQgKi8KKyNkZWZpbmUgUl8zODZfVExTX0dPVElFCSAgIDE2CQkvKiBHT1QgZW50cnkgZm9yIHN0YXRpYyBUTFMgYmxvY2sKKwkJCQkJICAgb2Zmc2V0ICovCisjZGVmaW5lIFJfMzg2X1RMU19MRQkgICAxNwkJLyogT2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgKi8KKyNkZWZpbmUgUl8zODZfVExTX0dECSAgIDE4CQkvKiBEaXJlY3QgMzIgYml0IGZvciBHTlUgdmVyc2lvbiBvZgorCQkJCQkgICBnZW5lcmFsIGR5bmFtaWMgdGhyZWFkIGxvY2FsIGRhdGEgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xETQkgICAxOQkJLyogRGlyZWN0IDMyIGJpdCBmb3IgR05VIHZlcnNpb24gb2YKKwkJCQkJICAgbG9jYWwgZHluYW1pYyB0aHJlYWQgbG9jYWwgZGF0YQorCQkJCQkgICBpbiBMRSBjb2RlICovCisjZGVmaW5lIFJfMzg2XzE2CSAgIDIwCisjZGVmaW5lIFJfMzg2X1BDMTYJICAgMjEKKyNkZWZpbmUgUl8zODZfOAkJICAgMjIKKyNkZWZpbmUgUl8zODZfUEM4CSAgIDIzCisjZGVmaW5lIFJfMzg2X1RMU19HRF8zMgkgICAyNAkJLyogRGlyZWN0IDMyIGJpdCBmb3IgZ2VuZXJhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhICovCisjZGVmaW5lIFJfMzg2X1RMU19HRF9QVVNIICAyNQkJLyogVGFnIGZvciBwdXNobCBpbiBHRCBUTFMgY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfR0RfQ0FMTCAgMjYJCS8qIFJlbG9jYXRpb24gZm9yIGNhbGwgdG8KKwkJCQkJICAgX190bHNfZ2V0X2FkZHIoKSAqLworI2RlZmluZSBSXzM4Nl9UTFNfR0RfUE9QICAgMjcJCS8qIFRhZyBmb3IgcG9wbCBpbiBHRCBUTFMgY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERNXzMyICAgMjgJCS8qIERpcmVjdCAzMiBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgaW4gTEUgY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERNX1BVU0ggMjkJCS8qIFRhZyBmb3IgcHVzaGwgaW4gTERNIFRMUyBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE1fQ0FMTCAzMAkJLyogUmVsb2NhdGlvbiBmb3IgY2FsbCB0bworCQkJCQkgICBfX3Rsc19nZXRfYWRkcigpIGluIExETSBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE1fUE9QICAzMQkJLyogVGFnIGZvciBwb3BsIGluIExETSBUTFMgY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERPXzMyICAgMzIJCS8qIE9mZnNldCByZWxhdGl2ZSB0byBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl8zODZfVExTX0lFXzMyCSAgIDMzCQkvKiBHT1QgZW50cnkgZm9yIG5lZ2F0ZWQgc3RhdGljIFRMUworCQkJCQkgICBibG9jayBvZmZzZXQgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xFXzMyCSAgIDM0CQkvKiBOZWdhdGVkIG9mZnNldCByZWxhdGl2ZSB0byBzdGF0aWMKKwkJCQkJICAgVExTIGJsb2NrICovCisjZGVmaW5lIFJfMzg2X1RMU19EVFBNT0QzMiAzNQkJLyogSUQgb2YgbW9kdWxlIGNvbnRhaW5pbmcgc3ltYm9sICovCisjZGVmaW5lIFJfMzg2X1RMU19EVFBPRkYzMiAzNgkJLyogT2Zmc2V0IGluIFRMUyBibG9jayAqLworI2RlZmluZSBSXzM4Nl9UTFNfVFBPRkYzMiAgMzcJCS8qIE5lZ2F0ZWQgb2Zmc2V0IGluIHN0YXRpYyBUTFMgYmxvY2sgKi8KKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfMzg2X05VTQkgICAzOAorCisvKiBTVU4gU1BBUkMgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX1RZUEUgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIHR5cGUpLiAgKi8KKworI2RlZmluZSBTVFRfU1BBUkNfUkVHSVNURVIJMTMJLyogR2xvYmFsIHJlZ2lzdGVyIHJlc2VydmVkIHRvIGFwcC4gKi8KKworLyogVmFsdWVzIGZvciBFbGY2NF9FaGRyLmVfZmxhZ3MuICAqLworCisjZGVmaW5lIEVGX1NQQVJDVjlfTU0JCTMKKyNkZWZpbmUgRUZfU1BBUkNWOV9UU08JCTAKKyNkZWZpbmUgRUZfU1BBUkNWOV9QU08JCTEKKyNkZWZpbmUgRUZfU1BBUkNWOV9STU8JCTIKKyNkZWZpbmUgRUZfU1BBUkNfTEVEQVRBCQkweDgwMDAwMCAvKiBsaXR0bGUgZW5kaWFuIGRhdGEgKi8KKyNkZWZpbmUgRUZfU1BBUkNfRVhUX01BU0sJMHhGRkZGMDAKKyNkZWZpbmUgRUZfU1BBUkNfMzJQTFVTCQkweDAwMDEwMCAvKiBnZW5lcmljIFY4KyBmZWF0dXJlcyAqLworI2RlZmluZSBFRl9TUEFSQ19TVU5fVVMxCTB4MDAwMjAwIC8qIFN1biBVbHRyYVNQQVJDMSBleHRlbnNpb25zICovCisjZGVmaW5lIEVGX1NQQVJDX0hBTF9SMQkJMHgwMDA0MDAgLyogSEFMIFIxIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgRUZfU1BBUkNfU1VOX1VTMwkweDAwMDgwMCAvKiBTdW4gVWx0cmFTUEFSQ0lJSSBleHRlbnNpb25zICovCisKKy8qIFNQQVJDIHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl9TUEFSQ19OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfU1BBUkNfOAkJMQkvKiBEaXJlY3QgOCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18xNgkJMgkvKiBEaXJlY3QgMTYgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfMzIJCTMJLyogRGlyZWN0IDMyIGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0RJU1A4CQk0CS8qIFBDIHJlbGF0aXZlIDggYml0ICovCisjZGVmaW5lIFJfU1BBUkNfRElTUDE2CQk1CS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0RJU1AzMgkJNgkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19XRElTUDMwCQk3CS8qIFBDIHJlbGF0aXZlIDMwIGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfU1BBUkNfV0RJU1AyMgkJOAkvKiBQQyByZWxhdGl2ZSAyMiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX0hJMjIJCTkJLyogSGlnaCAyMiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18yMgkJMTAJLyogRGlyZWN0IDIyIGJpdCAqLworI2RlZmluZSBSX1NQQVJDXzEzCQkxMQkvKiBEaXJlY3QgMTMgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfTE8xMAkJMTIJLyogVHJ1bmNhdGVkIDEwIGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0dPVDEwCQkxMwkvKiBUcnVuY2F0ZWQgMTAgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0dPVDEzCQkxNAkvKiAxMyBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfR09UMjIJCTE1CS8qIDIyIGJpdCBHT1QgZW50cnkgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1BDMTAJCTE2CS8qIFBDIHJlbGF0aXZlIDEwIGJpdCB0cnVuY2F0ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19QQzIyCQkxNwkvKiBQQyByZWxhdGl2ZSAyMiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1dQTFQzMAkJMTgJLyogMzAgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfU1BBUkNfQ09QWQkJMTkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX1NQQVJDX0dMT0JfREFUCTIwCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9TUEFSQ19KTVBfU0xPVAkyMQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfUkVMQVRJVkUJMjIJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX1NQQVJDX1VBMzIJCTIzCS8qIERpcmVjdCAzMiBiaXQgdW5hbGlnbmVkICovCisKKy8qIEFkZGl0aW9uYWwgU3BhcmM2NCByZWxvY3MuICAqLworCisjZGVmaW5lIFJfU1BBUkNfUExUMzIJCTI0CS8qIERpcmVjdCAzMiBiaXQgcmVmIHRvIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0hJUExUMjIJCTI1CS8qIEhpZ2ggMjIgYml0IFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0xPUExUMTAJCTI2CS8qIFRydW5jYXRlZCAxMCBiaXQgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfUENQTFQzMgkJMjcJLyogUEMgcmVsIDMyIGJpdCByZWYgdG8gUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfUENQTFQyMgkJMjgJLyogUEMgcmVsIGhpZ2ggMjIgYml0IFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX1BDUExUMTAJCTI5CS8qIFBDIHJlbCB0cnVuYyAxMCBiaXQgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfMTAJCTMwCS8qIERpcmVjdCAxMCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18xMQkJMzEJLyogRGlyZWN0IDExIGJpdCAqLworI2RlZmluZSBSX1NQQVJDXzY0CQkzMgkvKiBEaXJlY3QgNjQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfT0xPMTAJCTMzCS8qIDEwYml0IHdpdGggc2Vjb25kYXJ5IDEzYml0IGFkZGVuZCAqLworI2RlZmluZSBSX1NQQVJDX0hIMjIJCTM0CS8qIFRvcCAyMiBiaXRzIG9mIGRpcmVjdCA2NCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19ITTEwCQkzNQkvKiBIaWdoIG1pZGRsZSAxMCBiaXRzIG9mIC4uLiAqLworI2RlZmluZSBSX1NQQVJDX0xNMjIJCTM2CS8qIExvdyBtaWRkbGUgMjIgYml0cyBvZiAuLi4gKi8KKyNkZWZpbmUgUl9TUEFSQ19QQ19ISDIyCQkzNwkvKiBUb3AgMjIgYml0cyBvZiBwYyByZWwgNjQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfUENfSE0xMAkJMzgJLyogSGlnaCBtaWRkbGUgMTAgYml0IG9mIC4uLiAqLworI2RlZmluZSBSX1NQQVJDX1BDX0xNMjIJCTM5CS8qIExvdyBtaWdnbGUgMjIgYml0cyBvZiAuLi4gKi8KKyNkZWZpbmUgUl9TUEFSQ19XRElTUDE2CQk0MAkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1dESVNQMTkJCTQxCS8qIFBDIHJlbGF0aXZlIDE5IGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfU1BBUkNfNwkJNDMJLyogRGlyZWN0IDcgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfNQkJNDQJLyogRGlyZWN0IDUgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfNgkJNDUJLyogRGlyZWN0IDYgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfRElTUDY0CQk0NgkvKiBQQyByZWxhdGl2ZSA2NCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19QTFQ2NAkJNDcJLyogRGlyZWN0IDY0IGJpdCByZWYgdG8gUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfSElYMjIJCTQ4CS8qIEhpZ2ggMjIgYml0IGNvbXBsZW1lbnRlZCAqLworI2RlZmluZSBSX1NQQVJDX0xPWDEwCQk0OQkvKiBUcnVuY2F0ZWQgMTEgYml0IGNvbXBsZW1lbnRlZCAqLworI2RlZmluZSBSX1NQQVJDX0g0NAkJNTAJLyogRGlyZWN0IGhpZ2ggMTIgb2YgNDQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfTTQ0CQk1MQkvKiBEaXJlY3QgbWlkIDIyIG9mIDQ0IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0w0NAkJNTIJLyogRGlyZWN0IGxvdyAxMCBvZiA0NCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19SRUdJU1RFUgk1MwkvKiBHbG9iYWwgcmVnaXN0ZXIgdXNhZ2UgKi8KKyNkZWZpbmUgUl9TUEFSQ19VQTY0CQk1NAkvKiBEaXJlY3QgNjQgYml0IHVuYWxpZ25lZCAqLworI2RlZmluZSBSX1NQQVJDX1VBMTYJCTU1CS8qIERpcmVjdCAxNiBiaXQgdW5hbGlnbmVkICovCisjZGVmaW5lIFJfU1BBUkNfVExTX0dEX0hJMjIJNTYKKyNkZWZpbmUgUl9TUEFSQ19UTFNfR0RfTE8xMAk1NworI2RlZmluZSBSX1NQQVJDX1RMU19HRF9BREQJNTgKKyNkZWZpbmUgUl9TUEFSQ19UTFNfR0RfQ0FMTAk1OQorI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fSEkyMgk2MAorI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fTE8xMAk2MQorI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fQURECTYyCisjZGVmaW5lIFJfU1BBUkNfVExTX0xETV9DQUxMCTYzCisjZGVmaW5lIFJfU1BBUkNfVExTX0xET19ISVgyMgk2NAorI2RlZmluZSBSX1NQQVJDX1RMU19MRE9fTE9YMTAJNjUKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTERPX0FERAk2NgorI2RlZmluZSBSX1NQQVJDX1RMU19JRV9ISTIyCTY3CisjZGVmaW5lIFJfU1BBUkNfVExTX0lFX0xPMTAJNjgKKyNkZWZpbmUgUl9TUEFSQ19UTFNfSUVfTEQJNjkKKyNkZWZpbmUgUl9TUEFSQ19UTFNfSUVfTERYCTcwCisjZGVmaW5lIFJfU1BBUkNfVExTX0lFX0FERAk3MQorI2RlZmluZSBSX1NQQVJDX1RMU19MRV9ISVgyMgk3MgorI2RlZmluZSBSX1NQQVJDX1RMU19MRV9MT1gxMAk3MworI2RlZmluZSBSX1NQQVJDX1RMU19EVFBNT0QzMgk3NAorI2RlZmluZSBSX1NQQVJDX1RMU19EVFBNT0Q2NAk3NQorI2RlZmluZSBSX1NQQVJDX1RMU19EVFBPRkYzMgk3NgorI2RlZmluZSBSX1NQQVJDX1RMU19EVFBPRkY2NAk3NworI2RlZmluZSBSX1NQQVJDX1RMU19UUE9GRjMyCTc4CisjZGVmaW5lIFJfU1BBUkNfVExTX1RQT0ZGNjQJNzkKKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfU1BBUkNfTlVNCQk4MAorCisvKiBGb3IgU3BhcmM2NCwgbGVnYWwgdmFsdWVzIGZvciBkX3RhZyBvZiBFbGY2NF9EeW4uICAqLworCisjZGVmaW5lIERUX1NQQVJDX1JFR0lTVEVSIDB4NzAwMDAwMDEKKyNkZWZpbmUgRFRfU1BBUkNfTlVNCTIKKworLyogQml0cyBwcmVzZW50IGluIEFUX0hXQ0FQLCBwcmltYXJpbHkgZm9yIFNwYXJjMzIuICAqLworCisjZGVmaW5lIEhXQ0FQX1NQQVJDX0ZMVVNICTEJLyogVGhlIGNwdSBzdXBwb3J0cyBmbHVzaCBpbnNuLiAgKi8KKyNkZWZpbmUgSFdDQVBfU1BBUkNfU1RCQVIJMgorI2RlZmluZSBIV0NBUF9TUEFSQ19TV0FQCTQKKyNkZWZpbmUgSFdDQVBfU1BBUkNfTVVMRElWCTgKKyNkZWZpbmUgSFdDQVBfU1BBUkNfVjkJCTE2CS8qIFRoZSBjcHUgaXMgdjksIHNvIHY4cGx1cyBpcyBvay4gICovCisjZGVmaW5lIEhXQ0FQX1NQQVJDX1VMVFJBMwkzMgorCisvKiBNSVBTIFIzMDAwIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBlX2ZsYWdzIGZpZWxkIG9mIEVsZjMyX0VoZHIuICAqLworCisjZGVmaW5lIEVGX01JUFNfTk9SRU9SREVSICAgMQkJLyogQSAubm9yZW9yZGVyIGRpcmVjdGl2ZSB3YXMgdXNlZCAqLworI2RlZmluZSBFRl9NSVBTX1BJQwkgICAgMgkJLyogQ29udGFpbnMgUElDIGNvZGUgKi8KKyNkZWZpbmUgRUZfTUlQU19DUElDCSAgICA0CQkvKiBVc2VzIFBJQyBjYWxsaW5nIHNlcXVlbmNlICovCisjZGVmaW5lIEVGX01JUFNfWEdPVAkgICAgOAorI2RlZmluZSBFRl9NSVBTXzY0QklUX1dISVJMIDE2CisjZGVmaW5lIEVGX01JUFNfQUJJMgkgICAgMzIKKyNkZWZpbmUgRUZfTUlQU19BQklfT04zMiAgICA2NAorI2RlZmluZSBFRl9NSVBTX0FSQ0gJICAgIDB4ZjAwMDAwMDAJLyogTUlQUyBhcmNoaXRlY3R1cmUgbGV2ZWwgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBNSVBTIGFyY2hpdGVjdHVyZSBsZXZlbC4gICovCisKKyNkZWZpbmUgRUZfTUlQU19BUkNIXzEJICAgIDB4MDAwMDAwMDAJLyogLW1pcHMxIGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfMgkgICAgMHgxMDAwMDAwMAkvKiAtbWlwczIgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF8zCSAgICAweDIwMDAwMDAwCS8qIC1taXBzMyBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzQJICAgIDB4MzAwMDAwMDAJLyogLW1pcHM0IGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfNQkgICAgMHg0MDAwMDAwMAkvKiAtbWlwczUgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF8zMgkgICAgMHg2MDAwMDAwMAkvKiBNSVBTMzIgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF82NAkgICAgMHg3MDAwMDAwMAkvKiBNSVBTNjQgY29kZS4gICovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIG5vbi1vZmZpY2lhbCBuYW1lcyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgKi8KKworI2RlZmluZSBFX01JUFNfQVJDSF8xCSAgMHgwMDAwMDAwMAkvKiAtbWlwczEgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzIJICAweDEwMDAwMDAwCS8qIC1taXBzMiBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfMwkgIDB4MjAwMDAwMDAJLyogLW1pcHMzIGNvZGUuICAqLworI2RlZmluZSBFX01JUFNfQVJDSF80CSAgMHgzMDAwMDAwMAkvKiAtbWlwczQgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzUJICAweDQwMDAwMDAwCS8qIC1taXBzNSBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfMzIJICAweDYwMDAwMDAwCS8qIE1JUFMzMiBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfNjQJICAweDcwMDAwMDAwCS8qIE1JUFM2NCBjb2RlLiAgKi8KKworLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMuICAqLworCisjZGVmaW5lIFNITl9NSVBTX0FDT01NT04gICAgMHhmZjAwCS8qIEFsbG9jYXRlZCBjb21tb24gc3ltYm9scyAqLworI2RlZmluZSBTSE5fTUlQU19URVhUCSAgICAweGZmMDEJLyogQWxsb2NhdGVkIHRlc3Qgc3ltYm9scy4gICovCisjZGVmaW5lIFNITl9NSVBTX0RBVEEJICAgIDB4ZmYwMgkvKiBBbGxvY2F0ZWQgZGF0YSBzeW1ib2xzLiAgKi8KKyNkZWZpbmUgU0hOX01JUFNfU0NPTU1PTiAgICAweGZmMDMJLyogU21hbGwgY29tbW9uIHN5bWJvbHMgKi8KKyNkZWZpbmUgU0hOX01JUFNfU1VOREVGSU5FRCAweGZmMDQJLyogU21hbGwgdW5kZWZpbmVkIHN5bWJvbHMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF90eXBlIGZpZWxkIG9mIEVsZjMyX1NoZHIuICAqLworCisjZGVmaW5lIFNIVF9NSVBTX0xJQkxJU1QgICAgICAgMHg3MDAwMDAwMCAvKiBTaGFyZWQgb2JqZWN0cyB1c2VkIGluIGxpbmsgKi8KKyNkZWZpbmUgU0hUX01JUFNfTVNZTQkgICAgICAgMHg3MDAwMDAwMQorI2RlZmluZSBTSFRfTUlQU19DT05GTElDVCAgICAgIDB4NzAwMDAwMDIgLyogQ29uZmxpY3Rpbmcgc3ltYm9scyAqLworI2RlZmluZSBTSFRfTUlQU19HUFRBQgkgICAgICAgMHg3MDAwMDAwMyAvKiBHbG9iYWwgZGF0YSBhcmVhIHNpemVzICovCisjZGVmaW5lIFNIVF9NSVBTX1VDT0RFCSAgICAgICAweDcwMDAwMDA0IC8qIFJlc2VydmVkIGZvciBTR0kvTUlQUyBjb21waWxlcnMgKi8KKyNkZWZpbmUgU0hUX01JUFNfREVCVUcJICAgICAgIDB4NzAwMDAwMDUgLyogTUlQUyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24qLworI2RlZmluZSBTSFRfTUlQU19SRUdJTkZPICAgICAgIDB4NzAwMDAwMDYgLyogUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgU0hUX01JUFNfUEFDS0FHRSAgICAgICAweDcwMDAwMDA3CisjZGVmaW5lIFNIVF9NSVBTX1BBQ0tTWU0gICAgICAgMHg3MDAwMDAwOAorI2RlZmluZSBTSFRfTUlQU19SRUxECSAgICAgICAweDcwMDAwMDA5CisjZGVmaW5lIFNIVF9NSVBTX0lGQUNFICAgICAgICAgMHg3MDAwMDAwYgorI2RlZmluZSBTSFRfTUlQU19DT05URU5UICAgICAgIDB4NzAwMDAwMGMKKyNkZWZpbmUgU0hUX01JUFNfT1BUSU9OUyAgICAgICAweDcwMDAwMDBkIC8qIE1pc2NlbGxhbmVvdXMgb3B0aW9ucy4gICovCisjZGVmaW5lIFNIVF9NSVBTX1NIRFIJICAgICAgIDB4NzAwMDAwMTAKKyNkZWZpbmUgU0hUX01JUFNfRkRFU0MJICAgICAgIDB4NzAwMDAwMTEKKyNkZWZpbmUgU0hUX01JUFNfRVhUU1lNCSAgICAgICAweDcwMDAwMDEyCisjZGVmaW5lIFNIVF9NSVBTX0RFTlNFCSAgICAgICAweDcwMDAwMDEzCisjZGVmaW5lIFNIVF9NSVBTX1BERVNDCSAgICAgICAweDcwMDAwMDE0CisjZGVmaW5lIFNIVF9NSVBTX0xPQ1NZTQkgICAgICAgMHg3MDAwMDAxNQorI2RlZmluZSBTSFRfTUlQU19BVVhTWU0JICAgICAgIDB4NzAwMDAwMTYKKyNkZWZpbmUgU0hUX01JUFNfT1BUU1lNCSAgICAgICAweDcwMDAwMDE3CisjZGVmaW5lIFNIVF9NSVBTX0xPQ1NUUgkgICAgICAgMHg3MDAwMDAxOAorI2RlZmluZSBTSFRfTUlQU19MSU5FCSAgICAgICAweDcwMDAwMDE5CisjZGVmaW5lIFNIVF9NSVBTX1JGREVTQwkgICAgICAgMHg3MDAwMDAxYQorI2RlZmluZSBTSFRfTUlQU19ERUxUQVNZTSAgICAgIDB4NzAwMDAwMWIKKyNkZWZpbmUgU0hUX01JUFNfREVMVEFJTlNUICAgICAweDcwMDAwMDFjCisjZGVmaW5lIFNIVF9NSVBTX0RFTFRBQ0xBU1MgICAgMHg3MDAwMDAxZAorI2RlZmluZSBTSFRfTUlQU19EV0FSRiAgICAgICAgIDB4NzAwMDAwMWUgLyogRFdBUkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX01JUFNfREVMVEFERUNMICAgICAweDcwMDAwMDFmCisjZGVmaW5lIFNIVF9NSVBTX1NZTUJPTF9MSUIgICAgMHg3MDAwMDAyMAorI2RlZmluZSBTSFRfTUlQU19FVkVOVFMJICAgICAgIDB4NzAwMDAwMjEgLyogRXZlbnQgc2VjdGlvbi4gICovCisjZGVmaW5lIFNIVF9NSVBTX1RSQU5TTEFURSAgICAgMHg3MDAwMDAyMgorI2RlZmluZSBTSFRfTUlQU19QSVhJRQkgICAgICAgMHg3MDAwMDAyMworI2RlZmluZSBTSFRfTUlQU19YTEFURQkgICAgICAgMHg3MDAwMDAyNAorI2RlZmluZSBTSFRfTUlQU19YTEFURV9ERUJVRyAgIDB4NzAwMDAwMjUKKyNkZWZpbmUgU0hUX01JUFNfV0hJUkwJICAgICAgIDB4NzAwMDAwMjYKKyNkZWZpbmUgU0hUX01JUFNfRUhfUkVHSU9OICAgICAweDcwMDAwMDI3CisjZGVmaW5lIFNIVF9NSVBTX1hMQVRFX09MRCAgICAgMHg3MDAwMDAyOAorI2RlZmluZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OIDB4NzAwMDAwMjkKKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF9mbGFncyBmaWVsZCBvZiBFbGYzMl9TaGRyLiAgKi8KKworI2RlZmluZSBTSEZfTUlQU19HUFJFTAkgMHgxMDAwMDAwMAkvKiBNdXN0IGJlIHBhcnQgb2YgZ2xvYmFsIGRhdGEgYXJlYSAqLworI2RlZmluZSBTSEZfTUlQU19NRVJHRQkgMHgyMDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19BRERSCSAweDQwMDAwMDAwCisjZGVmaW5lIFNIRl9NSVBTX1NUUklOR1MgMHg4MDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19OT1NUUklQIDB4MDgwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTE9DQUwJIDB4MDQwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTkFNRVMJIDB4MDIwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTk9EVVBFCSAweDAxMDAwMDAwCisKKworLyogU3ltYm9sIHRhYmxlcy4gICovCisKKy8qIE1JUFMgc3BlY2lmaWMgdmFsdWVzIGZvciBgc3Rfb3RoZXInLiAgKi8KKyNkZWZpbmUgU1RPX01JUFNfREVGQVVMVAkJMHgwCisjZGVmaW5lIFNUT19NSVBTX0lOVEVSTkFMCQkweDEKKyNkZWZpbmUgU1RPX01JUFNfSElEREVOCQkJMHgyCisjZGVmaW5lIFNUT19NSVBTX1BST1RFQ1RFRAkJMHgzCisjZGVmaW5lIFNUT19NSVBTX1NDX0FMSUdOX1VOVVNFRAkweGZmCisKKy8qIE1JUFMgc3BlY2lmaWMgdmFsdWVzIGZvciBgc3RfaW5mbycuICAqLworI2RlZmluZSBTVEJfTUlQU19TUExJVF9DT01NT04JCTEzCisKKy8qIEVudHJpZXMgZm91bmQgaW4gc2VjdGlvbnMgb2YgdHlwZSBTSFRfTUlQU19HUFRBQi4gICovCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0CisgICAgeworICAgICAgRWxmMzJfV29yZCBndF9jdXJyZW50X2dfdmFsdWU7CS8qIC1HIHZhbHVlIHVzZWQgZm9yIGNvbXBpbGF0aW9uICovCisgICAgICBFbGYzMl9Xb3JkIGd0X3VudXNlZDsJCS8qIE5vdCB1c2VkICovCisgICAgfSBndF9oZWFkZXI7CQkJLyogRmlyc3QgZW50cnkgaW4gc2VjdGlvbiAqLworICBzdHJ1Y3QKKyAgICB7CisgICAgICBFbGYzMl9Xb3JkIGd0X2dfdmFsdWU7CQkvKiBJZiB0aGlzIHZhbHVlIHdlcmUgdXNlZCBmb3IgLUcgKi8KKyAgICAgIEVsZjMyX1dvcmQgZ3RfYnl0ZXM7CQkvKiBUaGlzIG1hbnkgYnl0ZXMgd291bGQgYmUgdXNlZCAqLworICAgIH0gZ3RfZW50cnk7CQkJCS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBzZWN0aW9uICovCit9IEVsZjMyX2dwdGFiOworCisvKiBFbnRyeSBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX1JFR0lORk8uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkCXJpX2dwcm1hc2s7CQkvKiBHZW5lcmFsIHJlZ2lzdGVycyB1c2VkICovCisgIEVsZjMyX1dvcmQJcmlfY3BybWFza1s0XTsJCS8qIENvcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkICovCisgIEVsZjMyX1N3b3JkCXJpX2dwX3ZhbHVlOwkJLyogJGdwIHJlZ2lzdGVyIHZhbHVlICovCit9IEVsZjMyX1JlZ0luZm87CisKKy8qIEVudHJpZXMgZm91bmQgaW4gc2VjdGlvbnMgb2YgdHlwZSBTSFRfTUlQU19PUFRJT05TLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBraW5kOwkJLyogRGV0ZXJtaW5lcyBpbnRlcnByZXRhdGlvbiBvZiB0aGUKKwkJCQkgICB2YXJpYWJsZSBwYXJ0IG9mIGRlc2NyaXB0b3IuICAqLworICB1bnNpZ25lZCBjaGFyIHNpemU7CQkvKiBTaXplIG9mIGRlc2NyaXB0b3IsIGluY2x1ZGluZyBoZWFkZXIuICAqLworICBFbGYzMl9TZWN0aW9uIHNlY3Rpb247CS8qIFNlY3Rpb24gaGVhZGVyIGluZGV4IG9mIHNlY3Rpb24gYWZmZWN0ZWQsCisJCQkJICAgMCBmb3IgZ2xvYmFsIG9wdGlvbnMuICAqLworICBFbGYzMl9Xb3JkIGluZm87CQkvKiBLaW5kLXNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KK30gRWxmX09wdGlvbnM7CisKKy8qIFZhbHVlcyBmb3IgYGtpbmQnIGZpZWxkIGluIEVsZl9PcHRpb25zLiAgKi8KKworI2RlZmluZSBPREtfTlVMTAkwCS8qIFVuZGVmaW5lZC4gICovCisjZGVmaW5lIE9ES19SRUdJTkZPCTEJLyogUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICAqLworI2RlZmluZSBPREtfRVhDRVBUSU9OUwkyCS8qIEV4Y2VwdGlvbiBwcm9jZXNzaW5nIG9wdGlvbnMuICAqLworI2RlZmluZSBPREtfUEFECQkzCS8qIFNlY3Rpb24gcGFkZGluZyBvcHRpb25zLiAgKi8KKyNkZWZpbmUgT0RLX0hXUEFUQ0gJNAkvKiBIYXJkd2FyZSB3b3JrYXJvdW5kcyBwZXJmb3JtZWQgKi8KKyNkZWZpbmUgT0RLX0ZJTEwJNQkvKiByZWNvcmQgdGhlIGZpbGwgdmFsdWUgdXNlZCBieSB0aGUgbGlua2VyLiAqLworI2RlZmluZSBPREtfVEFHUwk2CS8qIHJlc2VydmUgc3BhY2UgZm9yIGRlc2t0b3AgdG9vbHMgdG8gd3JpdGUuICovCisjZGVmaW5lIE9ES19IV0FORAk3CS8qIEhXIHdvcmthcm91bmRzLiAgJ0FORCcgYml0cyB3aGVuIG1lcmdpbmcuICovCisjZGVmaW5lIE9ES19IV09SCTgJLyogSFcgd29ya2Fyb3VuZHMuICAnT1InIGJpdHMgd2hlbiBtZXJnaW5nLiAgKi8KKworLyogVmFsdWVzIGZvciBgaW5mbycgaW4gRWxmX09wdGlvbnMgZm9yIE9ES19FWENFUFRJT05TIGVudHJpZXMuICAqLworCisjZGVmaW5lIE9FWF9GUFVfTUlOCTB4MWYJLyogRlBFJ3Mgd2hpY2ggTVVTVCBiZSBlbmFibGVkLiAgKi8KKyNkZWZpbmUgT0VYX0ZQVV9NQVgJMHgxZjAwCS8qIEZQRSdzIHdoaWNoIE1BWSBiZSBlbmFibGVkLiAgKi8KKyNkZWZpbmUgT0VYX1BBR0UwCTB4MTAwMDAJLyogcGFnZSB6ZXJvIG11c3QgYmUgbWFwcGVkLiAgKi8KKyNkZWZpbmUgT0VYX1NNTQkJMHgyMDAwMAkvKiBGb3JjZSBzZXF1ZW50aWFsIG1lbW9yeSBtb2RlPyAgKi8KKyNkZWZpbmUgT0VYX0ZQREJVRwkweDQwMDAwCS8qIEZvcmNlIGZsb2F0aW5nIHBvaW50IGRlYnVnIG1vZGU/ICAqLworI2RlZmluZSBPRVhfUFJFQ0lTRUZQCU9FWF9GUERCVUcKKyNkZWZpbmUgT0VYX0RJU01JU1MJMHg4MDAwMAkvKiBEaXNtaXNzIGludmFsaWQgYWRkcmVzcyBmYXVsdHM/ICAqLworCisjZGVmaW5lIE9FWF9GUFVfSU5WQUwJMHgxMAorI2RlZmluZSBPRVhfRlBVX0RJVjAJMHgwOAorI2RlZmluZSBPRVhfRlBVX09GTE8JMHgwNAorI2RlZmluZSBPRVhfRlBVX1VGTE8JMHgwMgorI2RlZmluZSBPRVhfRlBVX0lORVgJMHgwMQorCisvKiBNYXNrcyBmb3IgYGluZm8nIGluIEVsZl9PcHRpb25zIGZvciBhbiBPREtfSFdQQVRDSCBlbnRyeS4gICovCisKKyNkZWZpbmUgT0hXX1I0S0VPUAkweDEJLyogUjQwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLworI2RlZmluZSBPSFdfUjhLUEZFVENICTB4MgkvKiBtYXkgbmVlZCBSODAwMCBwcmVmZXRjaCBwYXRjaC4gICovCisjZGVmaW5lIE9IV19SNUtFT1AJMHg0CS8qIFI1MDAwIGVuZC1vZi1wYWdlIHBhdGNoLiAgKi8KKyNkZWZpbmUgT0hXX1I1S0NWVEwJMHg4CS8qIFI1MDAwIGN2dC5bZHNdLmwgYnVnLiAgY2xlYW49MS4gICovCisKKyNkZWZpbmUgT1BBRF9QUkVGSVgJMHgxCisjZGVmaW5lIE9QQURfUE9TVEZJWAkweDIKKyNkZWZpbmUgT1BBRF9TWU1CT0wJMHg0CisKKy8qIEVudHJ5IGZvdW5kIGluIGAub3B0aW9ucycgc2VjdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQgaHdwX2ZsYWdzMTsJLyogRXh0cmEgZmxhZ3MuICAqLworICBFbGYzMl9Xb3JkIGh3cF9mbGFnczI7CS8qIEV4dHJhIGZsYWdzLiAgKi8KK30gRWxmX09wdGlvbnNfSHc7CisKKy8qIE1hc2tzIGZvciBgaW5mbycgaW4gRWxmT3B0aW9ucyBmb3IgT0RLX0hXQU5EIGFuZCBPREtfSFdPUiBlbnRyaWVzLiAgKi8KKworI2RlZmluZSBPSFdBMF9SNEtFT1BfQ0hFQ0tFRAkweDAwMDAwMDAxCisjZGVmaW5lIE9IV0ExX1I0S0VPUF9DTEVBTgkweDAwMDAwMDAyCisKKy8qIE1JUFMgcmVsb2NzLiAgKi8KKworI2RlZmluZSBSX01JUFNfTk9ORQkJMAkvKiBObyByZWxvYyAqLworI2RlZmluZSBSX01JUFNfMTYJCTEJLyogRGlyZWN0IDE2IGJpdCAqLworI2RlZmluZSBSX01JUFNfMzIJCTIJLyogRGlyZWN0IDMyIGJpdCAqLworI2RlZmluZSBSX01JUFNfUkVMMzIJCTMJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfTUlQU18yNgkJNAkvKiBEaXJlY3QgMjYgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9NSVBTX0hJMTYJCTUJLyogSGlnaCAxNiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX0xPMTYJCTYJLyogTG93IDE2IGJpdCAqLworI2RlZmluZSBSX01JUFNfR1BSRUwxNgkJNwkvKiBHUCByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX0xJVEVSQUwJCTgJLyogMTYgYml0IGxpdGVyYWwgZW50cnkgKi8KKyNkZWZpbmUgUl9NSVBTX0dPVDE2CQk5CS8qIDE2IGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9NSVBTX1BDMTYJCTEwCS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX01JUFNfQ0FMTDE2CQkxMQkvKiAxNiBiaXQgR09UIGVudHJ5IGZvciBmdW5jdGlvbiAqLworI2RlZmluZSBSX01JUFNfR1BSRUwzMgkJMTIJLyogR1AgcmVsYXRpdmUgMzIgYml0ICovCisKKyNkZWZpbmUgUl9NSVBTX1NISUZUNQkJMTYKKyNkZWZpbmUgUl9NSVBTX1NISUZUNgkJMTcKKyNkZWZpbmUgUl9NSVBTXzY0CQkxOAorI2RlZmluZSBSX01JUFNfR09UX0RJU1AJCTE5CisjZGVmaW5lIFJfTUlQU19HT1RfUEFHRQkJMjAKKyNkZWZpbmUgUl9NSVBTX0dPVF9PRlNUCQkyMQorI2RlZmluZSBSX01JUFNfR09UX0hJMTYJCTIyCisjZGVmaW5lIFJfTUlQU19HT1RfTE8xNgkJMjMKKyNkZWZpbmUgUl9NSVBTX1NVQgkJMjQKKyNkZWZpbmUgUl9NSVBTX0lOU0VSVF9BCQkyNQorI2RlZmluZSBSX01JUFNfSU5TRVJUX0IJCTI2CisjZGVmaW5lIFJfTUlQU19ERUxFVEUJCTI3CisjZGVmaW5lIFJfTUlQU19ISUdIRVIJCTI4CisjZGVmaW5lIFJfTUlQU19ISUdIRVNUCQkyOQorI2RlZmluZSBSX01JUFNfQ0FMTF9ISTE2CTMwCisjZGVmaW5lIFJfTUlQU19DQUxMX0xPMTYJMzEKKyNkZWZpbmUgUl9NSVBTX1NDTl9ESVNQCQkzMgorI2RlZmluZSBSX01JUFNfUkVMMTYJCTMzCisjZGVmaW5lIFJfTUlQU19BRERfSU1NRURJQVRFCTM0CisjZGVmaW5lIFJfTUlQU19QSlVNUAkJMzUKKyNkZWZpbmUgUl9NSVBTX1JFTEdPVAkJMzYKKyNkZWZpbmUgUl9NSVBTX0pBTFIJCTM3CisjZGVmaW5lIFJfTUlQU19UTFNfRFRQTU9EMzIJMzgJLyogTW9kdWxlIG51bWJlciAzMiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19EVFBSRUwzMgkzOQkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0IDMyIGJpdCAqLworI2RlZmluZSBSX01JUFNfVExTX0RUUE1PRDY0CTQwCS8qIE1vZHVsZSBudW1iZXIgNjQgYml0ICovCisjZGVmaW5lIFJfTUlQU19UTFNfRFRQUkVMNjQJNDEJLyogTW9kdWxlLXJlbGF0aXZlIG9mZnNldCA2NCBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19HRAkJNDIJLyogMTYgYml0IEdPVCBvZmZzZXQgZm9yIEdEICovCisjZGVmaW5lIFJfTUlQU19UTFNfTERNCQk0MwkvKiAxNiBiaXQgR09UIG9mZnNldCBmb3IgTERNICovCisjZGVmaW5lIFJfTUlQU19UTFNfRFRQUkVMX0hJMTYJNDQJLyogTW9kdWxlLXJlbGF0aXZlIG9mZnNldCwgaGlnaCAxNiBiaXRzICovCisjZGVmaW5lIFJfTUlQU19UTFNfRFRQUkVMX0xPMTYJNDUJLyogTW9kdWxlLXJlbGF0aXZlIG9mZnNldCwgbG93IDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19HT1RUUFJFTAk0NgkvKiAxNiBiaXQgR09UIG9mZnNldCBmb3IgSUUgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19UUFJFTDMyCTQ3CS8qIFRQLXJlbGF0aXZlIG9mZnNldCwgMzIgYml0ICovCisjZGVmaW5lIFJfTUlQU19UTFNfVFBSRUw2NAk0OAkvKiBUUC1yZWxhdGl2ZSBvZmZzZXQsIDY0IGJpdCAqLworI2RlZmluZSBSX01JUFNfVExTX1RQUkVMX0hJMTYJNDkJLyogVFAtcmVsYXRpdmUgb2Zmc2V0LCBoaWdoIDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19UUFJFTF9MTzE2CTUwCS8qIFRQLXJlbGF0aXZlIG9mZnNldCwgbG93IDE2IGJpdHMgKi8KKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfTUlQU19OVU0JCTUxCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgcF90eXBlIGZpZWxkIG9mIEVsZjMyX1BoZHIuICAqLworCisjZGVmaW5lIFBUX01JUFNfUkVHSU5GTwkweDcwMDAwMDAwCS8qIFJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFBUX01JUFNfUlRQUk9DICAweDcwMDAwMDAxCS8qIFJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlLiAqLworI2RlZmluZSBQVF9NSVBTX09QVElPTlMgMHg3MDAwMDAwMgorCisvKiBTcGVjaWFsIHByb2dyYW0gaGVhZGVyIHR5cGVzLiAgKi8KKworI2RlZmluZSBQRl9NSVBTX0xPQ0FMCTB4MTAwMDAwMDAKKworLyogTGVnYWwgdmFsdWVzIGZvciBkX3RhZyBmaWVsZCBvZiBFbGYzMl9EeW4uICAqLworCisjZGVmaW5lIERUX01JUFNfUkxEX1ZFUlNJT04gIDB4NzAwMDAwMDEJLyogUnVudGltZSBsaW5rZXIgaW50ZXJmYWNlIHZlcnNpb24gKi8KKyNkZWZpbmUgRFRfTUlQU19USU1FX1NUQU1QICAgMHg3MDAwMDAwMgkvKiBUaW1lc3RhbXAgKi8KKyNkZWZpbmUgRFRfTUlQU19JQ0hFQ0tTVU0gICAgMHg3MDAwMDAwMwkvKiBDaGVja3N1bSAqLworI2RlZmluZSBEVF9NSVBTX0lWRVJTSU9OICAgICAweDcwMDAwMDA0CS8qIFZlcnNpb24gc3RyaW5nIChzdHJpbmcgdGJsIGluZGV4KSAqLworI2RlZmluZSBEVF9NSVBTX0ZMQUdTCSAgICAgMHg3MDAwMDAwNQkvKiBGbGFncyAqLworI2RlZmluZSBEVF9NSVBTX0JBU0VfQUREUkVTUyAweDcwMDAwMDA2CS8qIEJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBEVF9NSVBTX01TWU0JICAgICAweDcwMDAwMDA3CisjZGVmaW5lIERUX01JUFNfQ09ORkxJQ1QgICAgIDB4NzAwMDAwMDgJLyogQWRkcmVzcyBvZiBDT05GTElDVCBzZWN0aW9uICovCisjZGVmaW5lIERUX01JUFNfTElCTElTVAkgICAgIDB4NzAwMDAwMDkJLyogQWRkcmVzcyBvZiBMSUJMSVNUIHNlY3Rpb24gKi8KKyNkZWZpbmUgRFRfTUlQU19MT0NBTF9HT1ROTyAgMHg3MDAwMDAwYQkvKiBOdW1iZXIgb2YgbG9jYWwgR09UIGVudHJpZXMgKi8KKyNkZWZpbmUgRFRfTUlQU19DT05GTElDVE5PICAgMHg3MDAwMDAwYgkvKiBOdW1iZXIgb2YgQ09ORkxJQ1QgZW50cmllcyAqLworI2RlZmluZSBEVF9NSVBTX0xJQkxJU1ROTyAgICAweDcwMDAwMDEwCS8qIE51bWJlciBvZiBMSUJMSVNUIGVudHJpZXMgKi8KKyNkZWZpbmUgRFRfTUlQU19TWU1UQUJOTyAgICAgMHg3MDAwMDAxMQkvKiBOdW1iZXIgb2YgRFlOU1lNIGVudHJpZXMgKi8KKyNkZWZpbmUgRFRfTUlQU19VTlJFRkVYVE5PICAgMHg3MDAwMDAxMgkvKiBGaXJzdCBleHRlcm5hbCBEWU5TWU0gKi8KKyNkZWZpbmUgRFRfTUlQU19HT1RTWU0JICAgICAweDcwMDAwMDEzCS8qIEZpcnN0IEdPVCBlbnRyeSBpbiBEWU5TWU0gKi8KKyNkZWZpbmUgRFRfTUlQU19ISVBBR0VOTyAgICAgMHg3MDAwMDAxNAkvKiBOdW1iZXIgb2YgR09UIHBhZ2UgdGFibGUgZW50cmllcyAqLworI2RlZmluZSBEVF9NSVBTX1JMRF9NQVAJICAgICAweDcwMDAwMDE2CS8qIEFkZHJlc3Mgb2YgcnVuIHRpbWUgbG9hZGVyIG1hcC4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1MgIDB4NzAwMDAwMTcJLyogRGVsdGEgQysrIGNsYXNzIGRlZmluaXRpb24uICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05PICAgIDB4NzAwMDAwMTggLyogTnVtYmVyIG9mIGVudHJpZXMgaW4KKwkJCQkJCURUX01JUFNfREVMVEFfQ0xBU1MuICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFICAgIDB4NzAwMDAwMTkgLyogRGVsdGEgQysrIGNsYXNzIGluc3RhbmNlcy4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfSU5TVEFOQ0VfTk8gMHg3MDAwMDAxYSAvKiBOdW1iZXIgb2YgZW50cmllcyBpbgorCQkJCQkJRFRfTUlQU19ERUxUQV9JTlNUQU5DRS4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfUkVMT0MgIDB4NzAwMDAwMWIgLyogRGVsdGEgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX1JFTE9DX05PIDB4NzAwMDAwMWMgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4KKwkJCQkJICAgICBEVF9NSVBTX0RFTFRBX1JFTE9DLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9TWU0gICAgMHg3MDAwMDAxZCAvKiBEZWx0YSBzeW1ib2xzIHRoYXQgRGVsdGEKKwkJCQkJICAgcmVsb2NhdGlvbnMgcmVmZXIgdG8uICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX1NZTV9OTyAweDcwMDAwMDFlIC8qIE51bWJlciBvZiBlbnRyaWVzIGluCisJCQkJCSAgIERUX01JUFNfREVMVEFfU1lNLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU1NZTSAweDcwMDAwMDIwIC8qIERlbHRhIHN5bWJvbHMgdGhhdCBob2xkIHRoZQorCQkJCQkgICAgIGNsYXNzIGRlY2xhcmF0aW9uLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU1NZTV9OTyAweDcwMDAwMDIxIC8qIE51bWJlciBvZiBlbnRyaWVzIGluCisJCQkJCQlEVF9NSVBTX0RFTFRBX0NMQVNTU1lNLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19DWFhfRkxBR1MgICAgMHg3MDAwMDAyMiAvKiBGbGFncyBpbmRpY2F0aW5nIGZvciBDKysgZmxhdm9yLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19QSVhJRV9JTklUICAgMHg3MDAwMDAyMworI2RlZmluZSBEVF9NSVBTX1NZTUJPTF9MSUIgICAweDcwMDAwMDI0CisjZGVmaW5lIERUX01JUFNfTE9DQUxQQUdFX0dPVElEWCAweDcwMDAwMDI1CisjZGVmaW5lIERUX01JUFNfTE9DQUxfR09USURYIDB4NzAwMDAwMjYKKyNkZWZpbmUgRFRfTUlQU19ISURERU5fR09USURYIDB4NzAwMDAwMjcKKyNkZWZpbmUgRFRfTUlQU19QUk9URUNURURfR09USURYIDB4NzAwMDAwMjgKKyNkZWZpbmUgRFRfTUlQU19PUFRJT05TCSAgICAgMHg3MDAwMDAyOSAvKiBBZGRyZXNzIG9mIC5vcHRpb25zLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19JTlRFUkZBQ0UgICAgMHg3MDAwMDAyYSAvKiBBZGRyZXNzIG9mIC5pbnRlcmZhY2UuICAqLworI2RlZmluZSBEVF9NSVBTX0RZTlNUUl9BTElHTiAweDcwMDAwMDJiCisjZGVmaW5lIERUX01JUFNfSU5URVJGQUNFX1NJWkUgMHg3MDAwMDAyYyAvKiBTaXplIG9mIHRoZSAuaW50ZXJmYWNlIHNlY3Rpb24uICovCisjZGVmaW5lIERUX01JUFNfUkxEX1RFWFRfUkVTT0xWRV9BRERSIDB4NzAwMDAwMmQgLyogQWRkcmVzcyBvZiBybGRfdGV4dF9yc29sdmUKKwkJCQkJCSAgICBmdW5jdGlvbiBzdG9yZWQgaW4gR09ULiAgKi8KKyNkZWZpbmUgRFRfTUlQU19QRVJGX1NVRkZJWCAgMHg3MDAwMDAyZSAvKiBEZWZhdWx0IHN1ZmZpeCBvZiBkc28gdG8gYmUgYWRkZWQKKwkJCQkJICAgYnkgcmxkIG9uIGRsb3BlbigpIGNhbGxzLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19DT01QQUNUX1NJWkUgMHg3MDAwMDAyZiAvKiAoTzMyKVNpemUgb2YgY29tcGFjdCByZWwgc2VjdGlvbi4gKi8KKyNkZWZpbmUgRFRfTUlQU19HUF9WQUxVRSAgICAgMHg3MDAwMDAzMCAvKiBHUCB2YWx1ZSBmb3IgYXV4IEdPVHMuICAqLworI2RlZmluZSBEVF9NSVBTX0FVWF9EWU5BTUlDICAweDcwMDAwMDMxIC8qIEFkZHJlc3Mgb2YgYXV4IC5keW5hbWljLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19OVU0JICAgICAweDMyCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgRFRfTUlQU19GTEFHUyBFbGYzMl9EeW4gZW50cnkuICAqLworCisjZGVmaW5lIFJIRl9OT05FCQkgICAwCQkvKiBObyBmbGFncyAqLworI2RlZmluZSBSSEZfUVVJQ0tTVEFSVAkJICAgKDEgPDwgMCkJLyogVXNlIHF1aWNrc3RhcnQgKi8KKyNkZWZpbmUgUkhGX05PVFBPVAkJICAgKDEgPDwgMSkJLyogSGFzaCBzaXplIG5vdCBwb3dlciBvZiAyICovCisjZGVmaW5lIFJIRl9OT19MSUJSQVJZX1JFUExBQ0VNRU5UICgxIDw8IDIpCS8qIElnbm9yZSBMRF9MSUJSQVJZX1BBVEggKi8KKyNkZWZpbmUgUkhGX05PX01PVkUJCSAgICgxIDw8IDMpCisjZGVmaW5lIFJIRl9TR0lfT05MWQkJICAgKDEgPDwgNCkKKyNkZWZpbmUgUkhGX0dVQVJBTlRFRV9JTklUCSAgICgxIDw8IDUpCisjZGVmaW5lIFJIRl9ERUxUQV9DX1BMVVNfUExVUwkgICAoMSA8PCA2KQorI2RlZmluZSBSSEZfR1VBUkFOVEVFX1NUQVJUX0lOSVQgICAoMSA8PCA3KQorI2RlZmluZSBSSEZfUElYSUUJCSAgICgxIDw8IDgpCisjZGVmaW5lIFJIRl9ERUZBVUxUX0RFTEFZX0xPQUQJICAgKDEgPDwgOSkKKyNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVAkgICAoMSA8PCAxMCkKKyNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVEVECSAgICgxIDw8IDExKQorI2RlZmluZSBSSEZfQ09SRAkJICAgKDEgPDwgMTIpCisjZGVmaW5lIFJIRl9OT19VTlJFU19VTkRFRgkgICAoMSA8PCAxMykKKyNkZWZpbmUgUkhGX1JMRF9PUkRFUl9TQUZFCSAgICgxIDw8IDE0KQorCisvKiBFbnRyaWVzIGZvdW5kIGluIHNlY3Rpb25zIG9mIHR5cGUgU0hUX01JUFNfTElCTElTVC4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQgbF9uYW1lOwkJLyogTmFtZSAoc3RyaW5nIHRhYmxlIGluZGV4KSAqLworICBFbGYzMl9Xb3JkIGxfdGltZV9zdGFtcDsJLyogVGltZXN0YW1wICovCisgIEVsZjMyX1dvcmQgbF9jaGVja3N1bTsJLyogQ2hlY2tzdW0gKi8KKyAgRWxmMzJfV29yZCBsX3ZlcnNpb247CQkvKiBJbnRlcmZhY2UgdmVyc2lvbiAqLworICBFbGYzMl9Xb3JkIGxfZmxhZ3M7CQkvKiBGbGFncyAqLworfSBFbGYzMl9MaWI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1dvcmQgbF9uYW1lOwkJLyogTmFtZSAoc3RyaW5nIHRhYmxlIGluZGV4KSAqLworICBFbGY2NF9Xb3JkIGxfdGltZV9zdGFtcDsJLyogVGltZXN0YW1wICovCisgIEVsZjY0X1dvcmQgbF9jaGVja3N1bTsJLyogQ2hlY2tzdW0gKi8KKyAgRWxmNjRfV29yZCBsX3ZlcnNpb247CQkvKiBJbnRlcmZhY2UgdmVyc2lvbiAqLworICBFbGY2NF9Xb3JkIGxfZmxhZ3M7CQkvKiBGbGFncyAqLworfSBFbGY2NF9MaWI7CisKKworLyogTGVnYWwgdmFsdWVzIGZvciBsX2ZsYWdzLiAgKi8KKworI2RlZmluZSBMTF9OT05FCQkgIDAKKyNkZWZpbmUgTExfRVhBQ1RfTUFUQ0gJICAoMSA8PCAwKQkvKiBSZXF1aXJlIGV4YWN0IG1hdGNoICovCisjZGVmaW5lIExMX0lHTk9SRV9JTlRfVkVSICgxIDw8IDEpCS8qIElnbm9yZSBpbnRlcmZhY2UgdmVyc2lvbiAqLworI2RlZmluZSBMTF9SRVFVSVJFX01JTk9SICAoMSA8PCAyKQorI2RlZmluZSBMTF9FWFBPUlRTCSAgKDEgPDwgMykKKyNkZWZpbmUgTExfREVMQVlfTE9BRAkgICgxIDw8IDQpCisjZGVmaW5lIExMX0RFTFRBCSAgKDEgPDwgNSkKKworLyogRW50cmllcyBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX0NPTkZMSUNULiAgKi8KKwordHlwZWRlZiBFbGYzMl9BZGRyIEVsZjMyX0NvbmZsaWN0OworCisKKy8qIEhQUEEgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfZmxhZ3MgZmllbGQgb2YgRWxmMzJfRWhkci4gICovCisKKyNkZWZpbmUgRUZfUEFSSVNDX1RSQVBOSUwJMHgwMDAxMDAwMCAvKiBUcmFwIG5pbCBwb2ludGVyIGRlcmVmZXJlbmNlLiAgKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0VYVAkJMHgwMDAyMDAwMCAvKiBQcm9ncmFtIHVzZXMgYXJjaC4gZXh0ZW5zaW9ucy4gKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0xTQgkJMHgwMDA0MDAwMCAvKiBQcm9ncmFtIGV4cGVjdHMgbGl0dGxlIGVuZGlhbi4gKi8KKyNkZWZpbmUgRUZfUEFSSVNDX1dJREUJCTB4MDAwODAwMDAgLyogUHJvZ3JhbSBleHBlY3RzIHdpZGUgbW9kZS4gICovCisjZGVmaW5lIEVGX1BBUklTQ19OT19LQUJQCTB4MDAxMDAwMDAgLyogTm8ga2VybmVsIGFzc2lzdGVkIGJyYW5jaAorCQkJCQkgICAgICBwcmVkaWN0aW9uLiAgKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0xBWllTV0FQCTB4MDA0MDAwMDAgLyogQWxsb3cgbGF6eSBzd2FwcGluZy4gICovCisjZGVmaW5lIEVGX1BBUklTQ19BUkNICQkweDAwMDBmZmZmIC8qIEFyY2hpdGVjdHVyZSB2ZXJzaW9uLiAgKi8KKworLyogRGVmaW5lZCB2YWx1ZXMgZm9yIGBlX2ZsYWdzICYgRUZfUEFSSVNDX0FSQ0gnIGFyZTogICovCisKKyNkZWZpbmUgRUZBX1BBUklTQ18xXzAJCSAgICAweDAyMGIgLyogUEEtUklTQyAxLjAgYmlnLWVuZGlhbi4gICovCisjZGVmaW5lIEVGQV9QQVJJU0NfMV8xCQkgICAgMHgwMjEwIC8qIFBBLVJJU0MgMS4xIGJpZy1lbmRpYW4uICAqLworI2RlZmluZSBFRkFfUEFSSVNDXzJfMAkJICAgIDB4MDIxNCAvKiBQQS1SSVNDIDIuMCBiaWctZW5kaWFuLiAgKi8KKworLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZGVjZXMuICAqLworCisjZGVmaW5lIFNITl9QQVJJU0NfQU5TSV9DT01NT04JMHhmZjAwCSAgIC8qIFNlY3Rpb24gZm9yIHRlbmF0aXZlbHkgZGVjbGFyZWQKKwkJCQkJICAgICAgc3ltYm9scyBpbiBBTlNJIEMuICAqLworI2RlZmluZSBTSE5fUEFSSVNDX0hVR0VfQ09NTU9OCTB4ZmYwMQkgICAvKiBDb21tb24gYmxvY2tzIGluIGh1Z2UgbW9kZWwuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHNoX3R5cGUgZmllbGQgb2YgRWxmMzJfU2hkci4gICovCisKKyNkZWZpbmUgU0hUX1BBUklTQ19FWFQJCTB4NzAwMDAwMDAgLyogQ29udGFpbnMgcHJvZHVjdCBzcGVjaWZpYyBleHQuICovCisjZGVmaW5lIFNIVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEgLyogVW53aW5kIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX1BBUklTQ19ET0MJCTB4NzAwMDAwMDIgLyogRGVidWcgaW5mbyBmb3Igb3B0aW1pemVkIGNvZGUuICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfZmxhZ3MgZmllbGQgb2YgRWxmMzJfU2hkci4gICovCisKKyNkZWZpbmUgU0hGX1BBUklTQ19TSE9SVAkweDIwMDAwMDAwIC8qIFNlY3Rpb24gd2l0aCBzaG9ydCBhZGRyZXNzaW5nLiAqLworI2RlZmluZSBTSEZfUEFSSVNDX0hVR0UJCTB4NDAwMDAwMDAgLyogU2VjdGlvbiBmYXIgZnJvbSBncC4gICovCisjZGVmaW5lIFNIRl9QQVJJU0NfU0JQCQkweDgwMDAwMDAwIC8qIFN0YXRpYyBicmFuY2ggcHJlZGljdGlvbiBjb2RlLiAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX1RZUEUgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIHR5cGUpLiAgKi8KKworI2RlZmluZSBTVFRfUEFSSVNDX01JTExJQ09ERQkxMwkvKiBNaWxsaWNvZGUgZnVuY3Rpb24gZW50cnkgcG9pbnQuICAqLworCisjZGVmaW5lIFNUVF9IUF9PUEFRVUUJCShTVFRfTE9PUyArIDB4MSkKKyNkZWZpbmUgU1RUX0hQX1NUVUIJCShTVFRfTE9PUyArIDB4MikKKworLyogSFBQQSByZWxvY3MuICAqLworCisjZGVmaW5lIFJfUEFSSVNDX05PTkUJCTAJLyogTm8gcmVsb2MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIzMgkJMQkvKiBEaXJlY3QgMzItYml0IHJlZmVyZW5jZS4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjIxTAkJMgkvKiBMZWZ0IDIxIGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTdSCQkzCS8qIFJpZ2h0IDE3IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTdGCQk0CS8qIDE3IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTRSCQk2CS8qIFJpZ2h0IDE0IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwzMgk5CS8qIDMyLWJpdCByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDIxTAkxMAkvKiBMZWZ0IDIxIGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxN1IJMTEJLyogUmlnaHQgMTcgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE3RgkxMgkvKiAxNyBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTRSCTE0CS8qIFJpZ2h0IDE0IGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRFBSRUwyMUwJMTgJLyogTGVmdCAyMSBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RQUkVMMTRSCTIyCS8qIFJpZ2h0IDE0IGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwyMUwJMjYJLyogR1AtcmVsYXRpdmUsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTRSCTMwCS8qIEdQLXJlbGF0aXZlLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkYyMUwJMzQJLyogTFQtcmVsYXRpdmUsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTRSCTM4CS8qIExULXJlbGF0aXZlLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfU0VDUkVMMzIJNDEJLyogMzIgYml0cyBzZWN0aW9uIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1NFR0JBU0UJNDgJLyogTm8gcmVsb2NhdGlvbiwgc2V0IHNlZ21lbnQgYmFzZS4gICovCisjZGVmaW5lIFJfUEFSSVNDX1NFR1JFTDMyCTQ5CS8qIDMyIGJpdHMgc2VnbWVudCByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYyMUwJNTAJLyogUExUIHJlbC4gYWRkcmVzcywgbGVmdCAyMSBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTRSCTU0CS8qIFBMVCByZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMzIJNTcJLyogMzIgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHBvaW50ZXIuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUwJNTgJLyogTFQtcmVsLiBmY3QgcHRyLCBsZWZ0IDIxIGJpdHMuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIJNjIJLyogTFQtcmVsLiBmY3QgcHRyLCByaWdodCAxNCBiaXRzLiAqLworI2RlZmluZSBSX1BBUklTQ19GUFRSNjQJCTY0CS8qIDY0IGJpdHMgZnVuY3Rpb24gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMQUJFTDMyCTY1CS8qIDMyIGJpdHMgZnVuY3Rpb24gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMNjQJNzIJLyogNjQgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDIyRgk3NAkvKiAyMiBiaXRzIFBDLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTRXUgk3NQkvKiBQQy1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE0RFIJNzYJLyogUEMgcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNkYJNzcJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE2V0YJNzgJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE2REYJNzkJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVI2NAkJODAJLyogNjQgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNFdSCTgzCS8qIDE0IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTREUgk4NAkvKiAxNCBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE2RgkJODUJLyogMTYgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNldGCTg2CS8qIDE2IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTZERgk4NwkvKiAxNiBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMNjQJODgJLyogNjQgYml0cyBvZiBHUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDE0V1IJOTEJLyogR1AtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNERSCTkyCS8qIEdQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTZGCTkzCS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNldGCTk0CS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNkRGCTk1CS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkY2NAk5NgkvKiA2NCBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTRXUgk5OQkvKiBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE0RFIJMTAwCS8qIExULXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTZGCTEwMQkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTZXRgkxMDIJLyogMTYgYml0cyBMVC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE2REYJMTAzCS8qIDE2IGJpdHMgTFQtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfU0VDUkVMNjQJMTA0CS8qIDY0IGJpdHMgc2VjdGlvbiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19TRUdSRUw2NAkxMTIJLyogNjQgYml0cyBzZWdtZW50IHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE0V1IJMTE1CS8qIFBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNERSCTExNgkvKiBQTFQtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTZGCTExNwkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE2V0YJMTE4CS8qIDE2IGJpdHMgUExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE2REYJMTE5CS8qIDE2IGJpdHMgUExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFI2NAkxMjAJLyogNjQgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFdSCTEyMwkvKiBMVC1yZWwuIGZjdC4gcHRyLiwgcmlnaHQgMTQgYml0cy4gKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIJMTI0CS8qIExULXJlbC4gZmN0LiBwdHIuLCByaWdodCAxNCBiaXRzLiAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGCTEyNQkvKiAxNiBiaXRzIExULXJlbC4gZnVuY3Rpb24gcHRyLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YJMTI2CS8qIDE2IGJpdHMgTFQtcmVsLiBmdW5jdGlvbiBwdHIuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERgkxMjcJLyogMTYgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xPUkVTRVJWRQkxMjgKKyNkZWZpbmUgUl9QQVJJU0NfQ09QWQkJMTI4CS8qIENvcHkgcmVsb2NhdGlvbi4gICovCisjZGVmaW5lIFJfUEFSSVNDX0lQTFQJCTEyOQkvKiBEeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRVBMVAkJMTMwCS8qIER5bmFtaWMgcmVsb2MsIGV4cG9ydGVkIFBMVCAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDMyCTE1MwkvKiAzMiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMjFMCTE1NAkvKiBUUC1yZWwuIGFkZHJlc3MsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTRSCTE1OAkvKiBUUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDIxTAkxNjIJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCBsZWZ0IDIxIGJpdHMuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTRSCTE2NgkvKiBMVC1UUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNEYJMTY3CS8qIDE0IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUw2NAkyMTYJLyogNjQgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDE0V1IJMjE5CS8qIFRQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTREUgkyMjAJLyogVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNkYJMjIxCS8qIDE2IGJpdHMgVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNldGCTIyMgkvKiAxNiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTZERgkyMjMJLyogMTYgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDY0CTIyNAkvKiA2NCBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUgkyMjcJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTREUgkyMjgJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTZGCTIyOQkvKiAxNiBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTZXRgkyMzAJLyogMTYgYml0cyBMVC1UUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE2REYJMjMxCS8qIDE2IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfSElSRVNFUlZFCTI1NQorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHBfdHlwZSBmaWVsZCBvZiBFbGYzMl9QaGRyL0VsZjY0X1BoZHIuICAqLworCisjZGVmaW5lIFBUX0hQX1RMUwkJKFBUX0xPT1MgKyAweDApCisjZGVmaW5lIFBUX0hQX0NPUkVfTk9ORQkJKFBUX0xPT1MgKyAweDEpCisjZGVmaW5lIFBUX0hQX0NPUkVfVkVSU0lPTgkoUFRfTE9PUyArIDB4MikKKyNkZWZpbmUgUFRfSFBfQ09SRV9LRVJORUwJKFBUX0xPT1MgKyAweDMpCisjZGVmaW5lIFBUX0hQX0NPUkVfQ09NTQkJKFBUX0xPT1MgKyAweDQpCisjZGVmaW5lIFBUX0hQX0NPUkVfUFJPQwkJKFBUX0xPT1MgKyAweDUpCisjZGVmaW5lIFBUX0hQX0NPUkVfTE9BREFCTEUJKFBUX0xPT1MgKyAweDYpCisjZGVmaW5lIFBUX0hQX0NPUkVfU1RBQ0sJKFBUX0xPT1MgKyAweDcpCisjZGVmaW5lIFBUX0hQX0NPUkVfU0hNCQkoUFRfTE9PUyArIDB4OCkKKyNkZWZpbmUgUFRfSFBfQ09SRV9NTUYJCShQVF9MT09TICsgMHg5KQorI2RlZmluZSBQVF9IUF9QQVJBTExFTAkJKFBUX0xPT1MgKyAweDEwKQorI2RlZmluZSBQVF9IUF9GQVNUQklORAkJKFBUX0xPT1MgKyAweDExKQorI2RlZmluZSBQVF9IUF9PUFRfQU5OT1QJCShQVF9MT09TICsgMHgxMikKKyNkZWZpbmUgUFRfSFBfSFNMX0FOTk9UCQkoUFRfTE9PUyArIDB4MTMpCisjZGVmaW5lIFBUX0hQX1NUQUNLCQkoUFRfTE9PUyArIDB4MTQpCisKKyNkZWZpbmUgUFRfUEFSSVNDX0FSQ0hFWFQJMHg3MDAwMDAwMAorI2RlZmluZSBQVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKKworLyogTGVnYWwgdmFsdWVzIGZvciBwX2ZsYWdzIGZpZWxkIG9mIEVsZjMyX1BoZHIvRWxmNjRfUGhkci4gICovCisKKyNkZWZpbmUgUEZfUEFSSVNDX1NCUAkJMHgwODAwMDAwMAorCisjZGVmaW5lIFBGX0hQX1BBR0VfU0laRQkJMHgwMDEwMDAwMAorI2RlZmluZSBQRl9IUF9GQVJfU0hBUkVECTB4MDAyMDAwMDAKKyNkZWZpbmUgUEZfSFBfTkVBUl9TSEFSRUQJMHgwMDQwMDAwMAorI2RlZmluZSBQRl9IUF9DT0RFCQkweDAxMDAwMDAwCisjZGVmaW5lIFBGX0hQX01PRElGWQkJMHgwMjAwMDAwMAorI2RlZmluZSBQRl9IUF9MQVpZU1dBUAkJMHgwNDAwMDAwMAorI2RlZmluZSBQRl9IUF9TQlAJCTB4MDgwMDAwMDAKKworCisvKiBBbHBoYSBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgZV9mbGFncyBmaWVsZCBvZiBFbGY2NF9FaGRyLiAgKi8KKworI2RlZmluZSBFRl9BTFBIQV8zMkJJVAkJMQkvKiBBbGwgYWRkcmVzc2VzIG11c3QgYmUgPCAyR0IuICAqLworI2RlZmluZSBFRl9BTFBIQV9DQU5SRUxBWAkyCS8qIFJlbG9jYXRpb25zIGZvciByZWxheGluZyBleGlzdC4gICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfdHlwZSBmaWVsZCBvZiBFbGY2NF9TaGRyLiAgKi8KKworLyogVGhlc2UgdHdvIGFyZSBwcmltZXJpbHkgY29uY2VybmVkIHdpdGggRUNPRkYgZGVidWdnaW5nIGluZm8uICAqLworI2RlZmluZSBTSFRfQUxQSEFfREVCVUcJCTB4NzAwMDAwMDEKKyNkZWZpbmUgU0hUX0FMUEhBX1JFR0lORk8JMHg3MDAwMDAwMgorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHNoX2ZsYWdzIGZpZWxkIG9mIEVsZjY0X1NoZHIuICAqLworCisjZGVmaW5lIFNIRl9BTFBIQV9HUFJFTAkJMHgxMDAwMDAwMAorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHN0X290aGVyIGZpZWxkIG9mIEVsZjY0X1N5bS4gICovCisjZGVmaW5lIFNUT19BTFBIQV9OT1BWCQkweDgwCS8qIE5vIFBWIHJlcXVpcmVkLiAgKi8KKyNkZWZpbmUgU1RPX0FMUEhBX1NURF9HUExPQUQJMHg4OAkvKiBQViBvbmx5IHVzZWQgZm9yIGluaXRpYWwgbGRncC4gICovCisKKy8qIEFscGhhIHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl9BTFBIQV9OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfQUxQSEFfUkVGTE9ORwkJMQkvKiBEaXJlY3QgMzIgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfUkVGUVVBRAkJMgkvKiBEaXJlY3QgNjQgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfR1BSRUwzMgkJMwkvKiBHUCByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9MSVRFUkFMCQk0CS8qIEdQIHJlbGF0aXZlIDE2IGJpdCB3L29wdGltaXphdGlvbiAqLworI2RlZmluZSBSX0FMUEhBX0xJVFVTRQkJNQkvKiBPcHRpbWl6YXRpb24gaGludCBmb3IgTElURVJBTCAqLworI2RlZmluZSBSX0FMUEhBX0dQRElTUAkJNgkvKiBBZGQgZGlzcGxhY2VtZW50IHRvIEdQICovCisjZGVmaW5lIFJfQUxQSEFfQlJBRERSCQk3CS8qIFBDKzQgcmVsYXRpdmUgMjMgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9BTFBIQV9ISU5UCQk4CS8qIFBDKzQgcmVsYXRpdmUgMTYgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9BTFBIQV9TUkVMMTYJCTkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfU1JFTDMyCQkxMAkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9TUkVMNjQJCTExCS8qIFBDIHJlbGF0aXZlIDY0IGJpdCAqLworI2RlZmluZSBSX0FMUEhBX0dQUkVMSElHSAkxNwkvKiBHUCByZWxhdGl2ZSAzMiBiaXQsIGhpZ2ggMTYgYml0cyAqLworI2RlZmluZSBSX0FMUEhBX0dQUkVMTE9XCTE4CS8qIEdQIHJlbGF0aXZlIDMyIGJpdCwgbG93IDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9BTFBIQV9HUFJFTDE2CQkxOQkvKiBHUCByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9DT1BZCQkyNAkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfQUxQSEFfR0xPQl9EQVQJMjUJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSX0FMUEhBX0pNUF9TTE9UCTI2CS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9BTFBIQV9SRUxBVElWRQkyNwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfQUxQSEFfVExTX0dEX0hJCTI4CisjZGVmaW5lIFJfQUxQSEFfVExTR0QJCTI5CisjZGVmaW5lIFJfQUxQSEFfVExTX0xETQkJMzAKKyNkZWZpbmUgUl9BTFBIQV9EVFBNT0Q2NAkzMQorI2RlZmluZSBSX0FMUEhBX0dPVERUUFJFTAkzMgorI2RlZmluZSBSX0FMUEhBX0RUUFJFTDY0CTMzCisjZGVmaW5lIFJfQUxQSEFfRFRQUkVMSEkJMzQKKyNkZWZpbmUgUl9BTFBIQV9EVFBSRUxMTwkzNQorI2RlZmluZSBSX0FMUEhBX0RUUFJFTDE2CTM2CisjZGVmaW5lIFJfQUxQSEFfR09UVFBSRUwJMzcKKyNkZWZpbmUgUl9BTFBIQV9UUFJFTDY0CQkzOAorI2RlZmluZSBSX0FMUEhBX1RQUkVMSEkJCTM5CisjZGVmaW5lIFJfQUxQSEFfVFBSRUxMTwkJNDAKKyNkZWZpbmUgUl9BTFBIQV9UUFJFTDE2CQk0MQorLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9BTFBIQV9OVU0JCTQ2CisKKy8qIE1hZ2ljIHZhbHVlcyBvZiB0aGUgTElUVVNFIHJlbG9jYXRpb24gYWRkZW5kLiAgKi8KKyNkZWZpbmUgTElUVVNFX0FMUEhBX0FERFIJMAorI2RlZmluZSBMSVRVU0VfQUxQSEFfQkFTRQkxCisjZGVmaW5lIExJVFVTRV9BTFBIQV9CWVRPRkYJMgorI2RlZmluZSBMSVRVU0VfQUxQSEFfSlNSCTMKKyNkZWZpbmUgTElUVVNFX0FMUEhBX1RMU19HRAk0CisjZGVmaW5lIExJVFVTRV9BTFBIQV9UTFNfTERNCTUKKworCisvKiBQb3dlclBDIHNwZWNpZmljIGRlY2xhcmF0aW9ucyAqLworCisvKiBWYWx1ZXMgZm9yIEVsZjMyLzY0X0VoZHIuZV9mbGFncy4gICovCisjZGVmaW5lIEVGX1BQQ19FTUIJCTB4ODAwMDAwMDAJLyogUG93ZXJQQyBlbWJlZGRlZCBmbGFnICovCisKKy8qIEN5Z251cyBsb2NhbCBiaXRzIGJlbG93ICovCisjZGVmaW5lIEVGX1BQQ19SRUxPQ0FUQUJMRQkweDAwMDEwMDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZSBmbGFnKi8KKyNkZWZpbmUgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQgkweDAwMDA4MDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZS1saWIKKwkJCQkJCSAgIGZsYWcgKi8KKworLyogUG93ZXJQQyByZWxvY2F0aW9ucyBkZWZpbmVkIGJ5IHRoZSBBQklzICovCisjZGVmaW5lIFJfUFBDX05PTkUJCTAKKyNkZWZpbmUgUl9QUENfQUREUjMyCQkxCS8qIDMyYml0IGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUENfQUREUjI0CQkyCS8qIDI2Yml0IGFkZHJlc3MsIDIgYml0cyBpZ25vcmVkLiAgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE2CQkzCS8qIDE2Yml0IGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE2X0xPCQk0CS8qIGxvd2VyIDE2Yml0IG9mIGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE2X0hJCQk1CS8qIGhpZ2ggMTZiaXQgb2YgYWJzb2x1dGUgYWRkcmVzcyAqLworI2RlZmluZSBSX1BQQ19BRERSMTZfSEEJCTYJLyogYWRqdXN0ZWQgaGlnaCAxNmJpdCAqLworI2RlZmluZSBSX1BQQ19BRERSMTQJCTcJLyogMTZiaXQgYWRkcmVzcywgMiBiaXRzIGlnbm9yZWQgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE0X0JSVEFLRU4JOAorI2RlZmluZSBSX1BQQ19BRERSMTRfQlJOVEFLRU4JOQorI2RlZmluZSBSX1BQQ19SRUwyNAkJMTAJLyogUEMgcmVsYXRpdmUgMjYgYml0ICovCisjZGVmaW5lIFJfUFBDX1JFTDE0CQkxMQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9QUENfUkVMMTRfQlJUQUtFTgkxMgorI2RlZmluZSBSX1BQQ19SRUwxNF9CUk5UQUtFTgkxMworI2RlZmluZSBSX1BQQ19HT1QxNgkJMTQKKyNkZWZpbmUgUl9QUENfR09UMTZfTE8JCTE1CisjZGVmaW5lIFJfUFBDX0dPVDE2X0hJCQkxNgorI2RlZmluZSBSX1BQQ19HT1QxNl9IQQkJMTcKKyNkZWZpbmUgUl9QUENfUExUUkVMMjQJCTE4CisjZGVmaW5lIFJfUFBDX0NPUFkJCTE5CisjZGVmaW5lIFJfUFBDX0dMT0JfREFUCQkyMAorI2RlZmluZSBSX1BQQ19KTVBfU0xPVAkJMjEKKyNkZWZpbmUgUl9QUENfUkVMQVRJVkUJCTIyCisjZGVmaW5lIFJfUFBDX0xPQ0FMMjRQQwkJMjMKKyNkZWZpbmUgUl9QUENfVUFERFIzMgkJMjQKKyNkZWZpbmUgUl9QUENfVUFERFIxNgkJMjUKKyNkZWZpbmUgUl9QUENfUkVMMzIJCTI2CisjZGVmaW5lIFJfUFBDX1BMVDMyCQkyNworI2RlZmluZSBSX1BQQ19QTFRSRUwzMgkJMjgKKyNkZWZpbmUgUl9QUENfUExUMTZfTE8JCTI5CisjZGVmaW5lIFJfUFBDX1BMVDE2X0hJCQkzMAorI2RlZmluZSBSX1BQQ19QTFQxNl9IQQkJMzEKKyNkZWZpbmUgUl9QUENfU0RBUkVMMTYJCTMyCisjZGVmaW5lIFJfUFBDX1NFQ1RPRkYJCTMzCisjZGVmaW5lIFJfUFBDX1NFQ1RPRkZfTE8JMzQKKyNkZWZpbmUgUl9QUENfU0VDVE9GRl9ISQkzNQorI2RlZmluZSBSX1BQQ19TRUNUT0ZGX0hBCTM2CisKKy8qIFBvd2VyUEMgcmVsb2NhdGlvbnMgZGVmaW5lZCBmb3IgdGhlIFRMUyBhY2Nlc3MgQUJJLiAgKi8KKyNkZWZpbmUgUl9QUENfVExTCQk2NyAvKiBub25lCShzeW0rYWRkKUB0bHMgKi8KKyNkZWZpbmUgUl9QUENfRFRQTU9EMzIJCTY4IC8qIHdvcmQzMgkoc3ltK2FkZClAZHRwbW9kICovCisjZGVmaW5lIFJfUFBDX1RQUkVMMTYJCTY5IC8qIGhhbGYxNioJKHN5bSthZGQpQHRwcmVsICovCisjZGVmaW5lIFJfUFBDX1RQUkVMMTZfTE8JNzAgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDX1RQUkVMMTZfSEkJNzEgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDX1RQUkVMMTZfSEEJNzIgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoYSAqLworI2RlZmluZSBSX1BQQ19UUFJFTDMyCQk3MyAvKiB3b3JkMzIJKHN5bSthZGQpQHRwcmVsICovCisjZGVmaW5lIFJfUFBDX0RUUFJFTDE2CQk3NCAvKiBoYWxmMTYqCShzeW0rYWRkKUBkdHByZWwgKi8KKyNkZWZpbmUgUl9QUENfRFRQUkVMMTZfTE8JNzUgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAbCAqLworI2RlZmluZSBSX1BQQ19EVFBSRUwxNl9ISQk3NiAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDX0RUUFJFTDE2X0hBCTc3IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGhhICovCisjZGVmaW5lIFJfUFBDX0RUUFJFTDMyCQk3OCAvKiB3b3JkMzIJKHN5bSthZGQpQGR0cHJlbCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTR0QxNgk3OSAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAdGxzZ2QgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0dEMTZfTE8JODAgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAbCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTR0QxNl9ISQk4MSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBoICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNHRDE2X0hBCTgyIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGhhICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNMRDE2CTgzIC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0bHNsZCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTTEQxNl9MTwk4NCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBsICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNMRDE2X0hJCTg1IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGggKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0xEMTZfSEEJODYgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAaGEgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RQUkVMMTYJODcgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QHRwcmVsICovCisjZGVmaW5lIFJfUFBDX0dPVF9UUFJFTDE2X0xPCTg4IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RQUkVMMTZfSEkJODkgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdHByZWxAaCAqLworI2RlZmluZSBSX1BQQ19HT1RfVFBSRUwxNl9IQQk5MCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBoYSAqLworI2RlZmluZSBSX1BQQ19HT1RfRFRQUkVMMTYJOTEgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QGR0cHJlbCAqLworI2RlZmluZSBSX1BQQ19HT1RfRFRQUkVMMTZfTE8JOTIgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QGR0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDX0dPVF9EVFBSRUwxNl9ISQk5MyAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAZHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUENfR09UX0RUUFJFTDE2X0hBCTk0IC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEBkdHByZWxAaGEgKi8KKworLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9QUENfTlVNCQk5NQorCisvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZnJvbSB0aGUgRW1iZWRkZWQgRUxGIEFCSSwgYW5kIGFyZSBub3QKKyAgIGluIHRoZSBTVlI0IEVMRiBBQkkuICAqLworI2RlZmluZSBSX1BQQ19FTUJfTkFERFIzMgkxMDEKKyNkZWZpbmUgUl9QUENfRU1CX05BRERSMTYJMTAyCisjZGVmaW5lIFJfUFBDX0VNQl9OQUREUjE2X0xPCTEwMworI2RlZmluZSBSX1BQQ19FTUJfTkFERFIxNl9ISQkxMDQKKyNkZWZpbmUgUl9QUENfRU1CX05BRERSMTZfSEEJMTA1CisjZGVmaW5lIFJfUFBDX0VNQl9TREFJMTYJMTA2CisjZGVmaW5lIFJfUFBDX0VNQl9TREEySTE2CTEwNworI2RlZmluZSBSX1BQQ19FTUJfU0RBMlJFTAkxMDgKKyNkZWZpbmUgUl9QUENfRU1CX1NEQTIxCQkxMDkJLyogMTYgYml0IG9mZnNldCBpbiBTREEgKi8KKyNkZWZpbmUgUl9QUENfRU1CX01SS1JFRgkxMTAKKyNkZWZpbmUgUl9QUENfRU1CX1JFTFNFQzE2CTExMQorI2RlZmluZSBSX1BQQ19FTUJfUkVMU1RfTE8JMTEyCisjZGVmaW5lIFJfUFBDX0VNQl9SRUxTVF9ISQkxMTMKKyNkZWZpbmUgUl9QUENfRU1CX1JFTFNUX0hBCTExNAorI2RlZmluZSBSX1BQQ19FTUJfQklUX0ZMRAkxMTUKKyNkZWZpbmUgUl9QUENfRU1CX1JFTFNEQQkxMTYJLyogMTYgYml0IHJlbGF0aXZlIG9mZnNldCBpbiBTREEgKi8KKworLyogRGlhYiB0b29sIHJlbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgUl9QUENfRElBQl9TREEyMV9MTwkxODAJLyogbGlrZSBFTUJfU0RBMjEsIGJ1dCBsb3dlciAxNiBiaXQgKi8KKyNkZWZpbmUgUl9QUENfRElBQl9TREEyMV9ISQkxODEJLyogbGlrZSBFTUJfU0RBMjEsIGJ1dCBoaWdoIDE2IGJpdCAqLworI2RlZmluZSBSX1BQQ19ESUFCX1NEQTIxX0hBCTE4MgkvKiBsaWtlIEVNQl9TREEyMSwgYWRqdXN0ZWQgaGlnaCAxNiAqLworI2RlZmluZSBSX1BQQ19ESUFCX1JFTFNEQV9MTwkxODMJLyogbGlrZSBFTUJfUkVMU0RBLCBidXQgbG93ZXIgMTYgYml0ICovCisjZGVmaW5lIFJfUFBDX0RJQUJfUkVMU0RBX0hJCTE4NAkvKiBsaWtlIEVNQl9SRUxTREEsIGJ1dCBoaWdoIDE2IGJpdCAqLworI2RlZmluZSBSX1BQQ19ESUFCX1JFTFNEQV9IQQkxODUJLyogbGlrZSBFTUJfUkVMU0RBLCBhZGp1c3RlZCBoaWdoIDE2ICovCisKKy8qIFRoaXMgaXMgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgYW55IG9sZCBmYXNoaW9uZWQgVE9DMTYgcmVmZXJlbmNlcworICAgdGhhdCBtYXkgc3RpbGwgYmUgaW4gb2JqZWN0IGZpbGVzLiAgKi8KKyNkZWZpbmUgUl9QUENfVE9DMTYJCTI1NQorCisKKy8qIFBvd2VyUEM2NCByZWxvY2F0aW9ucyBkZWZpbmVkIGJ5IHRoZSBBQklzICovCisjZGVmaW5lIFJfUFBDNjRfTk9ORQkJUl9QUENfTk9ORQorI2RlZmluZSBSX1BQQzY0X0FERFIzMgkJUl9QUENfQUREUjMyIC8qIDMyYml0IGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMjQJCVJfUFBDX0FERFIyNCAvKiAyNmJpdCBhZGRyZXNzLCB3b3JkIGFsaWduZWQgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTYJCVJfUFBDX0FERFIxNiAvKiAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0xPCVJfUFBDX0FERFIxNl9MTwkvKiBsb3dlciAxNmJpdHMgb2YgYWRkcmVzcyAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9ISQlSX1BQQ19BRERSMTZfSEkJLyogaGlnaCAxNmJpdHMgb2YgYWRkcmVzcy4gKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfSEEJUl9QUENfQUREUjE2X0hBIC8qIGFkanVzdGVkIGhpZ2ggMTZiaXRzLiAgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTQJCVJfUFBDX0FERFIxNCAvKiAxNmJpdCBhZGRyZXNzLCB3b3JkIGFsaWduZWQgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTRfQlJUQUtFTglSX1BQQ19BRERSMTRfQlJUQUtFTgorI2RlZmluZSBSX1BQQzY0X0FERFIxNF9CUk5UQUtFTglSX1BQQ19BRERSMTRfQlJOVEFLRU4KKyNkZWZpbmUgUl9QUEM2NF9SRUwyNAkJUl9QUENfUkVMMjQgLyogUEMtcmVsLiAyNiBiaXQsIHdvcmQgYWxpZ25lZCAqLworI2RlZmluZSBSX1BQQzY0X1JFTDE0CQlSX1BQQ19SRUwxNCAvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9QUEM2NF9SRUwxNF9CUlRBS0VOCVJfUFBDX1JFTDE0X0JSVEFLRU4KKyNkZWZpbmUgUl9QUEM2NF9SRUwxNF9CUk5UQUtFTglSX1BQQ19SRUwxNF9CUk5UQUtFTgorI2RlZmluZSBSX1BQQzY0X0dPVDE2CQlSX1BQQ19HT1QxNgorI2RlZmluZSBSX1BQQzY0X0dPVDE2X0xPCVJfUFBDX0dPVDE2X0xPCisjZGVmaW5lIFJfUFBDNjRfR09UMTZfSEkJUl9QUENfR09UMTZfSEkKKyNkZWZpbmUgUl9QUEM2NF9HT1QxNl9IQQlSX1BQQ19HT1QxNl9IQQorCisjZGVmaW5lIFJfUFBDNjRfQ09QWQkJUl9QUENfQ09QWQorI2RlZmluZSBSX1BQQzY0X0dMT0JfREFUCVJfUFBDX0dMT0JfREFUCisjZGVmaW5lIFJfUFBDNjRfSk1QX1NMT1QJUl9QUENfSk1QX1NMT1QKKyNkZWZpbmUgUl9QUEM2NF9SRUxBVElWRQlSX1BQQ19SRUxBVElWRQorCisjZGVmaW5lIFJfUFBDNjRfVUFERFIzMgkJUl9QUENfVUFERFIzMgorI2RlZmluZSBSX1BQQzY0X1VBRERSMTYJCVJfUFBDX1VBRERSMTYKKyNkZWZpbmUgUl9QUEM2NF9SRUwzMgkJUl9QUENfUkVMMzIKKyNkZWZpbmUgUl9QUEM2NF9QTFQzMgkJUl9QUENfUExUMzIKKyNkZWZpbmUgUl9QUEM2NF9QTFRSRUwzMglSX1BQQ19QTFRSRUwzMgorI2RlZmluZSBSX1BQQzY0X1BMVDE2X0xPCVJfUFBDX1BMVDE2X0xPCisjZGVmaW5lIFJfUFBDNjRfUExUMTZfSEkJUl9QUENfUExUMTZfSEkKKyNkZWZpbmUgUl9QUEM2NF9QTFQxNl9IQQlSX1BQQ19QTFQxNl9IQQorCisjZGVmaW5lIFJfUFBDNjRfU0VDVE9GRgkJUl9QUENfU0VDVE9GRgorI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfTE8JUl9QUENfU0VDVE9GRl9MTworI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfSEkJUl9QUENfU0VDVE9GRl9ISQorI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfSEEJUl9QUENfU0VDVE9GRl9IQQorI2RlZmluZSBSX1BQQzY0X0FERFIzMAkJMzcgLyogd29yZDMwIChTICsgQSAtIFApID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSNjQJCTM4IC8qIGRvdWJsZXdvcmQ2NCBTICsgQSAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9ISUdIRVIJMzkgLyogaGFsZjE2ICNoaWdoZXIoUyArIEEpICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJR0hFUkEJNDAgLyogaGFsZjE2ICNoaWdoZXJhKFMgKyBBKSAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9ISUdIRVNUCTQxIC8qIGhhbGYxNiAjaGlnaGVzdChTICsgQSkgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfSElHSEVTVEEJNDIgLyogaGFsZjE2ICNoaWdoZXN0YShTICsgQSkgKi8KKyNkZWZpbmUgUl9QUEM2NF9VQUREUjY0CQk0MyAvKiBkb3VibGV3b3JkNjQgUyArIEEgKi8KKyNkZWZpbmUgUl9QUEM2NF9SRUw2NAkJNDQgLyogZG91Ymxld29yZDY0IFMgKyBBIC0gUCAqLworI2RlZmluZSBSX1BQQzY0X1BMVDY0CQk0NSAvKiBkb3VibGV3b3JkNjQgTCArIEEgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRSRUw2NAk0NiAvKiBkb3VibGV3b3JkNjQgTCArIEEgLSBQICovCisjZGVmaW5lIFJfUFBDNjRfVE9DMTYJCTQ3IC8qIGhhbGYxNiogUyArIEEgLSAuVE9DICovCisjZGVmaW5lIFJfUFBDNjRfVE9DMTZfTE8JNDggLyogaGFsZjE2ICNsbyhTICsgQSAtIC5UT0MuKSAqLworI2RlZmluZSBSX1BQQzY0X1RPQzE2X0hJCTQ5IC8qIGhhbGYxNiAjaGkoUyArIEEgLSAuVE9DLikgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNl9IQQk1MCAvKiBoYWxmMTYgI2hhKFMgKyBBIC0gLlRPQy4pICovCisjZGVmaW5lIFJfUFBDNjRfVE9DCQk1MSAvKiBkb3VibGV3b3JkNjQgLlRPQyAqLworI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2CTUyIC8qIGhhbGYxNiogTSArIEEgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9MTwk1MyAvKiBoYWxmMTYgI2xvKE0gKyBBKSAqLworI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2X0hJCTU0IC8qIGhhbGYxNiAjaGkoTSArIEEpICovCisjZGVmaW5lIFJfUFBDNjRfUExUR09UMTZfSEEJNTUgLyogaGFsZjE2ICNoYShNICsgQSkgKi8KKworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9EUwk1NiAvKiBoYWxmMTZkcyogKFMgKyBBKSA+PiAyICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0xPX0RTCTU3IC8qIGhhbGYxNmRzICAjbG8oUyArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1QxNl9EUwk1OCAvKiBoYWxmMTZkcyogKEcgKyBBKSA+PiAyICovCisjZGVmaW5lIFJfUFBDNjRfR09UMTZfTE9fRFMJNTkgLyogaGFsZjE2ZHMgICNsbyhHICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1BMVDE2X0xPX0RTCTYwIC8qIGhhbGYxNmRzICAjbG8oTCArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9TRUNUT0ZGX0RTCTYxIC8qIGhhbGYxNmRzKiAoUiArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9TRUNUT0ZGX0xPX0RTCTYyIC8qIGhhbGYxNmRzICAjbG8oUiArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNl9EUwk2MyAvKiBoYWxmMTZkcyogKFMgKyBBIC0gLlRPQy4pID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNl9MT19EUwk2NCAvKiBoYWxmMTZkcyAgI2xvKFMgKyBBIC0gLlRPQy4pID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9EUwk2NSAvKiBoYWxmMTZkcyogKE0gKyBBKSA+PiAyICovCisjZGVmaW5lIFJfUFBDNjRfUExUR09UMTZfTE9fRFMJNjYgLyogaGFsZjE2ZHMgICNsbyhNICsgQSkgPj4gMiAqLworCisvKiBQb3dlclBDNjQgcmVsb2NhdGlvbnMgZGVmaW5lZCBmb3IgdGhlIFRMUyBhY2Nlc3MgQUJJLiAgKi8KKyNkZWZpbmUgUl9QUEM2NF9UTFMJCTY3IC8qIG5vbmUJKHN5bSthZGQpQHRscyAqLworI2RlZmluZSBSX1BQQzY0X0RUUE1PRDY0CTY4IC8qIGRvdWJsZXdvcmQ2NCAoc3ltK2FkZClAZHRwbW9kICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNgkJNjkgLyogaGFsZjE2Kgkoc3ltK2FkZClAdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0xPCTcwIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSEkJNzEgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9IQQk3MiAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGhhICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUw2NAkJNzMgLyogZG91Ymxld29yZDY0IChzeW0rYWRkKUB0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2CTc0IC8qIGhhbGYxNioJKHN5bSthZGQpQGR0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0xPCTc1IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9ISQk3NiAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSEEJNzcgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUw2NAk3OCAvKiBkb3VibGV3b3JkNjQgKHN5bSthZGQpQGR0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNHRDE2CTc5IC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0bHNnZCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNHRDE2X0xPCTgwIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTR0QxNl9ISQk4MSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBoICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0dEMTZfSEEJODIgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTTEQxNgk4MyAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAdGxzbGQgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTTEQxNl9MTwk4NCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBsICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0xEMTZfSEkJODUgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAaCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNMRDE2X0hBCTg2IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGhhICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RQUkVMMTZfRFMJODcgLyogaGFsZjE2ZHMqCShzeW0rYWRkKUBnb3RAdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9MT19EUyA4OCAvKiBoYWxmMTZkcyAoc3ltK2FkZClAZ290QHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9ISQk4OSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RQUkVMMTZfSEEJOTAgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfRFRQUkVMMTZfRFMJOTEgLyogaGFsZjE2ZHMqCShzeW0rYWRkKUBnb3RAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfR09UX0RUUFJFTDE2X0xPX0RTIDkyIC8qIGhhbGYxNmRzIChzeW0rYWRkKUBnb3RAZHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEkJOTMgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAZHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEEJOTQgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAZHRwcmVsQGhhICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9EUwk5NSAvKiBoYWxmMTZkcyoJKHN5bSthZGQpQHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9MT19EUwk5NiAvKiBoYWxmMTZkcwkoc3ltK2FkZClAdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSElHSEVSCTk3IC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVyICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVJBCTk4IC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVyYSAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSElHSEVTVAk5OSAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGhpZ2hlc3QgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0hJR0hFU1RBIDEwMCAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGhpZ2hlc3RhICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfRFMJMTAxIC8qIGhhbGYxNmRzKiAoc3ltK2FkZClAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfTE9fRFMJMTAyIC8qIGhhbGYxNmRzCShzeW0rYWRkKUBkdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFUgkxMDMgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGlnaGVyICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVSQSAxMDQgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGlnaGVyYSAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFU1QgMTA1IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGhpZ2hlc3QgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVNUQSAxMDYgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGlnaGVzdGEgKi8KKworLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9QUEM2NF9OVU0JCTEwNworCisvKiBQb3dlclBDNjQgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgRHluIGRfdGFnIGZpZWxkLiAgKi8KKyNkZWZpbmUgRFRfUFBDNjRfR0xJTksgIChEVF9MT1BST0MgKyAwKQorI2RlZmluZSBEVF9QUEM2NF9PUEQJKERUX0xPUFJPQyArIDEpCisjZGVmaW5lIERUX1BQQzY0X09QRFNaCShEVF9MT1BST0MgKyAyKQorI2RlZmluZSBEVF9QUEM2NF9OVU0gICAgMworCisKKy8qIEFSTSBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KKyNkZWZpbmUgRUZfQVJNX1JFTEVYRUMgICAgIDB4MDEKKyNkZWZpbmUgRUZfQVJNX0hBU0VOVFJZICAgIDB4MDIKKyNkZWZpbmUgRUZfQVJNX0lOVEVSV09SSyAgIDB4MDQKKyNkZWZpbmUgRUZfQVJNX0FQQ1NfMjYgICAgIDB4MDgKKyNkZWZpbmUgRUZfQVJNX0FQQ1NfRkxPQVQgIDB4MTAKKyNkZWZpbmUgRUZfQVJNX1BJQyAgICAgICAgIDB4MjAKKyNkZWZpbmUgRUZfQVJNX0FMSUdOOCAgICAgIDB4NDAJCS8qIDgtYml0IHN0cnVjdHVyZSBhbGlnbm1lbnQgaXMgaW4gdXNlICovCisjZGVmaW5lIEVGX0FSTV9ORVdfQUJJICAgICAweDgwCisjZGVmaW5lIEVGX0FSTV9PTERfQUJJICAgICAweDEwMAorCisvKiBPdGhlciBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUgQVJNIEVMRiBzcGVjLiB2ZXJzaW9uIEItMDEuICAqLworLyogTkIuIFRoZXNlIGNvbmZsaWN0IHdpdGggdmFsdWVzIGRlZmluZWQgYWJvdmUuICAqLworI2RlZmluZSBFRl9BUk1fU1lNU0FSRVNPUlRFRAkweDA0CisjZGVmaW5lIEVGX0FSTV9EWU5TWU1TVVNFU0VHSURYIDB4MDgKKyNkZWZpbmUgRUZfQVJNX01BUFNZTVNGSVJTVAkweDEwCisjZGVmaW5lIEVGX0FSTV9FQUJJTUFTSwkJMFhGRjAwMDAwMAorCisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUlNJT04oZmxhZ3MpICgoZmxhZ3MpICYgRUZfQVJNX0VBQklNQVNLKQorI2RlZmluZSBFRl9BUk1fRUFCSV9VTktOT1dOICAweDAwMDAwMDAwCisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjEgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSMiAgICAgMHgwMjAwMDAwMAorCisvKiBBZGRpdGlvbmFsIHN5bWJvbCB0eXBlcyBmb3IgVGh1bWIgKi8KKyNkZWZpbmUgU1RUX0FSTV9URlVOQyAgICAgIDB4ZAorCisvKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLworI2RlZmluZSBTSEZfQVJNX0VOVFJZU0VDVCAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQgKi8KKyNkZWZpbmUgU0hGX0FSTV9DT01ERUYgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkCisJCQkJCSAgIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcCAqLworCisvKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8KKyNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgorCQkJCQkgICBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBQaGRyIHBfdHlwZSBmaWVsZC4gICovCisjZGVmaW5lIFBUX0FSTV9FWElEWAkweDcwMDAwMDAxCS8qIC5BUk0uZXhpZHggc2VnbWVudCAqLworCisvKiBBUk0gcmVsb2NzLiAgKi8KKworI2RlZmluZSBSX0FSTV9OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfQVJNX1BDMjQJCTEJLyogUEMgcmVsYXRpdmUgMjYgYml0IGJyYW5jaCAqLworI2RlZmluZSBSX0FSTV9BQlMzMgkJMgkvKiBEaXJlY3QgMzIgYml0ICAqLworI2RlZmluZSBSX0FSTV9SRUwzMgkJMwkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl9BUk1fUEMxMwkJNAorI2RlZmluZSBSX0FSTV9BQlMxNgkJNQkvKiBEaXJlY3QgMTYgYml0ICovCisjZGVmaW5lIFJfQVJNX0FCUzEyCQk2CS8qIERpcmVjdCAxMiBiaXQgKi8KKyNkZWZpbmUgUl9BUk1fVEhNX0FCUzUJCTcKKyNkZWZpbmUgUl9BUk1fQUJTOAkJOAkvKiBEaXJlY3QgOCBiaXQgKi8KKyNkZWZpbmUgUl9BUk1fU0JSRUwzMgkJOQorI2RlZmluZSBSX0FSTV9USE1fUEMyMgkJMTAKKyNkZWZpbmUgUl9BUk1fVEhNX1BDOAkJMTEKKyNkZWZpbmUgUl9BUk1fQU1QX1ZDQUxMOQkxMgorI2RlZmluZSBSX0FSTV9TV0kyNAkJMTMKKyNkZWZpbmUgUl9BUk1fVEhNX1NXSTgJCTE0CisjZGVmaW5lIFJfQVJNX1hQQzI1CQkxNQorI2RlZmluZSBSX0FSTV9USE1fWFBDMjIJCTE2CisjZGVmaW5lIFJfQVJNX0NPUFkJCTIwCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl9BUk1fR0xPQl9EQVQJCTIxCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9BUk1fSlVNUF9TTE9UCQkyMgkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfQVJNX1JFTEFUSVZFCQkyMwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfQVJNX0dPVE9GRgkJMjQJLyogMzIgYml0IG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9BUk1fR09UUEMJCTI1CS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfQVJNX0dPVDMyCQkyNgkvKiAzMiBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfQVJNX1BMVDMyCQkyNwkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9BUk1fQUxVX1BDUkVMXzdfMAkzMgorI2RlZmluZSBSX0FSTV9BTFVfUENSRUxfMTVfOAkzMworI2RlZmluZSBSX0FSTV9BTFVfUENSRUxfMjNfMTUJMzQKKyNkZWZpbmUgUl9BUk1fTERSX1NCUkVMXzExXzAJMzUKKyNkZWZpbmUgUl9BUk1fQUxVX1NCUkVMXzE5XzEyCTM2CisjZGVmaW5lIFJfQVJNX0FMVV9TQlJFTF8yN18yMAkzNworI2RlZmluZSBSX0FSTV9HTlVfVlRFTlRSWQkxMDAKKyNkZWZpbmUgUl9BUk1fR05VX1ZUSU5IRVJJVAkxMDEKKyNkZWZpbmUgUl9BUk1fVEhNX1BDMTEJCTEwMgkvKiB0aHVtYiB1bmNvbmRpdGlvbmFsIGJyYW5jaCAqLworI2RlZmluZSBSX0FSTV9USE1fUEM5CQkxMDMJLyogdGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoICovCisjZGVmaW5lIFJfQVJNX1JYUEMyNQkJMjQ5CisjZGVmaW5lIFJfQVJNX1JTQlJFTDMyCQkyNTAKKyNkZWZpbmUgUl9BUk1fVEhNX1JQQzIyCQkyNTEKKyNkZWZpbmUgUl9BUk1fUlJFTDMyCQkyNTIKKyNkZWZpbmUgUl9BUk1fUkFCUzIyCQkyNTMKKyNkZWZpbmUgUl9BUk1fUlBDMjQJCTI1NAorI2RlZmluZSBSX0FSTV9SQkFTRQkJMjU1CisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSX0FSTV9OVU0JCTI1NgorCisvKiBJQS02NCBzcGVjaWZpYyBkZWNsYXJhdGlvbnMuICAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFaGRyIGVfZmxhZ3MgZmllbGQuICAqLworI2RlZmluZSBFRl9JQV82NF9NQVNLT1MJCTB4MDAwMDAwMGYJLyogb3Mtc3BlY2lmaWMgZmxhZ3MgKi8KKyNkZWZpbmUgRUZfSUFfNjRfQUJJNjQJCTB4MDAwMDAwMTAJLyogNjQtYml0IEFCSSAqLworI2RlZmluZSBFRl9JQV82NF9BUkNICQkweGZmMDAwMDAwCS8qIGFyY2guIHZlcnNpb24gbWFzayAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgUGhkciBwX3R5cGUgZmllbGQuICAqLworI2RlZmluZSBQVF9JQV82NF9BUkNIRVhUCShQVF9MT1BST0MgKyAwKQkvKiBhcmNoIGV4dGVuc2lvbiBiaXRzICovCisjZGVmaW5lIFBUX0lBXzY0X1VOV0lORAkJKFBUX0xPUFJPQyArIDEpCS8qIGlhNjQgdW53aW5kIGJpdHMgKi8KKyNkZWZpbmUgUFRfSUFfNjRfSFBfT1BUX0FOT1QJKFBUX0xPT1MgKyAweDEyKQorI2RlZmluZSBQVF9JQV82NF9IUF9IU0xfQU5PVAkoUFRfTE9PUyArIDB4MTMpCisjZGVmaW5lIFBUX0lBXzY0X0hQX1NUQUNLCShQVF9MT09TICsgMHgxNCkKKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgUGhkciBwX2ZsYWdzIGZpZWxkLiAgKi8KKyNkZWZpbmUgUEZfSUFfNjRfTk9SRUNPVgkweDgwMDAwMDAwCS8qIHNwZWMgaW5zbnMgdy9vIHJlY292ZXJ5ICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBTaGRyIHNoX3R5cGUgZmllbGQuICAqLworI2RlZmluZSBTSFRfSUFfNjRfRVhUCQkoU0hUX0xPUFJPQyArIDApIC8qIGV4dGVuc2lvbiBiaXRzICovCisjZGVmaW5lIFNIVF9JQV82NF9VTldJTkQJKFNIVF9MT1BST0MgKyAxKSAvKiB1bndpbmQgYml0cyAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBTaGRyIHNoX2ZsYWdzIGZpZWxkLiAgKi8KKyNkZWZpbmUgU0hGX0lBXzY0X1NIT1JUCQkweDEwMDAwMDAwCS8qIHNlY3Rpb24gbmVhciBncCAqLworI2RlZmluZSBTSEZfSUFfNjRfTk9SRUNPVgkweDIwMDAwMDAwCS8qIHNwZWMgaW5zbnMgdy9vIHJlY292ZXJ5ICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBEeW4gZF90YWcgZmllbGQuICAqLworI2RlZmluZSBEVF9JQV82NF9QTFRfUkVTRVJWRQkoRFRfTE9QUk9DICsgMCkKKyNkZWZpbmUgRFRfSUFfNjRfTlVNCQkxCisKKy8qIElBLTY0IHJlbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgUl9JQTY0X05PTkUJCTB4MDAJLyogbm9uZSAqLworI2RlZmluZSBSX0lBNjRfSU1NMTQJCTB4MjEJLyogc3ltYm9sICsgYWRkZW5kLCBhZGQgaW1tMTQgKi8KKyNkZWZpbmUgUl9JQTY0X0lNTTIyCQkweDIyCS8qIHN5bWJvbCArIGFkZGVuZCwgYWRkIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9JTU02NAkJMHgyMwkvKiBzeW1ib2wgKyBhZGRlbmQsIG1vdiBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfRElSMzJNU0IJCTB4MjQJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RJUjMyTFNCCQkweDI1CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9ESVI2NE1TQgkJMHgyNgkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRElSNjRMU0IJCTB4MjcJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMMjIJCTB4MmEJLyogQGdwcmVsKHN5bSArIGFkZCksIGFkZCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfR1BSRUw2NEkJCTB4MmIJLyogQGdwcmVsKHN5bSArIGFkZCksIG1vdiBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfR1BSRUwzMk1TQgkweDJjCS8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMMzJMU0IJMHgyZAkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDY0TVNCCTB4MmUJLyogQGdwcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfR1BSRUw2NExTQgkweDJmCS8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGMjIJCTB4MzIJLyogQGx0b2ZmKHN5bSArIGFkZCksIGFkZCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkY2NEkJCTB4MzMJLyogQGx0b2ZmKHN5bSArIGFkZCksIG1vdiBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfUExUT0ZGMjIJCTB4M2EJLyogQHBsdG9mZihzeW0gKyBhZGQpLCBhZGQgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X1BMVE9GRjY0SQkweDNiCS8qIEBwbHRvZmYoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9QTFRPRkY2NE1TQgkweDNlCS8qIEBwbHRvZmYoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9QTFRPRkY2NExTQgkweDNmCS8qIEBwbHRvZmYoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9GUFRSNjRJCQkweDQzCS8qIEBmcHRyKHN5bSArIGFkZCksIG1vdiBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfRlBUUjMyTVNCCTB4NDQJLyogQGZwdHIoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9GUFRSMzJMU0IJMHg0NQkvKiBAZnB0cihzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0ZQVFI2NE1TQgkweDQ2CS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRlBUUjY0TFNCCTB4NDcJLyogQGZwdHIoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDYwQgkJMHg0OAkvKiBAcGNyZWwoc3ltICsgYWRkKSwgYnJsICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDIxQgkJMHg0OQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgcHRiLCBjYWxsICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDIxTQkJMHg0YQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgY2hrLnMgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMjFGCQkweDRiCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBmY2hrZiAqLworI2RlZmluZSBSX0lBNjRfUENSRUwzMk1TQgkweDRjCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMzJMU0IJMHg0ZAkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDY0TVNCCTB4NGUJLyogQHBjcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfUENSRUw2NExTQgkweDRmCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFIyMgkweDUyCS8qIEBsdG9mZihAZnB0cihzK2EpKSwgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFI2NEkJMHg1MwkvKiBAbHRvZmYoQGZwdHIocythKSksIGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSMzJNU0IJMHg1NAkvKiBAbHRvZmYoQGZwdHIocythKSksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjMyTFNCCTB4NTUJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFI2NE1TQgkweDU2CS8qIEBsdG9mZihAZnB0cihzK2EpKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSNjRMU0IJMHg1NwkvKiBAbHRvZmYoQGZwdHIocythKSksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfU0VHUkVMMzJNU0IJMHg1YwkvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfU0VHUkVMMzJMU0IJMHg1ZAkvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfU0VHUkVMNjRNU0IJMHg1ZQkvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfU0VHUkVMNjRMU0IJMHg1ZgkvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfU0VDUkVMMzJNU0IJMHg2NAkvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfU0VDUkVMMzJMU0IJMHg2NQkvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfU0VDUkVMNjRNU0IJMHg2NgkvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfU0VDUkVMNjRMU0IJMHg2NwkvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfUkVMMzJNU0IJCTB4NmMJLyogZGF0YSA0ICsgUkVMICovCisjZGVmaW5lIFJfSUE2NF9SRUwzMkxTQgkJMHg2ZAkvKiBkYXRhIDQgKyBSRUwgKi8KKyNkZWZpbmUgUl9JQTY0X1JFTDY0TVNCCQkweDZlCS8qIGRhdGEgOCArIFJFTCAqLworI2RlZmluZSBSX0lBNjRfUkVMNjRMU0IJCTB4NmYJLyogZGF0YSA4ICsgUkVMICovCisjZGVmaW5lIFJfSUE2NF9MVFYzMk1TQgkJMHg3NAkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfTFRWMzJMU0IJCTB4NzUJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUVjY0TVNCCQkweDc2CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9MVFY2NExTQgkJMHg3NwkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfUENSRUwyMUJJCTB4NzkJLyogQHBjcmVsKHN5bSArIGFkZCksIDIxYml0IGluc3QgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMjIJCTB4N2EJLyogQHBjcmVsKHN5bSArIGFkZCksIDIyYml0IGluc3QgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMNjRJCQkweDdiCS8qIEBwY3JlbChzeW0gKyBhZGQpLCA2NGJpdCBpbnN0ICovCisjZGVmaW5lIFJfSUE2NF9JUExUTVNCCQkweDgwCS8qIGR5bmFtaWMgcmVsb2MsIGltcG9ydGVkIFBMVCwgTVNCICovCisjZGVmaW5lIFJfSUE2NF9JUExUTFNCCQkweDgxCS8qIGR5bmFtaWMgcmVsb2MsIGltcG9ydGVkIFBMVCwgTFNCICovCisjZGVmaW5lIFJfSUE2NF9DT1BZCQkweDg0CS8qIGNvcHkgcmVsb2NhdGlvbiAqLworI2RlZmluZSBSX0lBNjRfU1VCCQkweDg1CS8qIEFkZGVuZCBhbmQgc3ltYm9sIGRpZmZlcmVuY2UgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGMjJYCQkweDg2CS8qIExUT0ZGMjIsIHJlbGF4YWJsZS4gICovCisjZGVmaW5lIFJfSUE2NF9MRFhNT1YJCTB4ODcJLyogVXNlIG9mIExUT0ZGMjJYLiAgKi8KKyNkZWZpbmUgUl9JQTY0X1RQUkVMMTQJCTB4OTEJLyogQHRwcmVsKHN5bSArIGFkZCksIGltbTE0ICovCisjZGVmaW5lIFJfSUE2NF9UUFJFTDIyCQkweDkyCS8qIEB0cHJlbChzeW0gKyBhZGQpLCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfVFBSRUw2NEkJCTB4OTMJLyogQHRwcmVsKHN5bSArIGFkZCksIGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9UUFJFTDY0TVNCCTB4OTYJLyogQHRwcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfVFBSRUw2NExTQgkweDk3CS8qIEB0cHJlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX1RQUkVMMjIJMHg5YQkvKiBAbHRvZmYoQHRwcmVsKHMrYSkpLCBpbW0yICovCisjZGVmaW5lIFJfSUE2NF9EVFBNT0Q2NE1TQgkweGE2CS8qIEBkdHBtb2Qoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9EVFBNT0Q2NExTQgkweGE3CS8qIEBkdHBtb2Qoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9EVFBNT0QyMgkweGFhCS8qIEBsdG9mZihAZHRwbW9kKHN5bSArIGFkZCkpLCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfRFRQUkVMMTQJCTB4YjEJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBpbW0xNCAqLworI2RlZmluZSBSX0lBNjRfRFRQUkVMMjIJCTB4YjIJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfRFRQUkVMNjRJCTB4YjMJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfRFRQUkVMMzJNU0IJMHhiNAkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRFRQUkVMMzJMU0IJMHhiNQkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfRFRQUkVMNjRNU0IJMHhiNgkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRFRQUkVMNjRMU0IJMHhiNwkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRFRQUkVMMjIJMHhiYQkvKiBAbHRvZmYoQGR0cHJlbChzK2EpKSwgaW1tMjIgKi8KKworLyogU0ggc3BlY2lmaWMgZGVjbGFyYXRpb25zICovCisKKy8qIFNIIHJlbG9jcy4gICovCisjZGVmaW5lCVJfU0hfTk9ORQkJMAorI2RlZmluZQlSX1NIX0RJUjMyCQkxCisjZGVmaW5lCVJfU0hfUkVMMzIJCTIKKyNkZWZpbmUJUl9TSF9ESVI4V1BOCQkzCisjZGVmaW5lCVJfU0hfSU5EMTJXCQk0CisjZGVmaW5lCVJfU0hfRElSOFdQTAkJNQorI2RlZmluZQlSX1NIX0RJUjhXUFoJCTYKKyNkZWZpbmUJUl9TSF9ESVI4QlAJCTcKKyNkZWZpbmUJUl9TSF9ESVI4VwkJOAorI2RlZmluZQlSX1NIX0RJUjhMCQk5CisjZGVmaW5lCVJfU0hfU1dJVENIMTYJCTI1CisjZGVmaW5lCVJfU0hfU1dJVENIMzIJCTI2CisjZGVmaW5lCVJfU0hfVVNFUwkJMjcKKyNkZWZpbmUJUl9TSF9DT1VOVAkJMjgKKyNkZWZpbmUJUl9TSF9BTElHTgkJMjkKKyNkZWZpbmUJUl9TSF9DT0RFCQkzMAorI2RlZmluZQlSX1NIX0RBVEEJCTMxCisjZGVmaW5lCVJfU0hfTEFCRUwJCTMyCisjZGVmaW5lCVJfU0hfU1dJVENIOAkJMzMKKyNkZWZpbmUJUl9TSF9HTlVfVlRJTkhFUklUCTM0CisjZGVmaW5lCVJfU0hfR05VX1ZURU5UUlkJMzUKKyNkZWZpbmUJUl9TSF9UTFNfR0RfMzIJCTE0NAorI2RlZmluZQlSX1NIX1RMU19MRF8zMgkJMTQ1CisjZGVmaW5lCVJfU0hfVExTX0xET18zMgkJMTQ2CisjZGVmaW5lCVJfU0hfVExTX0lFXzMyCQkxNDcKKyNkZWZpbmUJUl9TSF9UTFNfTEVfMzIJCTE0OAorI2RlZmluZQlSX1NIX1RMU19EVFBNT0QzMgkxNDkKKyNkZWZpbmUJUl9TSF9UTFNfRFRQT0ZGMzIJMTUwCisjZGVmaW5lCVJfU0hfVExTX1RQT0ZGMzIJMTUxCisjZGVmaW5lCVJfU0hfR09UMzIJCTE2MAorI2RlZmluZQlSX1NIX1BMVDMyCQkxNjEKKyNkZWZpbmUJUl9TSF9DT1BZCQkxNjIKKyNkZWZpbmUJUl9TSF9HTE9CX0RBVAkJMTYzCisjZGVmaW5lCVJfU0hfSk1QX1NMT1QJCTE2NAorI2RlZmluZQlSX1NIX1JFTEFUSVZFCQkxNjUKKyNkZWZpbmUJUl9TSF9HT1RPRkYJCTE2NgorI2RlZmluZQlSX1NIX0dPVFBDCQkxNjcKKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lCVJfU0hfTlVNCQkyNTYKKworLyogQWRkaXRpb25hbCBzMzkwIHJlbG9jcyAqLworCisjZGVmaW5lIFJfMzkwX05PTkUJCTAJLyogTm8gcmVsb2MuICAqLworI2RlZmluZSBSXzM5MF84CQkJMQkvKiBEaXJlY3QgOCBiaXQuICAqLworI2RlZmluZSBSXzM5MF8xMgkJMgkvKiBEaXJlY3QgMTIgYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfMTYJCTMJLyogRGlyZWN0IDE2IGJpdC4gICovCisjZGVmaW5lIFJfMzkwXzMyCQk0CS8qIERpcmVjdCAzMiBiaXQuICAqLworI2RlZmluZSBSXzM5MF9QQzMyCQk1CS8qIFBDIHJlbGF0aXZlIDMyIGJpdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UMTIJCTYJLyogMTIgYml0IEdPVCBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9HT1QzMgkJNwkvKiAzMiBiaXQgR09UIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1BMVDMyCQk4CS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcy4gICovCisjZGVmaW5lIFJfMzkwX0NPUFkJCTkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZS4gICovCisjZGVmaW5lIFJfMzkwX0dMT0JfREFUCQkxMAkvKiBDcmVhdGUgR09UIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl8zOTBfSk1QX1NMT1QJCTExCS8qIENyZWF0ZSBQTFQgZW50cnkuICAqLworI2RlZmluZSBSXzM5MF9SRUxBVElWRQkJMTIJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZS4gICovCisjZGVmaW5lIFJfMzkwX0dPVE9GRjMyCQkxMwkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVC4JICovCisjZGVmaW5lIFJfMzkwX0dPVFBDCQkxNAkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVC4gICovCisjZGVmaW5lIFJfMzkwX0dPVDE2CQkxNQkvKiAxNiBiaXQgR09UIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1BDMTYJCTE2CS8qIFBDIHJlbGF0aXZlIDE2IGJpdC4JKi8KKyNkZWZpbmUgUl8zOTBfUEMxNkRCTAkJMTcJLyogUEMgcmVsYXRpdmUgMTYgYml0IHNoaWZ0ZWQgYnkgMS4gICovCisjZGVmaW5lIFJfMzkwX1BMVDE2REJMCQkxOAkvKiAxNiBiaXQgUEMgcmVsLiBQTFQgc2hpZnRlZCBieSAxLiAgKi8KKyNkZWZpbmUgUl8zOTBfUEMzMkRCTAkJMTkJLyogUEMgcmVsYXRpdmUgMzIgYml0IHNoaWZ0ZWQgYnkgMS4gICovCisjZGVmaW5lIFJfMzkwX1BMVDMyREJMCQkyMAkvKiAzMiBiaXQgUEMgcmVsLiBQTFQgc2hpZnRlZCBieSAxLiAgKi8KKyNkZWZpbmUgUl8zOTBfR09UUENEQkwJCTIxCS8qIDMyIGJpdCBQQyByZWwuIEdPVCBzaGlmdGVkIGJ5IDEuICAqLworI2RlZmluZSBSXzM5MF82NAkJMjIJLyogRGlyZWN0IDY0IGJpdC4gICovCisjZGVmaW5lIFJfMzkwX1BDNjQJCTIzCS8qIFBDIHJlbGF0aXZlIDY0IGJpdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UNjQJCTI0CS8qIDY0IGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUNjQJCTI1CS8qIDY0IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcy4gICovCisjZGVmaW5lIFJfMzkwX0dPVEVOVAkJMjYJLyogMzIgYml0IFBDIHJlbC4gdG8gR09UIGVudHJ5ID4+IDEuICovCisjZGVmaW5lIFJfMzkwX0dPVE9GRjE2CQkyNwkvKiAxNiBiaXQgb2Zmc2V0IHRvIEdPVC4gKi8KKyNkZWZpbmUgUl8zOTBfR09UT0ZGNjQJCTI4CS8qIDY0IGJpdCBvZmZzZXQgdG8gR09ULiAqLworI2RlZmluZSBSXzM5MF9HT1RQTFQxMgkJMjkJLyogMTIgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuCSovCisjZGVmaW5lIFJfMzkwX0dPVFBMVDE2CQkzMAkvKiAxNiBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UUExUMzIJCTMxCS8qIDMyIGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LgkqLworI2RlZmluZSBSXzM5MF9HT1RQTFQ2NAkJMzIJLyogNjQgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuCSovCisjZGVmaW5lIFJfMzkwX0dPVFBMVEVOVAkJMzMJLyogMzIgYml0IHJlbC4gb2Zmc2V0IHRvIGp1bXAgc2xvdC4gICovCisjZGVmaW5lIFJfMzkwX1BMVE9GRjE2CQkzNAkvKiAxNiBiaXQgb2Zmc2V0IGZyb20gR09UIHRvIFBMVC4gKi8KKyNkZWZpbmUgUl8zOTBfUExUT0ZGMzIJCTM1CS8qIDMyIGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworI2RlZmluZSBSXzM5MF9QTFRPRkY2NAkJMzYJLyogMTYgYml0IG9mZnNldCBmcm9tIEdPVCB0byBQTFQuICovCisjZGVmaW5lIFJfMzkwX1RMU19MT0FECQkzNwkvKiBUYWcgZm9yIGxvYWQgaW5zbiBpbiBUTFMgY29kZS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19HRENBTEwJMzgJLyogVGFnIGZvciBmdW5jdGlvbiBjYWxsIGluIGdlbmVyYWwKKwkJCQkJICAgZHluYW1pYyBUTFMgY29kZS4gKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xEQ0FMTAkzOQkvKiBUYWcgZm9yIGZ1bmN0aW9uIGNhbGwgaW4gbG9jYWwKKwkJCQkJICAgZHluYW1pYyBUTFMgY29kZS4gKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dEMzIJCTQwCS8qIERpcmVjdCAzMiBiaXQgZm9yIGdlbmVyYWwgZHluYW1pYworCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19HRDY0CQk0MQkvKiBEaXJlY3QgNjQgYml0IGZvciBnZW5lcmFsIGR5bmFtaWMKKwkJCQkJICB0aHJlYWQgbG9jYWwgZGF0YS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19HT1RJRTEyCTQyCS8qIDEyIGJpdCBHT1Qgb2Zmc2V0IGZvciBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1RMU19HT1RJRTMyCTQzCS8qIDMyIGJpdCBHT1Qgb2Zmc2V0IGZvciBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1RMU19HT1RJRTY0CTQ0CS8qIDY0IGJpdCBHT1Qgb2Zmc2V0IGZvciBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrIG9mZnNldC4gKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xETTMyCQk0NQkvKiBEaXJlY3QgMzIgYml0IGZvciBsb2NhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhIGluIExFIGNvZGUuICAqLworI2RlZmluZSBSXzM5MF9UTFNfTERNNjQJCTQ2CS8qIERpcmVjdCA2NCBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgaW4gTEUgY29kZS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19JRTMyCQk0NwkvKiAzMiBiaXQgYWRkcmVzcyBvZiBHT1QgZW50cnkgZm9yCisJCQkJCSAgIG5lZ2F0ZWQgc3RhdGljIFRMUyBibG9jayBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9UTFNfSUU2NAkJNDgJLyogNjQgYml0IGFkZHJlc3Mgb2YgR09UIGVudHJ5IGZvcgorCQkJCQkgICBuZWdhdGVkIHN0YXRpYyBUTFMgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0lFRU5UCQk0OQkvKiAzMiBiaXQgcmVsLiBvZmZzZXQgdG8gR09UIGVudHJ5IGZvcgorCQkJCQkgICBuZWdhdGVkIHN0YXRpYyBUTFMgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xFMzIJCTUwCS8qIDMyIGJpdCBuZWdhdGVkIG9mZnNldCByZWxhdGl2ZSB0bworCQkJCQkgICBzdGF0aWMgVExTIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xFNjQJCTUxCS8qIDY0IGJpdCBuZWdhdGVkIG9mZnNldCByZWxhdGl2ZSB0bworCQkJCQkgICBzdGF0aWMgVExTIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xETzMyCQk1MgkvKiAzMiBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIFRMUworCQkJCQkgICBibG9jay4gICovCisjZGVmaW5lIFJfMzkwX1RMU19MRE82NAkJNTMJLyogNjQgYml0IG9mZnNldCByZWxhdGl2ZSB0byBUTFMKKwkJCQkJICAgYmxvY2suICAqLworI2RlZmluZSBSXzM5MF9UTFNfRFRQTU9ECTU0CS8qIElEIG9mIG1vZHVsZSBjb250YWluaW5nIHN5bWJvbC4gICovCisjZGVmaW5lIFJfMzkwX1RMU19EVFBPRkYJNTUJLyogT2Zmc2V0IGluIFRMUyBibG9jay4JICovCisjZGVmaW5lIFJfMzkwX1RMU19UUE9GRgkJNTYJLyogTmVnYXRlZCBvZmZzZXQgaW4gc3RhdGljIFRMUworCQkJCQkgICBibG9jay4gICovCisjZGVmaW5lIFJfMzkwXzIwCQk1NwkvKiBEaXJlY3QgMjAgYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfR09UMjAJCTU4CS8qIDIwIGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfR09UUExUMjAJCTU5CS8qIDIwIGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dPVElFMjAJNjAJLyogMjAgYml0IEdPVCBvZmZzZXQgZm9yIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgb2Zmc2V0LiAgKi8KKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfMzkwX05VTQkJNjEKKworCisvKiBDUklTIHJlbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgUl9DUklTX05PTkUJCTAKKyNkZWZpbmUgUl9DUklTXzgJCTEKKyNkZWZpbmUgUl9DUklTXzE2CQkyCisjZGVmaW5lIFJfQ1JJU18zMgkJMworI2RlZmluZSBSX0NSSVNfOF9QQ1JFTAkJNAorI2RlZmluZSBSX0NSSVNfMTZfUENSRUwJCTUKKyNkZWZpbmUgUl9DUklTXzMyX1BDUkVMCQk2CisjZGVmaW5lIFJfQ1JJU19HTlVfVlRJTkhFUklUCTcKKyNkZWZpbmUgUl9DUklTX0dOVV9WVEVOVFJZCTgKKyNkZWZpbmUgUl9DUklTX0NPUFkJCTkKKyNkZWZpbmUgUl9DUklTX0dMT0JfREFUCQkxMAorI2RlZmluZSBSX0NSSVNfSlVNUF9TTE9UCTExCisjZGVmaW5lIFJfQ1JJU19SRUxBVElWRQkJMTIKKyNkZWZpbmUgUl9DUklTXzE2X0dPVAkJMTMKKyNkZWZpbmUgUl9DUklTXzMyX0dPVAkJMTQKKyNkZWZpbmUgUl9DUklTXzE2X0dPVFBMVAkxNQorI2RlZmluZSBSX0NSSVNfMzJfR09UUExUCTE2CisjZGVmaW5lIFJfQ1JJU18zMl9HT1RSRUwJMTcKKyNkZWZpbmUgUl9DUklTXzMyX1BMVF9HT1RSRUwJMTgKKyNkZWZpbmUgUl9DUklTXzMyX1BMVF9QQ1JFTAkxOQorCisjZGVmaW5lIFJfQ1JJU19OVU0JCTIwCisKKworLyogQU1EIHg4Ni02NCByZWxvY2F0aW9ucy4gICovCisjZGVmaW5lIFJfWDg2XzY0X05PTkUJCTAJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl9YODZfNjRfNjQJCTEJLyogRGlyZWN0IDY0IGJpdCAgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEMzMgkJMgkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgc2lnbmVkICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVDMyCQkzCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfUExUMzIJCTQJLyogMzIgYml0IFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfWDg2XzY0X0NPUFkJCTUJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX1g4Nl82NF9HTE9CX0RBVAk2CS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfSlVNUF9TTE9UCTcJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1g4Nl82NF9SRUxBVElWRQk4CS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UUENSRUwJOQkvKiAzMiBiaXQgc2lnbmVkIFBDIHJlbGF0aXZlCisJCQkJCSAgIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9YODZfNjRfMzIJCTEwCS8qIERpcmVjdCAzMiBiaXQgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF8zMlMJCTExCS8qIERpcmVjdCAzMiBiaXQgc2lnbiBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF8xNgkJMTIJLyogRGlyZWN0IDE2IGJpdCB6ZXJvIGV4dGVuZGVkICovCisjZGVmaW5lIFJfWDg2XzY0X1BDMTYJCTEzCS8qIDE2IGJpdCBzaWduIGV4dGVuZGVkIHBjIHJlbGF0aXZlICovCisjZGVmaW5lIFJfWDg2XzY0XzgJCTE0CS8qIERpcmVjdCA4IGJpdCBzaWduIGV4dGVuZGVkICAqLworI2RlZmluZSBSX1g4Nl82NF9QQzgJCTE1CS8qIDggYml0IHNpZ24gZXh0ZW5kZWQgcGMgcmVsYXRpdmUgKi8KKyNkZWZpbmUgUl9YODZfNjRfRFRQTU9ENjQJMTYJLyogSUQgb2YgbW9kdWxlIGNvbnRhaW5pbmcgc3ltYm9sICovCisjZGVmaW5lIFJfWDg2XzY0X0RUUE9GRjY0CTE3CS8qIE9mZnNldCBpbiBtb2R1bGUncyBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl9YODZfNjRfVFBPRkY2NAkxOAkvKiBPZmZzZXQgaW4gaW5pdGlhbCBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl9YODZfNjRfVExTR0QJCTE5CS8qIDMyIGJpdCBzaWduZWQgUEMgcmVsYXRpdmUgb2Zmc2V0CisJCQkJCSAgIHRvIHR3byBHT1QgZW50cmllcyBmb3IgR0Qgc3ltYm9sICovCisjZGVmaW5lIFJfWDg2XzY0X1RMU0xECQkyMAkvKiAzMiBiaXQgc2lnbmVkIFBDIHJlbGF0aXZlIG9mZnNldAorCQkJCQkgICB0byB0d28gR09UIGVudHJpZXMgZm9yIExEIHN5bWJvbCAqLworI2RlZmluZSBSX1g4Nl82NF9EVFBPRkYzMgkyMQkvKiBPZmZzZXQgaW4gVExTIGJsb2NrICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFRQT0ZGCTIyCS8qIDMyIGJpdCBzaWduZWQgUEMgcmVsYXRpdmUgb2Zmc2V0CisJCQkJCSAgIHRvIEdPVCBlbnRyeSBmb3IgSUUgc3ltYm9sICovCisjZGVmaW5lIFJfWDg2XzY0X1RQT0ZGMzIJMjMJLyogT2Zmc2V0IGluIGluaXRpYWwgVExTIGJsb2NrICovCisKKyNkZWZpbmUgUl9YODZfNjRfTlVNCQkyNAorCisKKy8qIEFNMzMgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBSX01OMTAzMDBfTk9ORQkJMAkvKiBObyByZWxvYy4gICovCisjZGVmaW5lIFJfTU4xMDMwMF8zMgkJMQkvKiBEaXJlY3QgMzIgYml0LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwXzE2CQkyCS8qIERpcmVjdCAxNiBiaXQuICAqLworI2RlZmluZSBSX01OMTAzMDBfOAkJMwkvKiBEaXJlY3QgOCBiaXQuICAqLworI2RlZmluZSBSX01OMTAzMDBfUENSRUwzMgk0CS8qIFBDLXJlbGF0aXZlIDMyLWJpdC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9QQ1JFTDE2CTUJLyogUEMtcmVsYXRpdmUgMTYtYml0IHNpZ25lZC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9QQ1JFTDgJNgkvKiBQQy1yZWxhdGl2ZSA4LWJpdCBzaWduZWQuICAqLworI2RlZmluZSBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVAk3CS8qIEFuY2llbnQgQysrIHZ0YWJsZSBnYXJiYWdlLi4uICovCisjZGVmaW5lIFJfTU4xMDMwMF9HTlVfVlRFTlRSWQk4CS8qIC4uLiBjb2xsZWN0aW9uIGFubm90YXRpb24uICAqLworI2RlZmluZSBSX01OMTAzMDBfMjQJCTkJLyogRGlyZWN0IDI0IGJpdC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1RQQzMyCTEwCS8qIDMyLWJpdCBQQ3JlbCBvZmZzZXQgdG8gR09ULiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVFBDMTYJMTEJLyogMTYtYml0IFBDcmVsIG9mZnNldCB0byBHT1QuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UT0ZGMzIJMTIJLyogMzItYml0IG9mZnNldCBmcm9tIEdPVC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1RPRkYyNAkxMwkvKiAyNC1iaXQgb2Zmc2V0IGZyb20gR09ULiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVE9GRjE2CTE0CS8qIDE2LWJpdCBvZmZzZXQgZnJvbSBHT1QuICAqLworI2RlZmluZSBSX01OMTAzMDBfUExUMzIJCTE1CS8qIDMyLWJpdCBQQ3JlbCB0byBQTFQgZW50cnkuICAqLworI2RlZmluZSBSX01OMTAzMDBfUExUMTYJCTE2CS8qIDE2LWJpdCBQQ3JlbCB0byBQTFQgZW50cnkuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UMzIJCTE3CS8qIDMyLWJpdCBvZmZzZXQgdG8gR09UIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVDI0CQkxOAkvKiAyNC1iaXQgb2Zmc2V0IHRvIEdPVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1QxNgkJMTkJLyogMTYtYml0IG9mZnNldCB0byBHT1QgZW50cnkuICAqLworI2RlZmluZSBSX01OMTAzMDBfQ09QWQkJMjAJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HTE9CX0RBVAkyMQkvKiBDcmVhdGUgR09UIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0pNUF9TTE9UCTIyCS8qIENyZWF0ZSBQTFQgZW50cnkuICAqLworI2RlZmluZSBSX01OMTAzMDBfUkVMQVRJVkUJMjMJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZS4gICovCisKKyNkZWZpbmUgUl9NTjEwMzAwX05VTQkJMjQKKworCisvKiBNMzJSIHJlbG9jcy4gICovCisjZGVmaW5lIFJfTTMyUl9OT05FCQkwCS8qIE5vIHJlbG9jLiAqLworI2RlZmluZSBSX00zMlJfMTYJCTEJLyogRGlyZWN0IDE2IGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSXzMyCQkyCS8qIERpcmVjdCAzMiBiaXQuICovCisjZGVmaW5lIFJfTTMyUl8yNAkJMwkvKiBEaXJlY3QgMjQgYml0LiAqLworI2RlZmluZSBSX00zMlJfMTBfUENSRUwJCTQJLyogUEMgcmVsYXRpdmUgMTAgYml0IHNoaWZ0ZWQuICovCisjZGVmaW5lIFJfTTMyUl8xOF9QQ1JFTAkJNQkvKiBQQyByZWxhdGl2ZSAxOCBiaXQgc2hpZnRlZC4gKi8KKyNkZWZpbmUgUl9NMzJSXzI2X1BDUkVMCQk2CS8qIFBDIHJlbGF0aXZlIDI2IGJpdCBzaGlmdGVkLiAqLworI2RlZmluZSBSX00zMlJfSEkxNl9VTE8JCTcJLyogSGlnaCAxNiBiaXQgd2l0aCB1bnNpZ25lZCBsb3cuICovCisjZGVmaW5lIFJfTTMyUl9ISTE2X1NMTwkJOAkvKiBIaWdoIDE2IGJpdCB3aXRoIHNpZ25lZCBsb3cuICovCisjZGVmaW5lIFJfTTMyUl9MTzE2CQk5CS8qIExvdyAxNiBiaXQuICovCisjZGVmaW5lIFJfTTMyUl9TREExNgkJMTAJLyogMTYgYml0IG9mZnNldCBpbiBTREEuICovCisjZGVmaW5lIFJfTTMyUl9HTlVfVlRJTkhFUklUCTExCisjZGVmaW5lIFJfTTMyUl9HTlVfVlRFTlRSWQkxMgorLyogTTMyUiByZWxvY3MgdXNlIFNIVF9SRUxBLiAgKi8KKyNkZWZpbmUgUl9NMzJSXzE2X1JFTEEJCTMzCS8qIERpcmVjdCAxNiBiaXQuICovCisjZGVmaW5lIFJfTTMyUl8zMl9SRUxBCQkzNAkvKiBEaXJlY3QgMzIgYml0LiAqLworI2RlZmluZSBSX00zMlJfMjRfUkVMQQkJMzUJLyogRGlyZWN0IDI0IGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSXzEwX1BDUkVMX1JFTEEJMzYJLyogUEMgcmVsYXRpdmUgMTAgYml0IHNoaWZ0ZWQuICovCisjZGVmaW5lIFJfTTMyUl8xOF9QQ1JFTF9SRUxBCTM3CS8qIFBDIHJlbGF0aXZlIDE4IGJpdCBzaGlmdGVkLiAqLworI2RlZmluZSBSX00zMlJfMjZfUENSRUxfUkVMQQkzOAkvKiBQQyByZWxhdGl2ZSAyNiBiaXQgc2hpZnRlZC4gKi8KKyNkZWZpbmUgUl9NMzJSX0hJMTZfVUxPX1JFTEEJMzkJLyogSGlnaCAxNiBiaXQgd2l0aCB1bnNpZ25lZCBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0hJMTZfU0xPX1JFTEEJNDAJLyogSGlnaCAxNiBiaXQgd2l0aCBzaWduZWQgbG93ICovCisjZGVmaW5lIFJfTTMyUl9MTzE2X1JFTEEJNDEJLyogTG93IDE2IGJpdCAqLworI2RlZmluZSBSX00zMlJfU0RBMTZfUkVMQQk0MgkvKiAxNiBiaXQgb2Zmc2V0IGluIFNEQSAqLworI2RlZmluZSBSX00zMlJfUkVMQV9HTlVfVlRJTkhFUklUCTQzCisjZGVmaW5lIFJfTTMyUl9SRUxBX0dOVV9WVEVOVFJZCTQ0CisKKyNkZWZpbmUgUl9NMzJSX0dPVDI0CQk0OAkvKiAyNCBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfTTMyUl8yNl9QTFRSRUwJNDkJLyogMjYgYml0IFBDIHJlbGF0aXZlIHRvIFBMVCBzaGlmdGVkICovCisjZGVmaW5lIFJfTTMyUl9DT1BZCQk1MAkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfTTMyUl9HTE9CX0RBVAkJNTEJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSX00zMlJfSk1QX1NMT1QJCTUyCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9NMzJSX1JFTEFUSVZFCQk1MwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfTTMyUl9HT1RPRkYJCTU0CS8qIDI0IGJpdCBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfTTMyUl9HT1RQQzI0CQk1NQkvKiAyNCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX00zMlJfR09UMTZfSElfVUxPCTU2CS8qIEhpZ2ggMTYgYml0IEdPVCBlbnRyeSB3aXRoIHVuc2lnbmVkCisJCQkJCSAgIGxvdyAqLworI2RlZmluZSBSX00zMlJfR09UMTZfSElfU0xPCTU3CS8qIEhpZ2ggMTYgYml0IEdPVCBlbnRyeSB3aXRoIHNpZ25lZAorCQkJCQkgICBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVDE2X0xPCQk1OAkvKiBMb3cgMTYgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX00zMlJfR09UUENfSElfVUxPCTU5CS8qIEhpZ2ggMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0bworCQkJCQkgICBHT1Qgd2l0aCB1bnNpZ25lZCBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVFBDX0hJX1NMTwk2MAkvKiBIaWdoIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8KKwkJCQkJICAgR09UIHdpdGggc2lnbmVkIGxvdyAqLworI2RlZmluZSBSX00zMlJfR09UUENfTE8JCTYxCS8qIExvdyAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvCisJCQkJCSAgIEdPVCAqLworI2RlZmluZSBSX00zMlJfR09UT0ZGX0hJX1VMTwk2MgkvKiBIaWdoIDE2IGJpdCBvZmZzZXQgdG8gR09UCisJCQkJCSAgIHdpdGggdW5zaWduZWQgbG93ICovCisjZGVmaW5lIFJfTTMyUl9HT1RPRkZfSElfU0xPCTYzCS8qIEhpZ2ggMTYgYml0IG9mZnNldCB0byBHT1QKKwkJCQkJICAgd2l0aCBzaWduZWQgbG93ICovCisjZGVmaW5lIFJfTTMyUl9HT1RPRkZfTE8JNjQJLyogTG93IDE2IGJpdCBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfTTMyUl9OVU0JCTI1NgkvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICovCisKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIGVsZi5oICovCmRpZmYgLS1naXQgYS9saWJlbGYvZWxmMzJfY2hlY2tzdW0uYyBiL2xpYmVsZi9lbGYzMl9jaGVja3N1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NGViYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmMzJfY2hlY2tzdW0uYwpAQCAtMCwwICsxLDE0NSBAQAorLyogQ29tcHV0ZSBzaW1wbGUgY2hlY2tzdW0gZnJvbSBwZXJtYW5lbnQgcGFydHMgb2YgdGhlIEVMRiBmaWxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ2VsZi5oIgorI2luY2x1ZGUgImxpYmVsZlAuaCIKKyNpbmNsdWRlICJlbGYta25vd2xlZGdlLmgiCisKKyNpZm5kZWYgTElCRUxGQklUUworIyBkZWZpbmUgTElCRUxGQklUUyAzMgorI2VuZGlmCisKKworLyogVGhlIFNFQ1RJT05fU1RSSVBfUCBtYWNybyB3YW50cyB0byBjYWxsIGludG8gbGliZWJsIHdoaWNoIHdlIGNhbm5vdAorICAgZG8gYW5kIGRvIG5vdCBoYXZlIHRvIGRvIGhlcmUuICBQcm92aWRlIGEgZHVtbXkgcmVwbGFjZW1lbnQuICAqLworI2RlZmluZSBlYmxfZGVidWdzY25fcChlYmwsIG5hbWUpIHRydWUKKworCisjZGVmaW5lIHByb2Nlc3NfYmxvY2soY3JjLCBkYXRhKSBcCisgIF9fbGliZWxmX2NyYzMyIChjcmMsIGRhdGEtPmRfYnVmLCBkYXRhLT5kX3NpemUpCisKKworbG9uZyBpbnQKK2VsZncyKExJQkVMRkJJVFMsY2hlY2tzdW0pIChlbGYpCisgICAgIEVsZiAqZWxmOworeworICBzaXplX3Qgc2hzdHJuZHg7CisgIEVsZl9TY24gKnNjbjsKKyAgbG9uZyBpbnQgcmVzdWx0ID0gMDsKKyAgdW5zaWduZWQgY2hhciAqaWRlbnQ7CisgIGJvb2wgc2FtZV9ieXRlX29yZGVyOworCisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICByZXR1cm4gLTFsOworCisgIC8qIEZpbmQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCisgIGlmICAoSU5UVVNFKGVsZl9nZXRzaHN0cm5keCkgKGVsZiwgJnNoc3RybmR4KSA8IDApCisgICAgeworICAgICAgLyogVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIEVMRiBoYW5kbGUgaXMgbm90IGZvciByZWFsLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gLTFsOworICAgIH0KKworICAvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgZmlsZSBhbmQgdGhhdCBvZiB0aGUgaG9zdAorICAgICBpcyB0aGUgc2FtZS4gICovCisgIGlkZW50ID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyLT5lX2lkZW50OworICBzYW1lX2J5dGVfb3JkZXIgPSAoKGlkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTFNCCisJCSAgICAgICYmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4pCisJCSAgICAgfHwgKGlkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTVNCCisJCQkgJiYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTikpOworCisgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgc2VjdGlvbnMgdG8gZmluZCB0aG9zZSB3aGljaCBhcmUgbm90IHN0cmlwcGFibGUuICAqLworICBzY24gPSBOVUxMOworICB3aGlsZSAoKHNjbiA9IElOVFVTRShlbGZfbmV4dHNjbikgKGVsZiwgc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnNoZHI7CisgICAgICBFbGZfRGF0YSAqZGF0YTsKKworICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlci4gICovCisgICAgICBzaGRyID0gSU5UVVNFKGdlbGZfZ2V0c2hkcikgKHNjbiwgJnNoZHJfbWVtKTsKKyAgICAgIGlmIChzaGRyID09IE5VTEwpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfU0VDVElPTl9IRUFERVIpOworCSAgcmV0dXJuIC0xbDsKKwl9CisKKyAgICAgIGlmIChTRUNUSU9OX1NUUklQX1AgKHNoZHIsCisJCQkgICBJTlRVU0UoZWxmX3N0cnB0cikgKGVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAorCQkJICAgdHJ1ZSkpCisJLyogVGhlIHNlY3Rpb24gY2FuIGJlIHN0cmlwcGVkLiAgRG9uJ3QgdXNlIGl0LiAgKi8KKwljb250aW51ZTsKKworICAgICAgLyogRG8gbm90IGxvb2sgYXQgTk9CSVRTIHNlY3Rpb25zLiAgKi8KKyAgICAgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9OT0JJVFMpCisJY29udGludWU7CisKKyAgICAgIC8qIFRvIGNvbXB1dGUgdGhlIGNoZWNrc3VtIHdlIG5lZWQgdG8gZ2V0IHRvIHRoZSBkYXRhLiAgRm9yCisJIHJlcGVhdGFibGUgcmVzdWx0cyB3ZSBtdXN0IHVzZSB0aGUgZXh0ZXJuYWwgZm9ybWF0LiAgVGhlIGRhdGEKKwkgd2UgZ2V0IHdpdGggJ2VsZidnZXRkYXRhJyBtaWdodCBiZSBjaGFuZ2VkIGZvciBlbmRpYW5lc3MKKwkgcmVhc29ucy4gIFRoZXJlZm9yZSB3ZSB1c2UgJ2VsZl9yYXdkYXRhJyBpZiBwb3NzaWJsZS4gIEJ1dAorCSB0aGlzIGZ1bmN0aW9uIGNhbiBmYWlsIGlmIHRoZSBkYXRhIHdhcyBjb25zdHJ1Y3RlZCBieSB0aGUKKwkgcHJvZ3JhbS4gIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHVzZSAnZWxmX2dldGRhdGEnIGFuZAorCSBldmVudHVhbGx5IGNvbnZlcnQgdGhlIGRhdGEgdG8gdGhlIGV4dGVybmFsIGZvcm1hdC4gICovCisgICAgICBkYXRhID0gSU5UVVNFKGVsZl9yYXdkYXRhKSAoc2NuLCBOVUxMKTsKKyAgICAgIGlmIChkYXRhICE9IE5VTEwpCisJeworCSAgLyogVGhlIHJhdyBkYXRhIGlzIGF2YWlsYWJsZS4gICovCisJICByZXN1bHQgPSBwcm9jZXNzX2Jsb2NrIChyZXN1bHQsIGRhdGEpOworCisJICAvKiBNYXliZSB0aGUgdXNlciBhZGRlZCBtb3JlIGRhdGEuICBUaGVzZSBibG9ja3MgY2Fubm90IGJlCisJICAgICByZWFkIHVzaW5nICdlbGZfcmF3ZGF0YScuICBTaW1wbHkgcHJvY2VlZCB3aXRoIGxvb2tpbmcKKwkgICAgIGZvciBtb3JlIGRhdGEgYmxvY2sgd2l0aCAnZWxmX2dldGRhdGEnLiAgKi8KKwl9CisKKyAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiBkYXRhIGJsb2Nrcy4gICovCisgICAgICB3aGlsZSAoKGRhdGEgPSBJTlRVU0UoZWxmX2dldGRhdGEpIChzY24sIGRhdGEpKSAhPSBOVUxMKQorCS8qIElmIHRoZSBmaWxlIGJ5dGUgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGhvc3QgYnl0ZSBvcmRlcgorCSAgIHByb2Nlc3MgdGhlIGJ1ZmZlciBkaXJlY3RseS4gIElmIHRoZSBkYXRhIGlzIGp1c3QgYSBzdHJlYW0KKwkgICBvZiBieXRlcyB3aGljaCB0aGUgbGlicmFyeSB3aWxsIG5vdCBjb252ZXJ0IHdlIGNhbiB1c2UgaXQKKwkgICBhcyB3ZWxsLiAgKi8KKwlpZiAobGlrZWx5IChzYW1lX2J5dGVfb3JkZXIpIHx8IGRhdGEtPmRfdHlwZSA9PSBFTEZfVF9CWVRFKQorCSAgcmVzdWx0ID0gcHJvY2Vzc19ibG9jayAocmVzdWx0LCBkYXRhKTsKKwllbHNlCisJICB7CisJICAgIC8qIENvbnZlcnQgdGhlIGRhdGEgdG8gZmlsZSBieXRlIG9yZGVyLiAgKi8KKwkgICAgaWYgKElOVFVTRShlbGZ3MihMSUJFTEZCSVRTLHhsYXRldG9mKSkgKGRhdGEsIGRhdGEsIGlkZW50W0VJX0RBVEFdKQorCQk9PSBOVUxMKQorCSAgICAgIHJldHVybiAtMWw7CisKKwkgICAgcmVzdWx0ID0gcHJvY2Vzc19ibG9jayAocmVzdWx0LCBkYXRhKTsKKworCSAgICAvKiBBbmQgY29udmVydCBpdCBiYWNrLiAgKi8KKwkgICAgaWYgKElOVFVTRShlbGZ3MihMSUJFTEZCSVRTLHhsYXRldG9tKSkgKGRhdGEsIGRhdGEsIGlkZW50W0VJX0RBVEFdKQorCQk9PSBOVUxMKQorCSAgICAgIHJldHVybiAtMWw7CisJICB9CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CitJTlRERUYoZWxmdzIoTElCRUxGQklUUyxjaGVja3N1bSkpCmRpZmYgLS1naXQgYS9saWJlbGYvZWxmMzJfZnNpemUuYyBiL2xpYmVsZi9lbGYzMl9mc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNzUwMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmMzJfZnNpemUuYwpAQCAtMCwwICsxLDU5IEBACisvKiBSZXR1cm4gdGhlIHNpemUgb2YgYW4gb2JqZWN0IGZpbGUgdHlwZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgImxpYmVsZlAuaCIKKworI2lmbmRlZiBMSUJFTEZCSVRTCisjIGRlZmluZSBMSUJFTEZCSVRTIDMyCisjZW5kaWYKKworCitzaXplX3QKK2VsZncyKExJQkVMRkJJVFMsIGZzaXplKSAodHlwZSwgY291bnQsIHZlcnNpb24pCisgICAgIEVsZl9UeXBlIHR5cGU7CisgICAgIHNpemVfdCBjb3VudDsKKyAgICAgdW5zaWduZWQgaW50IHZlcnNpb247Cit7CisgIC8qIFdlIGRvIG5vdCBoYXZlIGRpZmZlcmVuY2VzIGJldHdlZW4gZmlsZSBhbmQgbWVtb3J5IHNpemVzLiAgQmV0dGVyCisgICAgIG5vdCBzaW5jZSBvdGhlcndpc2UgYG1tYXAnIHdvdWxkIG5vdCB3b3JrLiAgKi8KKyAgaWYgKHVubGlrZWx5ICh2ZXJzaW9uID09IEVWX05PTkUpIHx8IHVubGlrZWx5ICh2ZXJzaW9uID49IEVWX05VTSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1VOS05PV05fVkVSU0lPTik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHVubGlrZWx5ICh0eXBlID49IEVMRl9UX05VTSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1VOS05PV05fVFlQRSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyNpZiBFVl9OVU0gIT0gMgorICByZXR1cm4gKGNvdW50CisJICAqIF9fbGliZWxmX3R5cGVfc2l6ZXNbdmVyc2lvbiAtIDFdW0VMRlcoRUxGQ0xBU1MsTElCRUxGQklUUykgLSAxXVt0eXBlXSk7CisjZWxzZQorICByZXR1cm4gKGNvdW50CisJICAqIF9fbGliZWxmX3R5cGVfc2l6ZXNbMF1bRUxGVyhFTEZDTEFTUyxMSUJFTEZCSVRTKSAtIDFdW3R5cGVdKTsKKyNlbmRpZgorfQorI2RlZmluZSBsb2NhbF9zdHJvbmdfYWxpYXMobjEsIG4yKSBzdHJvbmdfYWxpYXMgKG4xLCBuMikKK2xvY2FsX3N0cm9uZ19hbGlhcyAoZWxmdzIoTElCRUxGQklUUywgZnNpemUpLCBfX2VsZncyKExJQkVMRkJJVFMsIG1zaXplKSkKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGYzMl9nZXRlaGRyLmMgYi9saWJlbGYvZWxmMzJfZ2V0ZWhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDYwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmMzJfZ2V0ZWhkci5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIEdldCBFTEYgaGVhZGVyLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKyNpZm5kZWYgTElCRUxGQklUUworIyBkZWZpbmUgTElCRUxGQklUUyAzMgorI2VuZGlmCisKKworRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqCitlbGZ3MihMSUJFTEZCSVRTLGdldGVoZHIpIChlbGYpCisgICAgIEVsZiAqZWxmOworeworICBFbGZXMihMSUJFTEZCSVRTLEVoZHIpICpyZXN1bHQ7CisKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOworCisgIGlmIChlbGYtPmNsYXNzID09IDApCisgICAgZWxmLT5jbGFzcyA9IEVMRlcoRUxGQ0xBU1MsTElCRUxGQklUUyk7CisgIGVsc2UgaWYgKHVubGlrZWx5IChlbGYtPmNsYXNzICE9IEVMRlcoRUxGQ0xBU1MsTElCRUxGQklUUykpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0NMQVNTKTsKKyAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmVzdWx0ID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyOworCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CitJTlRERUYoZWxmdzIoTElCRUxGQklUUyxnZXRlaGRyKSkKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGYzMl9nZXRwaGRyLmMgYi9saWJlbGYvZWxmMzJfZ2V0cGhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjkzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmMzJfZ2V0cGhkci5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiBHZXQgRUxGIHByb2dyYW0gaGVhZGVyIHRhYmxlLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpZm5kZWYgTElCRUxGQklUUworIyBkZWZpbmUgTElCRUxGQklUUyAzMgorI2VuZGlmCisKKworRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqCitlbGZ3MihMSUJFTEZCSVRTLGdldHBoZHIpIChlbGYpCisgICAgIEVsZiAqZWxmOworeworICBFbGZXMihMSUJFTEZCSVRTLFBoZHIpICpyZXN1bHQ7CisKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBJZiB0aGUgcHJvZ3JhbSBoZWFkZXIgZW50cnkgaGFzIGFscmVhZHkgYmVlbiBmaWxsZWQgaW4gdGhlIGNvZGUKKyAgICAgYmVsb3cgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBydW4uICBTbyB0aGUgY2xhc3MgaXMgc2V0LCB0b28uICBObworICAgICBuZWVkIHRvIHdhc3RlIGFueSBtb3JlIHRpbWUgaGVyZS4gICovCisgIHJlc3VsdCA9IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcjsKKyAgaWYgKGxpa2VseSAocmVzdWx0ICE9IE5VTEwpKQorICAgIHJldHVybiByZXN1bHQ7CisKKyAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICBpZiAoZWxmLT5jbGFzcyA9PSAwKQorICAgIGVsZi0+Y2xhc3MgPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpOworICBlbHNlIGlmIChlbGYtPmNsYXNzICE9IEVMRlcoRUxGQ0xBU1MsTElCRUxGQklUUykpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ0xBU1MpOworICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAobGlrZWx5IChyZXN1bHQgPT0gTlVMTCkpCisgICAgeworICAgICAgLyogUmVhZCB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUuICAqLworICAgICAgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqZWhkciA9IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcjsKKworICAgICAgLyogSWYgbm8gcHJvZ3JhbSBoZWFkZXIgZXhpc3RzIHJldHVybiBOVUxMLiAgKi8KKyAgICAgIHNpemVfdCBwaG51bSA9IGVoZHItPmVfcGhudW07CisgICAgICBpZiAocGhudW0gPT0gMCkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9fUEhEUik7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIHNpemVfdCBzaXplID0gcGhudW0gKiBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsUGhkcikpOworCisgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMKQorCXsKKwkgIC8qIEFsbCB0aGUgZGF0YSBpcyBhbHJlYWR5IG1hcHBlZC4gIFVzZSBpdC4gICovCisJICBpZiAoZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9PSBNWV9FTEZEQVRBCisJICAgICAgJiYgKEFMTE9XX1VOQUxJR05FRAorCQkgIHx8IChlaGRyLT5lX3Bob2ZmCisJCSAgICAgICYgKF9fYWxpZ25vZl9fIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAtIDEpKSA9PSAwKSkKKwkgICAgLyogU2ltcGx5IHVzZSB0aGUgbWFwcGVkIGRhdGEuICAqLworCSAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIgPSAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqKQorCSAgICAgICgoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Bob2ZmKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIEVsZlcyKExJQkVMRkJJVFMsUGhkcikgKm5vdGN2dDsKKwkgICAgICBFbGZXMihMSUJFTEZCSVRTLFBoZHIpICpwaGRyOworCisJICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgV2Uga25vdyB0aGUgbnVtYmVyCisJCSBvZiBlbnRyaWVzIGZyb20gdGhlIEVMRiBoZWFkZXIuICAqLworCSAgICAgIHBoZHIgPSBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIgPQorCQkoRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqKSBtYWxsb2MgKHNpemUpOworCSAgICAgIGlmIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIgPT0gTlVMTCkKKwkJeworCQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7CisJCSAgZ290byBvdXQ7CisJCX0KKwkgICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHJfZmxhZ3MgfD0KKwkJRUxGX0ZfTUFMTE9DRUQgfCBFTEZfRl9ESVJUWTsKKworCSAgICAgIC8qIE5vdyBjb3B5IHRoZSBkYXRhIGFuZCBhdCB0aGUgc2FtZSB0aW1lIGNvbnZlcnQgdGhlCisJCSBieXRlIG9yZGVyLiAgKi8KKwkgICAgICBpZiAoQUxMT1dfVU5BTElHTkVECisJCSAgfHwgKGVoZHItPmVfcGhvZmYKKwkJICAgICAgJiAoX19hbGlnbm9mX18gKEVsZlcyKExJQkVMRkJJVFMsUGhkcikpIC0gMSkpID09IDApCisJCW5vdGN2dCA9IChFbGZXMihMSUJFTEZCSVRTLFBoZHIpICopCisJCSAgKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MKKwkJICAgKyBlbGYtPnN0YXJ0X29mZnNldCArIGVoZHItPmVfcGhvZmYpOworCSAgICAgIGVsc2UKKwkJeworCQkgIG5vdGN2dCA9IChFbGZXMihMSUJFTEZCSVRTLFBoZHIpICopIGFsbG9jYSAoc2l6ZSk7CisJCSAgbWVtY3B5IChub3RjdnQsICgoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsKKwkJCQkgICBlbGYtPnN0YXJ0X29mZnNldCArIGVoZHItPmVfcGhvZmYpLAorCQkJICBzaXplKTsKKwkJfQorCisJICAgICAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgcGhudW07ICsrY250KQorCQl7CisJCSAgQ09OVkVSVF9UTyAocGhkcltjbnRdLnBfdHlwZSwgbm90Y3Z0W2NudF0ucF90eXBlKTsKKwkJICBDT05WRVJUX1RPIChwaGRyW2NudF0ucF9vZmZzZXQsIG5vdGN2dFtjbnRdLnBfb2Zmc2V0KTsKKwkJICBDT05WRVJUX1RPIChwaGRyW2NudF0ucF92YWRkciwgbm90Y3Z0W2NudF0ucF92YWRkcik7CisJCSAgQ09OVkVSVF9UTyAocGhkcltjbnRdLnBfcGFkZHIsIG5vdGN2dFtjbnRdLnBfcGFkZHIpOworCQkgIENPTlZFUlRfVE8gKHBoZHJbY250XS5wX2ZpbGVzeiwgbm90Y3Z0W2NudF0ucF9maWxlc3opOworCQkgIENPTlZFUlRfVE8gKHBoZHJbY250XS5wX21lbXN6LCBub3RjdnRbY250XS5wX21lbXN6KTsKKwkJICBDT05WRVJUX1RPIChwaGRyW2NudF0ucF9mbGFncywgbm90Y3Z0W2NudF0ucF9mbGFncyk7CisJCSAgQ09OVkVSVF9UTyAocGhkcltjbnRdLnBfYWxpZ24sIG5vdGN2dFtjbnRdLnBfYWxpZ24pOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChsaWtlbHkgKGVsZi0+ZmlsZGVzICE9IC0xKSkKKwl7CisJICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwcm9ncmFtIGhlYWRlcnMuICBXZSBrbm93IHRoZSBudW1iZXIKKwkgICAgIG9mIGVudHJpZXMgZnJvbSB0aGUgRUxGIGhlYWRlci4gICovCisJICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIgPQorCSAgICAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqKSBtYWxsb2MgKHNpemUpOworCSAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKwkgICAgICBnb3RvIG91dDsKKwkgICAgfQorCSAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyX2ZsYWdzIHw9IEVMRl9GX01BTExPQ0VEOworCisJICAvKiBSZWFkIHRoZSBoZWFkZXIuICAqLworCSAgaWYgKChzaXplX3QpIHByZWFkIChlbGYtPmZpbGRlcywKKwkJCSAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciwgc2l6ZSwKKwkJCSAgICAgIChlbGYtPnN0YXJ0X29mZnNldCArIGVoZHItPmVfcGhvZmYpKSAhPSBzaXplKQorCSAgICB7CisJICAgICAgLyogU2V2ZXJlIHByb2JsZW1zLiAgV2UgY2Fubm90IHJlYWQgdGhlIGRhdGEuICAqLworCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9SRUFEX0VSUk9SKTsKKwkgICAgICBmcmVlIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIpOworCSAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciA9IE5VTEw7CisJICAgICAgZ290byBvdXQ7CisJICAgIH0KKworCSAgLyogSWYgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGZpbGUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBvbmUKKwkgICAgIG9mIHRoZSBob3N0IGNvbnZlcnQgdGhlIGRhdGEgbm93LiAgKi8KKwkgIGlmIChlaGRyLT5lX2lkZW50W0VJX0RBVEFdICE9IE1ZX0VMRkRBVEEpCisJICAgIHsKKwkgICAgICBFbGZXMihMSUJFTEZCSVRTLFBoZHIpICpwaGRyCisJCT0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyOworCisJICAgICAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgcGhudW07ICsrY250KQorCQl7CisJCSAgQ09OVkVSVCAocGhkcltjbnRdLnBfdHlwZSk7CisJCSAgQ09OVkVSVCAocGhkcltjbnRdLnBfb2Zmc2V0KTsKKwkJICBDT05WRVJUIChwaGRyW2NudF0ucF92YWRkcik7CisJCSAgQ09OVkVSVCAocGhkcltjbnRdLnBfcGFkZHIpOworCQkgIENPTlZFUlQgKHBoZHJbY250XS5wX2ZpbGVzeik7CisJCSAgQ09OVkVSVCAocGhkcltjbnRdLnBfbWVtc3opOworCQkgIENPTlZFUlQgKHBoZHJbY250XS5wX2ZsYWdzKTsKKwkJICBDT05WRVJUIChwaGRyW2NudF0ucF9hbGlnbik7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIHdhcyBhbHJlYWR5IGVuYWJsZWQgYW5kIG5vdCBhbGwgZGF0YSB3YXMKKwkgICAgIHJlYWQuICAqLworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0ZEX0RJU0FCTEVEKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgcmVzdWx0ID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyOworICAgIH0KKworIG91dDoKKyAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQorSU5UREVGKGVsZncyKExJQkVMRkJJVFMsZ2V0cGhkcikpCmRpZmYgLS1naXQgYS9saWJlbGYvZWxmMzJfZ2V0c2hkci5jIGIvbGliZWxmL2VsZjMyX2dldHNoZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTI2ZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZjMyX2dldHNoZHIuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogUmV0dXJuIHNlY3Rpb24gaGVhZGVyLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpZm5kZWYgTElCRUxGQklUUworIyBkZWZpbmUgTElCRUxGQklUUyAzMgorI2VuZGlmCisKKworRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqCitlbGZ3MihMSUJFTEZCSVRTLGdldHNoZHIpIChzY24pCisgICAgIEVsZl9TY24gKnNjbjsKK3sKKyAgRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqcmVzdWx0OworCisgIGlmIChzY24gPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodW5saWtlbHkgKHNjbi0+ZWxmLT5zdGF0ZS5lbGYuZWhkciA9PSBOVUxMKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JPTkdfT1JERVJfRUhEUik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChzY24tPmVsZi0+Y2xhc3MgIT0gRUxGVyhFTEZDTEFTUyxMSUJFTEZCSVRTKSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ0xBU1MpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJlc3VsdCA9IHNjbi0+c2hkci5FTEZXKGUsTElCRUxGQklUUyk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBSZWFkIHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZS4gICovCisgICAgICBFbGYgKmVsZiA9IHNjbi0+ZWxmOworICAgICAgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqZWhkciA9IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcjsKKworICAgICAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICAgICAgLyogVHJ5IGFnYWluLCBtYXliZSB0aGUgZGF0YSBpcyB0aGVyZSBub3cuICAqLworICAgICAgcmVzdWx0ID0gc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKKwlnb3RvIG91dDsKKworICAgICAgc2l6ZV90IHNobnVtOworICAgICAgaWYgKElOVFVTRSAoZWxmX2dldHNobnVtKSAoZWxmLCAmc2hudW0pICE9IDApCisJZ290byBvdXQ7CisgICAgICBzaXplX3Qgc2l6ZSA9IHNobnVtICogc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFNoZHIpKTsKKworICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgV2Uga25vdyB0aGUgbnVtYmVyCisJIG9mIGVudHJpZXMgZnJvbSB0aGUgRUxGIGhlYWRlci4gICovCisgICAgICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpzaGRyID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyID0KKwkoRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqKSBtYWxsb2MgKHNpemUpOworICAgICAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuc2hkciA9PSBOVUxMKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7CisJICBnb3RvIG91dDsKKwl9CisgICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNoZHJfbWFsbG9jZWQgPSAxOworCisgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMKQorCXsKKwkgIEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKm5vdGN2dDsKKworCSAgLyogQWxsIHRoZSBkYXRhIGlzIGFscmVhZHkgbWFwcGVkLiAgSWYgd2UgY291bGQgdXNlIGl0CisJICAgICBkaXJlY3RseSB0aGlzIHdvdWxkIGFscmVhZHkgaGF2ZSBoYXBwZW5lZC4gICovCisJICBhc3NlcnQgKGVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gTVlfRUxGREFUQQorCQkgIHx8ICghIEFMTE9XX1VOQUxJR05FRAorCQkgICAgICAmJiAoZWhkci0+ZV9zaG9mZgorCQkJICAmIChfX2FsaWdub2ZfXyAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSkgLSAxKSkgIT0gMCkpOworCisJICAvKiBOb3cgY29weSB0aGUgZGF0YSBhbmQgYXQgdGhlIHNhbWUgdGltZSBjb252ZXJ0IHRoZSBieXRlCisJICAgICBvcmRlci4gICovCisJICBpZiAoQUxMT1dfVU5BTElHTkVECisJICAgICAgfHwgKGVoZHItPmVfc2hvZmYKKwkJICAmIChfX2FsaWdub2ZfXyAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSkgLSAxKSkgPT0gMCkKKwkgICAgbm90Y3Z0ID0gKEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKikKKwkgICAgICAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcworCSAgICAgICArIGVsZi0+c3RhcnRfb2Zmc2V0ICsgZWhkci0+ZV9zaG9mZik7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBub3RjdnQgPSAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqKSBhbGxvY2EgKHNpemUpOworCSAgICAgIG1lbWNweSAobm90Y3Z0LCAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcworCQkJICAgICAgICsgZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Nob2ZmKSwKKwkJICAgICAgc2l6ZSk7CisJICAgIH0KKworCSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2hudW07ICsrY250KQorCSAgICB7CisJICAgICAgQ09OVkVSVF9UTyAoc2hkcltjbnRdLnNoX25hbWUsIG5vdGN2dFtjbnRdLnNoX25hbWUpOworCSAgICAgIENPTlZFUlRfVE8gKHNoZHJbY250XS5zaF90eXBlLCBub3RjdnRbY250XS5zaF90eXBlKTsKKwkgICAgICBDT05WRVJUX1RPIChzaGRyW2NudF0uc2hfZmxhZ3MsIG5vdGN2dFtjbnRdLnNoX2ZsYWdzKTsKKwkgICAgICBDT05WRVJUX1RPIChzaGRyW2NudF0uc2hfYWRkciwgbm90Y3Z0W2NudF0uc2hfYWRkcik7CisJICAgICAgQ09OVkVSVF9UTyAoc2hkcltjbnRdLnNoX29mZnNldCwgbm90Y3Z0W2NudF0uc2hfb2Zmc2V0KTsKKwkgICAgICBDT05WRVJUX1RPIChzaGRyW2NudF0uc2hfc2l6ZSwgbm90Y3Z0W2NudF0uc2hfc2l6ZSk7CisJICAgICAgQ09OVkVSVF9UTyAoc2hkcltjbnRdLnNoX2xpbmssIG5vdGN2dFtjbnRdLnNoX2xpbmspOworCSAgICAgIENPTlZFUlRfVE8gKHNoZHJbY250XS5zaF9pbmZvLCBub3RjdnRbY250XS5zaF9pbmZvKTsKKwkgICAgICBDT05WRVJUX1RPIChzaGRyW2NudF0uc2hfYWRkcmFsaWduLCBub3RjdnRbY250XS5zaF9hZGRyYWxpZ24pOworCSAgICAgIENPTlZFUlRfVE8gKHNoZHJbY250XS5zaF9lbnRzaXplLCBub3RjdnRbY250XS5zaF9lbnRzaXplKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGVsZi0+ZmlsZGVzICE9IC0xKQorCXsKKwkgIC8qIFJlYWQgdGhlIGhlYWRlci4gICovCisJICBpZiAoKHNpemVfdCkgcHJlYWQgKGVsZi0+ZmlsZGVzLAorCQkJICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyLCBzaXplLAorCQkJICAgICAgZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Nob2ZmKSAhPSBzaXplKQorCSAgICB7CisJICAgICAgLyogU2V2ZXJlIHByb2JsZW1zLiAgV2UgY2Fubm90IHJlYWQgdGhlIGRhdGEuICAqLworCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9SRUFEX0VSUk9SKTsKKwkgICAgICBnb3RvIGZyZWVfYW5kX291dDsKKwkgICAgfQorCisJICAvKiBJZiB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgZmlsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG9uZQorCSAgICAgb2YgdGhlIGhvc3QgY29udmVydCB0aGUgZGF0YSBub3cuICAqLworCSAgaWYgKGVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gTVlfRUxGREFUQSkKKwkgICAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2hudW07ICsrY250KQorCSAgICAgIHsKKwkJQ09OVkVSVCAoc2hkcltjbnRdLnNoX25hbWUpOworCQlDT05WRVJUIChzaGRyW2NudF0uc2hfdHlwZSk7CisJCUNPTlZFUlQgKHNoZHJbY250XS5zaF9mbGFncyk7CisJCUNPTlZFUlQgKHNoZHJbY250XS5zaF9hZGRyKTsKKwkJQ09OVkVSVCAoc2hkcltjbnRdLnNoX29mZnNldCk7CisJCUNPTlZFUlQgKHNoZHJbY250XS5zaF9zaXplKTsKKwkJQ09OVkVSVCAoc2hkcltjbnRdLnNoX2xpbmspOworCQlDT05WRVJUIChzaGRyW2NudF0uc2hfaW5mbyk7CisJCUNPTlZFUlQgKHNoZHJbY250XS5zaF9hZGRyYWxpZ24pOworCQlDT05WRVJUIChzaGRyW2NudF0uc2hfZW50c2l6ZSk7CisJICAgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIHdhcyBhbHJlYWR5IGVuYWJsZWQgYW5kIG5vdCBhbGwgZGF0YSB3YXMKKwkgICAgIHJlYWQuICBVbmRvIHRoZSBhbGxvY2F0aW9uLiAgKi8KKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9GRF9ESVNBQkxFRCk7CisKKwlmcmVlX2FuZF9vdXQ6CisJICBmcmVlIChzaGRyKTsKKwkgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuc2hkciA9IE5VTEw7CisJICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNoZHJfbWFsbG9jZWQgPSAwOworCisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIC8qIFNldCB0aGUgcG9pbnRlcnMgaW4gdGhlIGBzY24ncy4gICovCisgICAgICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBzaG51bTsgKytjbnQpCisJZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmRhdGFbY250XS5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKQorCSAgPSAmZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyW2NudF07CisKKyAgICAgIHJlc3VsdCA9IHNjbi0+c2hkci5FTEZXKGUsTElCRUxGQklUUyk7CisgICAgICBhc3NlcnQgKHJlc3VsdCAhPSBOVUxMKTsKKworICAgIG91dDoKKyAgICAgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CitJTlRERUYoZWxmdzIoTElCRUxGQklUUyxnZXRzaGRyKSkKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGYzMl9uZXdlaGRyLmMgYi9saWJlbGYvZWxmMzJfbmV3ZWhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OGFkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmMzJfbmV3ZWhkci5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIENyZWF0ZSBuZXcgRUxGIGhlYWRlci4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisjaWZuZGVmIExJQkVMRkJJVFMKKyMgZGVmaW5lIExJQkVMRkJJVFMgMzIKKyNlbmRpZgorCisKK0VsZlcyKExJQkVMRkJJVFMsRWhkcikgKgorZWxmdzIoTElCRUxGQklUUyxuZXdlaGRyKSAoZWxmKQorICAgICBFbGYgKmVsZjsKK3sKKyAgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqcmVzdWx0OworCisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICBpZiAoZWxmLT5jbGFzcyA9PSAwKQorICAgIGVsZi0+Y2xhc3MgPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpOworICBlbHNlIGlmICh1bmxpa2VseSAoZWxmLT5jbGFzcyAhPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DTEFTUyk7CisgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIERvbid0IGNyZWF0ZSBhbiBFTEYgaGVhZGVyIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gICovCisgIGlmIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSB1c2UgdGhlIG1lbW9yeSBpbiB0aGUgRUxGIGRlc2NyaXB0b3IuICAqLworICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyID0KKwkmZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX21lbTsKKworICAgICAgLyogV2UgY2xlYXIgdGhpcyBtZW1vcnkuICAqLworICAgICAgbWVtc2V0IChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHIsICdcMCcsCisJICAgICAgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLEVoZHIpKSk7CisKKyAgICAgIC8qIE1hcmsgdGhlIEVMRiBoZWFkZXIgaGFzIG1vZGlmaWVkLiAgKi8KKyAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcl9mbGFncyB8PSBFTEZfRl9ESVJUWTsKKyAgICB9CisKKyAgcmVzdWx0ID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyOworCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CitJTlRERUYoZWxmdzIoTElCRUxGQklUUyxuZXdlaGRyKSkKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGYzMl9uZXdwaGRyLmMgYi9saWJlbGYvZWxmMzJfbmV3cGhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTIzODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmMzJfbmV3cGhkci5jCkBAIC0wLDAgKzEsMTM4IEBACisvKiBDcmVhdGUgbmV3IEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisjaWZuZGVmIExJQkVMRkJJVFMKKyMgZGVmaW5lIExJQkVMRkJJVFMgMzIKKyNlbmRpZgorCisKK0VsZlcyKExJQkVMRkJJVFMsUGhkcikgKgorZWxmdzIoTElCRUxGQklUUyxuZXdwaGRyKSAoZWxmLCBjb3VudCkKKyAgICAgRWxmICplbGY7CisgICAgIHNpemVfdCBjb3VudDsKK3sKKyAgRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqcmVzdWx0OworCisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICBpZiAoZWxmLT5jbGFzcyA9PSAwKQorICAgIGVsZi0+Y2xhc3MgPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpOworICBlbHNlIGlmICh1bmxpa2VseSAoZWxmLT5jbGFzcyAhPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DTEFTUyk7CisgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICh1bmxpa2VseSAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUk9OR19PUkRFUl9FSERSKTsKKyAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogQSBDT1VOVCBvZiB6ZXJvIG1lYW5zIHJlbW92ZSBleGlzdGluZyB0YWJsZS4gICovCisgIGlmIChjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIC8qIEZyZWUgdGhlIG9sZCBwcm9ncmFtIGhlYWRlci4gICovCisgICAgICBpZiAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyICE9IE5VTEwpCisJeworCSAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcl9mbGFncyAmIEVMRl9GX01BTExPQ0VEKQorCSAgICBmcmVlIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIpOworCisJICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gTlVMTC4gICovCisJICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIgPSBOVUxMOworCSAgLyogU2V0IHRoZSBgZV9waG51bScgbWVtYmVyIHRvIHRoZSBuZXcgdmFsdWUuICAqLworCSAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyLT5lX3BobnVtID0gMDsKKwkgIC8qIEFsc28gc2V0IHRoZSBzaXplLiAgKi8KKwkgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkci0+ZV9waGVudHNpemUgPQorCSAgICBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsUGhkcikpOworCisJICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHJfZmxhZ3MgfD0gRUxGX0ZfRElSVFk7CisJICBlbGYtPmZsYWdzIHw9IEVMRl9GX0RJUlRZOworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PRVJST1IpOworCX0KKworICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CisgIGVsc2UgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkci0+ZV9waG51bSAhPSBjb3VudAorCSAgIHx8IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IHByb2dyYW0gaGVhZGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZgorCSBlbGVtZW50cy4gICovCisgICAgICByZXN1bHQgPSAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqKQorCXJlYWxsb2MgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciwKKwkJIGNvdW50ICogc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSk7CisgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisJX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBOb3cgc2V0IHRoZSByZXN1bHQuICAqLworCSAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyID0gcmVzdWx0OworCSAgLyogQ2xlYXIgdGhlIHdob2xlIG1lbW9yeS4gICovCisJICBtZW1zZXQgKHJlc3VsdCwgJ1wwJywgY291bnQgKiBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsUGhkcikpKTsKKwkgIC8qIFNldCB0aGUgYGVfcGhudW0nIG1lbWJlciB0byB0aGUgbmV3IHZhbHVlLiAgKi8KKwkgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkci0+ZV9waG51bSA9IGNvdW50OworCSAgLyogQWxzbyBzZXQgdGhlIHNpemUuICAqLworCSAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyLT5lX3BoZW50c2l6ZSA9CisJICAgIGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUEhEUiwgMSk7CisJICAvKiBSZW1lbWJlciB3ZSBhbGxvY2F0ZWQgdGhlIGFycmF5IGFuZCBtYXJrIHRoZSBzdHJ1Y3R1cmUgaXMKKwkgICAgIG1vZGlmaWVkLiAgKi8KKwkgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcl9mbGFncyB8PQorCSAgICBFTEZfRl9ESVJUWSB8IEVMRl9GX01BTExPQ0VEOworCSAgLyogV2UgaGF2ZSB0byByZXdyaXRlIHRoZSBlbnRpcmUgZmlsZSBpZiB0aGUgc2l6ZSBvZiB0aGUKKwkgICAgIHByb2dyYW0gaGVhZGVyIGlzIGNoYW5nZWQuICAqLworCSAgZWxmLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcy4gIEp1c3QgY2xlYXIgdGhlIGFycmF5LiAgKi8KKyAgICAgIGFzc2VydCAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyLT5lX3BoZW50c2l6ZQorCSAgICAgID09IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUEhEUiwgMSkpOworCisgICAgICAvKiBNYXJrIHRoZSBzdHJ1Y3R1cmUgYXMgbW9kaWZpZWQuICAqLworICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyX2ZsYWdzIHw9IEVMRl9GX0RJUlRZOworCisgICAgICByZXN1bHQgPSBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHI7CisgICAgfQorCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CitJTlRERUYoZWxmdzIoTElCRUxGQklUUyxuZXdwaGRyKSkKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGYzMl91cGRhdGVmaWxlLmMgYi9saWJlbGYvZWxmMzJfdXBkYXRlZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODkzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmMzJfdXBkYXRlZmlsZS5jCkBAIC0wLDAgKzEsNjEwIEBACisvKiBXcml0ZSBjaGFuZ2VkIGRhdGEgc3RydWN0dXJlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCisjaWZuZGVmIExJQkVMRkJJVFMKKyMgZGVmaW5lIExJQkVMRkJJVFMgMzIKKyNlbmRpZgorCisKK3N0YXRpYyBpbnQKK2NvbXBhcmVfc2VjdGlvbnMgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgIGNvbnN0IEVsZl9TY24gKipzY25hID0gKGNvbnN0IEVsZl9TY24gKiopIGE7CisgIGNvbnN0IEVsZl9TY24gKipzY25iID0gKGNvbnN0IEVsZl9TY24gKiopIGI7CisKKyAgaWYgKCgqc2NuYSktPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLT5zaF9vZmZzZXQKKyAgICAgIDwgKCpzY25iKS0+c2hkci5FTEZXKGUsTElCRUxGQklUUyktPnNoX29mZnNldCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKCgqc2NuYSktPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLT5zaF9vZmZzZXQKKyAgICAgID4gKCpzY25iKS0+c2hkci5FTEZXKGUsTElCRUxGQklUUyktPnNoX29mZnNldCkKKyAgICByZXR1cm4gMTsKKworICBpZiAoKCpzY25hKS0+aW5kZXggPCAoKnNjbmIpLT5pbmRleCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKCgqc2NuYSktPmluZGV4ID4gKCpzY25iKS0+aW5kZXgpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogSW5zZXJ0IHRoZSBzZWN0aW9ucyBpbiB0aGUgbGlzdCBpbnRvIHRoZSBwcm92aWRlZCBhcnJheSBhbmQgc29ydAorICAgdGhlbSBhY2NvcmRpbmcgdG8gdGhlaXIgc3RhcnQgb2Zmc2V0cy4gIEZvciBzZWN0aW9ucyB3aXRoIGVxdWFsCisgICBzdGFydCBvZmZzZXRzIHRoZSBzZWN0aW9uIGluZGV4IGlzIHVzZWQuICAqLworc3RhdGljIHZvaWQKK3NvcnRfc2VjdGlvbnMgKEVsZl9TY24gKipzY25zLCBFbGZfU2NuTGlzdCAqbGlzdCkKK3sKKyAgRWxmX1NjbiAqKnNjbnAgPSBzY25zOworICBkbworICAgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IGxpc3QtPmNudDsgKytjbnQpCisgICAgICAqc2NucCsrID0gJmxpc3QtPmRhdGFbY250XTsKKyAgd2hpbGUgKChsaXN0ID0gbGlzdC0+bmV4dCkgIT0gTlVMTCk7CisKKyAgcXNvcnQgKHNjbnMsIHNjbnAgLSBzY25zLCBzaXplb2YgKCpzY25zKSwgY29tcGFyZV9zZWN0aW9ucyk7Cit9CisKKworaW50CitpbnRlcm5hbF9mdW5jdGlvbl9kZWYKK19fZWxmdzIoTElCRUxGQklUUyx1cGRhdGVtbWFwKSAoRWxmICplbGYsIGludCBjaGFuZ2VfYm8sIHNpemVfdCBzaG51bSkKK3sKKyAgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqZWhkcjsKKyAgeGZjdF90IGZjdHA7CisgIGNoYXIgKmxhc3RfcG9zaXRpb247CisKKyAgLyogV2UgbmVlZCB0aGUgRUxGIGhlYWRlciBzZXZlcmFsIHRpbWVzLiAgKi8KKyAgZWhkciA9IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcjsKKworICAvKiBXcml0ZSBvdXQgdGhlIEVMRiBoZWFkZXIuICAqLworICBpZiAoKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcl9mbGFncyB8IGVsZi0+ZmxhZ3MpICYgRUxGX0ZfRElSVFkpCisgICAgeworICAgICAgLyogSWYgdGhlIHR5cGUgc2l6ZXMgc2hvdWxkIGJlIGRpZmZlcmVudCBhdCBzb21lIHRpbWUgd2UgaGF2ZSB0bworCSByZXdyaXRlIHRoaXMgY29kZS4gICovCisgICAgICBhc3NlcnQgKHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxFaGRyKSkKKwkgICAgICA9PSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX0VIRFIsIDEpKTsKKworICAgICAgaWYgKHVubGlrZWx5IChjaGFuZ2VfYm8pKQorCXsKKwkgIC8qIFRvZGF5IHRoZXJlIGlzIG9ubHkgb25lIHZlcnNpb24gb2YgdGhlIEVMRiBoZWFkZXIuICAqLworI2lmIEVWX05VTSAhPSAyCisJICBmY3RwID0gX19lbGZfeGZjdHN0b21bX19saWJlbGZfdmVyc2lvbiAtIDFdW0VWX0NVUlJFTlQgLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW0VMRl9UX0VIRFJdOworI2Vsc2UKKyMgdW5kZWYgZmN0cAorIyBkZWZpbmUgZmN0cCBfX2VsZl94ZmN0c3RvbVswXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtFTEZfVF9FSERSXQorI2VuZGlmCisKKwkgIC8qIERvIHRoZSByZWFsIHdvcmsuICAqLworCSAgKCpmY3RwKSAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0LCBlaGRyLAorCQkgICBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsRWhkcikpLCAxKTsKKwl9CisgICAgICBlbHNlCisJbWVtY3B5IChlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQsIGVoZHIsCisJCXNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxFaGRyKSkpOworCisgICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MgJj0gfkVMRl9GX0RJUlRZOworICAgIH0KKworICAvKiBXcml0ZSBvdXQgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKi8KKyAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciAhPSBOVUxMCisgICAgICAmJiAoKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcl9mbGFncyB8IGVsZi0+ZmxhZ3MpCisJICAmIEVMRl9GX0RJUlRZKSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgdHlwZSBzaXplcyBzaG91bGQgYmUgZGlmZmVyZW50IGF0IHNvbWUgdGltZSB3ZSBoYXZlIHRvCisJIHJld3JpdGUgdGhpcyBjb2RlLiAgKi8KKyAgICAgIGFzc2VydCAoc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKQorCSAgICAgID09IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUEhEUiwgMSkpOworCisgICAgICAvKiBNYXliZSB0aGUgdXNlciB3YW50cyBhIGdhcCBiZXR3ZWVuIHRoZSBFTEYgaGVhZGVyIGFuZCB0aGUgcHJvZ3JhbQorCSBoZWFkZXIuICAqLworICAgICAgaWYgKGVoZHItPmVfcGhvZmYgPiBlaGRyLT5lX2Voc2l6ZSkKKwltZW1zZXQgKGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldCArIGVoZHItPmVfZWhzaXplLAorCQlfX2xpYmVsZl9maWxsX2J5dGUsIGVoZHItPmVfcGhvZmYgLSBlaGRyLT5lX2Voc2l6ZSk7CisKKyAgICAgIGlmICh1bmxpa2VseSAoY2hhbmdlX2JvKSkKKwl7CisJICAvKiBUb2RheSB0aGVyZSBpcyBvbmx5IG9uZSB2ZXJzaW9uIG9mIHRoZSBFTEYgaGVhZGVyLiAgKi8KKyNpZiBFVl9OVU0gIT0gMgorCSAgZmN0cCA9IF9fZWxmX3hmY3RzdG9tW19fbGliZWxmX3ZlcnNpb24gLSAxXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtFTEZfVF9QSERSXTsKKyNlbHNlCisjIHVuZGVmIGZjdHAKKyMgZGVmaW5lIGZjdHAgX19lbGZfeGZjdHN0b21bMF1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bRUxGX1RfUEhEUl0KKyNlbmRpZgorCisJICAvKiBEbyB0aGUgcmVhbCB3b3JrLiAgKi8KKwkgICgqZmN0cCkgKGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldCArIGVoZHItPmVfcGhvZmYsCisJCSAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciwKKwkJICAgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAqIGVoZHItPmVfcGhudW0sIDEpOworCX0KKyAgICAgIGVsc2UKKwltZW1jcHkgKGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldCArIGVoZHItPmVfcGhvZmYsCisJCWVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciwKKwkJc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAqIGVoZHItPmVfcGhudW0pOworCisgICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHJfZmxhZ3MgJj0gfkVMRl9GX0RJUlRZOworICAgIH0KKworICAvKiBGcm9tIG5vdyBvbiB3ZSBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgcG9zaXRpb24gdG8gZXZlbnR1YWxseQorICAgICBmaWxsIHRoZSBnYXBzIHdpdGggdGhlIHByZXNjcmliZWQgZmlsbCBieXRlLiAgKi8KKyAgbGFzdF9wb3NpdGlvbiA9ICgoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQKKwkJICAgKyBNQVggKGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfRUhEUiwgMSksCisJCQkgIGVoZHItPmVfcGhvZmYpCisJCSAgICsgZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9QSERSLCBlaGRyLT5lX3BobnVtKSk7CisKKyAgLyogV3JpdGUgYWxsIHRoZSBzZWN0aW9ucy4gIFdlbGwsIG9ubHkgdGhvc2Ugd2hpY2ggYXJlIG1vZGlmaWVkLiAgKi8KKyAgaWYgKHNobnVtID4gMCkKKyAgICB7CisgICAgICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpzaGRyX2Rlc3Q7CisgICAgICBFbGZfU2NuTGlzdCAqbGlzdCA9ICZlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNjbnM7CisgICAgICBFbGZfU2NuICoqc2NucyA9IChFbGZfU2NuICoqKSBhbGxvY2EgKHNobnVtICogc2l6ZW9mIChFbGZfU2NuICopKTsKKyAgICAgIGNoYXIgKnNoZHJfc3RhcnQgPSAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0CisJCQkgICsgZWhkci0+ZV9zaG9mZik7CisgICAgICBjaGFyICpzaGRyX2VuZCA9IHNoZHJfc3RhcnQgKyBlaGRyLT5lX3NobnVtICogZWhkci0+ZV9zaGVudHNpemU7CisKKyNpZiBFVl9OVU0gIT0gMgorICAgICAgeGZjdF90IHNoZHJfZmN0cCA9IF9fZWxmX3hmY3RzdG9tW19fbGliZWxmX3ZlcnNpb24gLSAxXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtFTEZfVF9TSERSXTsKKyNlbHNlCisjIHVuZGVmIHNoZHJfZmN0cAorIyBkZWZpbmUgc2hkcl9mY3RwIF9fZWxmX3hmY3RzdG9tWzBdW0VWX0NVUlJFTlQgLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW0VMRl9UX1NIRFJdCisjZW5kaWYKKyAgICAgIHNoZHJfZGVzdCA9IChFbGZXMihMSUJFTEZCSVRTLFNoZHIpICopCisJKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldCArIGVoZHItPmVfc2hvZmYpOworCisgICAgICAvKiBHZXQgYWxsIHNlY3Rpb25zIGludG8gdGhlIGFycmF5IGFuZCBzb3J0IHRoZW0uICAqLworICAgICAgc29ydF9zZWN0aW9ucyAoc2NucywgbGlzdCk7CisKKyAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHNlY3Rpb24gaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkKKwkgYXBwZWFyIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCisgICAgICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBzaG51bTsgKytjbnQpCisJeworCSAgRWxmX1NjbiAqc2NuID0gc2Nuc1tjbnRdOworCSAgRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqc2hkcjsKKwkgIGNoYXIgKnNjbl9zdGFydDsKKwkgIEVsZl9EYXRhX0xpc3QgKmRsOworCisJICBzaGRyID0gc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKTsKKworCSAgc2NuX3N0YXJ0ID0gKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MKKwkJICAgICAgICsgZWxmLT5zdGFydF9vZmZzZXQgKyBzaGRyLT5zaF9vZmZzZXQpOworCSAgZGwgPSAmc2NuLT5kYXRhX2xpc3Q7CisKKwkgIGlmIChzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMgJiYgc2NuLT5kYXRhX2xpc3RfcmVhciAhPSBOVUxMKQorCSAgICBkbworCSAgICAgIHsKKwkJaWYgKChzY24tPmZsYWdzIHwgZGwtPmZsYWdzIHwgZWxmLT5mbGFncykgJiBFTEZfRl9ESVJUWSkKKwkJICB7CisJCSAgICBpZiAoc2NuX3N0YXJ0ICsgZGwtPmRhdGEuZC5kX29mZiAhPSBsYXN0X3Bvc2l0aW9uKQorCQkgICAgICB7CisJCQlpZiAoc2NuX3N0YXJ0ICsgZGwtPmRhdGEuZC5kX29mZiA+IGxhc3RfcG9zaXRpb24pCisJCQkgIHsKKwkJCSAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBkYXRhIGJsb2NrcyBmb3IKKwkJCSAgICAgICBhIHNlY3Rpb24gYXJlIG9yZGVyZWQgYnkgb2Zmc2V0LiAgKi8KKwkJCSAgICBzaXplX3Qgd3JpdHRlbiA9IDA7CisKKwkJCSAgICBpZiAobGFzdF9wb3NpdGlvbiA8IHNoZHJfc3RhcnQpCisJCQkgICAgICB7CisJCQkJd3JpdHRlbiA9IE1JTiAoc2NuX3N0YXJ0ICsgZGwtPmRhdGEuZC5kX29mZgorCQkJCQkgICAgICAgLSBsYXN0X3Bvc2l0aW9uLAorCQkJCQkgICAgICAgc2hkcl9zdGFydCAtIGxhc3RfcG9zaXRpb24pOworCisJCQkJbWVtc2V0IChsYXN0X3Bvc2l0aW9uLCBfX2xpYmVsZl9maWxsX2J5dGUsCisJCQkJCXdyaXR0ZW4pOworCQkJICAgICAgfQorCisJCQkgICAgaWYgKGxhc3RfcG9zaXRpb24gKyB3cml0dGVuCisJCQkJIT0gc2NuX3N0YXJ0ICsgZGwtPmRhdGEuZC5kX29mZgorCQkJCSYmIHNoZHJfZW5kIDwgc2NuX3N0YXJ0ICsgZGwtPmRhdGEuZC5kX29mZikKKwkJCSAgICAgIG1lbXNldCAoc2hkcl9lbmQsIF9fbGliZWxmX2ZpbGxfYnl0ZSwKKwkJCQkgICAgICBzY25fc3RhcnQgKyBkbC0+ZGF0YS5kLmRfb2ZmIC0gc2hkcl9lbmQpOworCisJCQkgICAgbGFzdF9wb3NpdGlvbiA9IHNjbl9zdGFydCArIGRsLT5kYXRhLmQuZF9vZmY7CisJCQkgIH0KKwkJICAgICAgfQorCisJCSAgICBpZiAodW5saWtlbHkgKGNoYW5nZV9ibykpCisJCSAgICAgIHsKKyNpZiBFVl9OVU0gIT0gMgorCQkJZmN0cCA9IF9fZWxmX3hmY3RzdG9tW19fbGliZWxmX3ZlcnNpb24gLSAxXVtkbC0+ZGF0YS5kLmRfdmVyc2lvbiAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bZGwtPmRhdGEuZC5kX3R5cGVdOworI2Vsc2UKKyMgdW5kZWYgZmN0cAorCQkJZmN0cCA9IF9fZWxmX3hmY3RzdG9tWzBdWzBdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bZGwtPmRhdGEuZC5kX3R5cGVdOworI2VuZGlmCisKKwkJCS8qIERvIHRoZSByZWFsIHdvcmsuICAqLworCQkJKCpmY3RwKSAobGFzdF9wb3NpdGlvbiwgZGwtPmRhdGEuZC5kX2J1ZiwKKwkJCQkgZGwtPmRhdGEuZC5kX3NpemUsIDEpOworCisJCQlsYXN0X3Bvc2l0aW9uICs9IGRsLT5kYXRhLmQuZF9zaXplOworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIGxhc3RfcG9zaXRpb24gPSBtZW1wY3B5IChsYXN0X3Bvc2l0aW9uLAorCQkJCQkgICAgICAgZGwtPmRhdGEuZC5kX2J1ZiwKKwkJCQkJICAgICAgIGRsLT5kYXRhLmQuZF9zaXplKTsKKwkJICB9CisJCWVsc2UKKwkJICBsYXN0X3Bvc2l0aW9uICs9IGRsLT5kYXRhLmQuZF9zaXplOworCisJCWRsLT5mbGFncyAmPSB+RUxGX0ZfRElSVFk7CisKKwkJZGwgPSBkbC0+bmV4dDsKKwkgICAgICB9CisJICAgIHdoaWxlIChkbCAhPSBOVUxMKTsKKwkgIGVsc2UgaWYgKHNoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUyAmJiBzY24tPmluZGV4ICE9IDApCisJICAgIC8qIFdlIGhhdmUgdG8gdHJ1c3QgdGhlIGV4aXN0aW5nIHNlY3Rpb24gaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KKwkgICAgbGFzdF9wb3NpdGlvbiArPSBzaGRyLT5zaF9zaXplOworCisJICAvKiBXcml0ZSB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaWYgbmVjZXNzYXJ5LiAgKi8KKwkgIGlmICgoc2NuLT5zaGRyX2ZsYWdzIHwgZWxmLT5mbGFncykgJiBFTEZfRl9ESVJUWSkKKwkgICAgeworCSAgICAgIGlmICh1bmxpa2VseSAoY2hhbmdlX2JvKSkKKwkJKCpzaGRyX2ZjdHApICgmc2hkcl9kZXN0W3Njbi0+aW5kZXhdLAorCQkJICAgICAgc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKSwKKwkJCSAgICAgIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSksIDEpOworCSAgICAgIGVsc2UKKwkJbWVtY3B5ICgmc2hkcl9kZXN0W3Njbi0+aW5kZXhdLAorCQkJc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKSwKKwkJCXNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSkpOworCisJICAgICAgc2NuLT5zaGRyX2ZsYWdzICAmPSB+RUxGX0ZfRElSVFk7CisJICAgIH0KKworCSAgc2NuLT5mbGFncyAmPSB+RUxGX0ZfRElSVFk7CisJfQorCisgICAgICAvKiBGaWxsIHRoZSBnYXAgYmV0d2VlbiBsYXN0IHNlY3Rpb24gYW5kIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGlmCisJIG5lY2Vzc2FyeS4gICovCisgICAgICBpZiAoKGVsZi0+ZmxhZ3MgJiBFTEZfRl9ESVJUWSkKKwkgICYmIGxhc3RfcG9zaXRpb24gPCAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0CisJCQkgICAgICAgKyBlaGRyLT5lX3Nob2ZmKSkKKwltZW1zZXQgKGxhc3RfcG9zaXRpb24sIF9fbGliZWxmX2ZpbGxfYnl0ZSwKKwkJKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0ICsgZWhkci0+ZV9zaG9mZgorCQktIGxhc3RfcG9zaXRpb24pOworICAgIH0KKworICAvKiBUaGF0IHdhcyB0aGUgbGFzdCBwYXJ0LiAgQ2xlYXIgdGhlIG92ZXJhbGwgZmxhZy4gICovCisgIGVsZi0+ZmxhZ3MgJj0gfkVMRl9GX0RJUlRZOworCisgIHJldHVybiAwOworfQorCisKKy8qIFNpemUgb2YgdGhlIGJ1ZmZlciB3ZSB1c2UgdG8gZ2VuZXJhdGUgdGhlIGJsb2NrcyBvZiBmaWxsIGJ5dGVzLiAgKi8KKyNkZWZpbmUgRklMTEJVRlNJWkUJNDA5NgorCisvKiBJZiB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlIHNlY3Rpb24gYnVmZmVyIGNvbnRlbnRzIHdlIGhhdmUgdG8gdXNlCisgICB0ZW1wb3JhcnkgYnVmZmVyLiAgT25seSBidWZmZXJzIHVwIHRvIE1BWF9UTVBCVUYgYnl0ZXMgYXJlIGFsbG9jYXRlZAorICAgb24gdGhlIHN0YWNrLiAgKi8KKyNkZWZpbmUgTUFYX1RNUEJVRgkzMjc2OAorCisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byB3cml0ZSBvdXQgZmlsbCBieXRlcy4gICovCitzdGF0aWMgaW50CitmaWxsIChpbnQgZmQsIG9mZl90IHBvcywgc2l6ZV90IGxlbiwgY2hhciAqZmlsbGJ1Ziwgc2l6ZV90ICpmaWxsZWRwKQoreworICBzaXplX3QgZmlsbGVkID0gKmZpbGxlZHA7CisgIHNpemVfdCBmaWxsX2xlbiA9IE1JTiAobGVuLCBGSUxMQlVGU0laRSk7CisKKyAgaWYgKHVubGlrZWx5IChmaWxsX2xlbiA+IGZpbGxlZCkgJiYgZmlsbGVkIDwgRklMTEJVRlNJWkUpCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSBhIGZldyBtb3JlIGJ5dGVzLiAgKi8KKyAgICAgIG1lbXNldCAoZmlsbGJ1ZiArIGZpbGxlZCwgX19saWJlbGZfZmlsbF9ieXRlLCBmaWxsX2xlbiAtIGZpbGxlZCk7CisgICAgICAqZmlsbGVkcCA9IGZpbGxlZCA9IGZpbGxfbGVuOworICAgIH0KKworICBkbworICAgIHsKKyAgICAgIC8qIFRoaXMgbWFueSBieXRlcyB3ZSB3YW50IHRvIHdyaXRlIGluIHRoaXMgcm91bmQuICAqLworICAgICAgc2l6ZV90IG4gPSBNSU4gKGZpbGxlZCwgbGVuKTsKKworICAgICAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSBwd3JpdGUgKGZkLCBmaWxsYnVmLCBuLCBwb3MpICE9IG4pKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUklURV9FUlJPUik7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIHBvcyArPSBuOworICAgICAgbGVuIC09IG47CisgICAgfQorICB3aGlsZSAobGVuID4gMCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworaW50CitpbnRlcm5hbF9mdW5jdGlvbl9kZWYKK19fZWxmdzIoTElCRUxGQklUUyx1cGRhdGVmaWxlKSAoRWxmICplbGYsIGludCBjaGFuZ2VfYm8sIHNpemVfdCBzaG51bSkKK3sKKyAgY2hhciBmaWxsYnVmW0ZJTExCVUZTSVpFXTsKKyAgc2l6ZV90IGZpbGxlZCA9IDA7CisgIHhmY3RfdCBmY3RwOworCisgIC8qIFdlIG5lZWQgdGhlIEVMRiBoZWFkZXIgc2V2ZXJhbCB0aW1lcy4gICovCisgIEVsZlcyKExJQkVMRkJJVFMsRWhkcikgKmVoZHIgPSBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHI7CisKKyAgLyogV3JpdGUgb3V0IHRoZSBFTEYgaGVhZGVyLiAgKi8KKyAgaWYgKChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MgfCBlbGYtPmZsYWdzKSAmIEVMRl9GX0RJUlRZKQorICAgIHsKKyAgICAgIEVsZlcyKExJQkVMRkJJVFMsRWhkcikgdG1wX2VoZHI7CisgICAgICBFbGZXMihMSUJFTEZCSVRTLEVoZHIpICpvdXRfZWhkciA9IGVoZHI7CisKKyAgICAgIC8qIElmIHRoZSB0eXBlIHNpemVzIHNob3VsZCBiZSBkaWZmZXJlbnQgYXQgc29tZSB0aW1lIHdlIGhhdmUgdG8KKwkgcmV3cml0ZSB0aGlzIGNvZGUuICAqLworICAgICAgYXNzZXJ0IChzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsRWhkcikpCisJICAgICAgPT0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9FSERSLCAxKSk7CisKKyAgICAgIGlmICh1bmxpa2VseSAoY2hhbmdlX2JvKSkKKwl7CisJICAvKiBUb2RheSB0aGVyZSBpcyBvbmx5IG9uZSB2ZXJzaW9uIG9mIHRoZSBFTEYgaGVhZGVyLiAgKi8KKyNpZiBFVl9OVU0gIT0gMgorCSAgZmN0cCA9IF9fZWxmX3hmY3RzdG9tW19fbGliZWxmX3ZlcnNpb24gLSAxXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtFTEZfVF9FSERSXTsKKyNlbHNlCisjIHVuZGVmIGZjdHAKKyMgZGVmaW5lIGZjdHAgX19lbGZfeGZjdHN0b21bMF1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bRUxGX1RfRUhEUl0KKyNlbmRpZgorCisJICAvKiBXcml0ZSB0aGUgY29udmVydGVkIEVMRiBoZWFkZXIgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyLiAgKi8KKwkgICgqZmN0cCkgKCZ0bXBfZWhkciwgZWhkciwgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLEVoZHIpKSwgMSk7CisKKwkgIC8qIFRoaXMgaXMgdGhlIGJ1ZmZlciB3ZSB3YW50IHRvIHdyaXRlLiAgKi8KKwkgIG91dF9laGRyID0gJnRtcF9laGRyOworCX0KKworICAgICAgLyogV3JpdGUgb3V0IHRoZSBFTEYgaGVhZGVyLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAocHdyaXRlIChlbGYtPmZpbGRlcywgb3V0X2VoZHIsCisJCQkgICAgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLEVoZHIpKSwgMCkKKwkJICAgICE9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxFaGRyKSkpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUklURV9FUlJPUik7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcl9mbGFncyAmPSB+RUxGX0ZfRElSVFk7CisgICAgfQorCisgIC8qIElmIHRoZSB0eXBlIHNpemVzIHNob3VsZCBiZSBkaWZmZXJlbnQgYXQgc29tZSB0aW1lIHdlIGhhdmUgdG8KKyAgICAgcmV3cml0ZSB0aGlzIGNvZGUuICAqLworICBhc3NlcnQgKHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSkKKwkgID09IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUEhEUiwgMSkpOworCisgIC8qIFdyaXRlIG91dCB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUuICAqLworICBpZiAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyICE9IE5VTEwKKyAgICAgICYmICgoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyX2ZsYWdzIHwgZWxmLT5mbGFncykKKwkgICYgRUxGX0ZfRElSVFkpKQorICAgIHsKKyAgICAgIEVsZlcyKExJQkVMRkJJVFMsUGhkcikgKnRtcF9waGRyID0gTlVMTDsKKyAgICAgIEVsZlcyKExJQkVMRkJJVFMsUGhkcikgKm91dF9waGRyID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyOworCisgICAgICAvKiBNYXliZSB0aGUgdXNlciB3YW50cyBhIGdhcCBiZXR3ZWVuIHRoZSBFTEYgaGVhZGVyIGFuZCB0aGUgcHJvZ3JhbQorCSBoZWFkZXIuICAqLworICAgICAgaWYgKGVoZHItPmVfcGhvZmYgPiBlaGRyLT5lX2Voc2l6ZQorCSAgJiYgdW5saWtlbHkgKGZpbGwgKGVsZi0+ZmlsZGVzLCBlaGRyLT5lX2Voc2l6ZSwKKwkJCSAgICAgZWhkci0+ZV9waG9mZiAtIGVoZHItPmVfZWhzaXplLCBmaWxsYnVmLCAmZmlsbGVkKQorCQkgICAgICAgIT0gMCkpCisJcmV0dXJuIDE7CisKKyAgICAgIGlmICh1bmxpa2VseSAoY2hhbmdlX2JvKSkKKwl7CisJICAvKiBUb2RheSB0aGVyZSBpcyBvbmx5IG9uZSB2ZXJzaW9uIG9mIHRoZSBFTEYgaGVhZGVyLiAgKi8KKyNpZiBFVl9OVU0gIT0gMgorCSAgZmN0cCA9IF9fZWxmX3hmY3RzdG9tW19fbGliZWxmX3ZlcnNpb24gLSAxXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtFTEZfVF9QSERSXTsKKyNlbHNlCisjIHVuZGVmIGZjdHAKKyMgZGVmaW5lIGZjdHAgX19lbGZfeGZjdHN0b21bMF1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bRUxGX1RfUEhEUl0KKyNlbmRpZgorCisJICAvKiBBbGxvY2F0ZSBzdWZmaWNpZW50IG1lbW9yeS4gICovCisJICB0bXBfcGhkciA9IChFbGZXMihMSUJFTEZCSVRTLFBoZHIpICopCisJICAgIG1hbGxvYyAoc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAqIGVoZHItPmVfcGhudW0pOworCSAgaWYgKHRtcF9waGRyID09IE5VTEwpCisJICAgIHsKKwkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisKKwkgIC8qIFdyaXRlIHRoZSBjb252ZXJ0ZWQgRUxGIGhlYWRlciBpbiBhIHRlbXBvcmFyeSBidWZmZXIuICAqLworCSAgKCpmY3RwKSAodG1wX3BoZHIsIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciwKKwkJICAgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAqIGVoZHItPmVfcGhudW0sIDEpOworCisJICAvKiBUaGlzIGlzIHRoZSBidWZmZXIgd2Ugd2FudCB0byB3cml0ZS4gICovCisJICBvdXRfcGhkciA9IHRtcF9waGRyOworCX0KKworICAgICAgLyogV3JpdGUgb3V0IHRoZSBFTEYgaGVhZGVyLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoKHNpemVfdCkgcHdyaXRlIChlbGYtPmZpbGRlcywgb3V0X3BoZHIsCisJCQkJICAgICBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsUGhkcikpCisJCQkJICAgICAqIGVoZHItPmVfcGhudW0sIGVoZHItPmVfcGhvZmYpCisJCSAgICAhPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsUGhkcikpICogZWhkci0+ZV9waG51bSkpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1dSSVRFX0VSUk9SKTsKKwkgIHJldHVybiAxOworCX0KKworICAgICAgLyogVGhpcyBpcyBhIG5vLW9wIHdlIHdlIGhhdmUgbm90IGFsbG9jYXRlZCBhbnkgbWVtb3J5LiAgKi8KKyAgICAgIGZyZWUgKHRtcF9waGRyKTsKKworICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyX2ZsYWdzICY9IH5FTEZfRl9ESVJUWTsKKyAgICB9CisKKyAgLyogRnJvbSBub3cgb24gd2UgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHBvc2l0aW9uIHRvIGV2ZW50dWFsbHkKKyAgICAgZmlsbCB0aGUgZ2FwcyB3aXRoIHRoZSBwcmVzY3JpYmVkIGZpbGwgYnl0ZS4gICovCisgIG9mZl90IGxhc3Rfb2Zmc2V0OworICBpZiAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyID09IE5VTEwpCisgICAgbGFzdF9vZmZzZXQgPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX0VIRFIsIDEpOworICBlbHNlCisgICAgbGFzdF9vZmZzZXQgPSAoZWhkci0+ZV9waG9mZgorCQkgICArIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSkgKiBlaGRyLT5lX3BobnVtKTsKKworICAvKiBXcml0ZSBhbGwgdGhlIHNlY3Rpb25zLiAgV2VsbCwgb25seSB0aG9zZSB3aGljaCBhcmUgbW9kaWZpZWQuICAqLworICBpZiAoc2hudW0gPiAwKQorICAgIHsKKyAgICAgIG9mZl90IHNoZHJfb2Zmc2V0ID0gZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Nob2ZmOworI2lmIEVWX05VTSAhPSAyCisgICAgICB4ZmN0X3Qgc2hkcl9mY3RwID0gX19lbGZfeGZjdHN0b21bX19saWJlbGZfdmVyc2lvbiAtIDFdW0VWX0NVUlJFTlQgLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW0VMRl9UX1NIRFJdOworI2Vsc2UKKyMgdW5kZWYgc2hkcl9mY3RwCisjIGRlZmluZSBzaGRyX2ZjdHAgX19lbGZfeGZjdHN0b21bMF1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bRUxGX1RfU0hEUl0KKyNlbmRpZgorCisgICAgICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpzaGRyX2RhdGE7CisgICAgICBpZiAoY2hhbmdlX2JvIHx8IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuc2hkciA9PSBOVUxMKQorCXNoZHJfZGF0YSA9IChFbGZXMihMSUJFTEZCSVRTLFNoZHIpICopCisJICBhbGxvY2EgKHNobnVtICogc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFNoZHIpKSk7CisgICAgICBlbHNlCisJc2hkcl9kYXRhID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyOworICAgICAgaW50IHNoZHJfZmxhZ3MgPSBlbGYtPmZsYWdzOworCisgICAgICAvKiBHZXQgYWxsIHNlY3Rpb25zIGludG8gdGhlIGFycmF5IGFuZCBzb3J0IHRoZW0uICAqLworICAgICAgRWxmX1Njbkxpc3QgKmxpc3QgPSAmZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zOworICAgICAgRWxmX1NjbiAqKnNjbnMgPSAoRWxmX1NjbiAqKikgYWxsb2NhIChzaG51bSAqIHNpemVvZiAoRWxmX1NjbiAqKSk7CisgICAgICBzb3J0X3NlY3Rpb25zIChzY25zLCBsaXN0KTsKKworICAgICAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2hudW07ICsrY250KQorCXsKKwkgIEVsZl9TY24gKnNjbiA9IHNjbnNbY250XTsKKworCSAgRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqc2hkciA9IHNjbi0+c2hkci5FTEZXKGUsTElCRUxGQklUUyk7CisKKwkgIG9mZl90IHNjbl9zdGFydCA9IGVsZi0+c3RhcnRfb2Zmc2V0ICsgc2hkci0+c2hfb2Zmc2V0OworCSAgRWxmX0RhdGFfTGlzdCAqZGwgPSAmc2NuLT5kYXRhX2xpc3Q7CisKKwkgIGlmIChzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMgJiYgc2NuLT5kYXRhX2xpc3RfcmVhciAhPSBOVUxMCisJICAgICAgJiYgc2NuLT5pbmRleCAhPSAwKQorCSAgICBkbworCSAgICAgIHsKKwkJaWYgKChzY24tPmZsYWdzIHwgZGwtPmZsYWdzIHwgZWxmLT5mbGFncykgJiBFTEZfRl9ESVJUWSkKKwkJICB7CisJCSAgICBjaGFyIHRtcGJ1ZltNQVhfVE1QQlVGXTsKKwkJICAgIHZvaWQgKmJ1ZiA9IGRsLT5kYXRhLmQuZF9idWY7CisKKwkJICAgIGlmIChzY25fc3RhcnQgKyBkbC0+ZGF0YS5kLmRfb2ZmICE9IGxhc3Rfb2Zmc2V0KQorCQkgICAgICB7CisJCQlhc3NlcnQgKGxhc3Rfb2Zmc2V0IDwgc2NuX3N0YXJ0ICsgZGwtPmRhdGEuZC5kX29mZik7CisKKwkJCWlmICh1bmxpa2VseSAoZmlsbCAoZWxmLT5maWxkZXMsIGxhc3Rfb2Zmc2V0LAorCQkJCQkgICAgKHNjbl9zdGFydCArIGRsLT5kYXRhLmQuZF9vZmYpCisJCQkJCSAgICAtIGxhc3Rfb2Zmc2V0LCBmaWxsYnVmLAorCQkJCQkgICAgJmZpbGxlZCkgIT0gMCkpCisJCQkgIHJldHVybiAxOworCisJCQlsYXN0X29mZnNldCA9IHNjbl9zdGFydCArIGRsLT5kYXRhLmQuZF9vZmY7CisJCSAgICAgIH0KKworCQkgICAgaWYgKHVubGlrZWx5IChjaGFuZ2VfYm8pKQorCQkgICAgICB7CisjaWYgRVZfTlVNICE9IDIKKwkJCWZjdHAgPSBfX2VsZl94ZmN0c3RvbVtfX2xpYmVsZl92ZXJzaW9uIC0gMV1bZGwtPmRhdGEuZC5kX3ZlcnNpb24gLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW2RsLT5kYXRhLmQuZF90eXBlXTsKKyNlbHNlCisjIHVuZGVmIGZjdHAKKwkJCWZjdHAgPSBfX2VsZl94ZmN0c3RvbVswXVswXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW2RsLT5kYXRhLmQuZF90eXBlXTsKKyNlbmRpZgorCisJCQlidWYgPSB0bXBidWY7CisJCQlpZiAoZGwtPmRhdGEuZC5kX3NpemUgPiBNQVhfVE1QQlVGKQorCQkJICB7CisJCQkgICAgYnVmID0gbWFsbG9jIChkbC0+ZGF0YS5kLmRfc2l6ZSk7CisJCQkgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCQkJICAgICAgeworCQkJCV9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7CisJCQkJcmV0dXJuIDE7CisJCQkgICAgICB9CisJCQkgIH0KKworCQkJLyogRG8gdGhlIHJlYWwgd29yay4gICovCisJCQkoKmZjdHApIChidWYsIGRsLT5kYXRhLmQuZF9idWYsIGRsLT5kYXRhLmQuZF9zaXplLCAxKTsKKwkJICAgICAgfQorCisJCSAgICBpZiAodW5saWtlbHkgKChzaXplX3QpIHB3cml0ZSAoZWxmLT5maWxkZXMsIGJ1ZiwKKwkJCQkJCSAgIGRsLT5kYXRhLmQuZF9zaXplLAorCQkJCQkJICAgbGFzdF9vZmZzZXQpCisJCQkJICAhPSBkbC0+ZGF0YS5kLmRfc2l6ZSkpCisJCSAgICAgIHsKKwkJCWlmIChidWYgIT0gZGwtPmRhdGEuZC5kX2J1ZiAmJiBidWYgIT0gdG1wYnVmKQorCQkJICBmcmVlIChidWYpOworCisJCQlfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JJVEVfRVJST1IpOworCQkJcmV0dXJuIDE7CisJCSAgICAgIH0KKworCQkgICAgaWYgKGJ1ZiAhPSBkbC0+ZGF0YS5kLmRfYnVmICYmIGJ1ZiAhPSB0bXBidWYpCisJCSAgICAgIGZyZWUgKGJ1Zik7CisJCSAgfQorCisJCWxhc3Rfb2Zmc2V0ICs9IGRsLT5kYXRhLmQuZF9zaXplOworCisJCWRsLT5mbGFncyAmPSB+RUxGX0ZfRElSVFk7CisKKwkJZGwgPSBkbC0+bmV4dDsKKwkgICAgICB9CisJICAgIHdoaWxlIChkbCAhPSBOVUxMKTsKKwkgIGVsc2UgaWYgKHNoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUyAmJiBzY24tPmluZGV4ICE9IDApCisJICAgIGxhc3Rfb2Zmc2V0ID0gc2NuX3N0YXJ0ICsgc2hkci0+c2hfc2l6ZTsKKworCSAgLyogQ29sbGVjdCB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW5mb3JtYXRpb24uICAqLworCSAgaWYgKHVubGlrZWx5IChjaGFuZ2VfYm8pKQorCSAgICAoKnNoZHJfZmN0cCkgKCZzaGRyX2RhdGFbc2NuLT5pbmRleF0sCisJCQkgIHNjbi0+c2hkci5FTEZXKGUsTElCRUxGQklUUyksCisJCQkgIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSksIDEpOworCSAgZWxzZSBpZiAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyID09IE5VTEwpCisJICAgIG1lbWNweSAoJnNoZHJfZGF0YVtzY24tPmluZGV4XSwgc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKSwKKwkJICAgIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSkpOworCisJICBzaGRyX2ZsYWdzIHw9IHNjbi0+c2hkcl9mbGFnczsKKwkgIHNjbi0+c2hkcl9mbGFncyAgJj0gfkVMRl9GX0RJUlRZOworCX0KKworICAgICAgLyogRmlsbCB0aGUgZ2FwIGJldHdlZW4gbGFzdCBzZWN0aW9uIGFuZCBzZWN0aW9uIGhlYWRlciB0YWJsZSBpZgorCSBuZWNlc3NhcnkuICAqLworICAgICAgaWYgKChlbGYtPmZsYWdzICYgRUxGX0ZfRElSVFkpICYmIGxhc3Rfb2Zmc2V0IDwgc2hkcl9vZmZzZXQKKwkgICYmIHVubGlrZWx5IChmaWxsIChlbGYtPmZpbGRlcywgbGFzdF9vZmZzZXQsCisJCQkgICAgIHNoZHJfb2Zmc2V0IC0gbGFzdF9vZmZzZXQsCisJCQkgICAgIGZpbGxidWYsICZmaWxsZWQpICE9IDApKQorCXJldHVybiAxOworCisgICAgICAvKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlLiAgKi8KKyAgICAgIGlmIChzaGRyX2ZsYWdzICYgRUxGX0ZfRElSVFkKKwkgICYmIHVubGlrZWx5ICgoc2l6ZV90KSBwd3JpdGUgKGVsZi0+ZmlsZGVzLCBzaGRyX2RhdGEsCisJCQkJCXNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSkKKwkJCQkJKiBzaG51bSwgc2hkcl9vZmZzZXQpCisJCSAgICAgICAhPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsU2hkcikpICogc2hudW0pKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUklURV9FUlJPUik7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgIC8qIFRoYXQgd2FzIHRoZSBsYXN0IHBhcnQuICBDbGVhciB0aGUgb3ZlcmFsbCBmbGFnLiAgKi8KKyAgZWxmLT5mbGFncyAmPSB+RUxGX0ZfRElSVFk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZWxmMzJfdXBkYXRlbnVsbC5jIGIvbGliZWxmL2VsZjMyX3VwZGF0ZW51bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDcyNDJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZjMyX3VwZGF0ZW51bGwuYwpAQCAtMCwwICsxLDM4NCBAQAorLyogVXBkYXRlIGRhdGEgc3RydWN0dXJlcyBmb3IgY2hhbmdlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKyNpbmNsdWRlICJlbGYta25vd2xlZGdlLmgiCisKKyNpZm5kZWYgTElCRUxGQklUUworIyBkZWZpbmUgTElCRUxGQklUUyAzMgorI2VuZGlmCisKKworCitzdGF0aWMgaW50CitFTEZXKGRlZmF1bHRfZWhkcixMSUJFTEZCSVRTKSAoRWxmICplbGYsIEVsZlcyKExJQkVMRkJJVFMsRWhkcikgKmVoZHIsCisJCQkgICAgICAgc2l6ZV90IHNobnVtLCBpbnQgKmNoYW5nZV9ib3ApCit7CisgIC8qIEFsd2F5cyB3cml0ZSB0aGUgbWFnaWMgYnl0ZXMuICAqLworICBpZiAobWVtY21wICgmZWhkci0+ZV9pZGVudFtFSV9NQUcwXSwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwKQorICAgIHsKKyAgICAgIG1lbWNweSAoJmVoZHItPmVfaWRlbnRbRUlfTUFHMF0sIEVMRk1BRywgU0VMRk1BRyk7CisgICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MgfD0gRUxGX0ZfRElSVFk7CisgICAgfQorCisgIC8qIEFsd2F5cyBzZXQgdGhlIGZpbGUgY2xhc3MuICAqLworICB1cGRhdGVfaWZfY2hhbmdlZCAoZWhkci0+ZV9pZGVudFtFSV9DTEFTU10sIEVMRlcoRUxGQ0xBU1MsTElCRUxGQklUUyksCisJCSAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX2ZsYWdzKTsKKworICAvKiBTZXQgdGhlIGRhdGEgZW5jb2RpbmcgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgaWYgKHVubGlrZWx5IChlaGRyLT5lX2lkZW50W0VJX0RBVEFdID09IEVMRkRBVEFOT05FKSkKKyAgICB7CisgICAgICBlaGRyLT5lX2lkZW50W0VJX0RBVEFdID0KKwlCWVRFX09SREVSID09IEJJR19FTkRJQU4gPyBFTEZEQVRBMk1TQiA6IEVMRkRBVEEyTFNCOworICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX2ZsYWdzIHw9IEVMRl9GX0RJUlRZOworICAgIH0KKyAgZWxzZSBpZiAodW5saWtlbHkgKGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPj0gRUxGREFUQU5VTSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RBVEFfRU5DT0RJTkcpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgKmNoYW5nZV9ib3AgPSAoKEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorCQkgICAgJiYgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSAhPSBFTEZEQVRBMkxTQikKKwkJICAgfHwgKEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorCQkgICAgICAgJiYgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSAhPSBFTEZEQVRBMk1TQikpOworCisgIC8qIFVuY29uZGl0aW9uYWxseSBvdmVyd3JpdGUgdGhlIEVMRiB2ZXJzaW9uLiAgKi8KKyAgdXBkYXRlX2lmX2NoYW5nZWQgKGVoZHItPmVfaWRlbnRbRUlfVkVSU0lPTl0sIEVWX0NVUlJFTlQsCisJCSAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX2ZsYWdzKTsKKworICBpZiAodW5saWtlbHkgKGVoZHItPmVfdmVyc2lvbiA9PSBFVl9OT05FKQorICAgICAgfHwgdW5saWtlbHkgKGVoZHItPmVfdmVyc2lvbiA+PSBFVl9OVU0pKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9VTktOT1dOX1ZFUlNJT04pOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGlmICh1bmxpa2VseSAoc2hudW0gPj0gU0hOX0xPUkVTRVJWRSkpCisgICAgeworICAgICAgdXBkYXRlX2lmX2NoYW5nZWQgKGVoZHItPmVfc2hudW0sIDAsCisJCQkgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX2ZsYWdzKTsKKyAgICB9CisgIGVsc2UKKyAgICB1cGRhdGVfaWZfY2hhbmdlZCAoZWhkci0+ZV9zaG51bSwgc2hudW0sCisJCSAgICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MpOworCisgIGlmICh1bmxpa2VseSAoZWhkci0+ZV9laHNpemUgIT0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9FSERSLCAxKSkpCisgICAgeworICAgICAgZWhkci0+ZV9laHNpemUgPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX0VIRFIsIDEpOworICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX2ZsYWdzIHw9IEVMRl9GX0RJUlRZOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworCitvZmZfdAoraW50ZXJuYWxfZnVuY3Rpb25fZGVmCitfX2VsZncyKExJQkVMRkJJVFMsdXBkYXRlbnVsbCkgKEVsZiAqZWxmLCBpbnQgKmNoYW5nZV9ib3AsIHNpemVfdCBzaG51bSkKK3sKKyAgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqZWhkciA9IElOVFVTRShlbGZ3MihMSUJFTEZCSVRTLGdldGVoZHIpKSAoZWxmKTsKKyAgaW50IGNoYW5nZWQgPSAwOworICBpbnQgZWhkcl9mbGFncyA9IDA7CisKKyAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlcy4gICovCisgIGlmIChFTEZXKGRlZmF1bHRfZWhkcixMSUJFTEZCSVRTKSAoZWxmLCBlaGRyLCBzaG51bSwgY2hhbmdlX2JvcCkgIT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogQXQgbGVhc3QgdGhlIEVMRiBoZWFkZXIgaXMgdGhlcmUuICAqLworICBvZmZfdCBzaXplID0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9FSERSLCAxKTsKKworICAvKiBTZXQgdGhlIHByb2dyYW0gaGVhZGVyIHBvc2l0aW9uLiAgKi8KKyAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciA9PSBOVUxMCisgICAgICAmJiAoZWhkci0+ZV90eXBlID09IEVUX0VYRUMgfHwgZWhkci0+ZV90eXBlID09IEVUX0RZTikpCisgICAgKHZvaWQpIElOVFVTRShlbGZ3MihMSUJFTEZCSVRTLGdldHBoZHIpKSAoZWxmKTsKKyAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE9ubHkgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgaGF2ZSBhIHByb2dyYW0gaGVhZGVyLiAgKi8KKyAgICAgIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiB1bmxpa2VseSAoZWhkci0+ZV90eXBlICE9IEVUX0RZTikpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfUEhEUik7CisJICByZXR1cm4gLTE7CisJfQorCisgICAgICBpZiAoZWxmLT5mbGFncyAmIEVMRl9GX0xBWU9VVCkKKwl7CisJICAvKiBUaGUgdXNlciBpcyBzdXBwb3NlZCB0byBmaWxsIG91dCBlX3Bob2ZmLiAgVXNlIGl0IGFuZAorCSAgICAgZV9waG51bSB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0gZXh0ZW5kLiAgKi8KKwkgIHNpemUgPSBNQVggKChzaXplX3QpIHNpemUsCisJCSAgICAgIGVoZHItPmVfcGhvZmYKKwkJICAgICAgKyBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1BIRFIsIGVoZHItPmVfcGhudW0pKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdXBkYXRlX2lmX2NoYW5nZWQgKGVoZHItPmVfcGhvZmYsCisJCQkgICAgIGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfRUhEUiwgMSksCisJCQkgICAgIGVoZHJfZmxhZ3MpOworCisJICAvKiBXZSBuZWVkIG5vIGFsaWdubWVudCBoZXJlLiAgKi8KKwkgIHNpemUgKz0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9QSERSLCBlaGRyLT5lX3BobnVtKTsKKwl9CisgICAgfQorCisgIGlmIChzaG51bSA+IDApCisgICAgeworICAgICAgRWxmX1Njbkxpc3QgKmxpc3Q7CisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAgICAgYXNzZXJ0IChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNjbnMuY250ID4gMCk7CisKKyAgICAgIGlmIChzaG51bSA+PSBTSE5fTE9SRVNFUlZFKQorCXsKKwkgIC8qIFdlIGhhdmUgdG8gIGZpbGwgaW4gdGhlIG51bWJlciBvZiBzZWN0aW9ucyBpbiB0aGUgaGVhZGVyCisJICAgICBvZiB0aGUgemVyb3RoIHNlY3Rpb24uICAqLworCSAgRWxmX1NjbiAqc2NuMCA9ICZlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNjbnMuZGF0YVswXTsKKworCSAgdXBkYXRlX2lmX2NoYW5nZWQgKHNjbjAtPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLT5zaF9zaXplLAorCQkJICAgICBzaG51bSwgc2NuMC0+c2hkcl9mbGFncyk7CisJfQorCisgICAgICAvKiBHbyBvdmVyIGFsbCBzZWN0aW9ucyBhbmQgZmluZCBvdXQgaG93IGxhcmdlIHRoZXkgYXJlLiAgKi8KKyAgICAgIGxpc3QgPSAmZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zOworCisgICAgICAvKiBMb2FkIHRoZSBzZWN0aW9uIGhlYWRlcnMgaWYgbmVjZXNzYXJ5LiAgVGhpcyBsb2FkcyB0aGUKKwkgaGVhZGVycyBmb3IgYWxsIHNlY3Rpb25zLiAgKi8KKyAgICAgIGlmIChsaXN0LT5kYXRhWzFdLnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpID09IE5VTEwpCisJKHZvaWQpIElOVFVTRShlbGZ3MihMSUJFTEZCSVRTLGdldHNoZHIpKSAoJmxpc3QtPmRhdGFbMV0pOworCisgICAgICBkbworCXsKKwkgIGZvciAoc2l6ZV90IGNudCA9IGZpcnN0ID09IHRydWU7IGNudCA8IGxpc3QtPmNudDsgKytjbnQpCisJICAgIHsKKwkgICAgICBFbGZfU2NuICpzY24gPSAmbGlzdC0+ZGF0YVtjbnRdOworCSAgICAgIEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKnNoZHIgPSBzY24tPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpOworCSAgICAgIG9mZl90IG9mZnNldCA9IDA7CisKKwkgICAgICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisJICAgICAgRWxmVzIoTElCRUxGQklUUyxXb3JkKSBzaF9lbnRzaXplID0gc2hkci0+c2hfZW50c2l6ZTsKKwkgICAgICBFbGZXMihMSUJFTEZCSVRTLFdvcmQpIHNoX2FsaWduID0gc2hkci0+c2hfYWRkcmFsaWduID86IDE7CisKKwkgICAgICAvKiBTZXQgdGhlIHNoX2VudHNpemUgdmFsdWUgaWYgd2UgY2FuIHJlbGlhYmx5IGRldGVjdCBpdC4gICovCisJICAgICAgc3dpdGNoIChzaGRyLT5zaF90eXBlKQorCQl7CisJCWNhc2UgU0hUX1NZTVRBQjoKKwkJICBzaF9lbnRzaXplID0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9TWU0sIDEpOworCQkgIGJyZWFrOworCQljYXNlIFNIVF9SRUxBOgorCQkgIHNoX2VudHNpemUgPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1JFTEEsIDEpOworCQkgIGJyZWFrOworCQljYXNlIFNIVF9HUk9VUDoKKwkJICAvKiBPbmx5IHJlbG9jYXRhYmxlIGZpbGVzIGNhbiBjb250YWluIHNlY3Rpb24gZ3JvdXBzLiAgKi8KKwkJICBpZiAoZWhkci0+ZV90eXBlICE9IEVUX1JFTCkKKwkJICAgIHsKKwkJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0dST1VQX05PVF9SRUwpOworCQkgICAgICByZXR1cm4gLTE7CisJCSAgICB9CisJCSAgLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBTSFRfU1lNVEFCX1NITkRYOgorCQkgIHNoX2VudHNpemUgPSBlbGZfdHlwZXNpemUgKDMyLCBFTEZfVF9XT1JELCAxKTsKKwkJICBicmVhazsKKwkJY2FzZSBTSFRfSEFTSDoKKwkJICBzaF9lbnRzaXplID0gU0hfRU5UU0laRV9IQVNIIChlaGRyKTsKKwkJICBicmVhazsKKwkJY2FzZSBTSFRfRFlOQU1JQzoKKwkJICBzaF9lbnRzaXplID0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9EWU4sIDEpOworCQkgIGJyZWFrOworCQljYXNlIFNIVF9SRUw6CisJCSAgc2hfZW50c2l6ZSA9IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUkVMLCAxKTsKKwkJICBicmVhazsKKwkJY2FzZSBTSFRfRFlOU1lNOgorCQkgIHNoX2VudHNpemUgPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1NZTSwgMSk7CisJCSAgYnJlYWs7CisJCWNhc2UgU0hUX1NVTldfbW92ZToKKwkJICBzaF9lbnRzaXplID0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9NT1ZFLCAxKTsKKwkJICBicmVhazsKKwkJY2FzZSBTSFRfU1VOV19zeW1pbmZvOgorCQkgIHNoX2VudHNpemUgPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1NZTUlORk8sIDEpOworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIGJyZWFrOworCQl9CisKKwkgICAgICAvKiBJZiB0aGUgc2VjdGlvbiBoZWFkZXIgY29udGFpbmVkIHRoZSB3cm9uZyBlbnRyeSBzaXplCisJCSBjb3JyZWN0IGl0IGFuZCBtYXJrIHRoZSBoZWFkZXIgYXMgbW9kaWZpZWQuICAqLworCSAgICAgIHVwZGF0ZV9pZl9jaGFuZ2VkIChzaGRyLT5zaF9lbnRzaXplLCBzaF9lbnRzaXplLAorCQkJCSBzY24tPnNoZHJfZmxhZ3MpOworCisJICAgICAgaWYgKHNjbi0+ZGF0YV9yZWFkID09IDAgJiYgX19saWJlbGZfc2V0X3Jhd2RhdGEgKHNjbikgIT0gMCkKKwkJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICBUaGUgZXJyb3IgdmFsdWUgaXMgYWxyZWFkeSBzZXQuICAqLworCQlyZXR1cm4gLTE7CisKKwkgICAgICAvKiBJdGVyYXRlIG92ZXIgYWxsIGRhdGEgYmxvY2tzLiAgKi8KKwkgICAgICBpZiAobGlzdC0+ZGF0YVtjbnRdLmRhdGFfbGlzdF9yZWFyICE9IE5VTEwpCisJCXsKKwkJICBFbGZfRGF0YV9MaXN0ICpkbCA9ICZzY24tPmRhdGFfbGlzdDsKKworCQkgIHdoaWxlIChkbCAhPSBOVUxMKQorCQkgICAgeworCQkgICAgICBFbGZfRGF0YSAqZGF0YSA9ICZkbC0+ZGF0YS5kOworCQkgICAgICBpZiAoZGwgPT0gJnNjbi0+ZGF0YV9saXN0ICYmIGRhdGEtPmRfYnVmID09IE5VTEwKKwkJCSAgJiYgc2NuLT5yYXdkYXRhLmQuZF9idWYgIT0gTlVMTCkKKwkJCWRhdGEgPSAmc2NuLT5yYXdkYXRhLmQ7CisKKwkJICAgICAgaWYgKHVubGlrZWx5IChkYXRhLT5kX3ZlcnNpb24gPT0gRVZfTk9ORSkKKwkJCSAgfHwgdW5saWtlbHkgKGRhdGEtPmRfdmVyc2lvbiA+PSBFVl9OVU0pKQorCQkJeworCQkJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfVU5LTk9XTl9WRVJTSU9OKTsKKwkJCSAgcmV0dXJuIC0xOworCQkJfQorCisJCSAgICAgIGlmICh1bmxpa2VseSAoISBwb3dlcm9mMiAoZGF0YS0+ZF9hbGlnbikpKQorCQkJeworCQkJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9BTElHTik7CisJCQkgIHJldHVybiAtMTsKKwkJCX0KKworCQkgICAgICBzaF9hbGlnbiA9IE1BWCAoc2hfYWxpZ24sIGRhdGEtPmRfYWxpZ24pOworCisJCSAgICAgIGlmIChlbGYtPmZsYWdzICYgRUxGX0ZfTEFZT1VUKQorCQkJeworCQkJICAvKiBUaGUgdXNlciBzcGVjaWZpZWQgdGhlIG9mZnNldCBhbmQgdGhlIHNpemUuCisJCQkgICAgIEFsbCB3ZSBoYXZlIHRvIGRvIGlzIGNoZWNrIHdoZXRoZXIgdGhpcyBibG9jaworCQkJICAgICBmaXRzIGluIHRoZSBzaXplIHNwZWNpZmllZCBmb3IgdGhlIHNlY3Rpb24uICAqLworCQkJICBpZiAodW5saWtlbHkgKChHRWxmX1dvcmQpIChkYXRhLT5kX29mZgorCQkJCQkJICAgICArIGRhdGEtPmRfc2l6ZSkKKwkJCQkJPiBzaGRyLT5zaF9zaXplKSkKKwkJCSAgICB7CisJCQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfU0VDVElPTl9UT09fU01BTEwpOworCQkJICAgICAgcmV0dXJuIC0xOworCQkJICAgIH0KKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICAvKiBEZXRlcm1pbmUgdGhlIHBhZGRpbmcuICAqLworCQkJICBvZmZzZXQgPSAoKG9mZnNldCArIGRhdGEtPmRfYWxpZ24gLSAxKQorCQkJCSAgICAmIH4oZGF0YS0+ZF9hbGlnbiAtIDEpKTsKKworCQkJICB1cGRhdGVfaWZfY2hhbmdlZCAoZGF0YS0+ZF9vZmYsIG9mZnNldCwgY2hhbmdlZCk7CisKKwkJCSAgb2Zmc2V0ICs9IGRhdGEtPmRfc2l6ZTsKKwkJCX0KKworCQkgICAgICAvKiBOZXh0IGRhdGEgYmxvY2suICAqLworCQkgICAgICBkbCA9IGRsLT5uZXh0OworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gZnJvbSB0aGUgcmF3IGRhdGEuICBJZgorCQkgICBub25lIGlzIGF2YWlsYWJsZSB0aGUgdmFsdWUgaXMgemVyby4gICovCisJCW9mZnNldCArPSBzY24tPnJhd2RhdGEuZC5kX3NpemU7CisKKwkgICAgICBpZiAoZWxmLT5mbGFncyAmIEVMRl9GX0xBWU9VVCkKKwkJeworCQkgIHNpemUgPSBNQVggKChHRWxmX1dvcmQpIHNpemUsCisJCQkgICAgICBzaGRyLT5zaF9vZmZzZXQKKwkJCSAgICAgICsgKHNoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUworCQkJCSA/IHNoZHItPnNoX3NpemUgOiAwKSk7CisKKwkJICAvKiBUaGUgYWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiB0d28uICBUaGlzIGlzIGEKKwkJICAgICByZXF1aXJlbWVudCBmcm9tIHRoZSBFTEYgc3BlY2lmaWNhdGlvbi4gIEFkZGl0aW9uYWxseQorCQkgICAgIHdlIHRlc3QgZm9yIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHNlY3Rpb24gYmVpbmcgbGFyZ2UKKwkJICAgICBlbm91Z2ggZm9yIHRoZSBsYXJnZXN0IGFsaWdubWVudCByZXF1aXJlZCBieSBhIGRhdGEKKwkJICAgICBibG9jay4gICovCisJCSAgaWYgKHVubGlrZWx5ICghIHBvd2Vyb2YyIChzaGRyLT5zaF9hZGRyYWxpZ24pKQorCQkgICAgICB8fCB1bmxpa2VseSAoc2hkci0+c2hfYWRkcmFsaWduIDwgc2hfYWxpZ24pKQorCQkgICAgeworCQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9BTElHTik7CisJCSAgICAgIHJldHVybiAtMTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIEhvdyBtdWNoIGFsaWdubWVudCBkbyB3ZSBuZWVkIGZvciB0aGlzIHNlY3Rpb24uICAqLworCQkgIHVwZGF0ZV9pZl9jaGFuZ2VkIChzaGRyLT5zaF9hZGRyYWxpZ24sIHNoX2FsaWduLAorCQkJCSAgICAgc2NuLT5zaGRyX2ZsYWdzKTsKKworCQkgIHNpemUgPSAoc2l6ZSArIHNoX2FsaWduIC0gMSkgJiB+KHNoX2FsaWduIC0gMSk7CisJCSAgdXBkYXRlX2lmX2NoYW5nZWQgKHNoZHItPnNoX29mZnNldCwgKEdFbGZfV29yZCkgc2l6ZSwKKwkJCQkgICAgIGNoYW5nZWQpOworCisJCSAgLyogU2VlIHdoZXRoZXIgdGhlIHNlY3Rpb24gc2l6ZSBpcyBjb3JyZWN0LiAgKi8KKwkJICB1cGRhdGVfaWZfY2hhbmdlZCAoc2hkci0+c2hfc2l6ZSwgKEdFbGZfV29yZCkgb2Zmc2V0LAorCQkJCSAgICAgY2hhbmdlZCk7CisKKwkJICBpZiAoc2hkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQorCQkgICAgc2l6ZSArPSBvZmZzZXQ7CisKKwkJICBzY24tPmZsYWdzIHw9IGNoYW5nZWQ7CisJCX0KKworCSAgICAgIC8qIENoZWNrIHRoYXQgdGhlIHNlY3Rpb24gc2l6ZSBpcyBhY3R1YWxseSBhIG11bHRpcGxlIG9mCisJCSB0aGUgZW50cnkgc2l6ZS4gICovCisJICAgICAgaWYgKHNoZHItPnNoX2VudHNpemUgIT0gMAorCQkgICYmIHVubGlrZWx5IChzaGRyLT5zaF9zaXplICUgc2hkci0+c2hfZW50c2l6ZSAhPSAwKQorCQkgICYmIChlbGYtPmZsYWdzICYgRUxGX0ZfUEVSTUlTU0lWRSkgPT0gMCkKKwkJeworCQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX1NIRU5UU0laRSk7CisJCSAgcmV0dXJuIC0xOworCQl9CisJICAgIH0KKworCSAgYXNzZXJ0IChsaXN0LT5uZXh0ID09IE5VTEwgfHwgbGlzdC0+Y250ID09IGxpc3QtPm1heCk7CisKKwkgIGZpcnN0ID0gZmFsc2U7CisJfQorICAgICAgd2hpbGUgKChsaXN0ID0gbGlzdC0+bmV4dCkgIT0gTlVMTCk7CisKKyAgICAgIC8qIFN0b3JlIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLworICAgICAgaWYgKGVsZi0+ZmxhZ3MgJiBFTEZfRl9MQVlPVVQpCisJeworCSAgLyogVGhlIHVzZXIgaXMgc3VwcG9zZWQgdG8gZmlsbCBvdXQgZV9waG9mZi4gIFVzZSBpdCBhbmQKKwkgICAgIGVfcGhudW0gdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGV4dGVuZC4gICovCisJICBzaXplID0gTUFYICgoR0VsZl9Xb3JkKSBzaXplLAorCQkgICAgICAoZWhkci0+ZV9zaG9mZgorCQkgICAgICAgKyAoZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9TSERSLCBzaG51bSkpKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEFsaWduIGZvciBzZWN0aW9uIGhlYWRlciB0YWJsZS4KKworCSAgICAgWWVzLCB3ZSB1c2UgYHNpemVvZicgYW5kIG5vdCBgX19hbGlnbm9mX18nIHNpbmNlIHdlIGRvIG5vdAorCSAgICAgd2FudCB0byBiZSBzdXJwcmlzZWQgYnkgYXJjaGl0ZWN0dXJlcyB3aXRoIGxlc3Mgc3RyaWN0CisJICAgICBhbGlnbm1lbnQgcnVsZXMuICAqLworI2RlZmluZSBTSERSX0FMSUdOIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxPZmYpKQorCSAgc2l6ZSA9IChzaXplICsgU0hEUl9BTElHTiAtIDEpICYgfihTSERSX0FMSUdOIC0gMSk7CisKKwkgIHVwZGF0ZV9pZl9jaGFuZ2VkIChlaGRyLT5lX3Nob2ZmLCAoR0VsZl9Xb3JkKSBzaXplLCBlbGYtPmZsYWdzKTsKKwkgIHVwZGF0ZV9pZl9jaGFuZ2VkIChlaGRyLT5lX3NoZW50c2l6ZSwKKwkJCSAgICAgZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9TSERSLCAxKSwKKwkJCSAgICAgZWhkcl9mbGFncyk7CisKKwkgIC8qIEFjY291bnQgZm9yIHRoZSBzZWN0aW9uIGhlYWRlciBzaXplLiAgKi8KKwkgIHNpemUgKz0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9TSERSLCBzaG51bSk7CisJfQorICAgIH0KKworICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MgfD0gZWhkcl9mbGFnczsKKworICByZXR1cm4gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGYzMl94bGF0ZXRvZi5jIGIvbGliZWxmL2VsZjMyX3hsYXRldG9mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiNjU4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGYzMl94bGF0ZXRvZi5jCkBAIC0wLDAgKzEsMTExIEBACisvKiBDb252ZXJ0IGZyb20gbWVtb3J5IHRvIGZpbGUgcmVwcmVzZW50YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworI2lmbmRlZiBMSUJFTEZCSVRTCisjIGRlZmluZSBMSUJFTEZCSVRTCTMyCisjZW5kaWYKKworCitFbGZfRGF0YSAqCitlbGZ3MihMSUJFTEZCSVRTLCB4bGF0ZXRvZikgKGRlc3QsIHNyYywgZW5jb2RlKQorICAgICBFbGZfRGF0YSAqZGVzdDsKKyAgICAgY29uc3QgRWxmX0RhdGEgKnNyYzsKKyAgICAgdW5zaWduZWQgaW50IGVuY29kZTsKK3sKKyAgLyogRmlyc3QgdGVzdCB3aGV0aGVyIHRoZSBpbnB1dCBkYXRhIGlzIHJlYWxseSBzdWl0YWJsZSBmb3IgdGhpcworICAgICB0eXBlLiAgVGhpcyBtZWFucywgd2hldGhlciB0aGVyZSBpcyBhbiBpbnRlZ2VyIG51bWJlciBvZiByZWNvcmRzLgorICAgICBOb3RlIHRoYXQgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24gdGhlIG1lbW9yeSBhbmQgZmlsZSBzaXplIG9mIHRoZQorICAgICBkYXRhIHR5cGVzIGFyZSBpZGVudGljYWwuICAqLworI2lmIEVWX05VTSAhPSAyCisgIHNpemVfdCByZWNzaXplID0gX19saWJlbGZfdHlwZV9zaXplc1tzcmMtPmRfdmVyc2lvbiAtIDFdW0VMRlcoRUxGQ0xBU1MsTElCRUxGQklUUykgLSAxXVtzcmMtPmRfdHlwZV07CisjZWxzZQorICBzaXplX3QgcmVjc2l6ZSA9IF9fbGliZWxmX3R5cGVfc2l6ZXNbMF1bRUxGVyhFTEZDTEFTUyxMSUJFTEZCSVRTKSAtIDFdW3NyYy0+ZF90eXBlXTsKKyNlbmRpZgorCisgIGlmIChzcmMtPmRfc2l6ZSAlIHJlY3NpemUgIT0gMCkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBOZXh0IHNlZSB3aGV0aGVyIHRoZSBjb252ZXJ0ZWQgZGF0YSBmaXRzIGluIHRoZSBvdXRwdXQgYnVmZmVyLiAgKi8KKyAgaWYgKHNyYy0+ZF9zaXplID4gZGVzdC0+ZF9zaXplKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9ERVNUX1NJWkUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIFRlc3QgdGhlIGVuY29kZSBwYXJhbWV0ZXIuICAqLworICBpZiAoZW5jb2RlICE9IEVMRkRBVEEyTFNCICYmIGVuY29kZSAhPSBFTEZEQVRBMk1TQikKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9FTkNPRElORyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogRGV0ZXJtaW5lIHRoZSB0cmFuc2xhdGlvbiBmdW5jdGlvbiB0byB1c2UuCisKKyAgICAgQXQgdGhpcyBwb2ludCB3ZSBtYWtlIGFuIGFzc3VtcHRpb24gd2hpY2ggaXMgdmFsaWQgZm9yIGFsbAorICAgICBleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMgc28gZmFyOiB0aGUgbWVtb3J5IGFuZCBmaWxlIHNpemVzIGFyZQorICAgICB0aGUgc2FtZS4gIFRoaXMgaGFzIHZlcnkgaW1wb3J0YW50IGNvbnNlcXVlbmNlczoKKyAgICAgYSkgVGhlIHJlcXVpcmVtZW50IHRoYXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVyIGNhbgorCW92ZXJsYXAgY2FuIGVhc2lseSBiZSBmdWxmaWxsZWQuCisgICAgIGIpIFdlIG5lZWQgb25seSBvbmUgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIGFuZCBtZW1vcnkgdG8gZmlsZQorCWFuZCB2aWNlIHZlcnNhIHNpbmNlIHRoZSBmdW5jdGlvbiBvbmx5IGhhcyB0byBjb3B5IGFuZC9vcgorCWNoYW5nZSB0aGUgYnl0ZSBvcmRlci4KKyAgKi8KKyAgaWYgKChfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOICYmIGVuY29kZSA9PSBFTEZEQVRBMkxTQikKKyAgICAgIHx8IChfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOICYmIGVuY29kZSA9PSBFTEZEQVRBMk1TQikpCisgICAgeworICAgICAgLyogV2Ugc2ltcGx5IGhhdmUgdG8gY29weSBzaW5jZSB0aGUgYnl0ZSBvcmRlciBpcyB0aGUgc2FtZS4gICovCisgICAgICBpZiAoc3JjLT5kX2J1ZiAhPSBkZXN0LT5kX2J1ZikKKwltZW1tb3ZlIChkZXN0LT5kX2J1Ziwgc3JjLT5kX2J1Ziwgc3JjLT5kX3NpemUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHhmY3RfdCBmY3RwOworCisgICAgICAvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMuICBUaGUgYCNpZmRlZicgaXMKKwkgYSBzbWFsbCBvcHRpbWl6YXRpb24gc2luY2Ugd2UgZG9uJ3QgYW50aWNpcGF0ZSBhbm90aGVyIEVMRgorCSB2ZXJzaW9uIGFuZCBzbyB3b3VsZCB3YXN0ZSAicHJlY2lvdXMiIGNvZGUuICAqLworI2lmIEVWX05VTSAhPSAyCisgICAgICBmY3RwID0gX19lbGZfeGZjdHN0b21bZGVzdC0+ZF92ZXJzaW9uIC0gMV1bc3JjLT5kX3ZlcnNpb24gLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW3NyYy0+ZF90eXBlXTsKKyNlbHNlCisgICAgICBmY3RwID0gX19lbGZfeGZjdHN0b21bMF1bMF1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtzcmMtPmRfdHlwZV07CisjZW5kaWYKKworICAgICAgLyogRG8gdGhlIHJlYWwgd29yay4gICovCisgICAgICAoKmZjdHApIChkZXN0LT5kX2J1Ziwgc3JjLT5kX2J1Ziwgc3JjLT5kX3NpemUsIDEpOworICAgIH0KKworICAvKiBOb3cgc2V0IHRoZSByZWFsIGRlc3RpbmF0aW9uIHR5cGUgYW5kIGxlbmd0aCBzaW5jZSB0aGUgb3BlcmF0aW9uIHdhcworICAgICBzdWNjZXNzZnVsLiAgKi8KKyAgZGVzdC0+ZF90eXBlID0gc3JjLT5kX3R5cGU7CisgIGRlc3QtPmRfc2l6ZSA9IHNyYy0+ZF9zaXplOworCisgIHJldHVybiBkZXN0OworfQorSU5UREVGKGVsZncyKExJQkVMRkJJVFMsIHhsYXRldG9mKSkKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGYzMl94bGF0ZXRvbS5jIGIvbGliZWxmL2VsZjMyX3hsYXRldG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4YzY1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGYzMl94bGF0ZXRvbS5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBDb252ZXJ0IGZyb20gZmlsZSB0byBtZW1vcnkgcmVwcmVzZW50YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworI2lmbmRlZiBMSUJFTEZCSVRTCisjIGRlZmluZSBMSUJFTEZCSVRTCTMyCisjZW5kaWYKKworCitFbGZfRGF0YSAqCitlbGZ3MihMSUJFTEZCSVRTLCB4bGF0ZXRvbSkgKGRlc3QsIHNyYywgZW5jb2RlKQorICAgICBFbGZfRGF0YSAqZGVzdDsKKyAgICAgY29uc3QgRWxmX0RhdGEgKnNyYzsKKyAgICAgdW5zaWduZWQgaW50IGVuY29kZTsKK3sKKyAgLyogRmlyc3QgdGVzdCB3aGV0aGVyIHRoZSBpbnB1dCBkYXRhIGlzIHJlYWxseSBzdWl0YWJsZSBmb3IgdGhpcworICAgICB0eXBlLiAgVGhpcyBtZWFucywgd2hldGhlciB0aGVyZSBpcyBhbiBpbnRlZ2VyIG51bWJlciBvZiByZWNvcmRzLgorICAgICBOb3RlIHRoYXQgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24gdGhlIG1lbW9yeSBhbmQgZmlsZSBzaXplIG9mIHRoZQorICAgICBkYXRhIHR5cGVzIGFyZSBpZGVudGljYWwuICAqLworI2lmIEVWX05VTSAhPSAyCisgIHNpemVfdCByZWNzaXplID0gX19saWJlbGZfdHlwZV9zaXplc1tzcmMtPmRfdmVyc2lvbiAtIDFdW0VMRlcoRUxGQ0xBU1MsTElCRUxGQklUUykgLSAxXVtzcmMtPmRfdHlwZV07CisjZWxzZQorICBzaXplX3QgcmVjc2l6ZSA9IF9fbGliZWxmX3R5cGVfc2l6ZXNbMF1bRUxGVyhFTEZDTEFTUyxMSUJFTEZCSVRTKSAtIDFdW3NyYy0+ZF90eXBlXTsKKyNlbmRpZgorCisKKyAgaWYgKHNyYy0+ZF9zaXplICUgcmVjc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0RBVEEpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIE5leHQgc2VlIHdoZXRoZXIgdGhlIGNvbnZlcnRlZCBkYXRhIGZpdHMgaW4gdGhlIG91dHB1dCBidWZmZXIuICAqLworICBpZiAoc3JjLT5kX3NpemUgPiBkZXN0LT5kX3NpemUpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RFU1RfU0laRSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogVGVzdCB0aGUgZW5jb2RlIHBhcmFtZXRlci4gICovCisgIGlmIChlbmNvZGUgIT0gRUxGREFUQTJMU0IgJiYgZW5jb2RlICE9IEVMRkRBVEEyTVNCKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBEZXRlcm1pbmUgdGhlIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIHRvIHVzZS4KKworICAgICBBdCB0aGlzIHBvaW50IHdlIG1ha2UgYW4gYXNzdW1wdGlvbiB3aGljaCBpcyB2YWxpZCBmb3IgYWxsCisgICAgIGV4aXN0aW5nIGltcGxlbWVudGF0aW9ucyBzbyBmYXI6IHRoZSBtZW1vcnkgYW5kIGZpbGUgc2l6ZXMgYXJlCisgICAgIHRoZSBzYW1lLiAgVGhpcyBoYXMgdmVyeSBpbXBvcnRhbnQgY29uc2VxdWVuY2VzOgorICAgICBhKSBUaGUgcmVxdWlyZW1lbnQgdGhhdCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBidWZmZXIgY2FuCisJb3ZlcmxhcCBjYW4gZWFzaWx5IGJlIGZ1bGZpbGxlZC4KKyAgICAgYikgV2UgbmVlZCBvbmx5IG9uZSBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gYW5kIG1lbW9yeSB0byBmaWxlCisJYW5kIHZpY2UgdmVyc2Egc2luY2UgdGhlIGZ1bmN0aW9uIG9ubHkgaGFzIHRvIGNvcHkgYW5kL29yCisJY2hhbmdlIHRoZSBieXRlIG9yZGVyLgorICAqLworICBpZiAoKEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTiAmJiBlbmNvZGUgPT0gRUxGREFUQTJMU0IpCisgICAgICB8fCAoQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOICYmIGVuY29kZSA9PSBFTEZEQVRBMk1TQikpCisgICAgeworICAgICAgLyogV2Ugc2ltcGx5IGhhdmUgdG8gY29weSBzaW5jZSB0aGUgYnl0ZSBvcmRlciBpcyB0aGUgc2FtZS4gICovCisgICAgICBpZiAoc3JjLT5kX2J1ZiAhPSBkZXN0LT5kX2J1ZikKKwltZW1tb3ZlIChkZXN0LT5kX2J1Ziwgc3JjLT5kX2J1Ziwgc3JjLT5kX3NpemUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHhmY3RfdCBmY3RwOworCisgICAgICAvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMuICBUaGUgYCNpZmRlZicgaXMKKwkgYSBzbWFsbCBvcHRpbWl6YXRpb24gc2luY2Ugd2UgZG9uJ3QgYW50aWNpcGF0ZSBhbm90aGVyIEVMRgorCSB2ZXJzaW9uIGFuZCBzbyB3b3VsZCB3YXN0ZSAicHJlY2lvdXMiIGNvZGUuICAqLworI2lmIEVWX05VTSAhPSAyCisgICAgICBmY3RwID0gX19lbGZfeGZjdHN0b21bc3JjLT5kX3ZlcnNpb24gLSAxXVtkZXN0LT5kX3ZlcnNpb24gLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW3NyYy0+ZF90eXBlXTsKKyNlbHNlCisgICAgICBmY3RwID0gX19lbGZfeGZjdHN0b21bMF1bMF1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtzcmMtPmRfdHlwZV07CisjZW5kaWYKKworICAgICAgLyogRG8gdGhlIHJlYWwgd29yay4gICovCisgICAgICAoKmZjdHApIChkZXN0LT5kX2J1Ziwgc3JjLT5kX2J1Ziwgc3JjLT5kX3NpemUsIDApOworICAgIH0KKworICAvKiBOb3cgc2V0IHRoZSByZWFsIGRlc3RpbmF0aW9uIHR5cGUgYW5kIGxlbmd0aCBzaW5jZSB0aGUgb3BlcmF0aW9uIHdhcworICAgICBzdWNjZXNzZnVsLiAgKi8KKyAgZGVzdC0+ZF90eXBlID0gc3JjLT5kX3R5cGU7CisgIGRlc3QtPmRfc2l6ZSA9IHNyYy0+ZF9zaXplOworCisgIHJldHVybiBkZXN0OworfQorSU5UREVGKGVsZncyKExJQkVMRkJJVFMsIHhsYXRldG9tKSkKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGY2NF9jaGVja3N1bS5jIGIvbGliZWxmL2VsZjY0X2NoZWNrc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiOTIxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGY2NF9jaGVja3N1bS5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIENvbXB1dGUgc2ltcGxlIGNoZWNrc3VtIGZyb20gcGVybWFuZW50IHBhcnRzIG9mIHRoZSBFTEYgZmlsZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBMSUJFTEZCSVRTIDY0CisjaW5jbHVkZSAiZWxmMzJfY2hlY2tzdW0uYyIKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGY2NF9mc2l6ZS5jIGIvbGliZWxmL2VsZjY0X2ZzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxZjQxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGY2NF9mc2l6ZS5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIFJldHVybiB0aGUgc2l6ZSBvZiBhbiBvYmplY3QgZmlsZSB0eXBlLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIExJQkVMRkJJVFMgNjQKKyNpbmNsdWRlICJlbGYzMl9mc2l6ZS5jIgpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZjY0X2dldGVoZHIuYyBiL2xpYmVsZi9lbGY2NF9nZXRlaGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhNjlmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGY2NF9nZXRlaGRyLmMKQEAgLTAsMCArMSwxOSBAQAorLyogUmV0dXJuIHByb2dyYW0gaGVhZGVyIHRhYmxlLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIExJQkVMRkJJVFMgNjQKKyNpbmNsdWRlICJlbGYzMl9nZXRlaGRyLmMiCmRpZmYgLS1naXQgYS9saWJlbGYvZWxmNjRfZ2V0cGhkci5jIGIvbGliZWxmL2VsZjY0X2dldHBoZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDZkN2MxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZjY0X2dldHBoZHIuYwpAQCAtMCwwICsxLDE5IEBACisvKiBSZXR1cm4gcHJvZ3JhbSBoZWFkZXIgdGFibGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgTElCRUxGQklUUyA2NAorI2luY2x1ZGUgImVsZjMyX2dldHBoZHIuYyIKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGY2NF9nZXRzaGRyLmMgYi9saWJlbGYvZWxmNjRfZ2V0c2hkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNWRhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmNjRfZ2V0c2hkci5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIFJldHVybiBzZWN0aW9uIGhlYWRlci4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBMSUJFTEZCSVRTIDY0CisjaW5jbHVkZSAiZWxmMzJfZ2V0c2hkci5jIgpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZjY0X25ld2VoZHIuYyBiL2xpYmVsZi9lbGY2NF9uZXdlaGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhNmU2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGY2NF9uZXdlaGRyLmMKQEAgLTAsMCArMSwxOSBAQAorLyogQ3JlYXRlIG5ldyBwcm9ncmFtIGhlYWRlciB0YWJsZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBMSUJFTEZCSVRTIDY0CisjaW5jbHVkZSAiZWxmMzJfbmV3ZWhkci5jIgpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZjY0X25ld3BoZHIuYyBiL2xpYmVsZi9lbGY2NF9uZXdwaGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmZjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGY2NF9uZXdwaGRyLmMKQEAgLTAsMCArMSwxOSBAQAorLyogQ3JlYXRlIG5ldyBwcm9ncmFtIGhlYWRlciB0YWJsZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBMSUJFTEZCSVRTIDY0CisjaW5jbHVkZSAiZWxmMzJfbmV3cGhkci5jIgpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZjY0X3VwZGF0ZWZpbGUuYyBiL2xpYmVsZi9lbGY2NF91cGRhdGVmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2MDRmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGY2NF91cGRhdGVmaWxlLmMKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIExJQkVMRkJJVFMgNjQKKyNpbmNsdWRlICJlbGYzMl91cGRhdGVmaWxlLmMiCmRpZmYgLS1naXQgYS9saWJlbGYvZWxmNjRfdXBkYXRlbnVsbC5jIGIvbGliZWxmL2VsZjY0X3VwZGF0ZW51bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFmMDcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZjY0X3VwZGF0ZW51bGwuYwpAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgTElCRUxGQklUUyA2NAorI2luY2x1ZGUgImVsZjMyX3VwZGF0ZW51bGwuYyIKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGY2NF94bGF0ZXRvZi5jIGIvbGliZWxmL2VsZjY0X3hsYXRldG9mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MGJiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGY2NF94bGF0ZXRvZi5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIENvbnZlcnQgZnJvbSBtZW1vcnkgdG8gZmlsZSByZXByZXNlbnRhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBMSUJFTEZCSVRTIDY0CisjaW5jbHVkZSAiZWxmMzJfeGxhdGV0b2YuYyIKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGY2NF94bGF0ZXRvbS5jIGIvbGliZWxmL2VsZjY0X3hsYXRldG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczZjA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGY2NF94bGF0ZXRvbS5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIENvbnZlcnQgZnJvbSBmaWxlIHRvIG1lbW9yeSByZXByZXNlbnRhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBMSUJFTEZCSVRTIDY0CisjaW5jbHVkZSAiZWxmMzJfeGxhdGV0b20uYyIKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfYmVnaW4uYyBiL2xpYmVsZi9lbGZfYmVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDRjYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9iZWdpbi5jCkBAIC0wLDAgKzEsMTA3MyBAQAorLyogQ3JlYXRlIGRlc2NyaXB0b3IgZm9yIHByb2Nlc3NpbmcgZmlsZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKworLyogQ3JlYXRlIGRlc2NyaXB0b3IgZm9yIGFyY2hpdmUgaW4gbWVtb3J5LiAgKi8KK3N0YXRpYyBpbmxpbmUgRWxmICoKK2ZpbGVfcmVhZF9hciAoaW50IGZpbGRlcywgdm9pZCAqbWFwX2FkZHJlc3MsIG9mZl90IG9mZnNldCwgc2l6ZV90IG1heHNpemUsCisJICAgICAgRWxmX0NtZCBjbWQsIEVsZiAqcGFyZW50KQoreworICBFbGYgKmVsZjsKKworICAvKiBDcmVhdGUgYSBkZXNjcmlwdG9yLiAgKi8KKyAgZWxmID0gYWxsb2NhdGVfZWxmIChmaWxkZXMsIG1hcF9hZGRyZXNzLCBvZmZzZXQsIG1heHNpemUsIGNtZCwgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgIEVMRl9LX0FSLCAwKTsKKyAgaWYgKGVsZiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFdlIGRvbid0IHJlYWQgYWxsIHRoZSBzeW1ib2wgdGFibGVzIGluIGFkdmFuY2UuICBBbGwgdGhpcyB3aWxsCisJIGhhcHBlbiBvbiBkZW1hbmQuICAqLworICAgICAgZWxmLT5zdGF0ZS5hci5vZmZzZXQgPSBvZmZzZXQgKyBTQVJNQUc7CisKKyAgICAgIGVsZi0+c3RhdGUuYXIuZWxmX2FyX2hkci5hcl9yYXduYW1lID0gZWxmLT5zdGF0ZS5hci5yYXdfbmFtZTsKKyAgICB9CisKKyAgcmV0dXJuIGVsZjsKK30KKworCitzdGF0aWMgc2l6ZV90CitnZXRfc2hudW0gKHZvaWQgKm1hcF9hZGRyZXNzLCB1bnNpZ25lZCBjaGFyICplX2lkZW50LCBpbnQgZmlsZGVzLCBvZmZfdCBvZmZzZXQsCisJICAgc2l6ZV90IG1heHNpemUpCit7CisgIHNpemVfdCByZXN1bHQ7CisgIHVuaW9uCisgIHsKKyAgICBFbGYzMl9FaGRyICplMzI7CisgICAgRWxmNjRfRWhkciAqZTY0OworICAgIHZvaWQgKnA7CisgIH0gZWhkcjsKKyAgYm9vbCBpczMyID0gZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMjsKKworICAvKiBNYWtlIHRoZSBFTEYgaGVhZGVyIGF2YWlsYWJsZS4gICovCisgIGlmIChsaWtlbHkgKG1hcF9hZGRyZXNzICE9IE5VTEwpICYmIGVfaWRlbnRbRUlfREFUQV0gPT0gTVlfRUxGREFUQQorICAgICAgJiYgKEFMTE9XX1VOQUxJR05FRAorCSAgfHwgKCgoc2l6ZV90KSAoKGNoYXIgKikgbWFwX2FkZHJlc3MgKyBvZmZzZXQpKQorCSAgICAgICYgKChpczMyID8gX19hbGlnbm9mX18gKEVsZjMyX0VoZHIpIDogX19hbGlnbm9mX18gKEVsZjY0X0VoZHIpKQorCQkgLSAxKSkgPT0gMCkpCisgICAgZWhkci5wID0gKGNoYXIgKikgbWFwX2FkZHJlc3MgKyBvZmZzZXQ7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4gICovCisgICAgICBzaXplX3QgbGVuID0gaXMzMiA/IHNpemVvZiAoRWxmMzJfRWhkcikgOiBzaXplb2YgKEVsZjY0X0VoZHIpOworCisgICAgICBlaGRyLnAgPSBhbGxvY2EgKGxlbik7CisgICAgICAvKiBGaWxsIGl0LiAgKi8KKyAgICAgIGlmICgoc2l6ZV90KSBwcmVhZCAoZmlsZGVzLCBlaGRyLnAsIGxlbiwgb2Zmc2V0KSAhPSBsZW4pCisJLyogRmFpbGVkIHJlYWRpbmcuICAqLworCXJldHVybiAoc2l6ZV90KSAtMWw7CisKKyAgICAgIGlmIChlX2lkZW50W0VJX0RBVEFdICE9IE1ZX0VMRkRBVEEpCisJeworCSAgaWYgKGlzMzIpCisJICAgIHsKKwkgICAgICBDT05WRVJUIChlaGRyLmUzMi0+ZV9zaG51bSk7CisJICAgICAgQ09OVkVSVCAoZWhkci5lMzItPmVfc2hvZmYpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBDT05WRVJUIChlaGRyLmU2NC0+ZV9zaG51bSk7CisJICAgICAgQ09OVkVSVCAoZWhkci5lNjQtPmVfc2hvZmYpOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoaXMzMikKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBzZWN0aW9ucyBmcm9tIHRoZSBFTEYgaGVhZGVyLiAgKi8KKyAgICAgIHJlc3VsdCA9IGVoZHIuZTMyLT5lX3NobnVtOworCisgICAgICBpZiAodW5saWtlbHkgKHJlc3VsdCA9PSAwKSAmJiBlaGRyLmUzMi0+ZV9zaG9mZiAhPSAwKQorCXsKKwkgIGlmIChvZmZzZXQgKyBlaGRyLmUzMi0+ZV9zaG9mZiArIHNpemVvZiAoRWxmMzJfU2hkcikgPiBtYXhzaXplKQorCSAgICAvKiBDYW5ub3QgcmVhZCB0aGUgZmlyc3Qgc2VjdGlvbiBoZWFkZXIuICAqLworCSAgICByZXR1cm4gKHNpemVfdCkgLTFsOworCisJICBpZiAobGlrZWx5IChtYXBfYWRkcmVzcyAhPSBOVUxMKSAmJiBlX2lkZW50W0VJX0RBVEFdID09IE1ZX0VMRkRBVEEKKwkgICAgICAmJiAoQUxMT1dfVU5BTElHTkVECisJCSAgfHwgKCgoc2l6ZV90KSAoKGNoYXIgKikgbWFwX2FkZHJlc3MgKyBvZmZzZXQpKQorCQkgICAgICAmIChfX2FsaWdub2ZfXyAoRWxmMzJfRWhkcikgLSAxKSkgPT0gMCkpCisJICAgIC8qIFdlIGNhbiBkaXJlY3RseSBhY2Nlc3MgdGhlIG1lbW9yeS4gICovCisJICAgIHJlc3VsdCA9ICgoRWxmMzJfU2hkciAqKSAoKGNoYXIgKikgbWFwX2FkZHJlc3MKKwkJCQkgICAgICArIGVoZHIuZTMyLT5lX3Nob2ZmCisJCQkJICAgICAgKyBvZmZzZXQpKS0+c2hfc2l6ZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIEVsZjMyX1dvcmQgc2l6ZTsKKworCSAgICAgIGlmIChwcmVhZCAoZmlsZGVzLCAmc2l6ZSwgc2l6ZW9mIChFbGYzMl9Xb3JkKSwKKwkJCSBvZmZzZXQgKyBlaGRyLmUzMi0+ZV9zaG9mZgorCQkJICsgb2Zmc2V0b2YgKEVsZjMyX1NoZHIsIHNoX3NpemUpKQorCQkgICE9IHNpemVvZiAoRWxmMzJfV29yZCkpCisJCXJldHVybiAoc2l6ZV90KSAtMWw7CisKKwkgICAgICBpZiAoZV9pZGVudFtFSV9EQVRBXSAhPSBNWV9FTEZEQVRBKQorCQlDT05WRVJUIChzaXplKTsKKworCSAgICAgIHJlc3VsdCA9IHNpemU7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogR2V0IHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgZnJvbSB0aGUgRUxGIGhlYWRlci4gICovCisgICAgICByZXN1bHQgPSBlaGRyLmU2NC0+ZV9zaG51bTsKKworICAgICAgaWYgKHVubGlrZWx5IChyZXN1bHQgPT0gMCkgJiYgZWhkci5lNjQtPmVfc2hvZmYgIT0gMCkKKwl7CisJICBpZiAob2Zmc2V0ICsgZWhkci5lNjQtPmVfc2hvZmYgKyBzaXplb2YgKEVsZjY0X1NoZHIpID4gbWF4c2l6ZSkKKwkgICAgLyogQ2Fubm90IHJlYWQgdGhlIGZpcnN0IHNlY3Rpb24gaGVhZGVyLiAgKi8KKwkgICAgcmV0dXJuIChzaXplX3QpIC0xbDsKKworCSAgaWYgKGxpa2VseSAobWFwX2FkZHJlc3MgIT0gTlVMTCkgJiYgZV9pZGVudFtFSV9EQVRBXSA9PSBNWV9FTEZEQVRBCisJICAgICAgJiYgKEFMTE9XX1VOQUxJR05FRAorCQkgIHx8ICgoKHNpemVfdCkgKChjaGFyICopIG1hcF9hZGRyZXNzICsgb2Zmc2V0KSkKKwkJICAgICAgJiAoX19hbGlnbm9mX18gKEVsZjY0X0VoZHIpIC0gMSkpID09IDApKQorCSAgICAvKiBXZSBjYW4gZGlyZWN0bHkgYWNjZXNzIHRoZSBtZW1vcnkuICAqLworCSAgICByZXN1bHQgPSAoKEVsZjY0X1NoZHIgKikgKChjaGFyICopIG1hcF9hZGRyZXNzCisJCQkJICAgICAgKyBlaGRyLmU2NC0+ZV9zaG9mZgorCQkJCSAgICAgICsgb2Zmc2V0KSktPnNoX3NpemU7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBFbGY2NF9Xb3JkIHNpemU7CisKKwkgICAgICBpZiAocHJlYWQgKGZpbGRlcywgJnNpemUsIHNpemVvZiAoRWxmNjRfV29yZCksCisJCQkgb2Zmc2V0ICsgZWhkci5lNjQtPmVfc2hvZmYKKwkJCSArIG9mZnNldG9mIChFbGY2NF9TaGRyLCBzaF9zaXplKSkKKwkJICAhPSBzaXplb2YgKEVsZjY0X1dvcmQpKQorCQlyZXR1cm4gKHNpemVfdCkgLTFsOworCisJICAgICAgaWYgKGVfaWRlbnRbRUlfREFUQV0gIT0gTVlfRUxGREFUQSkKKwkJQ09OVkVSVCAoc2l6ZSk7CisKKwkgICAgICByZXN1bHQgPSBzaXplOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIENyZWF0ZSBkZXNjcmlwdG9yIGZvciBFTEYgZmlsZSBpbiBtZW1vcnkuICAqLworc3RhdGljIEVsZiAqCitmaWxlX3JlYWRfZWxmIChpbnQgZmlsZGVzLCB2b2lkICptYXBfYWRkcmVzcywgb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbWF4c2l6ZSwKKwkgICAgICAgRWxmX0NtZCBjbWQsIEVsZiAqcGFyZW50KQoreworICAvKiBXZSBvbmx5IHJlYWQgdGhlIEVMRiBoZWFkZXIgbm93LiAgKi8KKyAgdW5zaWduZWQgY2hhciAqZV9pZGVudDsKKyAgc2l6ZV90IHNjbmNudDsKKyAgRWxmICplbGY7CisKKyAgaWYgKG1hcF9hZGRyZXNzICE9IE5VTEwpCisgICAgLyogSXQncyByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgTm8gd29yZCBhY2Nlc3MKKyAgICAgICByZXF1aXJlZCwganVzdCBieXRlcy4gICovCisgICAgZV9pZGVudCA9ICh1bnNpZ25lZCBjaGFyICopIG1hcF9hZGRyZXNzICsgb2Zmc2V0OworICBlbHNlCisgICAgeworICAgICAgZV9pZGVudCA9ICh1bnNpZ25lZCBjaGFyICopIGFsbG9jYSAoRUlfTklERU5UKTsKKworICAgICAgaWYgKHByZWFkIChmaWxkZXMsIGVfaWRlbnQsIEVJX05JREVOVCwgb2Zmc2V0KSAhPSBFSV9OSURFTlQpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1JFQURfRVJST1IpOworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAvKiBWZXJpZnkgdGhlIGJpbmFyeSBpcyBvZiB0aGUgY2xhc3Mgd2UgY2FuIGhhbmRsZS4gICovCisgIGlmICgoZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1MzMgorICAgICAgICYmIGVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTNjQpCisgICAgICAvKiBXZSBhbHNvIGNhbiBvbmx5IGhhbmRsZSB0d28gZW5jb2RpbmdzLiAgKi8KKyAgICAgIHx8IChlX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEEyTFNCCisJICAmJiBlX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEEyTVNCKSkKKyAgICB7CisgICAgICAvKiBDYW5ub3QgaGFuZGxlIHRoaXMuICAqLworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfRklMRSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMuICAqLworICBzY25jbnQgPSBnZXRfc2hudW0gKG1hcF9hZGRyZXNzLCBlX2lkZW50LCBmaWxkZXMsIG9mZnNldCwgbWF4c2l6ZSk7CisgIGlmIChzY25jbnQgPT0gKHNpemVfdCkgLTFsKQorICAgIC8qIENvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzZWN0aW9ucy4gICovCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogV2UgY2FuIG5vdyBhbGxvY2F0ZSB0aGUgbWVtb3J5LiAgKi8KKyAgZWxmID0gYWxsb2NhdGVfZWxmIChmaWxkZXMsIG1hcF9hZGRyZXNzLCBvZmZzZXQsIG1heHNpemUsIGNtZCwgcGFyZW50LAorCQkgICAgICBFTEZfS19FTEYsIHNjbmNudCAqIHNpemVvZiAoRWxmX1NjbikpOworICBpZiAoZWxmID09IE5VTEwpCisgICAgLyogTm90IGVub3VnaCBtZW1vcnkuICAqLworICAgIHJldHVybiBOVUxMOworCisgIC8qIFNvbWUgbW9yZSBvciBsZXNzIGFyYml0cmFyeSB2YWx1ZS4gICovCisgIGVsZi0+c3RhdGUuZWxmLnNjbmluY3IgPSAxMDsKKworICBpZiAoZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMikKKyAgICB7CisgICAgICAvKiBUaGlzIHBvaW50ZXIgbWlnaHQgbm90IGJlIGRpcmVjdGx5IHVzYWJsZSBpZiB0aGUgYWxpZ25tZW50IGlzCisJIG5vdCBzdWZmaWNpZW50IGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KKyAgICAgIEVsZjMyX0VoZHIgKmVoZHIgPSAoRWxmMzJfRWhkciAqKSAoKGNoYXIgKikgbWFwX2FkZHJlc3MgKyBvZmZzZXQpOworCisgICAgICBhc3NlcnQgKCh1bnNpZ25lZCBpbnQpIHNjbmNudCA9PSBzY25jbnQpOworICAgICAgZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmNudCA9IGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5tYXggPSBzY25jbnQ7CisKKyAgICAgIC8qIFRoaXMgaXMgYSAzMi1iaXQgYmluYXJ5LiAgKi8KKyAgICAgIGlmIChtYXBfYWRkcmVzcyAhPSBOVUxMICYmIGVfaWRlbnRbRUlfREFUQV0gPT0gTVlfRUxGREFUQQorCSAgJiYgKEFMTE9XX1VOQUxJR05FRAorCSAgICAgIHx8ICgoKCh1aW50cHRyX3QpIGVoZHIpICYgKF9fYWxpZ25vZl9fIChFbGYzMl9FaGRyKSAtIDEpKSA9PSAwCisJCSAgJiYgKCh1aW50cHRyX3QpICgoY2hhciAqKSBlaGRyICsgZWhkci0+ZV9zaG9mZikKKwkJICAgICAgJiAoX19hbGlnbm9mX18gKEVsZjMyX1NoZHIpIC0gMSkpID09IDAKKwkJICAmJiAoKHVpbnRwdHJfdCkgKChjaGFyICopIGVoZHIgKyBlaGRyLT5lX3Bob2ZmKQorCQkgICAgICAmIChfX2FsaWdub2ZfXyAoRWxmMzJfUGhkcikgLSAxKSkgPT0gMCkpKQorCXsKKwkgIC8qIFdlIGNhbiB1c2UgdGhlIG1tYXBwZWQgbWVtb3J5LiAgKi8KKwkgIGVsZi0+c3RhdGUuZWxmMzIuZWhkciA9CisJICAgIChFbGYzMl9FaGRyICopICgoY2hhciAqKSBtYXBfYWRkcmVzcyArIG9mZnNldCk7CisJICBlbGYtPnN0YXRlLmVsZjMyLnNoZHIgPQorCSAgICAoRWxmMzJfU2hkciAqKSAoKGNoYXIgKikgbWFwX2FkZHJlc3MgKyBvZmZzZXQKKwkJCSAgICArIGVsZi0+c3RhdGUuZWxmMzIuZWhkci0+ZV9zaG9mZik7CisJICBpZiAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX3BobnVtKQorCSAgICAvKiBBc3NpZ24gYSB2YWx1ZSBvbmx5IGlmIHRoZXJlIHJlYWxseSBpcyBhIHByb2dyYW0KKwkgICAgICAgaGVhZGVyLiAgT3RoZXJ3aXNlIHRoZSB2YWx1ZSByZW1haW5zIE5VTEwuICAqLworCSAgICBlbGYtPnN0YXRlLmVsZjMyLnBoZHIKKwkgICAgICA9IChFbGYzMl9QaGRyICopICgoY2hhciAqKSBtYXBfYWRkcmVzcyArIG9mZnNldAorCQkJCSsgZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX3Bob2ZmKTsKKworCSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2NuY250OyArK2NudCkKKwkgICAgeworCSAgICAgIGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2NudF0uaW5kZXggPSBjbnQ7CisJICAgICAgZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmRhdGFbY250XS5lbGYgPSBlbGY7CisJICAgICAgZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmRhdGFbY250XS5zaGRyLmUzMiA9CisJCSZlbGYtPnN0YXRlLmVsZjMyLnNoZHJbY250XTsKKwkgICAgICBlbGYtPnN0YXRlLmVsZjMyLnNjbnMuZGF0YVtjbnRdLnJhd2RhdGFfYmFzZSA9CisJCWVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2NudF0uZGF0YV9iYXNlID0KKwkJKChjaGFyICopIG1hcF9hZGRyZXNzICsgb2Zmc2V0CisJCSArIGVsZi0+c3RhdGUuZWxmMzIuc2hkcltjbnRdLnNoX29mZnNldCk7CisJICAgICAgZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmRhdGFbY250XS5saXN0ID0gJmVsZi0+c3RhdGUuZWxmMzIuc2NuczsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBSZWFkIHRoZSBkYXRhLiAgKi8KKwkgIGlmIChwcmVhZCAoZWxmLT5maWxkZXMsICZlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLAorCQkgICAgIHNpemVvZiAoRWxmMzJfRWhkciksIG9mZnNldCkgIT0gc2l6ZW9mIChFbGYzMl9FaGRyKSkKKwkgICAgeworCSAgICAgIC8qIFdlIG11c3QgYmUgYWJsZSB0byByZWFkIHRoZSBFTEYgaGVhZGVyLiAgKi8KKwkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9GSUxFKTsKKwkgICAgICByZXR1cm4gTlVMTDsKKwkgICAgfQorCisJICBpZiAoZV9pZGVudFtFSV9EQVRBXSAhPSBNWV9FTEZEQVRBKQorCSAgICB7CisJICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbS5lX3R5cGUpOworCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmMzIuZWhkcl9tZW0uZV9tYWNoaW5lKTsKKwkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLmVfdmVyc2lvbik7CisJICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbS5lX2VudHJ5KTsKKwkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLmVfcGhvZmYpOworCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmMzIuZWhkcl9tZW0uZV9zaG9mZik7CisJICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbS5lX2ZsYWdzKTsKKwkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLmVfZWhzaXplKTsKKwkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLmVfcGhlbnRzaXplKTsKKwkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLmVfcGhudW0pOworCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmMzIuZWhkcl9tZW0uZV9zaGVudHNpemUpOworCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmMzIuZWhkcl9tZW0uZV9zaG51bSk7CisJICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbS5lX3Noc3RybmR4KTsKKwkgICAgfQorCisJICBlbGYtPnN0YXRlLmVsZjMyLmVoZHIgPSAmZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbTsKKworCSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2NuY250OyArK2NudCkKKwkgICAgeworCSAgICAgIGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2NudF0uaW5kZXggPSBjbnQ7CisJICAgICAgZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmRhdGFbY250XS5lbGYgPSBlbGY7CisJICAgICAgZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmRhdGFbY250XS5saXN0ID0gJmVsZi0+c3RhdGUuZWxmMzIuc2NuczsKKwkgICAgfQorCX0KKworICAgICAgLyogU28gZmFyIG9ubHkgb25lIGJsb2NrIHdpdGggc2VjdGlvbnMuICAqLworICAgICAgZWxmLT5zdGF0ZS5lbGYzMi5zY25zX2xhc3QgPSAmZWxmLT5zdGF0ZS5lbGYzMi5zY25zOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoaXMgcG9pbnRlciBtaWdodCBub3QgYmUgZGlyZWN0bHkgdXNhYmxlIGlmIHRoZSBhbGlnbm1lbnQgaXMKKwkgbm90IHN1ZmZpY2llbnQgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICAqLworICAgICAgRWxmNjRfRWhkciAqZWhkciA9IChFbGY2NF9FaGRyICopICgoY2hhciAqKSBtYXBfYWRkcmVzcyArIG9mZnNldCk7CisKKyAgICAgIGFzc2VydCAoKHVuc2lnbmVkIGludCkgc2NuY250ID09IHNjbmNudCk7CisgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuY250ID0gZWxmLT5zdGF0ZS5lbGY2NC5zY25zLm1heCA9IHNjbmNudDsKKworICAgICAgLyogVGhpcyBpcyBhIDY0LWJpdCBiaW5hcnkuICAqLworICAgICAgaWYgKG1hcF9hZGRyZXNzICE9IE5VTEwgJiYgZV9pZGVudFtFSV9EQVRBXSA9PSBNWV9FTEZEQVRBCisJICAmJiAoQUxMT1dfVU5BTElHTkVECisJICAgICAgfHwgKCgoKHVpbnRwdHJfdCkgZWhkcikgJiAoX19hbGlnbm9mX18gKEVsZjY0X0VoZHIpIC0gMSkpID09IDAKKwkJICAmJiAoKHVpbnRwdHJfdCkgKChjaGFyICopIGVoZHIgKyBlaGRyLT5lX3Nob2ZmKQorCQkgICAgICAmIChfX2FsaWdub2ZfXyAoRWxmNjRfU2hkcikgLSAxKSkgPT0gMAorCQkgICYmICgodWludHB0cl90KSAoKGNoYXIgKikgZWhkciArIGVoZHItPmVfcGhvZmYpCisJCSAgICAgICYgKF9fYWxpZ25vZl9fIChFbGY2NF9QaGRyKSAtIDEpKSA9PSAwKSkpCisJeworCSAgLyogV2UgY2FuIHVzZSB0aGUgbW1hcHBlZCBtZW1vcnkuICAqLworCSAgZWxmLT5zdGF0ZS5lbGY2NC5laGRyID0KKwkgICAgKEVsZjY0X0VoZHIgKikgKChjaGFyICopIG1hcF9hZGRyZXNzICsgb2Zmc2V0KTsKKwkgIGVsZi0+c3RhdGUuZWxmNjQuc2hkciA9CisJICAgIChFbGY2NF9TaGRyICopICgoY2hhciAqKSBtYXBfYWRkcmVzcyArIG9mZnNldAorCQkJICAgICsgZWxmLT5zdGF0ZS5lbGY2NC5laGRyLT5lX3Nob2ZmKTsKKwkgIGlmIChlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfcGhudW0pCisJICAgIC8qIEFzc2lnbiBhIHZhbHVlIG9ubHkgaWYgdGhlcmUgcmVhbGx5IGlzIGEgcHJvZ3JhbQorCSAgICAgICBoZWFkZXIuICBPdGhlcndpc2UgdGhlIHZhbHVlIHJlbWFpbnMgTlVMTC4gICovCisJICAgIGVsZi0+c3RhdGUuZWxmNjQucGhkcgorCSAgICAgID0gKEVsZjY0X1BoZHIgKikgKChjaGFyICopIG1hcF9hZGRyZXNzICsgb2Zmc2V0CisJCQkJKyBlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfcGhvZmYpOworCisJICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBzY25jbnQ7ICsrY250KQorCSAgICB7CisJICAgICAgZWxmLT5zdGF0ZS5lbGY2NC5zY25zLmRhdGFbY250XS5pbmRleCA9IGNudDsKKwkgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLmVsZiA9IGVsZjsKKwkgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLnNoZHIuZTY0ID0KKwkJJmVsZi0+c3RhdGUuZWxmNjQuc2hkcltjbnRdOworCSAgICAgIGVsZi0+c3RhdGUuZWxmNjQuc2Nucy5kYXRhW2NudF0ucmF3ZGF0YV9iYXNlID0KKwkJZWxmLT5zdGF0ZS5lbGY2NC5zY25zLmRhdGFbY250XS5kYXRhX2Jhc2UgPQorCQkoKGNoYXIgKikgbWFwX2FkZHJlc3MgKyBvZmZzZXQKKwkJICsgZWxmLT5zdGF0ZS5lbGY2NC5zaGRyW2NudF0uc2hfb2Zmc2V0KTsKKwkgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLmxpc3QgPSAmZWxmLT5zdGF0ZS5lbGY2NC5zY25zOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFJlYWQgdGhlIGRhdGEuICAqLworCSAgaWYgKHByZWFkIChlbGYtPmZpbGRlcywgJmVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0sCisJCSAgICAgc2l6ZW9mIChFbGY2NF9FaGRyKSwgb2Zmc2V0KSAhPSBzaXplb2YgKEVsZjY0X0VoZHIpKQorCSAgICB7CisJICAgICAgLyogV2UgbXVzdCBiZSBhYmxlIHRvIHJlYWQgdGhlIEVMRiBoZWFkZXIuICAqLworCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0ZJTEUpOworCSAgICAgIHJldHVybiBOVUxMOworCSAgICB9CisKKwkgIGlmIChlX2lkZW50W0VJX0RBVEFdICE9IE1ZX0VMRkRBVEEpCisJICAgIHsKKwkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjY0LmVoZHJfbWVtLmVfdHlwZSk7CisJICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyX21lbS5lX21hY2hpbmUpOworCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV92ZXJzaW9uKTsKKwkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjY0LmVoZHJfbWVtLmVfZW50cnkpOworCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV9waG9mZik7CisJICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyX21lbS5lX3Nob2ZmKTsKKwkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjY0LmVoZHJfbWVtLmVfZmxhZ3MpOworCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV9laHNpemUpOworCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV9waGVudHNpemUpOworCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV9waG51bSk7CisJICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyX21lbS5lX3NoZW50c2l6ZSk7CisJICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyX21lbS5lX3NobnVtKTsKKwkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjY0LmVoZHJfbWVtLmVfc2hzdHJuZHgpOworCSAgICB9CisKKwkgIGVsZi0+c3RhdGUuZWxmNjQuZWhkciA9ICZlbGYtPnN0YXRlLmVsZjY0LmVoZHJfbWVtOworCisJICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBzY25jbnQ7ICsrY250KQorCSAgICB7CisJICAgICAgZWxmLT5zdGF0ZS5lbGY2NC5zY25zLmRhdGFbY250XS5pbmRleCA9IGNudDsKKwkgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLmVsZiA9IGVsZjsKKwkgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLmxpc3QgPSAmZWxmLT5zdGF0ZS5lbGY2NC5zY25zOworCSAgICB9CisJfQorCisgICAgICAvKiBTbyBmYXIgb25seSBvbmUgYmxvY2sgd2l0aCBzZWN0aW9ucy4gICovCisgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnNfbGFzdCA9ICZlbGYtPnN0YXRlLmVsZjY0LnNjbnM7CisgICAgfQorCisgIC8qIE1ha2UgdGhlIGNsYXNzIGVhc2lseSBhdmFpbGFibGUuICAqLworICBlbGYtPmNsYXNzID0gZV9pZGVudFtFSV9DTEFTU107CisKKyAgcmV0dXJuIGVsZjsKK30KKworCitFbGYgKgoraW50ZXJuYWxfZnVuY3Rpb25fZGVmCitfX2xpYmVsZl9yZWFkX21tYXBlZF9maWxlIChpbnQgZmlsZGVzLCB2b2lkICptYXBfYWRkcmVzcywgIG9mZl90IG9mZnNldCwKKwkJCSAgIHNpemVfdCBtYXhzaXplLCBFbGZfQ21kIGNtZCwgRWxmICpwYXJlbnQpCit7CisgIC8qIFdlIGhhdmUgdG8gZmluZCBvdXQgd2hhdCBraW5kIG9mIGZpbGUgdGhpcyBpcy4gIFdlIGhhbmRsZSBFTEYKKyAgICAgZmlsZXMgYW5kIGFyY2hpdmVzLiAgVG8gZmluZCBvdXQgd2hhdCB3ZSBoYXZlIHdlIG11c3QgbG9vayBhdCB0aGUKKyAgICAgaGVhZGVyLiAgVGhlIGhlYWRlciBmb3IgYW4gRUxGIGZpbGUgaXMgRUlfTklERU5UIGJ5dGVzIGluIHNpemUsCisgICAgIHRoZSBoZWFkZXIgZm9yIGFuIGFyY2hpdmUgZmlsZSBTQVJNQUcgYnl0ZXMgbG9uZy4gICovCisgIEVsZl9LaW5kIGtpbmQ7CisKKyAgLyogU2VlIHdoYXQga2luZCBvZiBvYmplY3Qgd2UgaGF2ZSBoZXJlLiAgKi8KKyAga2luZCA9IGRldGVybWluZV9raW5kIChtYXBfYWRkcmVzcyArIG9mZnNldCwgbWF4c2l6ZSk7CisKKyAgc3dpdGNoIChraW5kKQorICAgIHsKKyAgICBjYXNlIEVMRl9LX0VMRjoKKyAgICAgIHJldHVybiBmaWxlX3JlYWRfZWxmIChmaWxkZXMsIG1hcF9hZGRyZXNzLCBvZmZzZXQsIG1heHNpemUsIGNtZCwgcGFyZW50KTsKKworICAgIGNhc2UgRUxGX0tfQVI6CisgICAgICByZXR1cm4gZmlsZV9yZWFkX2FyIChmaWxkZXMsIG1hcF9hZGRyZXNzLCBvZmZzZXQsIG1heHNpemUsIGNtZCwgcGFyZW50KTsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogVGhpcyBjYXNlIGlzIGVhc3kuICBTaW5jZSB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgd2l0aCB0aGlzIGZpbGUKKyAgICAgY3JlYXRlIGEgZHVtbXkgZGVzY3JpcHRvci4gICovCisgIHJldHVybiBhbGxvY2F0ZV9lbGYgKGZpbGRlcywgbWFwX2FkZHJlc3MsIG9mZnNldCwgbWF4c2l6ZSwgY21kLCBwYXJlbnQsCisJCSAgICAgICBFTEZfS19OT05FLCAwKTsKK30KKworCitzdGF0aWMgRWxmICoKK3JlYWRfdW5tbWFwZWRfZmlsZSAoaW50IGZpbGRlcywgb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbWF4c2l6ZSwgRWxmX0NtZCBjbWQsCisJCSAgICBFbGYgKnBhcmVudCkKK3sKKyAgLyogV2UgaGF2ZSB0byBmaW5kIG91dCB3aGF0IGtpbmQgb2YgZmlsZSB0aGlzIGlzLiAgV2UgaGFuZGxlIEVMRgorICAgICBmaWxlcyBhbmQgYXJjaGl2ZXMuICBUbyBmaW5kIG91dCB3aGF0IHdlIGhhdmUgd2UgbXVzdCByZWFkIHRoZQorICAgICBoZWFkZXIuICBUaGUgaGVhZGVyIGZvciBhbiBFTEYgZmlsZSBpcyBFSV9OSURFTlQgYnl0ZXMgaW4gc2l6ZSwKKyAgICAgdGhlIGhlYWRlciBmb3IgYW4gYXJjaGl2ZSBmaWxlIFNBUk1BRyBieXRlcyBsb25nLiAgUmVhZCB0aGUKKyAgICAgbWF4aW11bSBvZiB0aGVzZSBudW1iZXJzLgorCisgICAgIFhYWCBXZSBoYXZlIHRvIGNoYW5nZSB0aGlzIGZvciB0aGUgZXh0ZW5kZWQgYGFyJyBmb3JtYXQgc29tZSBkYXkuICAqLworICB1bnNpZ25lZCBjaGFyIGhlYWRlcltNQVggKEVJX05JREVOVCwgU0FSTUFHKV07CisgIHNzaXplX3QgbnJlYWQ7CisgIEVsZl9LaW5kIGtpbmQ7CisKKyAgLyogUmVhZCB0aGUgaGVhZCBvZiB0aGUgZmlsZS4gICovCisgIG5yZWFkID0gcHJlYWQgKGZpbGRlcywgaGVhZGVyLCBNSU4gKE1BWCAoRUlfTklERU5ULCBTQVJNQUcpLCBtYXhzaXplKSwKKwkJIG9mZnNldCk7CisgIGlmIChucmVhZCA9PSAtMSkKKyAgICAvKiBXZSBjYW5ub3QgZXZlbiByZWFkIHRoZSBoZWFkIG9mIHRoZSBmaWxlLiAgTWF5YmUgRklMREVTIGlzIGFzc29jaWF0ZWQKKyAgICAgICB3aXRoIGFuIHVuc2Vla2FibGUgZGV2aWNlLiAgVGhpcyBpcyBub3RoaW5nIHdlIGNhbiBoYW5kbGUuICAqLworICAgIHJldHVybiBOVUxMOworCisgIC8qIFNlZSB3aGF0IGtpbmQgb2Ygb2JqZWN0IHdlIGhhdmUgaGVyZS4gICovCisgIGtpbmQgPSBkZXRlcm1pbmVfa2luZCAoaGVhZGVyLCBucmVhZCk7CisKKyAgc3dpdGNoIChraW5kKQorICAgIHsKKyAgICBjYXNlIEVMRl9LX0FSOgorICAgICAgcmV0dXJuIGZpbGVfcmVhZF9hciAoZmlsZGVzLCBOVUxMLCBvZmZzZXQsIG1heHNpemUsIGNtZCwgcGFyZW50KTsKKworICAgIGNhc2UgRUxGX0tfRUxGOgorICAgICAgLyogTWFrZSBzdXJlIGF0IGxlYXN0IHRoZSBFTEYgaGVhZGVyIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZS4gICovCisgICAgICBpZiAobWF4c2l6ZSA+PSAoaGVhZGVyW0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyCisJCSAgICAgID8gc2l6ZW9mIChFbGYzMl9FaGRyKSA6IHNpemVvZiAoRWxmNjRfRWhkcikpKQorCXJldHVybiBmaWxlX3JlYWRfZWxmIChmaWxkZXMsIE5VTEwsIG9mZnNldCwgbWF4c2l6ZSwgY21kLCBwYXJlbnQpOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogVGhpcyBjYXNlIGlzIGVhc3kuICBTaW5jZSB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgd2l0aCB0aGlzIGZpbGUKKyAgICAgY3JlYXRlIGEgZHVtbXkgZGVzY3JpcHRvci4gICovCisgIHJldHVybiBhbGxvY2F0ZV9lbGYgKGZpbGRlcywgTlVMTCwgb2Zmc2V0LCBtYXhzaXplLCBjbWQsIHBhcmVudCwKKwkJICAgICAgIEVMRl9LX05PTkUsIDApOworfQorCisKKy8qIE9wZW4gYSBmaWxlIGZvciByZWFkaW5nLiAgSWYgcG9zc2libGUgd2Ugd2lsbCB0cnkgdG8gbW1hcCgpIHRoZSBmaWxlLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgRWxmICoKK3JlYWRfZmlsZSAoaW50IGZpbGRlcywgb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbWF4c2l6ZSwKKwkgICBFbGZfQ21kIGNtZCwgRWxmICpwYXJlbnQpCit7CisgIHZvaWQgKm1hcF9hZGRyZXNzID0gTlVMTDsKKyAgaW50IHVzZV9tbWFwID0gKGNtZCA9PSBFTEZfQ19SRUFEX01NQVAgfHwgY21kID09IEVMRl9DX1JEV1JfTU1BUAorCQkgIHx8IGNtZCA9PSBFTEZfQ19XUklURV9NTUFQCisJCSAgfHwgY21kID09IEVMRl9DX1JFQURfTU1BUF9QUklWQVRFKTsKKworI2lmIF9NVURGTEFQCisgIC8qIE11ZGZsYXAgZG9lc24ndCBncm9rIHRoYXQgb3VyIG1tYXAnZCBkYXRhIGlzIG9rLiAgKi8KKyAgdXNlX21tYXAgPSAwOworI2VuZGlmCisKKyAgaWYgKHVzZV9tbWFwKQorICAgIHsKKyAgICAgIGlmIChwYXJlbnQgPT0gTlVMTCkKKwl7CisJICBpZiAobWF4c2l6ZSA9PSB+KChzaXplX3QpIDApKQorCSAgICB7CisJICAgICAgLyogV2UgZG9uJ3Qga25vdyBpbiB0aGUgbW9tZW50IGhvdyBsYXJnZSB0aGUgZmlsZSBpcy4KKwkJIERldGVybWluZSBpdCBub3cuICAqLworCSAgICAgIHN0cnVjdCBzdGF0IHN0OworCisJICAgICAgaWYgKGZzdGF0IChmaWxkZXMsICZzdCkgPT0gMAorCQkgICYmIChzaXplb2YgKHNpemVfdCkgPj0gc2l6ZW9mIChzdC5zdF9zaXplKQorCQkgICAgICB8fCBzdC5zdF9zaXplIDw9IH4oKHNpemVfdCkgMCkpKQorCQltYXhzaXplID0gKHNpemVfdCkgc3Quc3Rfc2l6ZTsKKwkgICAgfQorCisJICAvKiBXZSB0cnkgdG8gbWFwIHRoZSBmaWxlIG91cnNlbGYuICAqLworCSAgbWFwX2FkZHJlc3MgPSBtbWFwIChOVUxMLCBtYXhzaXplLCAoY21kID09IEVMRl9DX1JFQURfTU1BUAorCQkJCQkgICAgICA/IFBST1RfUkVBRAorCQkJCQkgICAgICA6IFBST1RfUkVBRHxQUk9UX1dSSVRFKSwKKwkJCSAgICAgIGNtZCA9PSBFTEZfQ19SRUFEX01NQVBfUFJJVkFURQorCQkJICAgICAgPyBNQVBfUFJJVkFURSA6IE1BUF9TSEFSRUQsCisJCQkgICAgICBmaWxkZXMsIG9mZnNldCk7CisKKwkgIGlmIChtYXBfYWRkcmVzcyA9PSBNQVBfRkFJTEVEKQorCSAgICBtYXBfYWRkcmVzcyA9IE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZSBwYXJlbnQgaXMgYWxyZWFkeSBsb2FkZWQuICBVc2UgaXQuICAqLworCSAgYXNzZXJ0IChtYXhzaXplICE9IH4oKHNpemVfdCkgMCkpOworCisJICBtYXBfYWRkcmVzcyA9IHBhcmVudC0+bWFwX2FkZHJlc3M7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBoYXZlIHRoZSBmaWxlIGluIG1lbW9yeSBvcHRpbWl6ZSB0aGUgYWNjZXNzLiAgKi8KKyAgaWYgKG1hcF9hZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IEVsZiAqcmVzdWx0OworCisgICAgICByZXN1bHQgPSBfX2xpYmVsZl9yZWFkX21tYXBlZF9maWxlIChmaWxkZXMsIG1hcF9hZGRyZXNzLCBvZmZzZXQsIG1heHNpemUsCisJCQkJCSAgY21kLCBwYXJlbnQpOworCisgICAgICAvKiBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIHVubWFwIHRoZQorCSBtZW1vcnkgaWYgd2UgbW1hcGVkIGhlcmUuICAqLworICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMCisJICAmJiAocGFyZW50ID09IE5VTEwKKwkgICAgICB8fCBwYXJlbnQtPm1hcF9hZGRyZXNzICE9IG1hcF9hZGRyZXNzKSkKKwltdW5tYXAgKG1hcF9hZGRyZXNzLCBtYXhzaXplKTsKKyAgICAgIGVsc2UgaWYgKHBhcmVudCA9PSBOVUxMKQorCS8qIFJlbWVtYmVyIHRoYXQgd2UgbW1hcCgpZWQgdGhlIG1lbW9yeS4gICovCisJcmVzdWx0LT5mbGFncyB8PSBFTEZfRl9NTUFQUEVEOworCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAvKiBPdGhlcndpc2Ugd2UgaGF2ZSB0byBkbyBpdCB0aGUgaGFyZCB3YXkuICBXZSByZWFkIGFzIG11Y2ggYXMgbmVjZXNzYXJ5CisgICAgIGZyb20gdGhlIGZpbGUgd2hlbmV2ZXIgd2UgbmVlZCBpbmZvcm1hdGlvbiB3aGljaCBpcyBub3QgYXZhaWxhYmxlLiAgKi8KKyAgcmV0dXJuIHJlYWRfdW5tbWFwZWRfZmlsZSAoZmlsZGVzLCBvZmZzZXQsIG1heHNpemUsIGNtZCwgcGFyZW50KTsKK30KKworCisvKiBGaW5kIHRoZSBlbnRyeSB3aXRoIHRoZSBsb25nIG5hbWVzIGZvciB0aGUgY29udGVudCBvZiB0aGlzIGFyY2hpdmUuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorcmVhZF9sb25nX25hbWVzIChFbGYgKmVsZikKK3sKKyAgb2ZmX3Qgb2Zmc2V0ID0gU0FSTUFHOwkvKiBUaGlzIGlzIHRoZSBmaXJzdCBlbnRyeS4gICovCisgIHN0cnVjdCBhcl9oZHIgaGRybTsKKyAgc3RydWN0IGFyX2hkciAqaGRyOworICBjaGFyICpuZXdwOworICBzaXplX3QgbGVuOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChlbGYtPm1hcF9hZGRyZXNzICE9IE5VTEwpCisJeworCSAgaWYgKG9mZnNldCArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgPiBlbGYtPm1heGltdW1fc2l6ZSkKKwkgICAgcmV0dXJuIE5VTEw7CisKKwkgIC8qIFRoZSBkYXRhIGlzIG1hcHBlZC4gICovCisJICBoZHIgPSAoc3RydWN0IGFyX2hkciAqKSAoZWxmLT5tYXBfYWRkcmVzcyArIG9mZnNldCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFJlYWQgdGhlIGhlYWRlciBmcm9tIHRoZSBmaWxlLiAgKi8KKwkgIGlmIChwcmVhZCAoZWxmLT5maWxkZXMsICZoZHJtLCBzaXplb2YgKGhkcm0pLAorCQkgICAgIGVsZi0+c3RhcnRfb2Zmc2V0ICsgb2Zmc2V0KSAhPSBzaXplb2YgKGhkcm0pKQorCSAgICByZXR1cm4gTlVMTDsKKworCSAgaGRyID0gJmhkcm07CisJfQorCisgICAgICBsZW4gPSBhdG9sIChoZHItPmFyX3NpemUpOworCisgICAgICBpZiAobWVtY21wIChoZHItPmFyX25hbWUsICIvLyAgICAgICAgICAgICAgIiwgMTYpID09IDApCisJYnJlYWs7CisKKyAgICAgIG9mZnNldCArPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgKChsZW4gKyAxKSAmIH4xbCk7CisgICAgfQorCisgIC8qIER1ZSB0byB0aGUgc3R1cGlkIGZvcm1hdCBvZiB0aGUgbG9uZyBuYW1lIHRhYmxlIGVudHJ5ICh3aGljaCBhcmUgbm90CisgICAgIE5VTCB0ZXJtaW50ZWQpIHdlIGhhdmUgdG8gcHJvdmlkZSBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvbiBhbnlob3cuCisgICAgIFRoZXJlZm9yZSB3ZSBhbHdheXMgbWFrZSBhIGNvcHkgd2hpY2ggaGFzIHRoZSBhcHByb3ByaWF0ZSBmb3JtLiAgKi8KKyAgbmV3cCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKyAgaWYgKG5ld3AgIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpydW5wOworCisgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMKQorCS8qIFNpbXBseSBjb3B5IGl0IG92ZXIuICAqLworCWVsZi0+c3RhdGUuYXIubG9uZ19uYW1lcyA9IChjaGFyICopIG1lbWNweSAobmV3cCwKKwkJCQkJCSAgICBlbGYtPm1hcF9hZGRyZXNzICsgb2Zmc2V0CisJCQkJCQkgICAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLAorCQkJCQkJICAgIGxlbik7CisgICAgICBlbHNlCisJeworCSAgaWYgKChzaXplX3QpIHByZWFkIChlbGYtPmZpbGRlcywgbmV3cCwgbGVuLAorCQkJICAgICAgZWxmLT5zdGFydF9vZmZzZXQgKyBvZmZzZXQKKwkJCSAgICAgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKKwkgICAgICAhPSBsZW4pCisJICAgIHsKKwkgICAgICAvKiBXZSB3ZXJlIG5vdCBhYmxlIHRvIHJlYWQgYWxsIGRhdGEuICAqLworCSAgICAgIGZyZWUgKG5ld3ApOworCSAgICAgIGVsZi0+c3RhdGUuYXIubG9uZ19uYW1lcyA9IE5VTEw7CisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKwkgIGVsZi0+c3RhdGUuYXIubG9uZ19uYW1lcyA9IG5ld3A7CisJfQorCisgICAgICBlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXNfbGVuID0gbGVuOworCisgICAgICAvKiBOb3cgTlVMLXRlcm1pbmF0ZSB0aGUgc3RyaW5ncy4gICovCisgICAgICBydW5wID0gbmV3cDsKKyAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisJICBydW5wID0gKGNoYXIgKikgbWVtY2hyIChydW5wLCAnLycsIG5ld3AgKyBsZW4gLSBydW5wKTsKKwkgIGlmIChydW5wID09IE5VTEwpCisJICAgIC8qIFRoaXMgd2FzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKwkgICAgYnJlYWs7CisKKwkgIC8qIE5VTC10ZXJtaW5hdGUgdGhlIHN0cmluZy4gICovCisJICAqcnVucCA9ICdcMCc7CisKKwkgIC8qIFNraXAgdGhlIE5VTCBienRlIGFuZCB0aGUgXDAxMi4gICovCisJICBydW5wICs9IDI7CisKKwkgIC8qIEEgc2FuaXR5IGNoZWNrLiAgU29tZWJvZHkgbWlnaHQgaGF2ZSBnZW5lcmF0ZWQgaW52YWxpZAorCSAgICAgYXJjaGl2ZS4gICovCisJICBpZiAocnVucCA+PSBuZXdwICsgbGVuKQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiBuZXdwOworfQorCisKKy8qIFJlYWQgdGhlIG5leHQgYXJjaGl2ZSBoZWFkZXIuICAqLworaW50CitpbnRlcm5hbF9mdW5jdGlvbl9kZWYKK19fbGliZWxmX25leHRfYXJoZHIgKGVsZikKKyAgICAgRWxmICplbGY7Cit7CisgIHN0cnVjdCBhcl9oZHIgKmFyX2hkcjsKKyAgRWxmX0FyaGRyICplbGZfYXJfaGRyOworCisgIGlmIChlbGYtPm1hcF9hZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2VlIHdoZXRoZXIgdGhpcyBlbnRyeSBpcyBpbiB0aGUgZmlsZS4gICovCisgICAgICBpZiAoZWxmLT5zdGF0ZS5hci5vZmZzZXQgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpCisJICA+IGVsZi0+c3RhcnRfb2Zmc2V0ICsgZWxmLT5tYXhpbXVtX3NpemUpCisJeworCSAgLyogVGhpcyByZWNvcmQgaXMgbm90IGFueW1vcmUgaW4gdGhlIGZpbGUuICAqLworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1JBTkdFKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBhcl9oZHIgPSAoc3RydWN0IGFyX2hkciAqKSAoZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhdGUuYXIub2Zmc2V0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhcl9oZHIgPSAmZWxmLT5zdGF0ZS5hci5hcl9oZHI7CisKKyAgICAgIGlmIChwcmVhZCAoZWxmLT5maWxkZXMsIGFyX2hkciwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwKKwkJIGVsZi0+c3RhdGUuYXIub2Zmc2V0KQorCSAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKKwl7CisJICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSByZWFkaW5nIHRoZSBmaWxlLiAgKi8KKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9SQU5HRSk7CisJICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAvKiBPbmUgbGl0dGxlIGNvbnNpc3RlbmN5IGNoZWNrLiAgKi8KKyAgaWYgKG1lbWNtcCAoYXJfaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpICE9IDApCisgICAgeworICAgICAgLyogVGhpcyBpcyBubyB2YWxpZCBhcmNoaXZlLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9BUkNISVZFX0ZNQUcpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAvKiBDb3B5IHRoZSByYXcgbmFtZSBvdmVyIHRvIGEgTlVMIHRlcm1pbmF0ZWQgYnVmZmVyLiAgKi8KKyAgKigoY2hhciAqKSBfX21lbXBjcHkgKGVsZi0+c3RhdGUuYXIucmF3X25hbWUsIGFyX2hkci0+YXJfbmFtZSwgMTYpKSA9ICdcMCc7CisKKyAgZWxmX2FyX2hkciA9ICZlbGYtPnN0YXRlLmFyLmVsZl9hcl9oZHI7CisKKyAgLyogTm93IGNvbnZlcnQgdGhlIGBzdHJ1Y3QgYXJfaGRyJyBpbnRvIGBFbGZfQXJoZHInLgorICAgICBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgc3BlY2lhbCBlbnRyeS4gICovCisgIGlmIChhcl9oZHItPmFyX25hbWVbMF0gPT0gJy8nKQorICAgIHsKKyAgICAgIGlmIChhcl9oZHItPmFyX25hbWVbMV0gPT0gJyAnCisJICAmJiBtZW1jbXAgKGFyX2hkci0+YXJfbmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikgPT0gMCkKKwkvKiBUaGlzIGlzIHRoZSBpbmRleC4gICovCisJZWxmX2FyX2hkci0+YXJfbmFtZSA9IG1lbWNweSAoZWxmLT5zdGF0ZS5hci5hcl9uYW1lLCAiLyIsIDIpOworICAgICAgZWxzZSBpZiAoYXJfaGRyLT5hcl9uYW1lWzFdID09ICcvJworCSAgICAgICAmJiBtZW1jbXAgKGFyX2hkci0+YXJfbmFtZSwgIi8vICAgICAgICAgICAgICAiLCAxNikgPT0gMCkKKwkvKiBUaGlzIGlzIHRoZSBhcnJheSB3aXRoIHRoZSBsb25nIG5hbWVzLiAgKi8KKwllbGZfYXJfaGRyLT5hcl9uYW1lID0gbWVtY3B5IChlbGYtPnN0YXRlLmFyLmFyX25hbWUsICIvLyIsIDMpOworICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoYXJfaGRyLT5hcl9uYW1lWzFdKSkKKwl7CisJICBzaXplX3Qgb2Zmc2V0OworCisJICAvKiBUaGlzIGlzIGEgbG9uZyBuYW1lLiAgRmlyc3Qgd2UgaGF2ZSB0byByZWFkIHRoZSBsb25nIG5hbWUKKwkgICAgIHRhYmxlLCBpZiB0aGlzIGhhc24ndCBoYXBwZW5lZCBhbHJlYWR5LiAgKi8KKwkgIGlmIChlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXMgPT0gTlVMTAorCSAgICAgICYmIHJlYWRfbG9uZ19uYW1lcyAoZWxmKSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogTm8gbG9uZyBuYW1lIHRhYmxlIGFsdGhvdWdoIGl0IGlzIHJlZmVyZW5jZS4gIFRoZSBhcmNoaXZlIGlzCisJCSBicm9rZW4uICAqLworCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0FSQ0hJVkUpOworCSAgICAgIHJldHVybiAtMTsKKwkgICAgfQorCisJICBvZmZzZXQgPSBhdG9sIChhcl9oZHItPmFyX25hbWUgKyAxKTsKKwkgIGlmIChvZmZzZXQgPj0gZWxmLT5zdGF0ZS5hci5sb25nX25hbWVzX2xlbikKKwkgICAgeworCSAgICAgIC8qIFRoZSBpbmRleCBpbiB0aGUgbG9uZyBuYW1lIHRhYmxlIGlzIGxhcmdlciB0aGFuIHRoZSB0YWJsZS4gICovCisJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQVJDSElWRSk7CisJICAgICAgcmV0dXJuIC0xOworCSAgICB9CisJICBlbGZfYXJfaGRyLT5hcl9uYW1lID0gZWxmLT5zdGF0ZS5hci5sb25nX25hbWVzICsgb2Zmc2V0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGlzIGlzIG5vbmUgb2YgdGhlIGtub3duIHNwZWNpYWwgZW50cmllcy4gICovCisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9BUkNISVZFKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciAqZW5kcDsKKworICAgICAgLyogSXQgaXMgYSBub3JtYWwgZW50cnkuICBDb3B5IG92ZXIgdGhlIG5hbWUuICAqLworICAgICAgZW5kcCA9IChjaGFyICopIG1lbWNjcHkgKGVsZi0+c3RhdGUuYXIuYXJfbmFtZSwgYXJfaGRyLT5hcl9uYW1lLAorCQkJICAgICAgICcvJywgMTYpOworICAgICAgaWYgKGVuZHAgIT0gTlVMTCkKKwllbmRwWy0xXSA9ICdcMCc7CisgICAgICBlbHNlCisJZWxmLT5zdGF0ZS5hci5yYXdfbmFtZVsxNl0gPSAnXDAnOworCisgICAgICBlbGZfYXJfaGRyLT5hcl9uYW1lID0gZWxmLT5zdGF0ZS5hci5hcl9uYW1lOworICAgIH0KKworICAvKiBTaW5jZSB0aGVyZSBhcmUgbm8gc3BlY2lhbGl6ZWQgZnVuY3Rpb25zIHRvIGNvbnZlcnQgQVNDSUkgdG8KKyAgICAgdGltZV90LCB1aWRfdCwgZ2lkX3QsIG1vZGVfdCwgYW5kIG9mZl90IHdlIHVzZSBlaXRoZXIgYXRvbCBvcgorICAgICBhdG9sbCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIHR5cGVzLiAgV2UgYXJlIGFsc28gcHJlcGFyZWQKKyAgICAgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB3aG9sZSBmaWVsZCBpbiB0aGUgYHN0cnVjdCBhcl9oZHInIGlzCisgICAgIGZpbGxlZCBpbiB3aGljaCBjYXNlIHdlIGNhbm5vdCBzaW1wbHkgdXNlIGF0b2wvbCBidXQgaW5zdGVhZCBoYXZlCisgICAgIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBjb3B5LiAgKi8KKyAgaWYgKGFyX2hkci0+YXJfZGF0ZVtzaXplb2YgKGFyX2hkci0+YXJfZGF0ZSkgLSAxXSA9PSAnICcpCisgICAgeworICAgICAgaWYgKGFyX2hkci0+YXJfZGF0ZVswXSA9PSAnICcpCisJZWxmX2FyX2hkci0+YXJfZGF0ZSA9IDA7CisgICAgICBlbHNlCisJZWxmX2FyX2hkci0+YXJfZGF0ZSA9IChzaXplb2YgKHRpbWVfdCkgPD0gc2l6ZW9mIChsb25nIGludCkKKwkJCSAgICAgICA/ICh0aW1lX3QpIGF0b2wgKGFyX2hkci0+YXJfZGF0ZSkKKwkJCSAgICAgICA6ICh0aW1lX3QpIGF0b2xsIChhcl9oZHItPmFyX2RhdGUpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyIGJ1ZltzaXplb2YgKGFyX2hkci0+YXJfZGF0ZSkgKyAxXTsKKyAgICAgICooKGNoYXIgKikgX19tZW1wY3B5IChidWYsIGFyX2hkci0+YXJfZGF0ZSwgc2l6ZW9mIChhcl9oZHItPmFyX2RhdGUpKSkKKwk9ICdcMCc7CisgICAgICBlbGZfYXJfaGRyLT5hcl9kYXRlID0gKHNpemVvZiAodGltZV90KSA8PSBzaXplb2YgKGxvbmcgaW50KQorCQkJICAgICA/ICh0aW1lX3QpIGF0b2wgKGFyX2hkci0+YXJfZGF0ZSkKKwkJCSAgICAgOiAodGltZV90KSBhdG9sbCAoYXJfaGRyLT5hcl9kYXRlKSk7CisgICAgfQorCisgIGlmIChhcl9oZHItPmFyX3VpZFtzaXplb2YgKGFyX2hkci0+YXJfdWlkKSAtIDFdID09ICcgJykKKyAgICB7CisgICAgICBpZiAoYXJfaGRyLT5hcl91aWRbMF0gPT0gJyAnKQorCWVsZl9hcl9oZHItPmFyX3VpZCA9IDA7CisgICAgICBlbHNlCisJZWxmX2FyX2hkci0+YXJfdWlkID0gKHNpemVvZiAodWlkX3QpIDw9IHNpemVvZiAobG9uZyBpbnQpCisJCQkgICAgICA/ICh1aWRfdCkgYXRvbCAoYXJfaGRyLT5hcl91aWQpCisJCQkgICAgICA6ICh1aWRfdCkgYXRvbGwgKGFyX2hkci0+YXJfdWlkKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciBidWZbc2l6ZW9mIChhcl9oZHItPmFyX3VpZCkgKyAxXTsKKyAgICAgICooKGNoYXIgKikgX19tZW1wY3B5IChidWYsIGFyX2hkci0+YXJfdWlkLCBzaXplb2YgKGFyX2hkci0+YXJfdWlkKSkpCisJPSAnXDAnOworICAgICAgZWxmX2FyX2hkci0+YXJfdWlkID0gKHNpemVvZiAodWlkX3QpIDw9IHNpemVvZiAobG9uZyBpbnQpCisJCQkgICAgID8gKHVpZF90KSBhdG9sIChhcl9oZHItPmFyX3VpZCkKKwkJCSAgICAgOiAodWlkX3QpIGF0b2xsIChhcl9oZHItPmFyX3VpZCkpOworICAgIH0KKworICBpZiAoYXJfaGRyLT5hcl9naWRbc2l6ZW9mIChhcl9oZHItPmFyX2dpZCkgLSAxXSA9PSAnICcpCisgICAgeworICAgICAgaWYgKGFyX2hkci0+YXJfZ2lkWzBdID09ICcgJykKKwllbGZfYXJfaGRyLT5hcl9naWQgPSAwOworICAgICAgZWxzZQorCWVsZl9hcl9oZHItPmFyX2dpZCA9IChzaXplb2YgKGdpZF90KSA8PSBzaXplb2YgKGxvbmcgaW50KQorCQkJICAgICAgPyAoZ2lkX3QpIGF0b2wgKGFyX2hkci0+YXJfZ2lkKQorCQkJICAgICAgOiAoZ2lkX3QpIGF0b2xsIChhcl9oZHItPmFyX2dpZCkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgYnVmW3NpemVvZiAoYXJfaGRyLT5hcl9naWQpICsgMV07CisgICAgICAqKChjaGFyICopIF9fbWVtcGNweSAoYnVmLCBhcl9oZHItPmFyX2dpZCwgc2l6ZW9mIChhcl9oZHItPmFyX2dpZCkpKQorCT0gJ1wwJzsKKyAgICAgIGVsZl9hcl9oZHItPmFyX2dpZCA9IChzaXplb2YgKGdpZF90KSA8PSBzaXplb2YgKGxvbmcgaW50KQorCQkJICAgICA/IChnaWRfdCkgYXRvbCAoYXJfaGRyLT5hcl9naWQpCisJCQkgICAgIDogKGdpZF90KSBhdG9sbCAoYXJfaGRyLT5hcl9naWQpKTsKKyAgICB9CisKKyAgaWYgKGFyX2hkci0+YXJfbW9kZVtzaXplb2YgKGFyX2hkci0+YXJfbW9kZSkgLSAxXSA9PSAnICcpCisgICAgeworICAgICAgaWYgKGFyX2hkci0+YXJfbW9kZVswXSA9PSAnICcpCisJZWxmX2FyX2hkci0+YXJfbW9kZSA9IDA7CisgICAgICBlbHNlCisJZWxmX2FyX2hkci0+YXJfbW9kZSA9IChzaXplb2YgKG1vZGVfdCkgPD0gc2l6ZW9mIChsb25nIGludCkKKwkJCSAgICAgICA/IChtb2RlX3QpIHN0cnRvbCAoYXJfaGRyLT5hcl9tb2RlLCBOVUxMLCA4KQorCQkJICAgICAgIDogKG1vZGVfdCkgc3RydG9sbCAoYXJfaGRyLT5hcl9tb2RlLCBOVUxMLCA4KSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciBidWZbc2l6ZW9mIChhcl9oZHItPmFyX21vZGUpICsgMV07CisgICAgICAqKChjaGFyICopIF9fbWVtcGNweSAoYnVmLCBhcl9oZHItPmFyX21vZGUsIHNpemVvZiAoYXJfaGRyLT5hcl9tb2RlKSkpCisJPSAnXDAnOworICAgICAgZWxmX2FyX2hkci0+YXJfbW9kZSA9IChzaXplb2YgKG1vZGVfdCkgPD0gc2l6ZW9mIChsb25nIGludCkKKwkJCSAgICAgPyAobW9kZV90KSBzdHJ0b2wgKGFyX2hkci0+YXJfbW9kZSwgTlVMTCwgOCkKKwkJCSAgICAgOiAobW9kZV90KSBzdHJ0b2xsIChhcl9oZHItPmFyX21vZGUsIE5VTEwsIDgpKTsKKyAgICB9CisKKyAgaWYgKGFyX2hkci0+YXJfc2l6ZVtzaXplb2YgKGFyX2hkci0+YXJfc2l6ZSkgLSAxXSA9PSAnICcpCisgICAgeworICAgICAgaWYgKGFyX2hkci0+YXJfc2l6ZVswXSA9PSAnICcpCisJLyogU29tZXRoaW5nIGlzIHJlYWxseSB3cm9uZy4gIFdlIGNhbm5vdCBsaXZlIHdpdGhvdXQgYSBzaXplIGZvcgorCSAgIHRoZSBtZW1iZXIgc2luY2UgaXQgd2lsbCBub3QgYmUgcG9zc2libGUgdG8gZmluZCB0aGUgbmV4dAorCSAgIGFyY2hpdmUgbWVtYmVyLiAgKi8KKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9BUkNISVZFKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBlbHNlCisJZWxmX2FyX2hkci0+YXJfc2l6ZSA9IChzaXplb2YgKHRpbWVfdCkgPT0gc2l6ZW9mIChsb25nIGludCkKKwkJCSAgICAgICA/IChvZmZfdCkgYXRvbCAoYXJfaGRyLT5hcl9zaXplKQorCQkJICAgICAgIDogKG9mZl90KSBhdG9sbCAoYXJfaGRyLT5hcl9zaXplKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciBidWZbc2l6ZW9mIChhcl9oZHItPmFyX3NpemUpICsgMV07CisgICAgICAqKChjaGFyICopIF9fbWVtcGNweSAoYnVmLCBhcl9oZHItPmFyX3NpemUsIHNpemVvZiAoYXJfaGRyLT5hcl9zaXplKSkpCisJPSAnXDAnOworICAgICAgZWxmX2FyX2hkci0+YXJfc2l6ZSA9IChzaXplb2YgKHRpbWVfdCkgPT0gc2l6ZW9mIChsb25nIGludCkKKwkJCSAgICAgPyAob2ZmX3QpIGF0b2wgKGFyX2hkci0+YXJfc2l6ZSkKKwkJCSAgICAgOiAob2ZmX3QpIGF0b2xsIChhcl9oZHItPmFyX3NpemUpKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogV2Ugd2VyZSBhc2tlZCB0byByZXR1cm4gYSBjbG9uZSBvZiBhbiBleGlzdGluZyBkZXNjcmlwdG9yLiAgVGhpcworICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBvbiB0aGUgcGFyZW50IGRlc2NyaXB0b3IKKyAgIGJlaW5nIGhlbGQuICovCitzdGF0aWMgRWxmICoKK2R1cF9lbGYgKGludCBmaWxkZXMsIEVsZl9DbWQgY21kLCBFbGYgKnJlZikKK3sKKyAgc3RydWN0IEVsZiAqcmVzdWx0OworCisgIGlmIChmaWxkZXMgPT0gLTEpCisgICAgLyogQWxsb3cgdGhlIHVzZXIgdG8gcGFzcyAtMSBhcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgbmV3IGZpbGUuICAqLworICAgIGZpbGRlcyA9IHJlZi0+ZmlsZGVzOworICAvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGJldHRlciBzaG91bGQgYmUgdGhlIHNhbWUuICBJZiBpdCB3YXMgZGlzY29ubmVjdGVkCisgICAgIGFscmVhZHkgKHVzaW5nIGBlbGZfY250bCcpIHdlIGRvIG5vdCB0ZXN0IGl0LiAgKi8KKyAgZWxzZSBpZiAocmVmLT5maWxkZXMgIT0gLTEgJiYgZmlsZGVzICE9IHJlZi0+ZmlsZGVzKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9GRF9NSVNNQVRDSCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogVGhlIG1vZGUgbXVzdCBhbGxvdyByZWFkaW5nLiAgSS5lLiwgYSBkZXNjcmlwdG9yIGNyZWF0aW5nIHdpdGggYQorICAgICBjb21tYW5kIGRpZmZlcmVudCB0aGVuIEVMRl9DX1JFQUQsIEVMRl9DX1dSSVRFIGFuZCBFTEZfQ19SRFdSIGlzCisgICAgIG5vdCBhbGxvd2VkLiAgKi8KKyAgaWYgKHJlZi0+Y21kICE9IEVMRl9DX1JFQUQgJiYgcmVmLT5jbWQgIT0gRUxGX0NfUkVBRF9NTUFQCisgICAgICAmJiByZWYtPmNtZCAhPSBFTEZfQ19XUklURSAmJiByZWYtPmNtZCAhPSBFTEZfQ19XUklURV9NTUFQCisgICAgICAmJiByZWYtPmNtZCAhPSBFTEZfQ19SRFdSICYmIHJlZi0+Y21kICE9IEVMRl9DX1JEV1JfTU1BUAorICAgICAgJiYgcmVmLT5jbWQgIT0gRUxGX0NfUkVBRF9NTUFQX1BSSVZBVEUpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT1ApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIE5vdyBpdCBpcyB0aW1lIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gcmVhZGluZyBub3JtYWwgZmlsZXMgYW5kCisgICAgIGFyY2hpdmVzLiAgTm9ybWFsIGZpbGVzIGNhbiBlYXNpbHkgYmUgaGFuZGxlZCBiZSBpbmNyZW1lbnRpbmcgdGhlCisgICAgIHJlZmVyZW5jZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIHNhbWUgZGVzY3JpcHRvci4gICovCisgIGlmIChyZWYtPmtpbmQgIT0gRUxGX0tfQVIpCisgICAgeworICAgICAgKytyZWYtPnJlZl9jb3VudDsKKyAgICAgIHJldHVybiByZWY7CisgICAgfQorCisgIC8qIFRoaXMgaXMgYW4gYXJjaGl2ZS4gIFdlIG11c3QgY3JlYXRlIGEgZGVzY3JpcHRvciBmb3IgdGhlIGFyY2hpdmUKKyAgICAgbWVtYmVyIHRoZSBpbnRlcm5hbCBwb2ludGVyIG9mIHRoZSBhcmNoaXZlIGZpbGUgZGVzcmlwdG9yIGlzCisgICAgIHBvaW50aW5nIHRvLiAgRmlyc3QgcmVhZCB0aGUgaGVhZGVyIG9mIHRoZSBuZXh0IG1lbWJlciBpZiB0aGlzCisgICAgIGhhcyBub3QgaGFwcGVuZWQgYWxyZWFkeS4gICovCisgIGlmIChyZWYtPnN0YXRlLmFyLmVsZl9hcl9oZHIuYXJfbmFtZSA9PSBOVUxMCisgICAgICAmJiBfX2xpYmVsZl9uZXh0X2FyaGRyIChyZWYpICE9IDApCisgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICBNYXliZSB0aGVyZSBpcyBubyBtZW1iZXIgbGVmdC4gICovCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogV2UgaGF2ZSBhbGwgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgYWJvdXQgdGhlIG5leHQgYXJjaGl2ZSBtZW1iZXIuCisgICAgIE5vdyBjcmVhdGUgYSBkZXNjcmlwdG9yIGZvciBpdC4gICovCisgIHJlc3VsdCA9IHJlYWRfZmlsZSAoZmlsZGVzLCByZWYtPnN0YXRlLmFyLm9mZnNldCArIHNpemVvZiAoc3RydWN0IGFyX2hkciksCisJCSAgICAgIHJlZi0+c3RhdGUuYXIuZWxmX2FyX2hkci5hcl9zaXplLCBjbWQsIHJlZik7CisKKyAgLyogRW5saXN0IHRoaXMgbmV3IGRlc2NyaXB0b3IgaW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4uICAqLworICBpZiAocmVzdWx0ICE9IE5VTEwpCisgICAgeworICAgICAgcmVzdWx0LT5uZXh0ID0gcmVmLT5zdGF0ZS5hci5jaGlsZHJlbjsKKyAgICAgIHJlZi0+c3RhdGUuYXIuY2hpbGRyZW4gPSByZXN1bHQ7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogUmV0dXJuIGRlc3JpcHRvciBmb3IgZW1wdHkgZmlsZSByZWFkeSBmb3Igd3JpdGluZy4gICovCitzdGF0aWMgc3RydWN0IEVsZiAqCit3cml0ZV9maWxlIChpbnQgZmQsIEVsZl9DbWQgY21kKQoreworICAvKiBXZSBzaW1wbHkgY3JlYXRlIGFuIGVtcHR5IGBFbGYnIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIE5TQ05TQUxMT0MJMTAKKyAgRWxmICpyZXN1bHQgPSBhbGxvY2F0ZV9lbGYgKGZkLCBOVUxMLCAwLCAwLCBjbWQsIE5VTEwsIEVMRl9LX0VMRiwKKwkJCSAgICAgIE5TQ05TQUxMT0MgKiBzaXplb2YgKEVsZl9TY24pKTsKKworICBpZiAocmVzdWx0ICE9IE5VTEwpCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byB3cml0ZSB0byB0aGUgZmlsZSBpbiBhbnkgY2FzZS4gICovCisgICAgICByZXN1bHQtPmZsYWdzID0gRUxGX0ZfRElSVFk7CisKKyAgICAgIC8qIFNvbWUgbW9yZSBvciBsZXNzIGFyYml0cmFyeSB2YWx1ZS4gICovCisgICAgICByZXN1bHQtPnN0YXRlLmVsZi5zY25pbmNyID0gTlNDTlNBTExPQzsKKworICAgICAgLyogV2UgaGF2ZSBhbGxvY2F0ZWQgcm9vbSBmb3Igc29tZSBzZWN0aW9ucy4gICovCisgICAgICBhc3NlcnQgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5zY25zKQorCSAgICAgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5zY25zKSk7CisgICAgICByZXN1bHQtPnN0YXRlLmVsZi5zY25zX2xhc3QgPSAmcmVzdWx0LT5zdGF0ZS5lbGYzMi5zY25zOworICAgICAgcmVzdWx0LT5zdGF0ZS5lbGYzMi5zY25zLm1heCA9IE5TQ05TQUxMT0M7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogUmV0dXJuIGEgZGVzY3JpcHRvciBmb3IgdGhlIGZpbGUgYmVsb25naW5nIHRvIEZJTERFUy4gICovCitFbGYgKgorZWxmX2JlZ2luIChmaWxkZXMsIGNtZCwgcmVmKQorICAgICBpbnQgZmlsZGVzOworICAgICBFbGZfQ21kIGNtZDsKKyAgICAgRWxmICpyZWY7Cit7CisgIEVsZiAqcmV0dmFsOworCisgIGlmICghIF9fbGliZWxmX3ZlcnNpb25faW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgLyogVmVyc2lvbiB3YXNuJ3Qgc2V0IHNvIGZhci4gICovCisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9fVkVSU0lPTik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHJlZiAhPSBOVUxMKQorICAgIC8qIE1ha2Ugc3VyZSB0aGUgZGVzY3JpcHRvciBpcyBub3Qgc3VkZGVubHkgZ29pbmcgYXdheS4gICovCisgICAgcndsb2NrX3JkbG9jayAocmVmLT5sb2NrKTsKKyAgZWxzZSBpZiAoZmNudGwgKGZpbGRlcywgRl9HRVRGTCkgPT0gLTEgJiYgZXJybm8gPT0gRUJBREYpCisgICAgeworICAgICAgLyogV2UgY2Fubm90IGRvIGFueXRoaW5nIHByb2R1Y3RpdmUgd2l0aG91dCBhIGZpbGUgZGVzY3JpcHRvci4gICovCisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9GSUxFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgY2FzZSBFTEZfQ19OVUxMOgorICAgICAgLyogV2Ugc2ltcGx5IHJldHVybiBhIE5VTEwgcG9pbnRlci4gICovCisgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRl9DX1JFQURfTU1BUF9QUklWQVRFOgorICAgICAgLyogSWYgd2UgaGF2ZSBhIHJlZmVyZW5jZSBpdCBtdXN0IGFsc28gYmUgb3BlbmVkIHRoaXMgd2F5LiAgKi8KKyAgICAgIGlmIChyZWYgIT0gTlVMTCAmJiByZWYtPmNtZCAhPSBFTEZfQ19SRUFEX01NQVBfUFJJVkFURSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DTUQpOworCSAgcmV0dmFsID0gTlVMTDsKKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisKKyAgICBjYXNlIEVMRl9DX1JFQUQ6CisgICAgY2FzZSBFTEZfQ19SRUFEX01NQVA6CisgICAgICBpZiAocmVmICE9IE5VTEwpCisJLyogRHVwbGljYXRlIHRoZSBkZXNjcmlwdG9yLiAgKi8KKwlyZXR2YWwgPSBkdXBfZWxmIChmaWxkZXMsIGNtZCwgcmVmKTsKKyAgICAgIGVsc2UKKwkvKiBDcmVhdGUgZGVzY3JpcHRvciBmb3IgZXhpc3RpbmcgZmlsZS4gICovCisJcmV0dmFsID0gcmVhZF9maWxlIChmaWxkZXMsIDAsIH4oKHNpemVfdCkgMCksIGNtZCwgTlVMTCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxGX0NfUkRXUjoKKyAgICBjYXNlIEVMRl9DX1JEV1JfTU1BUDoKKyAgICAgIC8qIElmIHdlIGhhdmUgYSBSRUYgb2JqZWN0IGl0IG11c3QgYWxzbyBiZSBvcGVuZWQgdXNpbmcgdGhpcworCSBjb21tYW5kLiAgKi8KKyAgICAgIGlmIChyZWYgIT0gTlVMTCkKKwl7CisJICBpZiAocmVmLT5jbWQgIT0gRUxGX0NfUkRXUiAmJiByZWYtPmNtZCAhPSBFTEZfQ19SRFdSX01NQVAKKwkgICAgICAmJiByZWYtPmNtZCAhPSBFTEZfQ19XUklURSAmJiByZWYtPmNtZCAhPSBFTEZfQ19XUklURV9NTUFQKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBub3Qgb2suICBSRUYgbXVzdCBhbHNvIGJlIG9wZW5lZCBmb3Igd3JpdGluZy4gICovCisJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ01EKTsKKwkgICAgICByZXR2YWwgPSBOVUxMOworCSAgICB9CisJICBlbHNlCisJICAgIC8qIER1cGxpY2F0ZSB0aGlzIGRlc2NyaXB0b3IuICAqLworCSAgICByZXR2YWwgPSBkdXBfZWxmIChmaWxkZXMsIGNtZCwgcmVmKTsKKwl9CisgICAgICBlbHNlCisJLyogQ3JlYXRlIGRlc2NyaXB0b3IgZm9yIGV4aXN0aW5nIGZpbGUuICAqLworCXJldHZhbCA9IHJlYWRfZmlsZSAoZmlsZGVzLCAwLCB+KChzaXplX3QpIDApLCBjbWQsIE5VTEwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRl9DX1dSSVRFOgorICAgIGNhc2UgRUxGX0NfV1JJVEVfTU1BUDoKKyAgICAgIC8qIFdlIGlnbm9yZSBSRUYgYW5kIHByZXBhcmUgYSBkZXNjcmlwdG9yIHRvIHdyaXRlIGEgbmV3IGZpbGUuICAqLworICAgICAgcmV0dmFsID0gd3JpdGVfZmlsZSAoZmlsZGVzLCBjbWQpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ01EKTsKKyAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogUmVsZWFzZSB0aGUgbG9jay4gICovCisgIGlmIChyZWYgIT0gTlVMTCkKKyAgICByd2xvY2tfdW5sb2NrIChyZWYtPmxvY2spOworCisgIHJldHVybiByZXR2YWw7Cit9CitJTlRERUYoZWxmX2JlZ2luKQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9jbG9uZS5jIGIvbGliZWxmL2VsZl9jbG9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNmQyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX2Nsb25lLmMKQEAgLTAsMCArMSw2OSBAQAorLyogQ3JlYXRlIGNsb25lIG9mIGEgZ2l2ZW4gZGVzY3JpcHRvci4KKyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgImxpYmVsZlAuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKworCitFbGYgKgorZWxmX2Nsb25lIChFbGYgKmVsZiwgRWxmX0NtZCBjbWQpCit7CisgIEVsZiAqcmV0dmFsID0gTlVMTDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgLyogU29tZSBlYXJsaWVyIG1pc3Rha2UuICAqLworICAgIHJldHVybiBOVUxMOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgZGVzY3JpcHRvciBpcyBub3Qgc3VkZGVubHkgZ29pbmcgYXdheS4gICovCisgIHJ3bG9ja19yZGxvY2sgKGVsZi0+bG9jayk7CisKKyAgaWYgKGNtZCAhPSBFTEZfQ19FTVBUWSkKKyAgICAvLyBYWFggVE9ETyBoYW5kbGUgRUxGX0NfUkVBRC9XUklURSBldGMKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBhbGxvY2F0ZV9lbGYgKGVsZi0+ZmlsZGVzLCBlbGYtPm1hcF9hZGRyZXNzLCBlbGYtPnN0YXJ0X29mZnNldCwKKwkJCSBlbGYtPm1heGltdW1fc2l6ZSwgZWxmLT5jbWQsIGVsZi0+cGFyZW50LCBlbGYtPmtpbmQsCisJCQkgZWxmLT5zdGF0ZS5lbGYzMi5zY25zLm1heCAqIHNpemVvZiAoRWxmX1NjbikpOworICBpZiAocmV0dmFsICE9IE5VTEwpCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byB3cml0ZSB0byB0aGUgZmlsZSBpbiBhbnkgY2FzZS4gICovCisgICAgICByZXR2YWwtPmZsYWdzID0gRUxGX0ZfRElSVFk7CisKKyAgICAgIC8qIFNvbWUgbW9yZSBvciBsZXNzIGFyYml0cmFyeSB2YWx1ZS4gICovCisgICAgICByZXR2YWwtPnN0YXRlLmVsZi5zY25pbmNyID0gMTA7CisKKyAgICAgIC8qIFdlIGhhdmUgYWxsb2NhdGVkIHJvb20gZm9yIHNvbWUgc2VjdGlvbnMuICAqLworICAgICAgYXNzZXJ0IChvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmMzIuc2NucykKKwkgICAgICA9PSBvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmNjQuc2NucykpOworICAgICAgcmV0dmFsLT5zdGF0ZS5lbGYuc2Nuc19sYXN0ID0gJnJldHZhbC0+c3RhdGUuZWxmMzIuc2NuczsKKyAgICAgIHJldHZhbC0+c3RhdGUuZWxmMzIuc2Nucy5tYXggPSBlbGYtPnN0YXRlLmVsZjMyLnNjbnMubWF4OworCisgICAgICByZXR2YWwtPmNsYXNzID0gZWxmLT5jbGFzczsKKyAgICB9CisKKyAgLyogUmVsZWFzZSB0aGUgbG9jay4gICovCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX2NudGwuYyBiL2xpYmVsZi9lbGZfY250bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTBmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX2NudGwuYwpAQCAtMCwwICsxLDcxIEBACisvKiBDb250cm9sIGFuIEVMRiBmaWxlIGRlc3JjaXB0b3IuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitpbnQKK2VsZl9jbnRsIChlbGYsIGNtZCkKKyAgICAgRWxmICplbGY7CisgICAgIEVsZl9DbWQgY21kOworeworICBpbnQgcmVzdWx0ID0gMDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChlbGYtPmZpbGRlcyA9PSAtMSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOworCisgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICBjYXNlIEVMRl9DX0ZEUkVBRDoKKyAgICAgIC8qIElmIG5vdCBhbGwgb2YgdGhlIGZpbGUgaXMgaW4gdGhlIG1lbW9yeSByZWFkIGl0IG5vdy4gICovCisgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMICYmIF9fbGliZWxmX3JlYWRhbGwgKGVsZikgPT0gTlVMTCkKKwl7CisJICAvKiBXZSB3ZXJlIG5vdCBhYmxlIHRvIHJlYWQgZXZlcnl0aGluZy4gICovCisJICByZXN1bHQgPSAtMTsKKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisKKyAgICBjYXNlIEVMRl9DX0ZERE9ORToKKyAgICAgIC8qIE1hcmsgdGhlIGZpbGUgZGVzY3JpcHRvciBhcyBub3QgdXNhYmxlLiAgKi8KKyAgICAgIGVsZi0+ZmlsZGVzID0gLTE7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DTUQpOworICAgICAgcmVzdWx0ID0gLTE7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9lbmQuYyBiL2xpYmVsZi9lbGZfZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2MjZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGZfZW5kLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBFbGYgZGVzY3JpcHRvci4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworaW50CitlbGZfZW5kIChlbGYpCisgICAgIEVsZiAqZWxmOworeworICBFbGYgKnBhcmVudDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgLyogVGhpcyBpcyBhbGxvd2VkIGFuZCBpcyBhIG5vLW9wLiAgKi8KKyAgICByZXR1cm4gMDsKKworICAvKiBNYWtlIHN1cmUgd2UgYXJlIGFsb25lLiAgKi8KKyAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICBpZiAoZWxmLT5yZWZfY291bnQgIT0gMCAmJiAtLWVsZi0+cmVmX2NvdW50ICE9IDApCisgICAgeworICAgICAgLyogTm90IHlldCB0aGUgbGFzdCBhY3RpdmF0aW9uLiAgKi8KKyAgICAgIGludCByZXN1bHQgPSBlbGYtPnJlZl9jb3VudDsKKyAgICAgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICBpZiAoZWxmLT5raW5kID09IEVMRl9LX0FSKQorICAgIHsKKyAgICAgIC8qIFdlIGNhbm5vdCByZW1vdmUgdGhlIGRlc2NyaXB0b3Igbm93IHNpbmNlIHdlIHN0aWxsIGhhdmUgc29tZQorCSBkZXNjcmlwdG9ycyB3aGljaCBkZXBlbmQgb24gaXQuICBCdXQgd2UgY2FuIGZyZWUgdGhlIGFyY2hpdmUKKwkgc3ltYm9sIHRhYmxlIHNpbmNlIHRoaXMgaXMgb25seSBhdmFpbGFibGUgdmlhIHRoZSBhcmNoaXZlIEVMRgorCSBkZXNjcmlwdG9yLiAgVGhlIGxvbmcgbmFtZSB0YWJsZSBjYW5ub3QgYmUgZnJlZWQgeWV0IHNpbmNlCisJIHRoZSBhcmNoaXZlIGhlYWRlcnMgZm9yIHRoZSBFTEYgZmlsZXMgaW4gdGhlIGFyY2hpdmUgcG9pbnQKKwkgaW50byB0aGlzIGFycmF5LiAgKi8KKyAgICAgIGZyZWUgKGVsZi0+c3RhdGUuYXIuYXJfc3ltKTsKKyAgICAgIGVsZi0+c3RhdGUuYXIuYXJfc3ltID0gTlVMTDsKKworICAgICAgaWYgKGVsZi0+c3RhdGUuYXIuY2hpbGRyZW4gIT0gTlVMTCkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgLyogUmVtb3ZlIHRoaXMgc3RydWN0dXJlIGZyb20gdGhlIGNoaWxkcmVuIGxpc3QuICAqLworICBwYXJlbnQgPSBlbGYtPnBhcmVudDsKKyAgaWYgKHBhcmVudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgdHJpY2t5LiAgTG9jayBtdXN0IGJlIGFjcXVpcmUgZnJvbSB0aGUgZmF0aGVyIHRvCisJIHRoZSBjaGlsZCBidXQgaGVyZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIGNoaWxkIGxvY2suICBXZQorCSBzb2x2ZSB0aGlzIHByb2JsZW0gYnkgZ2l2aW5nIGZyZWUgdGhlIGNoaWxkIGxvY2suICBUaGUKKwkgc3RhdGUgb2YgUkVGX0NPVU5UPT0wIGlzIGhhbmRsZWQgYWxsIG92ZXIgdGhlIGxpYnJhcnksIHNvCisJIHRoaXMgc2hvdWxkIGJlIG9rLiAgKi8KKyAgICAgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisgICAgICByd2xvY2tfcmRsb2NrIChwYXJlbnQtPmxvY2spOworICAgICAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICAgICAgaWYgKHBhcmVudC0+c3RhdGUuYXIuY2hpbGRyZW4gPT0gZWxmKQorCXBhcmVudC0+c3RhdGUuYXIuY2hpbGRyZW4gPSBlbGYtPm5leHQ7CisgICAgICBlbHNlCisJeworCSAgc3RydWN0IEVsZiAqY2hpbGQgPSBwYXJlbnQtPnN0YXRlLmFyLmNoaWxkcmVuOworCisJICB3aGlsZSAoY2hpbGQtPm5leHQgIT0gZWxmKQorCSAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OworCisJICBjaGlsZC0+bmV4dCA9IGVsZi0+bmV4dDsKKwl9CisKKyAgICAgIHJ3bG9ja191bmxvY2sgKHBhcmVudC0+bG9jayk7CisgICAgfQorCisgIC8qIFRoaXMgd2FzIHRoZSBsYXN0IGFjdGl2YXRpb24uICBGcmVlIGFsbCByZXNvdXJjZXMuICAqLworICBzd2l0Y2ggKGVsZi0+a2luZCkKKyAgICB7CisgICAgY2FzZSBFTEZfS19BUjoKKyAgICAgIGlmIChlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXMgIT0gTlVMTCkKKwlmcmVlIChlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRl9LX0VMRjoKKyAgICAgIHsKKwlFbGZfU2NuTGlzdCAqbGlzdCA9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKKwkJCSAgICAgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5zY25zKQorCQkJCSA9PSBvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmNjQuc2NucykpCisJCQkgICAgID8gJmVsZi0+c3RhdGUuZWxmMzIuc2NucworCQkJICAgICA6ICZlbGYtPnN0YXRlLmVsZjY0LnNjbnMpOworCisJZG8KKwkgIHsKKwkgICAgLyogRnJlZSBhbGwgc2VwYXJhdGVseSBhbGxvY2F0ZWQgc2VjdGlvbiBoZWFkZXJzLiAgKi8KKwkgICAgc2l6ZV90IGNudCA9IGxpc3QtPm1heDsKKworCSAgICB3aGlsZSAoY250LS0gPiAwKQorCSAgICAgIHsKKwkJLyogVGhlc2UgcG9pbnRlcnMgY2FuIGJlIE5VTEw7IGl0J3Mgc2FmZSB0byB1c2UKKwkJICAgJ2ZyZWUnIHNpbmNlIGl0IHdpbGwgY2hlY2sgZm9yIHRoaXMuICAqLworCQlFbGZfU2NuICpzY24gPSAmbGlzdC0+ZGF0YVtjbnRdOworCQlFbGZfRGF0YV9MaXN0ICpydW5wOworCisJCWlmICgoc2NuLT5zaGRyX2ZsYWdzICYgRUxGX0ZfTUFMTE9DRUQpICE9IDApCisJCSAgLyogSXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggcG9pbnRlci4gICovCisJCSAgZnJlZSAoc2NuLT5zaGRyLmUzMik7CisKKwkJLyogSWYgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIGJ5dGUgb3JkZXIgYW5kIHRoZQorCQkgICBhcmNoaXRlY3R1cmUgZG9lc24ndCByZXF1aXJlIG92ZXJseSBzdHJpbmdlbnQKKwkJICAgYWxpZ25tZW50IHRoZSByYXcgZGF0YSBidWZmZXIgaXMgdGhlIHNhbWUgYXMgdGhlCisJCSAgIG9uZSB1c2VkIGZvciBwcmVzZW50aW5nIHRvIHRoZSBjYWxsZXIuICAqLworCQlpZiAoc2NuLT5kYXRhX2Jhc2UgIT0gc2NuLT5yYXdkYXRhX2Jhc2UpCisJCSAgZnJlZSAoc2NuLT5kYXRhX2Jhc2UpOworCisJCS8qIFRoZSBzZWN0aW9uIGRhdGEgaXMgYWxsb2NhdGVkIGlmIHdlIGNvdWxkbid0IG1tYXAKKwkJICAgdGhlIGZpbGUuICAqLworCQlpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMKQorCQkgIGZyZWUgKHNjbi0+cmF3ZGF0YV9iYXNlKTsKKworCQkvKiBGcmVlIHRoZSBsaXN0IG9mIGRhdGEgYnVmZmVycyBmb3IgdGhlIHNlY3Rpb24uCisJCSAgIFdlIGRvbid0IGZyZWUgdGhlIGJ1ZmZlcnMgdGhlbXNlbHZlcyBzaW5jZSB0aGlzCisJCSAgIGlzIHRoZSB1c2VycyBqb2IuICAqLworCQlydW5wID0gc2NuLT5kYXRhX2xpc3QubmV4dDsKKwkJd2hpbGUgKHJ1bnAgIT0gTlVMTCkKKwkJICB7CisJCSAgICBFbGZfRGF0YV9MaXN0ICpvbGRwID0gcnVucDsKKwkJICAgIHJ1bnAgPSBydW5wLT5uZXh0OworCQkgICAgaWYgKChvbGRwLT5mbGFncyAmIEVMRl9GX01BTExPQ0VEKSAhPSAwKQorCQkgICAgICBmcmVlIChvbGRwKTsKKwkJICB9CisJICAgICAgfQorCisJICAgIC8qIEZyZWUgdGhlIG1lbW9yeSBmb3IgdGhlIGFycmF5LiAgKi8KKwkgICAgRWxmX1Njbkxpc3QgKm9sZHAgPSBsaXN0OworCSAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKwkgICAgYXNzZXJ0IChsaXN0ID09IE5VTEwgfHwgb2xkcC0+Y250ID09IG9sZHAtPm1heCk7CisJICAgIGlmIChvbGRwICE9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKKwkJCSB8fCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCisJCQkgICAgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5zY25zKSkKKwkJCSA/ICZlbGYtPnN0YXRlLmVsZjMyLnNjbnMKKwkJCSA6ICZlbGYtPnN0YXRlLmVsZjY0LnNjbnMpKQorCSAgICAgIGZyZWUgKG9sZHApOworCSAgfQorCXdoaWxlIChsaXN0ICE9IE5VTEwpOworICAgICAgfQorCisgICAgICAvKiBGcmVlIHRoZSBzZWN0aW9uIGhlYWRlci4gICovCisgICAgICBpZiAoZWxmLT5zdGF0ZS5lbGYuc2hkcl9tYWxsb2NlZCAgIT0gMCkKKwlmcmVlIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKKwkgICAgICB8fCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLnNoZHIpCisJCSAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LnNoZHIpKQorCSAgICAgID8gKHZvaWQgKikgZWxmLT5zdGF0ZS5lbGYzMi5zaGRyCisJICAgICAgOiAodm9pZCAqKSBlbGYtPnN0YXRlLmVsZjY0LnNoZHIpOworCisgICAgICAvKiBGcmVlIHRoZSBwcm9ncmFtIGhlYWRlci4gICovCisgICAgICBpZiAoKGVsZi0+c3RhdGUuZWxmLnBoZHJfZmxhZ3MgJiBFTEZfRl9NQUxMT0NFRCkgIT0gMCkKKwlmcmVlIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKKwkgICAgICB8fCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLnBoZHIpCisJCSAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LnBoZHIpKQorCSAgICAgID8gKHZvaWQgKikgZWxmLT5zdGF0ZS5lbGYzMi5waGRyCisJICAgICAgOiAodm9pZCAqKSBlbGYtPnN0YXRlLmVsZjY0LnBoZHIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChlbGYtPm1hcF9hZGRyZXNzICE9IE5VTEwgJiYgcGFyZW50ID09IE5VTEwpCisgICAgeworICAgICAgLyogVGhlIGZpbGUgd2FzIHJlYWQgb3IgbWFwcGVkIGZvciB0aGlzIGRlc2NyaXB0b3IuICAqLworICAgICAgaWYgKChlbGYtPmZsYWdzICYgRUxGX0ZfTUFMTE9DRUQpICE9IDApCisJZnJlZSAoZWxmLT5tYXBfYWRkcmVzcyk7CisgICAgICBlbHNlIGlmICgoZWxmLT5mbGFncyAmIEVMRl9GX01NQVBQRUQpICE9IDApCisJbXVubWFwIChlbGYtPm1hcF9hZGRyZXNzLCBlbGYtPm1heGltdW1fc2l6ZSk7CisgICAgfQorCisgIHJ3bG9ja19maW5pIChlbGYtPmxvY2spOworCisgIC8qIEZpbmFsbHkgdGhlIGRlc2NyaXB0b3IgaXRzZWxmLiAgKi8KKyAgZnJlZSAoZWxmKTsKKworICByZXR1cm4gKHBhcmVudCAhPSBOVUxMICYmIHBhcmVudC0+cmVmX2NvdW50ID09IDAKKwkgID8gSU5UVVNFKGVsZl9lbmQpIChwYXJlbnQpIDogMCk7Cit9CitJTlRERUYoZWxmX2VuZCkKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfZXJyb3IuYyBiL2xpYmVsZi9lbGZfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjhjZTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9lcnJvci5jCkBAIC0wLDAgKzEsMzY2IEBACisvKiBFcnJvciBoYW5kbGluZyBpbiBsaWJlbGYuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKKyNpZmRlZiBVU0VfVExTCisvKiBUaGUgZXJyb3IgbnVtYmVyLiAgKi8KK3N0YXRpYyBfX3RocmVhZCBpbnQgZ2xvYmFsX2Vycm9yOworI2Vsc2UKKy8qIFRoaXMgaXMgdGhlIGtleSBmb3IgdGhlIHRocmVhZCBzcGVjaWZpYyBtZW1vcnkuICAqLworc3RhdGljIHRsc19rZXlfdCBrZXk7CisKKy8qIFRoZSBlcnJvciBudW1iZXIuICBVc2VkIGluIG5vbi10aHJlYWRlZCBwcm9ncmFtcy4gICovCitzdGF0aWMgaW50IGdsb2JhbF9lcnJvcjsKK3N0YXRpYyBib29sIHRocmVhZGVkOworLyogV2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCitvbmNlX2RlZmluZSAoc3RhdGljLCBvbmNlKTsKKworLyogVGhlIGluaXRpYWxpemF0aW9uIGFuZCBkZXN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworc3RhdGljIHZvaWQgaW5pdCAodm9pZCk7CitzdGF0aWMgdm9pZCBmcmVlX2tleV9tZW0gKHZvaWQgKm1lbSk7CisjZW5kaWYJLyogVExTICovCisKKworaW50CitlbGZfZXJybm8gKHZvaWQpCit7CisgIGludCByZXN1bHQ7CisKKyNpZm5kZWYgVVNFX1RMUworICAvKiBJZiB3ZSBoYXZlIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgdGhlIGJ1ZmZlciBkbyBpdCBub3cuICAqLworICBvbmNlX2V4ZWN1dGUgKG9uY2UsIGluaXQpOworCisgIGlmICh0aHJlYWRlZCkKKyAgICB7CisgICAgLyogV2UgZG8gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRhdGEuICBJdCBpcyBvbmx5IGEgd29yZC4KKyAgICAgICBXZSBjYW4gc3RvcmUgaXQgaW4gcGxhY2Ugb2YgdGhlIHBvaW50ZXIuICAqLworICAgICAgcmVzdWx0ID0gKGludHB0cl90KSBnZXRzcGVjaWZpYyAoa2V5KTsKKworICAgICAgc2V0c3BlY2lmaWMgKGtleSwgKHZvaWQgKikgKGludHB0cl90KSBFTEZfRV9OT0VSUk9SKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorI2VuZGlmCS8qIFRMUyAqLworCisgIHJlc3VsdCA9IGdsb2JhbF9lcnJvcjsKKyAgZ2xvYmFsX2Vycm9yID0gRUxGX0VfTk9FUlJPUjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG1lc3NhZ2UgZm9yIHRoZSBlcnJvci4gICovCitzdGF0aWMgY29uc3QgY2hhciBtc2dzdHJbXSA9Cit7CisjZGVmaW5lIEVMRl9FX05PRVJST1JfSURYIDAKKyAgTl8oIm5vIGVycm9yIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9VTktOT1dOX0VSUk9SX0lEWCAoRUxGX0VfTk9FUlJPUl9JRFggKyBzaXplb2YgIm5vIGVycm9yIikKKyAgTl8oInVua25vd24gZXJyb3IiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX1VOS05PV05fVkVSU0lPTl9JRFggXAorICAoRUxGX0VfVU5LTk9XTl9FUlJPUl9JRFggKyBzaXplb2YgInVua25vd24gZXJyb3IiKQorICBOXygidW5rbm93biB2ZXJzaW9uIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9VTktOT1dOX1RZUEVfSURYIFwKKyAgKEVMRl9FX1VOS05PV05fVkVSU0lPTl9JRFggKyBzaXplb2YgInVua25vd24gdmVyc2lvbiIpCisgIE5fKCJ1bmtub3duIHR5cGUiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX0lOVkFMSURfSEFORExFX0lEWCBcCisgIChFTEZfRV9VTktOT1dOX1RZUEVfSURYICsgc2l6ZW9mICJ1bmtub3duIHR5cGUiKQorICBOXygiaW52YWxpZCBgRWxmJyBoYW5kbGUiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX1NPVVJDRV9TSVpFX0lEWCBcCisgIChFTEZfRV9JTlZBTElEX0hBTkRMRV9JRFggKyBzaXplb2YgImludmFsaWQgYEVsZicgaGFuZGxlIikKKyAgTl8oImludmFsaWQgc2l6ZSBvZiBzb3VyY2Ugb3BlcmFuZCIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfREVTVF9TSVpFX0lEWCBcCisgIChFTEZfRV9TT1VSQ0VfU0laRV9JRFggKyBzaXplb2YgImludmFsaWQgc2l6ZSBvZiBzb3VyY2Ugb3BlcmFuZCIpCisgIE5fKCJpbnZhbGlkIHNpemUgb2YgZGVzdGluYXRpb24gb3BlcmFuZCIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfSU5WQUxJRF9FTkNPRElOR19JRFggXAorICAoRUxGX0VfREVTVF9TSVpFX0lEWCArIHNpemVvZiAiaW52YWxpZCBzaXplIG9mIGRlc3RpbmF0aW9uIG9wZXJhbmQiKQorICBOXygiaW52YWxpZCBlbmNvZGluZyIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfTk9NRU1fSURYIFwKKyAgKEVMRl9FX0lOVkFMSURfRU5DT0RJTkdfSURYICsgc2l6ZW9mICJpbnZhbGlkIGVuY29kaW5nIikKKyAgTl8oIm91dCBvZiBtZW1vcnkiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX0lOVkFMSURfRklMRV9JRFggXAorICAoRUxGX0VfTk9NRU1fSURYICsgc2l6ZW9mICJvdXQgb2YgbWVtb3J5IikKKyAgTl8oImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9JTlZBTElEX09QX0lEWCBcCisgIChFTEZfRV9JTlZBTElEX0ZJTEVfSURYICsgc2l6ZW9mICJpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciIpCisgIE5fKCJpbnZhbGlkIG9wZXJhdGlvbiIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfTk9fVkVSU0lPTl9JRFggXAorICAoRUxGX0VfSU5WQUxJRF9PUF9JRFggKyBzaXplb2YgImludmFsaWQgb3BlcmF0aW9uIikKKyAgTl8oIkVMRiB2ZXJzaW9uIG5vdCBzZXQiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX0lOVkFMSURfQ01EX0lEWCBcCisgIChFTEZfRV9OT19WRVJTSU9OX0lEWCArIHNpemVvZiAiRUxGIHZlcnNpb24gbm90IHNldCIpCisgIE5fKCJpbnZhbGlkIGNvbW1hbmQiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX1JBTkdFX0lEWCBcCisgIChFTEZfRV9JTlZBTElEX0NNRF9JRFggKyBzaXplb2YgImludmFsaWQgY29tbWFuZCIpCisgIE5fKCJvZmZzZXQgb3V0IG9mIHJhbmdlIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9BUkNISVZFX0ZNQUdfSURYIFwKKyAgKEVMRl9FX1JBTkdFX0lEWCArIHNpemVvZiAib2Zmc2V0IG91dCBvZiByYW5nZSIpCisgIE5fKCJpbnZhbGlkIGZtYWcgZmllbGQgaW4gYXJjaGl2ZSBoZWFkZXIiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX0lOVkFMSURfQVJDSElWRV9JRFggXAorICAoRUxGX0VfQVJDSElWRV9GTUFHX0lEWCArIHNpemVvZiAiaW52YWxpZCBmbWFnIGZpZWxkIGluIGFyY2hpdmUgaGVhZGVyIikKKyAgTl8oImludmFsaWQgYXJjaGl2ZSBmaWxlIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9OT19BUkNISVZFX0lEWCBcCisgIChFTEZfRV9JTlZBTElEX0FSQ0hJVkVfSURYICsgc2l6ZW9mICJpbnZhbGlkIGFyY2hpdmUgZmlsZSIpCisgIE5fKCJkZXNjcmlwdG9yIGlzIG5vdCBmb3IgYW4gYXJjaGl2ZSIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfTk9fSU5ERVhfSURYIFwKKyAgKEVMRl9FX05PX0FSQ0hJVkVfSURYICsgc2l6ZW9mICJkZXNjcmlwdG9yIGlzIG5vdCBmb3IgYW4gYXJjaGl2ZSIpCisgIE5fKCJubyBpbmRleCBhdmFpbGFibGUiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX1JFQURfRVJST1JfSURYIFwKKyAgKEVMRl9FX05PX0lOREVYX0lEWCArIHNpemVvZiAibm8gaW5kZXggYXZhaWxhYmxlIikKKyAgTl8oImNhbm5vdCByZWFkIGRhdGEgZnJvbSBmaWxlIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9XUklURV9FUlJPUl9JRFggXAorICAoRUxGX0VfUkVBRF9FUlJPUl9JRFggKyBzaXplb2YgImNhbm5vdCByZWFkIGRhdGEgZnJvbSBmaWxlIikKKyAgTl8oImNhbm5vdCB3cml0ZSBkYXRhIHRvIGZpbGUiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX0lOVkFMSURfQ0xBU1NfSURYIFwKKyAgKEVMRl9FX1dSSVRFX0VSUk9SX0lEWCArIHNpemVvZiAiY2Fubm90IHdyaXRlIGRhdGEgdG8gZmlsZSIpCisgIE5fKCJpbnZhbGlkIGJpbmFyeSBjbGFzcyIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfSU5WQUxJRF9JTkRFWF9JRFggXAorICAoRUxGX0VfSU5WQUxJRF9DTEFTU19JRFggKyBzaXplb2YgImludmFsaWQgYmluYXJ5IGNsYXNzIikKKyAgTl8oImludmFsaWQgc2VjdGlvbiBpbmRleCIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfSU5WQUxJRF9PUEVSQU5EX0lEWCBcCisgIChFTEZfRV9JTlZBTElEX0lOREVYX0lEWCArIHNpemVvZiAiaW52YWxpZCBzZWN0aW9uIGluZGV4IikKKyAgTl8oImludmFsaWQgb3BlcmFuZCIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0lEWCBcCisgIChFTEZfRV9JTlZBTElEX09QRVJBTkRfSURYICsgc2l6ZW9mICJpbnZhbGlkIG9wZXJhbmQiKQorICBOXygiaW52YWxpZCBzZWN0aW9uIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9JTlZBTElEX0NPTU1BTkRfSURYIFwKKyAgKEVMRl9FX0lOVkFMSURfU0VDVElPTl9JRFggKyBzaXplb2YgImludmFsaWQgc2VjdGlvbiIpCisgIE5fKCJpbnZhbGlkIGNvbW1hbmQiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX1dST05HX09SREVSX0VIRFJfSURYIFwKKyAgKEVMRl9FX0lOVkFMSURfQ09NTUFORF9JRFggKyBzaXplb2YgImludmFsaWQgY29tbWFuZCIpCisgIE5fKCJleGVjdXRhYmxlIGhlYWRlciBub3QgY3JlYXRlZCBmaXJzdCIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfRkRfRElTQUJMRURfSURYIFwKKyAgKEVMRl9FX1dST05HX09SREVSX0VIRFJfSURYICsgc2l6ZW9mICJleGVjdXRhYmxlIGhlYWRlciBub3QgY3JlYXRlZCBmaXJzdCIpCisgIE5fKCJmaWxlIGRlc2NyaXB0b3IgZGlzYWJsZWQiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX0ZEX01JU01BVENIX0lEWCBcCisgIChFTEZfRV9GRF9ESVNBQkxFRF9JRFggKyBzaXplb2YgImZpbGUgZGVzY3JpcHRvciBkaXNhYmxlZCIpCisgIE5fKCJhcmNoaXZlL21lbWJlciBmaWxkZXMgbWlzbWF0Y2giKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX09GRlNFVF9SQU5HRV9JRFggXAorICAoRUxGX0VfRkRfTUlTTUFUQ0hfSURYICsgc2l6ZW9mICJhcmNoaXZlL21lbWJlciBmaWxkZXMgbWlzbWF0Y2giKQorICBOXygib2Zmc2V0IG91dCBvZiByYW5nZSIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfTk9UX05VTF9TRUNUSU9OX0lEWCBcCisgIChFTEZfRV9PRkZTRVRfUkFOR0VfSURYICsgc2l6ZW9mICJvZmZzZXQgb3V0IG9mIHJhbmdlIikKKyAgTl8oImNhbm5vdCBtYW5pcHVsYXRlIG51bGwgc2VjdGlvbiIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfREFUQV9NSVNNQVRDSF9JRFggXAorICAoRUxGX0VfTk9UX05VTF9TRUNUSU9OX0lEWCArIHNpemVvZiAiY2Fubm90IG1hbmlwdWxhdGUgbnVsbCBzZWN0aW9uIikKKyAgTl8oImRhdGEvc2NuIG1pc21hdGNoIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSX0lEWCBcCisgIChFTEZfRV9EQVRBX01JU01BVENIX0lEWCArIHNpemVvZiAiZGF0YS9zY24gbWlzbWF0Y2giKQorICBOXygiaW52YWxpZCBzZWN0aW9uIGhlYWRlciIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfSU5WQUxJRF9EQVRBX0lEWCBcCisgIChFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSX0lEWCArIHNpemVvZiAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciIpCisgIE5fKCJpbnZhbGlkIGRhdGEiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX0RBVEFfRU5DT0RJTkdfSURYIFwKKyAgKEVMRl9FX0lOVkFMSURfREFUQV9JRFggKyBzaXplb2YgImludmFsaWQgZGF0YSIpCisgIE5fKCJ1bmtub3duIGRhdGEgZW5jb2RpbmciKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX1NFQ1RJT05fVE9PX1NNQUxMX0lEWCBcCisgIChFTEZfRV9EQVRBX0VOQ09ESU5HX0lEWCArIHNpemVvZiAidW5rbm93biBkYXRhIGVuY29kaW5nIikKKyAgTl8oInNlY3Rpb24gYHNoX3NpemUnIHRvbyBzbWFsbCBmb3IgZGF0YSIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfSU5WQUxJRF9BTElHTl9JRFggXAorICAoRUxGX0VfU0VDVElPTl9UT09fU01BTExfSURYICsgc2l6ZW9mICJzZWN0aW9uIGBzaF9zaXplJyB0b28gc21hbGwgZm9yIGRhdGEiKQorICBOXygiaW52YWxpZCBzZWN0aW9uIGFsaWdubWVudCIpCisgICJcMCIKKyNkZWZpbmUgRUxGX0VfSU5WQUxJRF9TSEVOVFNJWkVfSURYIFwKKyAgKEVMRl9FX0lOVkFMSURfQUxJR05fSURYICsgc2l6ZW9mICJpbnZhbGlkIHNlY3Rpb24gYWxpZ25tZW50IikKKyAgTl8oImludmFsaWQgc2VjdGlvbiBlbnRyeSBzaXplIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9VUERBVEVfUk9fSURYIFwKKyAgKEVMRl9FX0lOVkFMSURfU0hFTlRTSVpFX0lEWCArIHNpemVvZiAiaW52YWxpZCBzZWN0aW9uIGVudHJ5IHNpemUiKQorICBOXygidXBkYXRlKCkgZm9yIHdyaXRlIG9uIHJlYWQtb25seSBmaWxlIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9OT0ZJTEVfSURYIFwKKyAgKEVMRl9FX1VQREFURV9ST19JRFggKyBzaXplb2YgInVwZGF0ZSgpIGZvciB3cml0ZSBvbiByZWFkLW9ubHkgZmlsZSIpCisgIE5fKCJubyBzdWNoIGZpbGUiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX0dST1VQX05PVF9SRUxfSURYIFwKKyAgKEVMRl9FX05PRklMRV9JRFggKyBzaXplb2YgIm5vIHN1Y2ggZmlsZSIpCisgIE5fKCJvbmx5IHJlbG9jYXRhYmxlIGZpbGVzIGNhbiBjb250YWluIHNlY3Rpb24gZ3JvdXBzIikKKyAgIlwwIgorI2RlZmluZSBFTEZfRV9JTlZBTElEX1BIRFJfSURYIFwKKyAgKEVMRl9FX0dST1VQX05PVF9SRUxfSURYIFwKKyAgICsgc2l6ZW9mICJvbmx5IHJlbG9jYXRhYmxlIGZpbGVzIGNhbiBjb250YWluIHNlY3Rpb24gZ3JvdXBzIikKKyAgTl8oInByb2dyYW0gaGVhZGVyIG9ubHkgYWxsb3dlZCBpbiBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIG9iamVjdHMiKQorICAiXDAiCisjZGVmaW5lIEVMRl9FX05PX1BIRFJfSURYIFwKKyAgKEVMRl9FX0lOVkFMSURfUEhEUl9JRFggXAorICAgKyBzaXplb2YgInByb2dyYW0gaGVhZGVyIG9ubHkgYWxsb3dlZCBpbiBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIG9iamVjdHMiKQorICBOXygiZmlsZSBoYXMgbm8gcHJvZ3JhbSBoZWFkZXIiKQorfTsKKworCitzdGF0aWMgY29uc3QgdWludF9mYXN0MTZfdCBtc2dpZHhbRUxGX0VfTlVNXSA9Cit7CisgIFtFTEZfRV9OT0VSUk9SXSA9IEVMRl9FX05PRVJST1JfSURYLAorICBbRUxGX0VfVU5LTk9XTl9FUlJPUl0gPSBFTEZfRV9VTktOT1dOX0VSUk9SX0lEWCwKKyAgW0VMRl9FX1VOS05PV05fVkVSU0lPTl0gPSBFTEZfRV9VTktOT1dOX1ZFUlNJT05fSURYLAorICBbRUxGX0VfVU5LTk9XTl9UWVBFXSA9IEVMRl9FX1VOS05PV05fVFlQRV9JRFgsCisgIFtFTEZfRV9JTlZBTElEX0hBTkRMRV0gPSBFTEZfRV9JTlZBTElEX0hBTkRMRV9JRFgsCisgIFtFTEZfRV9TT1VSQ0VfU0laRV0gPSBFTEZfRV9TT1VSQ0VfU0laRV9JRFgsCisgIFtFTEZfRV9ERVNUX1NJWkVdID0gRUxGX0VfREVTVF9TSVpFX0lEWCwKKyAgW0VMRl9FX0lOVkFMSURfRU5DT0RJTkddID0gRUxGX0VfSU5WQUxJRF9FTkNPRElOR19JRFgsCisgIFtFTEZfRV9OT01FTV0gPSBFTEZfRV9OT01FTV9JRFgsCisgIFtFTEZfRV9JTlZBTElEX0ZJTEVdID0gRUxGX0VfSU5WQUxJRF9GSUxFX0lEWCwKKyAgW0VMRl9FX0lOVkFMSURfT1BdID0gRUxGX0VfSU5WQUxJRF9PUF9JRFgsCisgIFtFTEZfRV9OT19WRVJTSU9OXSA9IEVMRl9FX05PX1ZFUlNJT05fSURYLAorICBbRUxGX0VfSU5WQUxJRF9DTURdID0gRUxGX0VfSU5WQUxJRF9DTURfSURYLAorICBbRUxGX0VfUkFOR0VdID0gRUxGX0VfUkFOR0VfSURYLAorICBbRUxGX0VfQVJDSElWRV9GTUFHXSA9IEVMRl9FX0FSQ0hJVkVfRk1BR19JRFgsCisgIFtFTEZfRV9JTlZBTElEX0FSQ0hJVkVdID0gRUxGX0VfSU5WQUxJRF9BUkNISVZFX0lEWCwKKyAgW0VMRl9FX05PX0FSQ0hJVkVdID0gRUxGX0VfTk9fQVJDSElWRV9JRFgsCisgIFtFTEZfRV9OT19JTkRFWF0gPSBFTEZfRV9OT19JTkRFWF9JRFgsCisgIFtFTEZfRV9SRUFEX0VSUk9SXSA9IEVMRl9FX1JFQURfRVJST1JfSURYLAorICBbRUxGX0VfV1JJVEVfRVJST1JdID0gRUxGX0VfV1JJVEVfRVJST1JfSURYLAorICBbRUxGX0VfSU5WQUxJRF9DTEFTU10gPSBFTEZfRV9JTlZBTElEX0NMQVNTX0lEWCwKKyAgW0VMRl9FX0lOVkFMSURfSU5ERVhdID0gRUxGX0VfSU5WQUxJRF9JTkRFWF9JRFgsCisgIFtFTEZfRV9JTlZBTElEX09QRVJBTkRdID0gRUxGX0VfSU5WQUxJRF9PUEVSQU5EX0lEWCwKKyAgW0VMRl9FX0lOVkFMSURfU0VDVElPTl0gPSBFTEZfRV9JTlZBTElEX1NFQ1RJT05fSURYLAorICBbRUxGX0VfSU5WQUxJRF9DT01NQU5EXSA9IEVMRl9FX0lOVkFMSURfQ09NTUFORF9JRFgsCisgIFtFTEZfRV9XUk9OR19PUkRFUl9FSERSXSA9IEVMRl9FX1dST05HX09SREVSX0VIRFJfSURYLAorICBbRUxGX0VfRkRfRElTQUJMRURdID0gRUxGX0VfRkRfRElTQUJMRURfSURYLAorICBbRUxGX0VfRkRfTUlTTUFUQ0hdID0gRUxGX0VfRkRfTUlTTUFUQ0hfSURYLAorICBbRUxGX0VfT0ZGU0VUX1JBTkdFXSA9IEVMRl9FX09GRlNFVF9SQU5HRV9JRFgsCisgIFtFTEZfRV9OT1RfTlVMX1NFQ1RJT05dID0gRUxGX0VfTk9UX05VTF9TRUNUSU9OX0lEWCwKKyAgW0VMRl9FX0RBVEFfTUlTTUFUQ0hdID0gRUxGX0VfREFUQV9NSVNNQVRDSF9JRFgsCisgIFtFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSXSA9IEVMRl9FX0lOVkFMSURfU0VDVElPTl9IRUFERVJfSURYLAorICBbRUxGX0VfSU5WQUxJRF9EQVRBXSA9IEVMRl9FX0lOVkFMSURfREFUQV9JRFgsCisgIFtFTEZfRV9EQVRBX0VOQ09ESU5HXSA9IEVMRl9FX0RBVEFfRU5DT0RJTkdfSURYLAorICBbRUxGX0VfU0VDVElPTl9UT09fU01BTExdID0gRUxGX0VfU0VDVElPTl9UT09fU01BTExfSURYLAorICBbRUxGX0VfSU5WQUxJRF9BTElHTl0gPSBFTEZfRV9JTlZBTElEX0FMSUdOX0lEWCwKKyAgW0VMRl9FX0lOVkFMSURfU0hFTlRTSVpFXSA9IEVMRl9FX0lOVkFMSURfU0hFTlRTSVpFX0lEWCwKKyAgW0VMRl9FX1VQREFURV9ST10gPSBFTEZfRV9VUERBVEVfUk9fSURYLAorICBbRUxGX0VfTk9GSUxFXSA9IEVMRl9FX05PRklMRV9JRFgsCisgIFtFTEZfRV9HUk9VUF9OT1RfUkVMXSA9IEVMRl9FX0dST1VQX05PVF9SRUxfSURYLAorICBbRUxGX0VfSU5WQUxJRF9QSERSXSA9IEVMRl9FX0lOVkFMSURfUEhEUl9JRFgsCisgIFtFTEZfRV9OT19QSERSXSA9IEVMRl9FX05PX1BIRFJfSURYCit9OworI2RlZmluZSBubXNnaWR4ICgoaW50KSAoc2l6ZW9mIChtc2dpZHgpIC8gc2l6ZW9mIChtc2dpZHhbMF0pKSkKKworCit2b2lkCitfX2xpYmVsZl9zZXRlcnJubyAodmFsdWUpCisgICAgIGludCB2YWx1ZTsKK3sKKyNpZm5kZWYgVVNFX1RMUworICAvKiBJZiB3ZSBoYXZlIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgdGhlIGJ1ZmZlciBkbyBpdCBub3cuICAqLworICBvbmNlX2V4ZWN1dGUgKG9uY2UsIGluaXQpOworCisgIGlmICh0aHJlYWRlZCkKKyAgICAvKiBXZSBkbyBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGF0YS4gIEl0IGlzIG9ubHkgYSB3b3JkLgorICAgICAgIFdlIGNhbiBzdG9yZSBpdCBpbiBwbGFjZSBvZiB0aGUgcG9pbnRlci4gICovCisgICAgc2V0c3BlY2lmaWMgKGtleSwgKHZvaWQgKikgKGludHB0cl90KSB2YWx1ZSk7CisjZW5kaWYJLyogVExTICovCisKKyAgZ2xvYmFsX2Vycm9yID0gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8IG5tc2dpZHggPyB2YWx1ZSA6IEVMRl9FX1VOS05PV05fRVJST1I7Cit9CisKKworY29uc3QgY2hhciAqCitlbGZfZXJybXNnIChlcnJvcikKKyAgICAgaW50IGVycm9yOworeworICBpbnQgbGFzdF9lcnJvcjsKKworI2lmbmRlZiBVU0VfVExTCisgIC8qIElmIHdlIGhhdmUgbm90IHlldCBpbml0aWFsaXplZCB0aGUgYnVmZmVyIGRvIGl0IG5vdy4gICovCisgIG9uY2VfZXhlY3V0ZSAob25jZSwgaW5pdCk7CisKKyAgaWYgKChlcnJvciA9PSAwIHx8IGVycm9yID09IC0xKSAmJiB0aHJlYWRlZCkKKyAgICAvKiBXZSBkbyBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGF0YS4gIEl0IGlzIG9ubHkgYSB3b3JkLgorICAgICAgIFdlIGNhbiBzdG9yZSBpdCBpbiBwbGFjZSBvZiB0aGUgcG9pbnRlci4gICovCisgICAgbGFzdF9lcnJvciA9IChpbnRwdHJfdCkgZ2V0c3BlY2lmaWMgKGtleSk7CisgIGVsc2UKKyNlbmRpZgkvKiBUTFMgKi8KKyAgICBsYXN0X2Vycm9yID0gZ2xvYmFsX2Vycm9yOworCisgIGlmIChlcnJvciA9PSAwKQorICAgIHsKKyAgICAgIGFzc2VydCAobXNnaWR4W2xhc3RfZXJyb3JdIDwgc2l6ZW9mIChtc2dzdHIpKTsKKyAgICAgIHJldHVybiBsYXN0X2Vycm9yICE9IDAgPyBfKG1zZ3N0ciArIG1zZ2lkeFtsYXN0X2Vycm9yXSkgOiBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAoZXJyb3IgPCAtMSB8fCBlcnJvciA+PSBubXNnaWR4KQorICAgIHJldHVybiBfKG1zZ3N0ciArIEVMRl9FX1VOS05PV05fRVJST1JfSURYKTsKKworICBhc3NlcnQgKG1zZ2lkeFtlcnJvciA9PSAtMSA/IGxhc3RfZXJyb3IgOiBlcnJvcl0gPCBzaXplb2YgKG1zZ3N0cikpOworICByZXR1cm4gXyhtc2dzdHIgKyBtc2dpZHhbZXJyb3IgPT0gLTEgPyBsYXN0X2Vycm9yIDogZXJyb3JdKTsKK30KKworCisjaWZuZGVmIFVTRV9UTFMKKy8qIEZyZWUgdGhlIHRocmVhZCBzcGVjaWZpYyBkYXRhLCB0aGlzIGlzIGRvbmUgaWYgYSB0aHJlYWQgdGVybWluYXRlcy4gICovCitzdGF0aWMgdm9pZAorZnJlZV9rZXlfbWVtICh2b2lkICptZW0gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBzZXRzcGVjaWZpYyAoa2V5LCBOVUxMKTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBrZXkgZm9yIHRoZSBnbG9iYWwgdmFyaWFibGUuICAqLworc3RhdGljIHZvaWQKK2luaXQgKHZvaWQpCit7CisgIC8vIFhYWCBTY3JldyB5b3UsIGdjYzQsIHRoZSB1bnVzZWQgZnVuY3Rpb24gYXR0cmlidXRlIGRvZXMgbm90IHdvcmsuCisgIF9fYXNtICgiIiA6OiAiciIgKGZyZWVfa2V5X21lbSkpOworCisgIGlmIChrZXlfY3JlYXRlICgma2V5LCBmcmVlX2tleV9tZW0pID09IDApCisgICAgLyogQ3JlYXRpbmcgdGhlIGtleSBzdWNjZWVkZWQuICAqLworICAgIHRocmVhZGVkID0gdHJ1ZTsKK30KKyNlbmRpZgkvKiBUTFMgKi8KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfZmlsbC5jIGIvbGliZWxmL2VsZl9maWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5Y2M3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGZfZmlsbC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIFNldCBmaWxsIGJ5dGUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyBFTEYgb2JqZWN0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2ludCBfX2xpYmVsZl9maWxsX2J5dGU7CisKKwordm9pZAorZWxmX2ZpbGwgKGZpbGwpCisgICAgIGludCBmaWxsOworeworICBfX2xpYmVsZl9maWxsX2J5dGUgPSBmaWxsOworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9mbGFnZGF0YS5jIGIvbGliZWxmL2VsZl9mbGFnZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTkxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX2ZsYWdkYXRhLmMKQEAgLTAsMCArMSw1OSBAQAorLyogTWFuaXB1bGF0ZSBFTEYgZGF0YSBmbGFnLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKwordW5zaWduZWQgaW50CitlbGZfZmxhZ2RhdGEgKGRhdGEsIGNtZCwgZmxhZ3MpCisgICAgIEVsZl9EYXRhICpkYXRhOworICAgICBFbGZfQ21kIGNtZDsKKyAgICAgdW5zaWduZWQgaW50IGZsYWdzOworeworICBFbGZfRGF0YV9TY24gKmRhdGFfc2NuOworICB1bnNpZ25lZCBpbnQgcmVzdWx0OworCisgIGlmIChkYXRhID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7CisKKyAgaWYgKGRhdGFfc2NuID09IE5VTEwgfHwgdW5saWtlbHkgKGRhdGFfc2NuLT5zLT5lbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChsaWtlbHkgKGNtZCA9PSBFTEZfQ19TRVQpKQorICAgIHJlc3VsdCA9IChkYXRhX3Njbi0+cy0+ZmxhZ3MgfD0gKGZsYWdzICYgRUxGX0ZfRElSVFkpKTsKKyAgZWxzZSBpZiAobGlrZWx5IChjbWQgPT0gRUxGX0NfQ0xSKSkKKyAgICByZXN1bHQgPSAoZGF0YV9zY24tPnMtPmZsYWdzICY9IH4oZmxhZ3MgJiBFTEZfRl9ESVJUWSkpOworICBlbHNlCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ09NTUFORCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfZmxhZ2VoZHIuYyBiL2xpYmVsZi9lbGZfZmxhZ2VoZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk5ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9mbGFnZWhkci5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIE1hbmlwdWxhdGUgRUxGIGhlYWRlciBmbGFncy4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK3Vuc2lnbmVkIGludAorZWxmX2ZsYWdlaGRyIChlbGYsIGNtZCwgZmxhZ3MpCisgICAgIEVsZiAqZWxmOworICAgICBFbGZfQ21kIGNtZDsKKyAgICAgdW5zaWduZWQgaW50IGZsYWdzOworeworICB1bnNpZ25lZCBpbnQgcmVzdWx0OworCisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGxpa2VseSAoY21kID09IEVMRl9DX1NFVCkpCisgICAgcmVzdWx0ID0gKGVsZi0+c3RhdGUuZWxmLmVoZHJfZmxhZ3MgfD0gKGZsYWdzICYgRUxGX0ZfRElSVFkpKTsKKyAgZWxzZSBpZiAoY21kID09IEVMRl9DX0NMUikKKyAgICByZXN1bHQgPSAoZWxmLT5zdGF0ZS5lbGYuZWhkcl9mbGFncyAmPSB+KGZsYWdzICYgRUxGX0ZfRElSVFkpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0NPTU1BTkQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX2ZsYWdlbGYuYyBiL2xpYmVsZi9lbGZfZmxhZ2VsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMDAxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX2ZsYWdlbGYuYwpAQCAtMCwwICsxLDU4IEBACisvKiBNYW5pcHVsYXRlIEVMRiBmaWxlIGZsYWdzLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKwordW5zaWduZWQgaW50CitlbGZfZmxhZ2VsZiAoZWxmLCBjbWQsIGZsYWdzKQorICAgICBFbGYgKmVsZjsKKyAgICAgRWxmX0NtZCBjbWQ7CisgICAgIHVuc2lnbmVkIGludCBmbGFnczsKK3sKKyAgdW5zaWduZWQgaW50IHJlc3VsdDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChsaWtlbHkgKGNtZCA9PSBFTEZfQ19TRVQpKQorICAgIHJlc3VsdCA9IChlbGYtPmZsYWdzCisJICAgICAgfD0gKGZsYWdzICYgKEVMRl9GX0RJUlRZIHwgRUxGX0ZfTEFZT1VUIHwgRUxGX0ZfUEVSTUlTU0lWRSkpKTsKKyAgZWxzZSBpZiAobGlrZWx5IChjbWQgPT0gRUxGX0NfQ0xSKSkKKyAgICByZXN1bHQgPSAoZWxmLT5mbGFncworCSAgICAgICY9IH4oZmxhZ3MgJiAoRUxGX0ZfRElSVFkgfCBFTEZfRl9MQVlPVVQgfCBFTEZfRl9QRVJNSVNTSVZFKSkpOworICBlbHNlCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ09NTUFORCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfZmxhZ3BoZHIuYyBiL2xpYmVsZi9lbGZfZmxhZ3BoZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmY4Nzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9mbGFncGhkci5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIE1hbmlwdWxhdGUgRUxGIHByb2dyYW0gaGVhZGVyIGZsYWdzLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKwordW5zaWduZWQgaW50CitlbGZfZmxhZ3BoZHIgKGVsZiwgY21kLCBmbGFncykKKyAgICAgRWxmICplbGY7CisgICAgIEVsZl9DbWQgY21kOworICAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7Cit7CisgIHVuc2lnbmVkIGludCByZXN1bHQ7CisKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAobGlrZWx5IChjbWQgPT0gRUxGX0NfU0VUKSkKKyAgICByZXN1bHQgPSAoZWxmLT5zdGF0ZS5lbGYucGhkcl9mbGFncyB8PSAoZmxhZ3MgJiBFTEZfRl9ESVJUWSkpOworICBlbHNlIGlmIChsaWtlbHkgKGNtZCA9PSBFTEZfQ19DTFIpKQorICAgIHJlc3VsdCA9IChlbGYtPnN0YXRlLmVsZi5waGRyX2ZsYWdzICY9IH4oZmxhZ3MgJiBFTEZfRl9ESVJUWSkpOworICBlbHNlCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ09NTUFORCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfZmxhZ3Njbi5jIGIvbGliZWxmL2VsZl9mbGFnc2NuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkMWNjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGZfZmxhZ3Njbi5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIE1hbmlwdWxhdGUgRUxGIHNlY3Rpb24gZmxhZ3MuCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCit1bnNpZ25lZCBpbnQKK2VsZl9mbGFnc2NuIChzY24sIGNtZCwgZmxhZ3MpCisgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgRWxmX0NtZCBjbWQ7CisgICAgIHVuc2lnbmVkIGludCBmbGFnczsKK3sKKyAgdW5zaWduZWQgaW50IHJlc3VsdDsKKworICBpZiAoc2NuID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHVubGlrZWx5IChzY24tPmVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGxpa2VseSAoY21kID09IEVMRl9DX1NFVCkpCisgICAgcmVzdWx0ID0gKHNjbi0+ZmxhZ3MgfD0gKGZsYWdzICYgRUxGX0ZfRElSVFkpKTsKKyAgZWxzZSBpZiAobGlrZWx5IChjbWQgPT0gRUxGX0NfQ0xSKSkKKyAgICByZXN1bHQgPSAoc2NuLT5mbGFncyAmPSB+KGZsYWdzICYgRUxGX0ZfRElSVFkpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0NPTU1BTkQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX2ZsYWdzaGRyLmMgYi9saWJlbGYvZWxmX2ZsYWdzaGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3MmQyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGZfZmxhZ3NoZHIuYwpAQCAtMCwwICsxLDU2IEBACisvKiBNYW5pcHVsYXRlIEVMRiBzZWN0aW9uIGhlYWRlciBmbGFncy4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK3Vuc2lnbmVkIGludAorZWxmX2ZsYWdzaGRyIChzY24sIGNtZCwgZmxhZ3MpCisgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgRWxmX0NtZCBjbWQ7CisgICAgIHVuc2lnbmVkIGludCBmbGFnczsKK3sKKyAgdW5zaWduZWQgaW50IHJlc3VsdDsKKworICBpZiAoc2NuID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHVubGlrZWx5IChzY24tPmVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGxpa2VseSAoY21kID09IEVMRl9DX1NFVCkpCisgICAgcmVzdWx0ID0gKHNjbi0+c2hkcl9mbGFncyB8PSAoZmxhZ3MgJiBFTEZfRl9ESVJUWSkpOworICBlbHNlIGlmIChsaWtlbHkgKGNtZCA9PSBFTEZfQ19DTFIpKQorICAgIHJlc3VsdCA9IChzY24tPnNoZHJfZmxhZ3MgJj0gfihmbGFncyAmIEVMRl9GX0RJUlRZKSk7CisgIGVsc2UKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DT01NQU5EKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9nZXRhcmhkci5jIGIvbGliZWxmL2VsZl9nZXRhcmhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGI0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX2dldGFyaGRyLmMKQEAgLTAsMCArMSw1MyBAQAorLyogUmVhZCBoZWFkZXIgb2YgbmV4dCBhcmNoaXZlIG1lbWJlci4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK0VsZl9BcmhkciAqCitlbGZfZ2V0YXJoZHIgKGVsZikKKyAgICAgRWxmICplbGY7Cit7CisgIEVsZiAqcGFyZW50ID0gZWxmLT5wYXJlbnQ7CisKKyAgLyogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBvayBmb3IgYW55IGZpbGUgdHlwZSBidXQgYXJjaGl2ZXMuICAqLworICBpZiAocGFyZW50ID09IE5VTEwpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT1ApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHJlYWQgdGhlIGFyY2hpdmUgaGVhZGVyLiAgKi8KKyAgaWYgKHBhcmVudC0+c3RhdGUuYXIuZWxmX2FyX2hkci5hcl9uYW1lID09IE5VTEwKKyAgICAgICYmIF9fbGliZWxmX25leHRfYXJoZHIgKHBhcmVudCkgIT0gMCkKKyAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gIE1heWJlIHRoZXJlIGlzIG5vIG1lbWJlciBsZWZ0LiAgKi8KKyAgICByZXR1cm4gTlVMTDsKKworCisgIC8qIFdlIGNhbiBiZSBzdXJlIHRoZSBwYXJlbnQgaXMgYW4gYXJjaGl2ZS4gICovCisgIGFzc2VydCAocGFyZW50LT5raW5kID09IEVMRl9LX0FSKTsKKworICByZXR1cm4gJnBhcmVudC0+c3RhdGUuYXIuZWxmX2FyX2hkcjsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfZ2V0YXJzeW0uYyBiL2xpYmVsZi9lbGZfZ2V0YXJzeW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGFmYTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9nZXRhcnN5bS5jCkBAIC0wLDAgKzEsMjQxIEBACisvKiBSZXR1cm4gc3ltYm9sIHRhYmxlIG9mIGFyY2hpdmUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8ZGwtaGFzaC5oPgorI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitFbGZfQXJzeW0gKgorZWxmX2dldGFyc3ltIChlbGYsIHB0cikKKyAgICAgRWxmICplbGY7CisgICAgIHNpemVfdCAqcHRyOworeworICBpZiAoZWxmLT5raW5kICE9IEVMRl9LX0FSKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgbm8gYXJjaGl2ZS4gICovCisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9fQVJDSElWRSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHB0ciAhPSBOVUxMKQorICAgIC8qIEluIGNhc2Ugb2YgYW4gZXJyb3Igb3Igd2hlbiB3ZSBrbm93IHRoZSB2YWx1ZSBzdG9yZSB0aGUgZXhwZWN0ZWQKKyAgICAgICB2YWx1ZSBub3cuICBEb2luZyB0aGlzIGFsbG93cyB1cyBlYXNpZXIgZXhpdHMgaW4gYW4gZXJyb3IgY2FzZS4gICovCisgICAgKnB0ciA9IGVsZi0+c3RhdGUuYXIuYXJfc3ltX251bTsKKworICBpZiAoZWxmLT5zdGF0ZS5hci5hcl9zeW0gPT0gKEVsZl9BcnN5bSAqKSAtMWwpCisgICAgeworICAgICAgLyogVGhlcmUgaXMgbm8gaW5kZXguICAqLworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PX0lOREVYKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBFbGZfQXJzeW0gKnJlc3VsdCA9IGVsZi0+c3RhdGUuYXIuYXJfc3ltOworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgeworICAgICAgLyogV2UgaGF2ZSBub3QgeWV0IHJlYWQgdGhlIGluZGV4LiAgKi8KKyAgICAgIHJ3bG9ja193cmxvY2sgKGVsZi0+bG9jayk7CisKKyAgICAgIC8qIEluIGNhc2Ugd2UgZmluZCBubyBpbmRleCByZW1lbWJlciB0aGlzIGZvciB0aGUgbmV4dCBjYWxsLiAgKi8KKyAgICAgIGVsZi0+c3RhdGUuYXIuYXJfc3ltID0gKEVsZl9BcnN5bSAqKSAtMWw7CisKKyAgICAgIHN0cnVjdCBhcl9oZHIgKmluZGV4X2hkcjsKKyAgICAgIGlmIChlbGYtPm1hcF9hZGRyZXNzID09IE5VTEwpCisJeworCSAgLyogV2UgbXVzdCByZWFkIGluZGV4IGZyb20gdGhlIGZpbGUuICAqLworCSAgYXNzZXJ0IChlbGYtPmZpbGRlcyAhPSAtMSk7CisJICBpZiAocHJlYWQgKGVsZi0+ZmlsZGVzLCAmZWxmLT5zdGF0ZS5hci5hcl9oZHIsCisJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgZWxmLT5zdGFydF9vZmZzZXQgKyBTQVJNQUcpCisJICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKKwkgICAgeworCSAgICAgIC8qIEl0IGlzIG5vdCBwb3NzaWJsZSB0byByZWFkIHRoZSBpbmRleC4gIE1heWJlIGl0IGRvZXMgbm90CisJCSBleGlzdC4gICovCisJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1JFQURfRVJST1IpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisKKwkgIGluZGV4X2hkciA9ICZlbGYtPnN0YXRlLmFyLmFyX2hkcjsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKFNBUk1BRyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgPiBlbGYtPm1heGltdW1fc2l6ZSkKKwkgICAgeworCSAgICAgIC8qIFRoZXJlIGlzIG5vIHJvb20gZm9yIHRoZSBmdWxsIGFyY2hpdmUuICAqLworCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT19JTkRFWCk7CisJICAgICAgZ290byBvdXQ7CisJICAgIH0KKworCSAgaW5kZXhfaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgKGVsZi0+bWFwX2FkZHJlc3MKKwkJCQkJICsgZWxmLT5zdGFydF9vZmZzZXQgKyBTQVJNQUcpOworCX0KKworICAgICAgLyogTm93IHRlc3Qgd2hldGhlciB0aGlzIHJlYWxseSBpcyBhbiBhcmNoaXZlLiAgKi8KKyAgICAgIGlmIChtZW1jbXAgKGluZGV4X2hkci0+YXJfZm1hZywgQVJGTUFHLCAyKSAhPSAwKQorCXsKKwkgIC8qIEludmFsaWQgbWFnaWMgYnl0ZXMuICAqLworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0FSQ0hJVkVfRk1BRyk7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIC8qIE5vdyB0ZXN0IHdoZXRoZXIgdGhpcyBpcyB0aGUgaW5kZXguICBJdCBpcyBkZW5vdGVkIGJ5IHRoZQorCSBuYW1lIGJlaW5nICIvICIuCisJIFhYWCBUaGlzIGlzIG5vdCBlbnRpcmVseSB0cnVlLiAgVGhlcmUgYXJlIHNvbWUgbW9yZSBmb3Jtcy4KKwkgV2hpY2ggb2YgdGhlbSBzaGFsbCB3ZSBoYW5kbGU/ICAqLworICAgICAgaWYgKG1lbWNtcCAoaW5kZXhfaGRyLT5hcl9uYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSAhPSAwKQorCXsKKwkgIC8qIElmIHRoZSBpbmRleCBpcyBub3QgdGhlIGZpcnN0IGVudHJ5LCB0aGVyZSBpcyBubyBpbmRleC4KKworCSAgICAgWFhYIElzIHRoaXMgdHJ1ZT8gICovCisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9fSU5ERVgpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAvKiBXZSBoYXZlIGFuIGFyY2hpdmUuICBUaGUgZmlyc3Qgd29yZCBpbiB0aGVyZSBpcyB0aGUgbnVtYmVyIG9mCisJIGVudHJpZXMgaW4gdGhlIHRhYmxlLiAgKi8KKyAgICAgIHVpbnQzMl90IG47CisgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMKQorCXsKKwkgIGlmIChwcmVhZCAoZWxmLT5maWxkZXMsICZuLCBzaXplb2YgKG4pLAorCQkgICAgIGVsZi0+c3RhcnRfb2Zmc2V0ICsgU0FSTUFHICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKKwkgICAgICAhPSBzaXplb2YgKG4pKQorCSAgICB7CisJICAgICAgLyogQ2Fubm90IHJlYWQgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KKwkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9fSU5ERVgpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisJfQorICAgICAgZWxzZQorCW4gPSAqKHVpbnQzMl90ICopIChlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQKKwkJCSAgICsgU0FSTUFHICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7CisKKyAgICAgIGlmIChfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOKQorCW4gPSBic3dhcF8zMiAobik7CisKKyAgICAgIC8qIE5vdyB3ZSBjYW4gcGVyZm9ybSBzb21lIGZpcnN0IHRlc3RzIG9uIHdoZXRoZXIgYWxsIHRoZSBkYXRhCisJIG5lZWRlZCBmb3IgdGhlIGluZGV4IGlzIGF2YWlsYWJsZS4gICovCisgICAgICBjaGFyIHRtcGJ1ZlsxN107CisgICAgICBtZW1jcHkgKHRtcGJ1ZiwgaW5kZXhfaGRyLT5hcl9zaXplLCAxMCk7CisgICAgICB0bXBidWZbMTBdID0gJ1wwJzsKKyAgICAgIHNpemVfdCBpbmRleF9zaXplID0gYXRvbCAodG1wYnVmKTsKKworICAgICAgaWYgKFNBUk1BRyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBpbmRleF9zaXplID4gZWxmLT5tYXhpbXVtX3NpemUKKwkgIHx8IG4gKiBzaXplb2YgKHVpbnQzMl90KSA+IGluZGV4X3NpemUpCisJeworCSAgLyogVGhpcyBpbmRleCB0YWJsZSBjYW5ub3QgYmUgcmlnaHQgc2luY2UgaXQgZG9lcyBub3QgZml0IGludG8KKwkgICAgIHRoZSBmaWxlLiAgKi8KKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT19JTkRFWCk7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIC8qIE5vdyB3ZSBjYW4gYWxsb2NhdGUgdGhlIGFycmF5cyBuZWVkZWQgdG8gc3RvcmUgdGhlIGluZGV4LiAgKi8KKyAgICAgIHNpemVfdCBhcl9zeW1fbGVuID0gKG4gKyAxKSAqIHNpemVvZiAoRWxmX0Fyc3ltKTsKKyAgICAgIGVsZi0+c3RhdGUuYXIuYXJfc3ltID0gKEVsZl9BcnN5bSAqKSBtYWxsb2MgKGFyX3N5bV9sZW4pOworICAgICAgaWYgKGVsZi0+c3RhdGUuYXIuYXJfc3ltICE9IE5VTEwpCisJeworCSAgdWludDMyX3QgKmZpbGVfZGF0YTsKKwkgIGNoYXIgKnN0cl9kYXRhOworCisJICBpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZmlsZV9kYXRhID0gKHVpbnQzMl90ICopIGFsbG9jYSAobiAqIHNpemVvZiAodWludDMyX3QpKTsKKworCSAgICAgIGFyX3N5bV9sZW4gKz0gaW5kZXhfc2l6ZSAtIG4gKiBzaXplb2YgKHVpbnQzMl90KTsKKwkgICAgICBFbGZfQXJzeW0gKm5ld3AgPSAoRWxmX0Fyc3ltICopIHJlYWxsb2MgKGVsZi0+c3RhdGUuYXIuYXJfc3ltLAorCQkJCQkJICAgICAgIGFyX3N5bV9sZW4pOworCSAgICAgIGlmIChuZXdwID09IE5VTEwpCisJCXsKKwkJICBmcmVlIChlbGYtPnN0YXRlLmFyLmFyX3N5bSk7CisJCSAgZWxmLT5zdGF0ZS5hci5hcl9zeW0gPSBOVUxMOworCQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7CisJCSAgZ290byBvdXQ7CisJCX0KKwkgICAgICBlbGYtPnN0YXRlLmFyLmFyX3N5bSA9IG5ld3A7CisKKwkgICAgICBjaGFyICpuZXdfc3RyID0gKGNoYXIgKikgKGVsZi0+c3RhdGUuYXIuYXJfc3ltICsgbiArIDEpOworCisJICAgICAgLyogTm93IHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4gICovCisJICAgICAgaWYgKChzaXplX3QpIHByZWFkIChlbGYtPmZpbGRlcywgZmlsZV9kYXRhLAorCQkJCSAgbiAqIHNpemVvZiAodWludDMyX3QpLCBlbGYtPnN0YXJ0X29mZnNldAorCQkJCSAgKyBTQVJNQUcgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpCisJCQkJICArIHNpemVvZiAodWludDMyX3QpKSAhPSBuICogc2l6ZW9mICh1aW50MzJfdCkKKwkJICB8fCAoKHNpemVfdCkgcHJlYWQgKGVsZi0+ZmlsZGVzLCBuZXdfc3RyLAorCQkJCSAgICAgIGluZGV4X3NpemUgLSBuICogc2l6ZW9mICh1aW50MzJfdCksCisJCQkJICAgICAgZWxmLT5zdGFydF9vZmZzZXQKKwkJCQkgICAgICArIFNBUk1BRyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikKKwkJCQkgICAgICArIChuICsgMSkgKiBzaXplb2YgKHVpbnQzMl90KSkKKwkJICAgICAgIT0gaW5kZXhfc2l6ZSAtIG4gKiBzaXplb2YgKHVpbnQzMl90KSkpCisJCXsKKwkJICAvKiBXZSB3ZXJlIG5vdCBhYmxlIHRvIHJlYWQgdGhlIGRhdGEuICAqLworCQkgIGZyZWUgKGVsZi0+c3RhdGUuYXIuYXJfc3ltKTsKKwkJICBlbGYtPnN0YXRlLmFyLmFyX3N5bSA9IE5VTEw7CisJCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PX0lOREVYKTsKKwkJICBnb3RvIG91dDsKKwkJfQorCisJICAgICAgc3RyX2RhdGEgPSAoY2hhciAqKSBuZXdfc3RyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmaWxlX2RhdGEgPSAodWludDMyX3QgKikgKGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldAorCQkJCQkrIFNBUk1BRyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikKKwkJCQkJKyBzaXplb2YgKHVpbnQzMl90KSk7CisJICAgICAgc3RyX2RhdGEgPSAoY2hhciAqKSAmZmlsZV9kYXRhW25dOworCSAgICB9CisKKwkgIC8qIE5vdyB3ZSBjYW4gYnVpbGQgdGhlIGRhdGEgc3RydWN0dXJlLiAgKi8KKwkgIEVsZl9BcnN5bSAqYXJzeW0gPSBlbGYtPnN0YXRlLmFyLmFyX3N5bTsKKwkgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IG47ICsrY250KQorCSAgICB7CisJICAgICAgYXJzeW1bY250XS5hc19uYW1lID0gc3RyX2RhdGE7CisJICAgICAgaWYgKF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4pCisJCWFyc3ltW2NudF0uYXNfb2ZmID0gYnN3YXBfMzIgKGZpbGVfZGF0YVtjbnRdKTsKKwkgICAgICBlbHNlCisJCWFyc3ltW2NudF0uYXNfb2ZmID0gZmlsZV9kYXRhW2NudF07CisJICAgICAgYXJzeW1bY250XS5hc19oYXNoID0gX2RsX2VsZl9oYXNoIChzdHJfZGF0YSk7CisJICAgICAgc3RyX2RhdGEgPSByYXdtZW1jaHIgKHN0cl9kYXRhLCAnXDAnKSArIDE7CisJICAgIH0KKwkgIC8qIEF0IHRoZSBlbmQgYSBzcGVjaWFsIGVudHJ5LiAgKi8KKwkgIGFyc3ltW25dLmFzX25hbWUgPSBOVUxMOworCSAgYXJzeW1bbl0uYXNfb2ZmID0gMDsKKwkgIGFyc3ltW25dLmFzX2hhc2ggPSB+MFVMOworCisJICAvKiBUZWxsIHRoZSBjYWxsZXIgaG93IG1hbnkgZW50cmllcyB3ZSBoYXZlLiAgKi8KKwkgIGVsZi0+c3RhdGUuYXIuYXJfc3ltX251bSA9IG4gKyAxOworCX0KKworICAgICAgcmVzdWx0ID0gZWxmLT5zdGF0ZS5hci5hcl9zeW07CisKKyAgICBvdXQ6CisgICAgICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworICAgIH0KKworICBpZiAocHRyICE9IE5VTEwpCisgICAgKnB0ciA9IGVsZi0+c3RhdGUuYXIuYXJfc3ltX251bTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9nZXRiYXNlLmMgYi9saWJlbGYvZWxmX2dldGJhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTc2ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9nZXRiYXNlLmMKQEAgLTAsMCArMSwzMyBAQAorLyogUmV0dXJuIG9mZnNldCBvZiBmaXJzdCBieXRlIGZvciB0aGUgb2JqZWN0LgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworb2ZmX3QKK2VsZl9nZXRiYXNlIChlbGYpCisgICAgIEVsZiAqZWxmOworeworICByZXR1cm4gZWxmID09IE5VTEwgPyAob2ZmX3QpIC0xIDogZWxmLT5zdGFydF9vZmZzZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX2dldGRhdGEuYyBiL2xpYmVsZi9lbGZfZ2V0ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZThlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX2dldGRhdGEuYwpAQCAtMCwwICsxLDQ1NCBAQAorLyogUmV0dXJuIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBzZWN0aW9uIGFmdGVyIHBvc3NpYmx5IGNvbnZlcnRpbmcgaXQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJlbGYta25vd2xlZGdlLmgiCisKKworI2lmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgZGVmaW5lIEFMTE9XX0FMSUdORUQJMQorI2Vsc2UKKyMgZGVmaW5lIEFMTE9XX0FMSUdORUQJMAorI2VuZGlmCisKKworI2RlZmluZSBUWVBFSURYKFNoX1R5cGUpIFwKKyAgKFNoX1R5cGUgPj0gU0hUX05VTEwgJiYgU2hfVHlwZSA8IFNIVF9OVU0JCQkJICAgICAgXAorICAgPyBTaF9UeXBlCQkJCQkJCQkgICAgICBcCisgICA6IChTaF9UeXBlID49IFNIVF9HTlVfTElCTElTVCAmJiBTaF9UeXBlIDw9IFNIVF9ISVNVTlcJCSAgICAgIFwKKyAgICAgID8gU0hUX05VTSArIFNoX1R5cGUgLSBTSFRfR05VX0xJQkxJU1QJCQkJICAgICAgXAorICAgICAgOiAwKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdAoreworICBFbGZfVHlwZSB0eXBlOworICBzaXplX3Qgc2l6ZTsKKyNpZiBBTExPV19BTElHTkVECisjIGRlZmluZSBBTCh2YWwpCisjZWxzZQorICBzaXplX3QgYWxpZ247CisjIGRlZmluZSBBTCh2YWwpLCB2YWwKKyNlbmRpZgorfSBzaHR5cGVfbWFwW0VWX05VTSAtIDFdW0VMRkNMQVNTTlVNIC0gMV1bVFlQRUlEWCAoU0hUX0hJU1VOVykgKyAxXSA9Cit7CisgIFtFVl9DVVJSRU5UIC0gMV0gPQorICB7CisgICAgW0VMRkNMQVNTMzIgLSAxXSA9CisgICAgeworICAgICAgLyogQXNzb2NpYXRlIHNlY3Rpb24gdHlwZXMgd2l0aCBsaWJlbGYgdHlwZXMsIHRoZWlyIHNpemVzIGFuZAorCSBhbGlnbm1lbnQuICBTSFRfR05VX3ZlcmRlZiBpcyBzcGVjaWFsIHNpbmNlIHRoZSBzZWN0aW9uIGRvZXMKKwkgbm90IGNvbnRhaW4gZW50cmllcyBvZiBvbmx5IG9uZSBzaXplLiAgKi8KKyNkZWZpbmUgREVGSU5FKEJpdHMpIFwKKyAgICAgIFtTSFRfU1lNVEFCXSA9IHsgRUxGX1RfU1lNLCBzaXplb2YgKEVsZlcyKEJpdHMsU3ltKSkJCSAgICAgIFwKKwkJICAgICAgIEFMIChfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxTeW0pKSkgfSwJCSAgICAgIFwKKyAgICAgIFtTSFRfUkVMQV0gPSB7IEVMRl9UX1JFTEEsIHNpemVvZiAoRWxmVzIoQml0cyxSZWxhKSkJCSAgICAgIFwKKwkJICAgICAgIEFMIChfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxSZWxhKSkpIH0sCQkgICAgICBcCisgICAgICBbU0hUX0hBU0hdID0geyBFTEZfVF9XT1JELCBzaXplb2YgKEVsZlcyKEJpdHMsV29yZCkpCQkgICAgICBcCisJCSAgICAgICBBTCAoX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsV29yZCkpKSB9LAkJICAgICAgXAorICAgICAgW1NIVF9EWU5BTUlDXSA9IHsgRUxGX1RfRFlOLCBzaXplb2YgKEVsZlcyKEJpdHMsRHluKSkJCSAgICAgIFwKKwkJICAgICAgIEFMIChfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxEeW4pKSkgfSwJCSAgICAgIFwKKyAgICAgIFtTSFRfUkVMXSA9IHsgRUxGX1RfUkVMLCBzaXplb2YgKEVsZlcyKEJpdHMsUmVsKSkJCQkgICAgICBcCisJCSAgICAgICBBTCAoX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsUmVsKSkpIH0sCQkgICAgICBcCisgICAgICBbU0hUX0RZTlNZTV0gPSB7IEVMRl9UX1NZTSwgc2l6ZW9mIChFbGZXMihCaXRzLFN5bSkpCQkgICAgICBcCisJCSAgICAgICBBTCAoX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsU3ltKSkpIH0sCQkgICAgICBcCisgICAgICBbU0hUX0lOSVRfQVJSQVldID0geyBFTEZfVF9BRERSLCBzaXplb2YgKEVsZlcyKEJpdHMsQWRkcikpCSAgICAgIFwKKwkJCSAgIEFMIChfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxBZGRyKSkpIH0sCSAgICAgIFwKKyAgICAgIFtTSFRfRklOSV9BUlJBWV0gPSB7IEVMRl9UX0FERFIsIHNpemVvZiAoRWxmVzIoQml0cyxBZGRyKSkJICAgICAgXAorCQkJICAgQUwgKF9fYWxpZ25vZl9fIChFbGZXMihCaXRzLEFkZHIpKSkgfSwJICAgICAgXAorICAgICAgW1NIVF9QUkVJTklUX0FSUkFZXSA9IHsgRUxGX1RfQUREUiwgc2l6ZW9mIChFbGZXMihCaXRzLEFkZHIpKQkgICAgICBcCisJCQkgICAgICBBTCAoX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsQWRkcikpKSB9LAkgICAgICBcCisgICAgICBbU0hUX0dST1VQXSA9IHsgRUxGX1RfV09SRCwgc2l6ZW9mIChFbGYzMl9Xb3JkKQkJCSAgICAgIFwKKwkJICAgICAgQUwgKF9fYWxpZ25vZl9fIChFbGYzMl9Xb3JkKSkgfSwJCQkgICAgICBcCisgICAgICBbU0hUX1NZTVRBQl9TSE5EWF0gPSB7IEVMRl9UX1dPUkQsIHNpemVvZiAoRWxmMzJfV29yZCkJCSAgICAgIFwKKwkJCSAgICAgQUwgKF9fYWxpZ25vZl9fIChFbGYzMl9Xb3JkKSkgfSwJCSAgICAgIFwKKyAgICAgIFtUWVBFSURYIChTSFRfR05VX3ZlcmRlZildID0geyBFTEZfVF9WREVGLCAxIEFMICgxKSB9LAkJICAgICAgXAorICAgICAgW1RZUEVJRFggKFNIVF9HTlVfdmVybmVlZCldID0geyBFTEZfVF9WTkVFRCwJCQkgICAgICBcCisJCQkJICAgICAgc2l6ZW9mIChFbGZXMihCaXRzLFZlcm5lZWQpKQkgICAgICBcCisJCQkJICAgICAgQUwgKF9fYWxpZ25vZl9fIChFbGZXMihCaXRzLFZlcm5lZWQpKSl9LFwKKyAgICAgIFtUWVBFSURYIChTSFRfR05VX3ZlcnN5bSldID0geyBFTEZfVF9IQUxGLCBzaXplb2YgKEVsZlcyKEJpdHMsVmVyc3ltKSkgIFwKKwkJCQkgICAgIEFMIChfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxWZXJzeW0pKSkgfSwgXAorICAgICAgW1RZUEVJRFggKFNIVF9TVU5XX3N5bWluZm8pXSA9IHsgRUxGX1RfU1lNSU5GTywJCQkgICAgICBcCisJCQkJICAgICAgIHNpemVvZiAoRWxmVzIoQml0cyxTeW1pbmZvKSkJICAgICAgXAorCQkJCSAgICAgICBBTChfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxTeW1pbmZvKSkpfSxcCisgICAgICBbVFlQRUlEWCAoU0hUX1NVTldfbW92ZSldID0geyBFTEZfVF9NT1ZFLCBzaXplb2YgKEVsZlcyKEJpdHMsTW92ZSkpICAgICBcCisJCQkJICAgIEFMIChfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxNb3ZlKSkpIH0sICAgIFwKKyAgICAgIFtUWVBFSURYIChTSFRfR05VX0xJQkxJU1QpXSA9IHsgRUxGX1RfTElCLCBzaXplb2YgKEVsZlcyKEJpdHMsTGliKSkgICAgIFwKKwkJCQkgICAgQUwgKF9fYWxpZ25vZl9fIChFbGZXMihCaXRzLExpYikpKSB9CisgICAgICBERUZJTkUgKDMyKQorICAgIH0sCisgICAgW0VMRkNMQVNTNjQgLSAxXSA9CisgICAgeworICAgICAgREVGSU5FICg2NCkKKyAgICB9CisgIH0KK307CisKKworLyogQ29udmVydCB0aGUgZGF0YSBpbiB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitjb252ZXJ0X2RhdGEgKEVsZl9TY24gKnNjbiwgaW50IHZlcnNpb24gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgZWNsYXNzLAorCSAgICAgIGludCBkYXRhLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHR5cGUpCit7CisjaWYgQUxMT1dfQUxJR05FRAorICAvKiBObyBuZWVkIHRvIGNvbXB1dGUgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUgaG9zdC4gICovCisgIGNvbnN0IHNpemVfdCBhbGlnbiA9IDE7CisjZWxzZQorIyBpZiBFVl9OVU0gIT0gMgorICBzaXplX3QgYWxpZ24gPSBzaHR5cGVfbWFwW3ZlcnNpb24gLSAxXVtlY2xhc3MgLSAxXVt0eXBlXS5hbGlnbjsKKyMgZWxzZQorICBzaXplX3QgYWxpZ24gPSBzaHR5cGVfbWFwWzBdW2VjbGFzcyAtIDFdW3R5cGVdLmFsaWduOworIyBlbmRpZgorI2VuZGlmCisKKyAgaWYgKGRhdGEgPT0gTVlfRUxGREFUQSkKKyAgICB7CisgICAgICBpZiAoQUxMT1dfQUxJR05FRAorCSAgfHwgKCgoc2l6ZV90KSAoKGNoYXIgKikgc2NuLT5yYXdkYXRhX2Jhc2UpKSAmIChhbGlnbiAtIDEpKSA9PSAwKQorCS8qIE5vIG5lZWQgdG8gY29weSwgd2UgY2FuIHVzZSB0aGUgcmF3IGRhdGEuICAqLworCXNjbi0+ZGF0YV9iYXNlID0gc2NuLT5yYXdkYXRhX2Jhc2U7CisgICAgICBlbHNlCisJeworCSAgc2NuLT5kYXRhX2Jhc2UgPSAoY2hhciAqKSBtYWxsb2MgKHNpemUpOworCSAgaWYgKHNjbi0+ZGF0YV9iYXNlID09IE5VTEwpCisJICAgIHsKKwkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICAvKiBUaGUgY29weSB3aWxsIGJlIGFwcHJvcHJpYXRlbHkgYWxpZ25lZCBmb3IgZGlyZWN0IGFjY2Vzcy4gICovCisJICBtZW1jcHkgKHNjbi0+ZGF0YV9iYXNlLCBzY24tPnJhd2RhdGFfYmFzZSwgc2l6ZSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHhmY3RfdCBmcDsKKworICAgICAgc2NuLT5kYXRhX2Jhc2UgPSAoY2hhciAqKSBtYWxsb2MgKHNpemUpOworICAgICAgaWYgKHNjbi0+ZGF0YV9iYXNlID09IE5VTEwpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIEdldCB0aGUgY29udmVyc2lvbiBmdW5jdGlvbi4gICovCisjaWYgRVZfTlVNICE9IDIKKyAgICAgIGZwID0gX19lbGZfeGZjdHN0b21bdmVyc2lvbiAtIDFdW19fbGliZWxmX3ZlcnNpb24gLSAxXVtlY2xhc3MgLSAxXVt0eXBlXTsKKyNlbHNlCisgICAgICBmcCA9IF9fZWxmX3hmY3RzdG9tWzBdWzBdW2VjbGFzcyAtIDFdW3R5cGVdOworI2VuZGlmCisKKyAgICAgIGZwIChzY24tPmRhdGFfYmFzZSwgc2NuLT5yYXdkYXRhX2Jhc2UsIHNpemUsIDApOworICAgIH0KKworICBzY24tPmRhdGFfbGlzdC5kYXRhLmQuZF9idWYgPSBzY24tPmRhdGFfYmFzZTsKKyAgc2NuLT5kYXRhX2xpc3QuZGF0YS5kLmRfc2l6ZSA9IHNpemU7CisgIHNjbi0+ZGF0YV9saXN0LmRhdGEuZC5kX3R5cGUgPSB0eXBlOworICBzY24tPmRhdGFfbGlzdC5kYXRhLmQuZF9vZmYgPSBzY24tPnJhd2RhdGEuZC5kX29mZjsKKyAgc2NuLT5kYXRhX2xpc3QuZGF0YS5kLmRfYWxpZ24gPSBzY24tPnJhd2RhdGEuZC5kX2FsaWduOworICBzY24tPmRhdGFfbGlzdC5kYXRhLmQuZF92ZXJzaW9uID0gc2NuLT5yYXdkYXRhLmQuZF92ZXJzaW9uOworCisgIHNjbi0+ZGF0YV9saXN0LmRhdGEucyA9IHNjbjsKK30KKworCisvKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSByYXcgZGF0YSBpbiB0aGUgYHJhd2RhdGEnIGVsZW1lbnQuICAqLworaW50CitpbnRlcm5hbF9mdW5jdGlvbl9kZWYKK19fbGliZWxmX3NldF9yYXdkYXRhIChFbGZfU2NuICpzY24pCit7CisgIHNpemVfdCBvZmZzZXQ7CisgIHNpemVfdCBzaXplOworICBzaXplX3QgYWxpZ247CisgIGludCB0eXBlOworICBFbGYgKmVsZiA9IHNjbi0+ZWxmOworCisgIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgRWxmMzJfU2hkciAqc2hkciA9IHNjbi0+c2hkci5lMzIgPzogSU5UVVNFKGVsZjMyX2dldHNoZHIpIChzY24pOworCisgICAgICBpZiAoc2hkciA9PSBOVUxMKQorCS8qIFNvbWV0aGluZyB3ZW50IHRlcnJpYmx5IHdyb25nLiAgKi8KKwlyZXR1cm4gMTsKKworICAgICAgb2Zmc2V0ID0gc2hkci0+c2hfb2Zmc2V0OworICAgICAgc2l6ZSA9IHNoZHItPnNoX3NpemU7CisgICAgICB0eXBlID0gc2hkci0+c2hfdHlwZTsKKyAgICAgIGFsaWduID0gc2hkci0+c2hfYWRkcmFsaWduOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEVsZjY0X1NoZHIgKnNoZHIgPSBzY24tPnNoZHIuZTY0ID86IElOVFVTRShlbGY2NF9nZXRzaGRyKSAoc2NuKTsKKworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwkvKiBTb21ldGhpbmcgd2VudCB0ZXJyaWJseSB3cm9uZy4gICovCisJcmV0dXJuIDE7CisKKyAgICAgIG9mZnNldCA9IHNoZHItPnNoX29mZnNldDsKKyAgICAgIHNpemUgPSBzaGRyLT5zaF9zaXplOworICAgICAgdHlwZSA9IHNoZHItPnNoX3R5cGU7CisgICAgICBhbGlnbiA9IHNoZHItPnNoX2FkZHJhbGlnbjsKKyAgICB9CisKKyAgLyogSWYgdGhlIHNlY3Rpb24gaGFzIG5vIGRhdGEgKGZvciB3aGF0ZXZlciByZWFzb24pLCBsZWF2ZSB0aGUgYGRfYnVmJworICAgICBwb2ludGVyIE5VTEwuICAqLworICBpZiAoc2l6ZSAhPSAwICYmIHR5cGUgIT0gU0hUX05PQklUUykKKyAgICB7CisgICAgICAvKiBGaXJzdCBhIHRlc3Qgd2hldGhlciB0aGUgc2VjdGlvbiBpcyB2YWxpZCBhdCBhbGwuICAqLworICAgICAgc2l6ZV90IGVudHNpemU7CisKKyAgICAgIGlmICh0eXBlID09IFNIVF9IQVNIKQorCXsKKwkgIEdFbGZfRWhkciBlaGRyX21lbTsKKworCSAgZW50c2l6ZSA9IFNIX0VOVFNJWkVfSEFTSCAoSU5UVVNFKGdlbGZfZ2V0ZWhkcikgKGVsZiwgJmVoZHJfbWVtKSk7CisJfQorICAgICAgZWxzZQorCXsKKyNpZiBFVl9OVU0gIT0gMgorCSAgZW50c2l6ZSA9IHNodHlwZV9tYXBbX19saWJlbGZfdmVyc2lvbiAtIDFdW2VsZi0+Y2xhc3MgLSAxXVtUWVBFSURYICh0eXBlKV0uc2l6ZTsKKyNlbHNlCisJICBlbnRzaXplID0gc2h0eXBlX21hcFswXVtlbGYtPmNsYXNzIC0gMV1bVFlQRUlEWCAodHlwZSldLnNpemU7CisjZW5kaWYKKwl9CisKKyAgICAgIC8qIFdlIGFzc3VtZSBpdCBpcyBhbiBhcnJheSBvZiBieXRlcyBpZiBpdCBpcyBub25lIG9mIHRoZSBzdHJ1Y3R1cmVkCisJIHNlY3Rpb25zIHdlIGtub3cgb2YuICAqLworICAgICAgaWYgKGVudHNpemUgPT0gMCkKKwllbnRzaXplID0gMTsKKworICAgICAgaWYgKHNpemUgJSBlbnRzaXplICE9IDApCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfREFUQSk7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIFdlIGNhbiB1c2UgdGhlIG1hcHBlZCBvciBsb2FkZWQgZGF0YSBpZiBhdmFpbGFibGUuICAqLworICAgICAgaWYgKGVsZi0+bWFwX2FkZHJlc3MgIT0gTlVMTCkKKwl7CisJICAvKiBGaXJzdCBzZWUgd2hldGhlciB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHNlY3Rpb24gaGVhZGVyIGlzCisJICAgICB2YWxpZCBhbmQgaXQgZG9lcyBub3QgYXNrIGZvciB0b28gbXVjaC4gICovCisJICBpZiAob2Zmc2V0ICsgc2l6ZSA+IGVsZi0+bWF4aW11bV9zaXplKQorCSAgICB7CisJICAgICAgLyogU29tZXRoaW5nIGlzIHdyb25nLiAgKi8KKwkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0hFQURFUik7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKworCSAgc2NuLT5yYXdkYXRhX2Jhc2UgPSBzY24tPnJhd2RhdGEuZC5kX2J1ZgorCSAgICA9IChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldCArIG9mZnNldDsKKwl9CisgICAgICBlbHNlIGlmIChlbGYtPmZpbGRlcyAhPSAtMSkKKwl7CisJICAvKiBXZSBoYXZlIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4gIEFsbG9jYXRlIHRoZSBuZWVkZWQKKwkgICAgIG1lbW9yeS4gICovCisJICBzY24tPnJhd2RhdGFfYmFzZSA9IHNjbi0+cmF3ZGF0YS5kLmRfYnVmCisJICAgID0gKGNoYXIgKikgbWFsbG9jIChzaXplKTsKKwkgIGlmIChzY24tPnJhd2RhdGEuZC5kX2J1ZiA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCisJICBpZiAoKHNpemVfdCkgcHJlYWQgKGVsZi0+ZmlsZGVzLCBzY24tPnJhd2RhdGEuZC5kX2J1Ziwgc2l6ZSwKKwkJCSAgICAgIGVsZi0+c3RhcnRfb2Zmc2V0ICsgb2Zmc2V0KSAhPSBzaXplKQorCSAgICB7CisJICAgICAgLyogQ2Fubm90IHJlYWQgdGhlIGRhdGEuICAqLworCSAgICAgIGZyZWUgKHNjbi0+cmF3ZGF0YS5kLmRfYnVmKTsKKwkgICAgICBzY24tPnJhd2RhdGFfYmFzZSA9IHNjbi0+cmF3ZGF0YS5kLmRfYnVmID0gTlVMTDsKKwkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfUkVBRF9FUlJPUik7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBhbHJlYWR5IGNsb3NlZCwgd2UgY2Fubm90IGdldCB0aGUgZGF0YQorCSAgICAgYW55bW9yZS4gICovCisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfRkRfRElTQUJMRUQpOworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICBzY24tPnJhd2RhdGEuZC5kX3NpemUgPSBzaXplOworICAvKiBTb21lIGJyb2tlbiBFTEYgQUJJIGZvciA2NC1iaXQgbWFjaGluZXMgdXNlIHRoZSB3cm9uZyBoYXNoIHRhYmxlCisgICAgIGVudHJ5IHNpemUuICBTZWUgZWxmLWtub3dsZWRnZS5oIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKHR5cGUgPT0gU0hUX0hBU0ggJiYgZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzY0KQorICAgIHsKKyAgICAgIEdFbGZfRWhkciBlaGRyX21lbTsKKworICAgICAgc2NuLT5yYXdkYXRhLmQuZF90eXBlCisJPSAoU0hfRU5UU0laRV9IQVNIIChJTlRVU0UoZ2VsZl9nZXRlaGRyKSAoZWxmLCAmZWhkcl9tZW0pKQorCSAgID09IDQgPyBFTEZfVF9XT1JEIDogRUxGX1RfWFdPUkQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZiBFVl9OVU0gIT0gMgorICAgICAgc2NuLT5yYXdkYXRhLmQuZF90eXBlID0KKwlzaHR5cGVfbWFwW19fbGliZWxmX3ZlcnNpb24gLSAxXVtlbGYtPmNsYXNzIC0gMV1bVFlQRUlEWCAodHlwZSldLnR5cGU7CisjZWxzZQorICAgICAgc2NuLT5yYXdkYXRhLmQuZF90eXBlID0KKwlzaHR5cGVfbWFwWzBdW2VsZi0+Y2xhc3MgLSAxXVtUWVBFSURYICh0eXBlKV0udHlwZTsKKyNlbmRpZgorICAgIH0KKyAgc2NuLT5yYXdkYXRhLmQuZF9vZmYgPSAwOworICBzY24tPnJhd2RhdGEuZC5kX2FsaWduID0gYWxpZ247CisgIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKKyAgICAgIHx8IChvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmMzIuZWhkcikKKwkgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5laGRyKSkpCisgICAgc2NuLT5yYXdkYXRhLmQuZF92ZXJzaW9uID0KKyAgICAgIGVsZi0+c3RhdGUuZWxmMzIuZWhkci0+ZV9pZGVudFtFSV9WRVJTSU9OXTsKKyAgZWxzZQorICAgIHNjbi0+cmF3ZGF0YS5kLmRfdmVyc2lvbiA9CisgICAgICBlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfaWRlbnRbRUlfVkVSU0lPTl07CisKKyAgc2NuLT5yYXdkYXRhLnMgPSBzY247CisKKyAgc2NuLT5kYXRhX3JlYWQgPSAxOworCisgIC8qIFdlIGFjdHVhbGx5IHJlYWQgZGF0YSBmcm9tIHRoZSBmaWxlLiAgQXQgbGVhc3Qgd2UgdHJpZWQuICAqLworICBzY24tPmZsYWdzIHw9IEVMRl9GX0ZJTEVEQVRBOworCisgIHJldHVybiAwOworfQorCisKK0VsZl9EYXRhICoKK2VsZl9nZXRkYXRhIChzY24sIGRhdGEpCisgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgRWxmX0RhdGEgKmRhdGE7Cit7CisgIEVsZl9EYXRhICpyZXN1bHQgPSBOVUxMOworICBFbGYgKmVsZjsKKworICBpZiAoc2NuID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVubGlrZWx5IChzY24tPmVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogV2Ugd2lsbCBuZWVkIHRoaXMgbXVsdGlwbGUgdGltZXMgbGF0ZXIgb24uICAqLworICBlbGYgPSBzY24tPmVsZjsKKworICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOworCisgIC8qIElmIGBkYXRhJyBpcyBub3QgTlVMTCB0aGlzIG1lYW5zIHdlIGFyZSBub3QgYWRkcmVzc2luZyB0aGUgaW5pdGlhbAorICAgICBkYXRhIGluIHRoZSBmaWxlLiAgQnV0IHRoaXMgYWxzbyBtZWFucyB0aGlzIGRhdGEgaXMgYWxyZWFkeSByZWFkCisgICAgIChzaW5jZSBvdGhlcndpc2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgYSB2YWxpZCBgZGF0YScgcG9pbnRlcikKKyAgICAgYW5kIGFsbCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZCBhcyB3ZWxsLiAgSW4gdGhpcyBjYXNlCisgICAgIHdlIGNhbiBzaW1wbHkgd2FsayB0aGUgbGlzdCBvZiBkYXRhIHJlY29yZHMuICAqLworICBpZiAoZGF0YSAhPSBOVUxMKQorICAgIHsKKyAgICAgIEVsZl9EYXRhX0xpc3QgKnJ1bnA7CisKKyAgICAgIC8qIEl0IGlzIG5vdCBwb3NzaWJsZSB0aGF0IGlmIERBVEEgaXMgbm90IE5VTEwgdGhlIGZpcnN0IGVudHJ5IGlzCisJIHJldHVybmVkLiAgQnV0IHRoaXMgYWxzbyBtZWFucyB0aGF0IHRoZXJlIG11c3QgYmUgYSBmaXJzdCBkYXRhCisJIGVudHJ5LiAgKi8KKyAgICAgIGlmIChzY24tPmRhdGFfbGlzdF9yZWFyID09IE5VTEwKKwkgIC8qIFRoZSBzZWN0aW9uIHRoZSByZWZlcmVuY2UgZGF0YSBpcyBmb3IgbXVzdCBtYXRjaCB0aGUgc2VjdGlvbgorCSAgICAgcGFyYW1ldGVyLiAgKi8KKwkgIHx8IHVubGlrZWx5ICgoKEVsZl9EYXRhX1NjbiAqKSBkYXRhKS0+cyAhPSBzY24pKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogV2Ugc3RhcnQgc2VhcmNoaW5nIHdpdGggdGhlIGZpcnN0IGVudHJ5LiAgKi8KKyAgICAgIHJ1bnAgPSAmc2NuLT5kYXRhX2xpc3Q7CisKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIC8qIElmIGBkYXRhJyBkb2VzIG5vdCBtYXRjaCBhbnkga25vd24gcmVjb3JkIHB1bnQuICAqLworCSAgaWYgKHJ1bnAgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKwkgICAgICBnb3RvIG91dDsKKwkgICAgfQorCisJICBpZiAoJnJ1bnAtPmRhdGEuZCA9PSBkYXRhKQorCSAgICAvKiBGb3VuZCB0aGUgZW50cnkuICAqLworCSAgICBicmVhazsKKworCSAgcnVucCA9IHJ1bnAtPm5leHQ7CisJfQorCisgICAgICAvKiBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBuZXh0IGRhdGEgcmVjb3JkLiAgKi8KKyAgICAgIHJlc3VsdCA9IHJ1bnAtPm5leHQgPyAmcnVucC0+bmV4dC0+ZGF0YS5kIDogTlVMTDsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBJZiB0aGUgZGF0YSBmb3IgdGhpcyBzZWN0aW9uIHdhcyBub3QgeWV0IGluaXRpYWxpemVkIGRvIGl0IG5vdy4gICovCisgIGlmIChzY24tPmRhdGFfcmVhZCA9PSAwKQorICAgIHsKKyAgICAgIC8qIFdlIGNhbm5vdCBhY3F1aXJlIGEgd3JpdGUgbG9jayB3aGlsZSB3ZSBhcmUgaG9sZGluZyBhIHJlYWQKKyAgICAgICAgIGxvY2suICBUaGVyZWZvcmUgZ2l2ZSB1cCB0aGUgcmVhZCBsb2NrIGFuZCB0aGVuIGdldCB0aGUgd3JpdGUKKyAgICAgICAgIGxvY2suICBCdXQgdGhpcyBtZWFucyB0aGF0IHRoZSBkYXRhIGNvdWxkIG1lYW53aGlsZSBiZQorICAgICAgICAgbW9kaWZpZWQsIHRoZXJlZm9yZSBzdGFydCB0aGUgdGVzdHMgYWdhaW4uICAqLworICAgICAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKKyAgICAgIHJ3bG9ja193cmxvY2sgKGVsZi0+bG9jayk7CisKKyAgICAgIC8qIFJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4gIFRoZXJlIGlzIGFsd2F5cyBhIGZpbGUgKG9yCisJIG1lbW9yeSByZWdpb24pIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlc2NyaXB0b3Igc2luY2UKKwkgb3RoZXJ3aXNlIHRoZSBgZGF0YV9yZWFkJyBmbGFnIHdvdWxkIGJlIHNldC4gICovCisgICAgICBpZiAoc2NuLT5kYXRhX3JlYWQgPT0gMCAmJiBfX2xpYmVsZl9zZXRfcmF3ZGF0YSAoc2NuKSAhPSAwKQorCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgVGhlIGVycm9yIHZhbHVlIGlzIGFscmVhZHkgc2V0LiAgKi8KKwlnb3RvIG91dDsKKyAgICB9CisKKyAgLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByYXcgZGF0YSBpcyBhdmFpbGFibGUuICBCdXQgaXQgbWlnaHQgYmUKKyAgICAgZW1wdHkgaW4gY2FzZSB0aGUgc2VjdGlvbiBoYXMgc2l6ZSB6ZXJvIChmb3Igd2hhdGV2ZXIgcmVhc29uKS4KKyAgICAgTm93IGNyZWF0ZSB0aGUgY29udmVydGVkIGRhdGEgaW4gY2FzZSB0aGlzIGlzIG5lY2Vzc2FyeS4gICovCisgIGlmIChzY24tPmRhdGFfbGlzdF9yZWFyID09IE5VTEwpCisgICAgeworICAgICAgaWYgKHNjbi0+cmF3ZGF0YS5kLmRfYnVmICE9IE5VTEwgJiYgc2NuLT5yYXdkYXRhLmQuZF9zaXplID4gMCkKKwkvKiBDb252ZXJ0IGFjY29yZGluZyB0byB0aGUgdmVyc2lvbiBhbmQgdGhlIHR5cGUuICAgKi8KKwljb252ZXJ0X2RhdGEgKHNjbiwgX19saWJlbGZfdmVyc2lvbiwgZWxmLT5jbGFzcywKKwkJICAgICAgKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgorCQkgICAgICAgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5laGRyKQorCQkJICAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LmVoZHIpKQorCQkgICAgICAgPyBlbGYtPnN0YXRlLmVsZjMyLmVoZHItPmVfaWRlbnRbRUlfREFUQV0KKwkJICAgICAgIDogZWxmLT5zdGF0ZS5lbGY2NC5laGRyLT5lX2lkZW50W0VJX0RBVEFdKSwKKwkJICAgICAgc2NuLT5yYXdkYXRhLmQuZF9zaXplLCBzY24tPnJhd2RhdGEuZC5kX3R5cGUpOworICAgICAgZWxzZQorCS8qIFRoaXMgaXMgYW4gZW1wdHkgb3IgTk9CSVRTIHNlY3Rpb24uICBUaGVyZSBpcyBubyBidWZmZXIgYnV0CisJICAgdGhlIHNpemUgaW5mb3JtYXRpb24gZXRjIGlzIGltcG9ydGFudC4gICovCisJc2NuLT5kYXRhX2xpc3QuZGF0YS5kID0gc2NuLT5yYXdkYXRhLmQ7CisKKyAgICAgIHNjbi0+ZGF0YV9saXN0X3JlYXIgPSAmc2NuLT5kYXRhX2xpc3Q7CisgICAgfQorCisgIC8qIElmIG5vIGRhdGEgaXMgcHJlc2VudCB3ZSBjYW5ub3QgcmV0dXJuIGFueS4gICovCisgIGlmIChzY24tPmRhdGFfbGlzdF9yZWFyICE9IE5VTEwpCisgICAgLyogUmV0dXJuIHRoZSBmaXJzdCBkYXRhIGVsZW1lbnQgaW4gdGhlIGxpc3QuICAqLworICAgIHJlc3VsdCA9ICZzY24tPmRhdGFfbGlzdC5kYXRhLmQ7CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KK0lOVERFRihlbGZfZ2V0ZGF0YSkKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfZ2V0aWRlbnQuYyBiL2xpYmVsZi9lbGZfZ2V0aWRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjczYjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9nZXRpZGVudC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIFJldHJpZXZlIGZpbGUgaWRlbnRpZmljYXRpb24gZGF0YS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2NoYXIgKgorZWxmX2dldGlkZW50IChlbGYsIHB0cikKKyAgICAgRWxmICplbGY7CisgICAgIHNpemVfdCAqcHRyOworeworICAvKiBJbiBjYXNlIHRoaXMgaXMgbm8gRUxGIGZpbGUsIHRoZSBoYW5kbGUgaXMgaW52YWxpZCBhbmQgd2UgcmV0dXJuCisgICAgIE5VTEwuICAqLworICBpZiAoZWxmID09IE5VTEwgfHwgZWxmLT5raW5kICE9IEVMRl9LX0VMRikKKyAgICB7CisgICAgICBpZiAocHRyICE9IE5VTEwpCisJKnB0ciA9IDA7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogV2UgYWxyZWFkeSByZWFkIHRoZSBFTEYgaGVhZGVyLiAgUmV0dXJuIGEgcG9pbnRlciB0byBpdCBhbmQgc3RvcmUKKyAgICAgdGhlIGxlbmd0aCBpbiAqUFRSLiAgKi8KKyAgaWYgKHB0ciAhPSBOVUxMKQorICAgICpwdHIgPSBFSV9OSURFTlQ7CisKKyAgcmV0dXJuIChjaGFyICopIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKKwkJICAgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5laGRyKQorCQkgICAgICAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LmVoZHIpKQorCQkgICA/IGVsZi0+c3RhdGUuZWxmMzIuZWhkci0+ZV9pZGVudAorCQkgICA6IGVsZi0+c3RhdGUuZWxmNjQuZWhkci0+ZV9pZGVudCk7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX2dldHNjbi5jIGIvbGliZWxmL2VsZl9nZXRzY24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI0NzY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9nZXRzY24uYwpAQCAtMCwwICsxLDc3IEBACisvKiBHZXQgc2VjdGlvbiBhdCBzcGVjaWZpYyBpbmRleC4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitFbGZfU2NuICoKK2VsZl9nZXRzY24gKGVsZiwgaWR4KQorICAgICBFbGYgKmVsZjsKKyAgICAgc2l6ZV90IGlkeDsKK3sKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOworCisgIEVsZl9TY24gKnJlc3VsdCA9IE5VTEw7CisKKyAgLyogRmluZCB0aGUgc2VjdGlvbiBpbiB0aGUgbGlzdC4gICovCisgIEVsZl9TY25MaXN0ICpydW5wID0gKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgorCQkgICAgICAgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5zY25zKQorCQkJICAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LnNjbnMpKQorCQkgICAgICAgPyAmZWxmLT5zdGF0ZS5lbGYzMi5zY25zIDogJmVsZi0+c3RhdGUuZWxmNjQuc2Nucyk7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChpZHggPCBydW5wLT5tYXgpCisJeworCSAgaWYgKGlkeCA8IHJ1bnAtPmNudCkKKwkgICAgcmVzdWx0ID0gJnJ1bnAtPmRhdGFbaWR4XTsKKwkgIGVsc2UKKwkgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZHggLT0gcnVucC0+bWF4OworCisgICAgICBydW5wID0gcnVucC0+bmV4dDsKKyAgICAgIGlmIChydW5wID09IE5VTEwpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CitJTlRERUYoZWxmX2dldHNjbikKZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfZ2V0c2hudW0uYyBiL2xpYmVsZi9lbGZfZ2V0c2hudW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQ2YTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9nZXRzaG51bS5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qIFJldHVybiBudW1iZXIgb2Ygc2VjdGlvbnMgaW4gdGhlIEVMRiBmaWxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2ludAorZWxmX2dldHNobnVtIChlbGYsIGRzdCkKKyAgICAgRWxmICplbGY7CisgICAgIHNpemVfdCAqZHN0OworeworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGlkeDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcndsb2NrX3JkbG9jayAoZWxmLT5sb2NrKTsKKworICBpZHggPSBlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPmNudDsKKyAgaWYgKGlkeCAhPSAwCisgICAgICB8fCAoZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0CisJICAhPSAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCisJICAgICAgfHwgKG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCisJCSAgPT0gb2Zmc2V0b2YgKEVsZiwgc3RhdGUuZWxmNjQuc2NucykpCisJICAgICAgPyAmZWxmLT5zdGF0ZS5lbGYzMi5zY25zIDogJmVsZi0+c3RhdGUuZWxmNjQuc2NucykpKQorICAgIC8qIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBzZWN0aW9uLiAgKi8KKyAgICAqZHN0ID0gMSArIGVsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdC0+ZGF0YVtpZHggLSAxXS5pbmRleDsKKyAgZWxzZQorICAgICpkc3QgPSAwOworCisgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KK0lOVERFRihlbGZfZ2V0c2hudW0pCmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX2dldHNoc3RybmR4LmMgYi9saWJlbGYvZWxmX2dldHNoc3RybmR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2MDkyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGZfZ2V0c2hzdHJuZHguYwpAQCAtMCwwICsxLDE2OCBAQAorLyogUmV0dXJuIHNlY3Rpb24gaW5kZXggb2Ygc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorCisKK2ludAorZWxmX2dldHNoc3RybmR4IChlbGYsIGRzdCkKKyAgICAgRWxmICplbGY7CisgICAgIHNpemVfdCAqZHN0OworeworICBpbnQgcmVzdWx0ID0gMDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcndsb2NrX3JkbG9jayAoZWxmLT5sb2NrKTsKKworICAvKiBXZSByZWx5IGhlcmUgb24gdGhlIGZhY3QgdGhhdCB0aGUgYGVsZicgZWxlbWVudCBpcyBhIGNvbW1vbiBwcmVmaXgKKyAgICAgb2YgYGVsZjMyJyBhbmQgYGVsZjY0Jy4gICovCisgIGFzc2VydCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZi5laGRyKQorCSAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLmVoZHIpKTsKKyAgYXNzZXJ0IChzaXplb2YgKGVsZi0+c3RhdGUuZWxmLmVoZHIpCisJICA9PSBzaXplb2YgKGVsZi0+c3RhdGUuZWxmMzIuZWhkcikpOworICBhc3NlcnQgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYuZWhkcikKKwkgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5laGRyKSk7CisgIGFzc2VydCAoc2l6ZW9mIChlbGYtPnN0YXRlLmVsZi5laGRyKQorCSAgPT0gc2l6ZW9mIChlbGYtPnN0YXRlLmVsZjY0LmVoZHIpKTsKKworICBpZiAodW5saWtlbHkgKGVsZi0+c3RhdGUuZWxmLmVoZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1dST05HX09SREVSX0VIRFIpOworICAgICAgcmVzdWx0ID0gLTE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgRWxmMzJfV29yZCBudW07CisKKyAgICAgIG51bSA9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKKwkgICAgID8gZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX3Noc3RybmR4CisJICAgICA6IGVsZi0+c3RhdGUuZWxmNjQuZWhkci0+ZV9zaHN0cm5keCk7CisKKyAgICAgIC8qIERldGVybWluZSB3aGV0aGVyIHRoZSBpbmRleCBpcyB0b28gYmlnIHRvIGZpdCBpbiB0aGUgRUxGCisJIGhlYWRlci4gICovCisgICAgICBpZiAodW5saWtlbHkgKG51bSA9PSBTSE5fWElOREVYKSkKKwl7CisJICAvKiBZZXMuICBTZWFyY2ggdGhlIHplcm90aCBzZWN0aW9uIGhlYWRlci4gICovCisJICBpZiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQorCSAgICB7CisJICAgICAgc2l6ZV90IG9mZnNldDsKKworCSAgICAgIGlmIChlbGYtPnN0YXRlLmVsZjMyLnNjbnMuZGF0YVswXS5zaGRyLmUzMiAhPSBOVUxMKQorCQl7CisJCSAgbnVtID0gZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmRhdGFbMF0uc2hkci5lMzItPnNoX2xpbms7CisJCSAgZ290byBzdWNjZXNzOworCQl9CisKKwkgICAgICBvZmZzZXQgPSBlbGYtPnN0YXRlLmVsZjMyLmVoZHItPmVfc2hvZmY7CisKKwkgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMCisJCSAgJiYgZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX2lkZW50W0VJX0RBVEFdID09IE1ZX0VMRkRBVEEKKwkJICAmJiAoQUxMT1dfVU5BTElHTkVECisJCSAgICAgIHx8ICgoKHNpemVfdCkgKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MgKyBvZmZzZXQpKQorCQkJICAmIChfX2FsaWdub2ZfXyAoRWxmMzJfU2hkcikgLSAxKSkgPT0gMCkpCisJCS8qIFdlIGNhbiBkaXJlY3RseSBhY2Nlc3MgdGhlIG1lbW9yeS4gICovCisJCW51bSA9ICgoRWxmMzJfU2hkciAqKSAoZWxmLT5tYXBfYWRkcmVzcyArIG9mZnNldCkpLT5zaF9saW5rOworCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFdlIGF2b2lkIHJlYWRpbmcgaW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMuICBKdXN0IHJlYWQKKwkJICAgICB0aGUgZmlyc3Qgb25lLiAgKi8KKwkJICBFbGYzMl9TaGRyIHNoZHJfbWVtOworCisJCSAgaWYgKHByZWFkIChlbGYtPmZpbGRlcywgJnNoZHJfbWVtLCBzaXplb2YgKEVsZjMyX1NoZHIpLAorCQkJICAgICBvZmZzZXQpICE9IHNpemVvZiAoRWxmMzJfU2hkcikpCisJCSAgICB7CisJCSAgICAgIC8qIFdlIG11c3QgYmUgYWJsZSB0byByZWFkIHRoaXMgRUxGIHNlY3Rpb24gaGVhZGVyLiAgKi8KKwkJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfRklMRSk7CisJCSAgICAgIHJlc3VsdCA9IC0xOworCQkgICAgICBnb3RvIG91dDsKKwkJICAgIH0KKworCQkgIGlmIChlbGYtPnN0YXRlLmVsZjMyLmVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gTVlfRUxGREFUQSkKKwkJICAgIENPTlZFUlQgKHNoZHJfbWVtLnNoX2xpbmspOworCQkgIG51bSA9IHNoZHJfbWVtLnNoX2xpbms7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc2l6ZV90IG9mZnNldDsKKworCSAgICAgIGlmIChlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVswXS5zaGRyLmU2NCAhPSBOVUxMKQorCQl7CisJCSAgbnVtID0gZWxmLT5zdGF0ZS5lbGY2NC5zY25zLmRhdGFbMF0uc2hkci5lNjQtPnNoX2xpbms7CisJCSAgZ290byBzdWNjZXNzOworCQl9CisKKwkgICAgICBvZmZzZXQgPSBlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfc2hvZmY7CisKKwkgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMCisJCSAgJiYgZWxmLT5zdGF0ZS5lbGY2NC5laGRyLT5lX2lkZW50W0VJX0RBVEFdID09IE1ZX0VMRkRBVEEKKwkJICAmJiAoQUxMT1dfVU5BTElHTkVECisJCSAgICAgIHx8ICgoKHNpemVfdCkgKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MgKyBvZmZzZXQpKQorCQkJICAmIChfX2FsaWdub2ZfXyAoRWxmNjRfU2hkcikgLSAxKSkgPT0gMCkpCisJCS8qIFdlIGNhbiBkaXJlY3RseSBhY2Nlc3MgdGhlIG1lbW9yeS4gICovCisJCW51bSA9ICgoRWxmNjRfU2hkciAqKSAoZWxmLT5tYXBfYWRkcmVzcyArIG9mZnNldCkpLT5zaF9saW5rOworCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFdlIGF2b2lkIHJlYWRpbmcgaW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMuICBKdXN0IHJlYWQKKwkJICAgICB0aGUgZmlyc3Qgb25lLiAgKi8KKwkJICBFbGY2NF9TaGRyIHNoZHJfbWVtOworCisJCSAgaWYgKHByZWFkIChlbGYtPmZpbGRlcywgJnNoZHJfbWVtLCBzaXplb2YgKEVsZjY0X1NoZHIpLAorCQkJICAgICBvZmZzZXQpICE9IHNpemVvZiAoRWxmNjRfU2hkcikpCisJCSAgICB7CisJCSAgICAgIC8qIFdlIG11c3QgYmUgYWJsZSB0byByZWFkIHRoaXMgRUxGIHNlY3Rpb24gaGVhZGVyLiAgKi8KKwkJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfRklMRSk7CisJCSAgICAgIHJlc3VsdCA9IC0xOworCQkgICAgICBnb3RvIG91dDsKKwkJICAgIH0KKworCQkgIGlmIChlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gTVlfRUxGREFUQSkKKwkJICAgIENPTlZFUlQgKHNoZHJfbWVtLnNoX2xpbmspOworCQkgIG51bSA9IHNoZHJfbWVtLnNoX2xpbms7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgLyogU3RvcmUgdGhlIHJlc3VsdC4gICovCisgICAgc3VjY2VzczoKKyAgICAgICpkc3QgPSBudW07CisgICAgfQorCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CitJTlRERUYoZWxmX2dldHNoc3RybmR4KQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9oYXNoLmMgYi9saWJlbGYvZWxmX2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY0YWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9oYXNoLmMKQEAgLTAsMCArMSwzMyBAQAorLyogSGFzaCBmdW5jdGlvbiB1c2VkIGluIEVMRiBpbXBsZW1lbnRhdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmUC5oPgorCisvKiBHZXQgdGhlIGltcGxlbWVudGF0aW9uLiAgKi8KKyNpbmNsdWRlIDxkbC1oYXNoLmg+CisKK3Vuc2lnbmVkIGxvbmcgaW50CitlbGZfaGFzaCAoc3RyaW5nKQorICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHJldHVybiBfZGxfZWxmX2hhc2ggKHN0cmluZyk7Cit9CitJTlRERUYoZWxmX2hhc2gpCmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX2tpbmQuYyBiL2xpYmVsZi9lbGZfa2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2N2ViZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX2tpbmQuYwpAQCAtMCwwICsxLDMzIEBACisvKiBSZXR1cm4gdGhlIGtpbmQgb2YgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworRWxmX0tpbmQKK2VsZl9raW5kIChlbGYpCisgICAgIEVsZiAqZWxmOworeworICByZXR1cm4gZWxmID09IE5VTEwgPyBFTEZfS19OT05FIDogZWxmLT5raW5kOworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9tZW1vcnkuYyBiL2xpYmVsZi9lbGZfbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyMjFmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGZfbWVtb3J5LmMKQEAgLTAsMCArMSw0MCBAQAorLyogQ3JlYXRlIGRlc2NyaXB0b3IgZm9yIG1lbW9yeSByZWdpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworRWxmICoKK2VsZl9tZW1vcnkgKGltYWdlLCBzaXplKQorICAgICBjaGFyICppbWFnZTsKKyAgICAgc2l6ZV90IHNpemU7Cit7CisgIGlmIChpbWFnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX09QRVJBTkQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBfX2xpYmVsZl9yZWFkX21tYXBlZF9maWxlICgtMSwgaW1hZ2UsIDAsIHNpemUsIEVMRl9DX1JFQUQsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9uZHhzY24uYyBiL2xpYmVsZi9lbGZfbmR4c2NuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkNmJkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGZfbmR4c2NuLmMKQEAgLTAsMCArMSwzNiBAQAorLyogR2V0IGluZGV4IG9mIHNlY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworc2l6ZV90CitlbGZfbmR4c2NuIChzY24pCisgICAgIEVsZl9TY24gKnNjbjsKK3sKKyAgaWYgKHNjbiA9PSBOVUxMKQorICAgIHJldHVybiBTSE5fVU5ERUY7CisKKyAgcmV0dXJuIHNjbi0+aW5kZXg7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX25ld2RhdGEuYyBiL2xpYmVsZi9lbGZfbmV3ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTNiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX25ld2RhdGEuYwpAQCAtMCwwICsxLDk3IEBACisvKiBDcmVhdGUgbmV3LCBlbXB0eSBzZWN0aW9uIGRhdGEuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworRWxmX0RhdGEgKgorZWxmX25ld2RhdGEgKEVsZl9TY24gKnNjbikKK3sKKyAgRWxmX0RhdGFfTGlzdCAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAoc2NuID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVubGlrZWx5IChzY24tPmluZGV4ID09IDApKQorICAgIHsKKyAgICAgIC8qIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGFkZCBzb21ldGhpbmcgdG8gdGhlIDB0aCBzZWN0aW9uLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT1RfTlVMX1NFQ1RJT04pOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChzY24tPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgorICAgICAgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5laGRyKQorCSAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LmVoZHIpKQorICAgICAgPyBzY24tPmVsZi0+c3RhdGUuZWxmMzIuZWhkciA9PSBOVUxMCisgICAgICA6IHNjbi0+ZWxmLT5zdGF0ZS5lbGY2NC5laGRyID09IE5VTEwpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1dST05HX09SREVSX0VIRFIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJ3bG9ja193cmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICBpZiAoc2NuLT5kYXRhX3JlYWQgJiYgc2NuLT5kYXRhX2xpc3RfcmVhciA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoaXMgbWVhbnMgdGhlIHNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgdGhlIHVzZXIgYW5kIHRoaXMgaXMgdGhlCisJIGZpcnN0IGRhdGEuICAqLworICAgICAgcmVzdWx0ID0gJnNjbi0+ZGF0YV9saXN0OworICAgICAgcmVzdWx0LT5mbGFncyA9IEVMRl9GX0RJUlRZOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIENyZWF0ZSBhIG5ldywgZW1wdHkgZGF0YSBkZXNjcmlwdG9yLiAgKi8KKyAgICAgIHJlc3VsdCA9IChFbGZfRGF0YV9MaXN0ICopIGNhbGxvYyAoMSwgc2l6ZW9mIChFbGZfRGF0YV9MaXN0KSk7CisgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgcmVzdWx0LT5mbGFncyA9IEVMRl9GX0RJUlRZIHwgRUxGX0ZfTUFMTE9DRUQ7CisKKyAgICAgIGlmIChzY24tPmRhdGFfbGlzdF9yZWFyID09IE5VTEwpCisJLyogV2UgY3JlYXRlIG5ldyBkYXRhIHdpdGhvdXQgcmVhZGluZy9jb252ZXJ0aW5nIHRoZSBkYXRhIGZyb20gdGhlCisJICAgZmlsZS4gIFRoYXQgaXMgZmluZSBidXQgd2UgaGF2ZSB0byByZW1lbWJlciB0aGlzLiAgKi8KKwlzY24tPmRhdGFfbGlzdF9yZWFyID0gJnNjbi0+ZGF0YV9saXN0OworICAgIH0KKworICAvKiBTZXQgdGhlIHByZWRlZmluZWQgdmFsdWVzLiAgKi8KKyAgcmVzdWx0LT5kYXRhLmQuZF92ZXJzaW9uID0gX19saWJlbGZfdmVyc2lvbjsKKworICByZXN1bHQtPmRhdGEucyA9IHNjbjsKKworICAvKiBBZGQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gICovCisgIGlmIChzY24tPmRhdGFfbGlzdF9yZWFyICE9IE5VTEwpCisgICAgc2NuLT5kYXRhX2xpc3RfcmVhci0+bmV4dCA9IHJlc3VsdDsKKworICBzY24tPmRhdGFfbGlzdF9yZWFyID0gcmVzdWx0OworCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChzY24tPmVsZi0+bG9jayk7CisKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGlzIHRocmVhZCBzYWZlIGFuZCBpcyBhbHNvIGRlZmluZWQKKyAgICAgZm9yIFJFU1VMVCA9PSBOVUxMIHNpbmNlIGl0IHN0aWxsIHJldHVybiBOVUxMLiAgKi8KKyAgcmV0dXJuICZyZXN1bHQtPmRhdGEuZDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfbmV3c2NuLmMgYi9saWJlbGYvZWxmX25ld3Njbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZWEwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX25ld3Njbi5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiBBcHBlbmQgbmV3IHNlY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworRWxmX1NjbiAqCitlbGZfbmV3c2NuIChlbGYpCisgICAgIEVsZiAqZWxmOworeworICBFbGZfU2NuICpyZXN1bHQgPSBOVUxMOworICBib29sIGZpcnN0ID0gZmFsc2U7CisKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFdlIHJlbHkgb24gdGhlIHByZWZpeCBvZiB0aGUgYGVsZicsIGBlbGYzMicsIGFuZCBgZWxmNjQnIGVsZW1lbnQKKyAgICAgYmVpbmcgdGhlIHNhbWUuICAqLworICBhc3NlcnQgKG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZi5zY25zX2xhc3QpCisJICA9PSBvZmZzZXRvZiAoRWxmLCBzdGF0ZS5lbGYzMi5zY25zX2xhc3QpKTsKKyAgYXNzZXJ0IChvZmZzZXRvZiAoRWxmLCBzdGF0ZS5lbGYuc2Nuc19sYXN0KQorCSAgPT0gb2Zmc2V0b2YgKEVsZiwgc3RhdGUuZWxmNjQuc2Nuc19sYXN0KSk7CisgIGFzc2VydCAob2Zmc2V0b2YgKEVsZiwgc3RhdGUuZWxmMzIuc2NucykKKwkgID09IG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjY0LnNjbnMpKTsKKworICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOworCisgYWdhaW46CisgIGlmIChlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPmNudCA8IGVsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdC0+bWF4KQorICAgIHsKKyAgICAgIHJlc3VsdCA9ICZlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPmRhdGFbZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5jbnRdOworCisgICAgICBpZiAoKytlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPmNudCA9PSAxCisJICAmJiAoZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0CisJICAgICAgPT0gKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgorCQkgIHx8IChvZmZzZXRvZiAoRWxmLCBzdGF0ZS5lbGYzMi5zY25zKQorCQkgICAgICA9PSBvZmZzZXRvZiAoRWxmLCBzdGF0ZS5lbGY2NC5zY25zKSkKKwkJICA/ICZlbGYtPnN0YXRlLmVsZjMyLnNjbnMgOiAmZWxmLT5zdGF0ZS5lbGY2NC5zY25zKSkpCisJLyogVGhpcyBpcyB6ZXJvdGggc2VjdGlvbi4gICovCisJZmlyc3QgPSB0cnVlOworICAgICAgZWxzZQorCXsKKwkgIGFzc2VydCAoZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5jbnQgPiAxKTsKKwkgIHJlc3VsdC0+aW5kZXggPSByZXN1bHRbLTFdLmluZGV4ICsgMTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyBlbGVtZW50LiAgKi8KKyAgICAgIEVsZl9TY25MaXN0ICpuZXdwOworCisgICAgICBhc3NlcnQgKGVsZi0+c3RhdGUuZWxmLnNjbmluY3IgPiAwKTsKKworICAgICAgbmV3cCA9IChFbGZfU2NuTGlzdCAqKSBjYWxsb2MgKHNpemVvZiAoRWxmX1Njbkxpc3QpCisJCQkJICAgICArICgoZWxmLT5zdGF0ZS5lbGYuc2NuaW5jciAqPSAyKQorCQkJCQkqIHNpemVvZiAoRWxmX1NjbikpLCAxKTsKKyAgICAgIGlmIChuZXdwID09IE5VTEwpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgcmVzdWx0ID0gJm5ld3AtPmRhdGFbMF07CisKKyAgICAgIC8qIE9uZSBzZWN0aW9uIHVzZWQuICAqLworICAgICAgKytuZXdwLT5jbnQ7CisKKyAgICAgIC8qIFRoaXMgaXMgdGhlIG51bWJlciBvZiBzZWN0aW9ucyB3ZSBhbGxvY2F0ZWQuICAqLworICAgICAgbmV3cC0+bWF4ID0gZWxmLT5zdGF0ZS5lbGYuc2NuaW5jcjsKKworICAgICAgLyogUmVtZW1iZXIgdGhlIGluZGV4IGZvciB0aGUgZmlyc3Qgc2VjdGlvbiBpbiB0aGlzIGJsb2NrLiAgKi8KKyAgICAgIG5ld3AtPmRhdGFbMF0uaW5kZXgKKwk9IDEgKyBlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPmRhdGFbZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5tYXggLSAxXS5pbmRleDsKKworICAgICAgLyogRW5xdWV1ZSB0aGUgbmV3IGxpc3QgZWxlbWVudC4gICovCisgICAgICBlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QgPSBlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPm5leHQgPSBuZXdwOworICAgIH0KKworICAvKiBDcmVhdGUgYSBzZWN0aW9uIGhlYWRlciBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KKyAgaWYgKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKKyAgICB7CisgICAgICByZXN1bHQtPnNoZHIuZTMyID0gKEVsZjMyX1NoZHIgKikgY2FsbG9jICgxLCBzaXplb2YgKEVsZjMyX1NoZHIpKTsKKyAgICAgIGlmIChyZXN1bHQtPnNoZHIuZTMyID09IE5VTEwpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXN1bHQtPnNoZHIuZTY0ID0gKEVsZjY0X1NoZHIgKikgY2FsbG9jICgxLCBzaXplb2YgKEVsZjY0X1NoZHIpKTsKKyAgICAgIGlmIChyZXN1bHQtPnNoZHIuZTY0ID09IE5VTEwpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CisKKyAgcmVzdWx0LT5lbGYgPSBlbGY7CisgIHJlc3VsdC0+c2hkcl9mbGFncyA9IEVMRl9GX0RJUlRZIHwgRUxGX0ZfTUFMTE9DRUQ7CisgIHJlc3VsdC0+bGlzdCA9IGVsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdDsKKworICAvKiBJbml0aWFsaXplIHRoZSBkYXRhIHBhcnQuICAqLworICByZXN1bHQtPmRhdGFfcmVhZCA9IDE7CisgIGlmICh1bmxpa2VseSAoZmlyc3QpKQorICAgIHsKKyAgICAgIC8qIEZvciB0aGUgZmlyc3Qgc2VjdGlvbiB3ZSBtYXJrIHRoZSBkYXRhIGFzIGFscmVhZHkgYXZhaWxhYmxlLiAgKi8KKyAgICAgIC8vcmVzdWx0LT5kYXRhX2xpc3RfcmVhciA9ICZyZXN1bHQtPmRhdGFfbGlzdDsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBnb3RvIGFnYWluOworICAgIH0KKworICByZXN1bHQtPmZsYWdzIHw9IEVMRl9GX0RJUlRZOworCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX25leHQuYyBiL2xpYmVsZi9lbGZfbmV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTA3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX25leHQuYwpAQCAtMCwwICsxLDUzIEBACisvKiBBZHZhbmNlIGluIGFyY2hpdmUgdG8gbmV4dCBlbGVtZW50LgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK0VsZl9DbWQKK2VsZl9uZXh0IChlbGYpCisgICAgIEVsZiAqZWxmOworeworICBFbGYgKnBhcmVudDsKKworICAvKiBCZSBncmF0aW91cywgdGhlIHNwZWNzIGRlbWFuZCBpdC4gICovCisgIGlmIChlbGYgPT0gTlVMTCB8fCBlbGYtPnBhcmVudCA9PSBOVUxMKQorICAgIHJldHVybiBFTEZfQ19OVUxMOworCisgIC8qIFdlIGNhbiBiZSBzdXJlIHRoZSBwYXJlbnQgaXMgYW4gYXJjaGl2ZS4gICovCisgIHBhcmVudCA9IGVsZi0+cGFyZW50OworICBhc3NlcnQgKHBhcmVudC0+a2luZCA9PSBFTEZfS19BUik7CisKKyAgLyogTm93IGFkdmFuY2UgdGhlIG9mZnNldC4gICovCisgIHBhcmVudC0+c3RhdGUuYXIub2Zmc2V0ICs9IChzaXplb2YgKHN0cnVjdCBhcl9oZHIpCisJCQkgICAgICArICgocGFyZW50LT5zdGF0ZS5hci5lbGZfYXJfaGRyLmFyX3NpemUgKyAxKQorCQkJCSAmIH4xbCkpOworCisgIC8qIEdldCB0aGUgbmV4dCBhcmNoaXZlIGhlYWRlci4gICovCisgIGlmIChfX2xpYmVsZl9uZXh0X2FyaGRyIChwYXJlbnQpICE9IDApCisgICAgcmV0dXJuIEVMRl9DX05VTEw7CisKKyAgcmV0dXJuIGVsZi0+Y21kOworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9uZXh0c2NuLmMgYi9saWJlbGYvZWxmX25leHRzY24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTlkZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9uZXh0c2NuLmMKQEAgLTAsMCArMSw3NyBAQAorLyogR2V0IG5leHQgc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitFbGZfU2NuICoKK2VsZl9uZXh0c2NuIChlbGYsIHNjbikKKyAgICAgRWxmICplbGY7CisgICAgIEVsZl9TY24gKnNjbjsKK3sKKyAgRWxmX1NjbiAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcndsb2NrX3JkbG9jayAoZWxmLT5sb2NrKTsKKworICBpZiAoc2NuID09IE5VTEwpCisgICAgeworICAgICAgLyogSWYgbm8gc2VjdGlvbiBoYW5kbGUgaXMgZ2l2ZW4gcmV0dXJuIHRoZSBmaXJzdCAobm90IDB0aCkgc2VjdGlvbi4gICovCisgICAgICBpZiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCisJICAgfHwgKG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCisJICAgICAgID09IG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjY0LnNjbnMpKSkKKwl7CisJICBpZiAoZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmNudCA+IDEpCisJICAgIHJlc3VsdCA9ICZlbGYtPnN0YXRlLmVsZjMyLnNjbnMuZGF0YVsxXTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGVsZi0+c3RhdGUuZWxmNjQuc2Nucy5jbnQgPiAxKQorCSAgICByZXN1bHQgPSAmZWxmLT5zdGF0ZS5lbGY2NC5zY25zLmRhdGFbMV07CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEVsZl9TY25MaXN0ICpsaXN0ID0gc2NuLT5saXN0OworCisgICAgICBpZiAoc2NuICsgMSA8ICZsaXN0LT5kYXRhW2xpc3QtPmNudF0pCisJcmVzdWx0ID0gc2NuICsgMTsKKyAgICAgIGVsc2UgaWYgKHNjbiArIDEgPT0gJmxpc3QtPmRhdGFbbGlzdC0+bWF4XQorCSAgICAgICAmJiAobGlzdCA9IGxpc3QtPm5leHQpICE9IE5VTEwpCisJeworCSAgLyogSWYgdGhlcmUgaXMgYW5vdGhlciBlbGVtZW50IGluIHRoZSBzZWN0aW9uIGxpc3QgaXQgbXVzdAorCSAgICAgaGF2ZSBhdCBsZWFzdCBvbmUgZW50cnkuICAqLworCSAgYXNzZXJ0IChsaXN0LT5jbnQgPiAwKTsKKwkgIHJlc3VsdCA9ICZsaXN0LT5kYXRhWzBdOworCX0KKyAgICB9CisKKyAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQorSU5UREVGKGVsZl9uZXh0c2NuKQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9yYW5kLmMgYi9saWJlbGYvZWxmX3JhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmMzODYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9yYW5kLmMKQEAgLTAsMCArMSw0OSBAQAorLyogU2VsZWN0IHNwZWNpZmljIGVsZW1lbnQgaW4gYXJjaGl2ZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitzaXplX3QKK2VsZl9yYW5kIChlbGYsIG9mZnNldCkKKyAgICAgRWxmICplbGY7CisgICAgIHNpemVfdCBvZmZzZXQ7Cit7CisgIC8qIEJlIGdyYXRpb3VzLCB0aGUgc3BlY3MgZGVtYW5kIGl0LiAgKi8KKyAgaWYgKGVsZiA9PSBOVUxMIHx8IGVsZi0+a2luZCAhPSBFTEZfS19BUikKKyAgICByZXR1cm4gMDsKKworICAvKiBTYXZlIHRoZSBvbGQgb2Zmc2V0IGFuZCBzZXQgdGhlIG9mZnNldC4gICovCisgIGVsZi0+c3RhdGUuYXIub2Zmc2V0ID0gZWxmLT5zdGFydF9vZmZzZXQgKyBvZmZzZXQ7CisKKyAgLyogR2V0IHRoZSBuZXh0IGFyY2hpdmUgaGVhZGVyLiAgKi8KKyAgaWYgKF9fbGliZWxmX25leHRfYXJoZHIgKGVsZikgIT0gMCkKKyAgICB7CisgICAgICAvKiBNYXJrIHRoZSBhcmNoaXZlIGhlYWRlciBhcyB1bnVzYWJsZS4gICovCisgICAgICBlbGYtPnN0YXRlLmFyLmVsZl9hcl9oZHIuYXJfbmFtZSA9IE5VTEw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIG9mZnNldDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfcmF3ZGF0YS5jIGIvbGliZWxmL2VsZl9yYXdkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3YzM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGZfcmF3ZGF0YS5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIFJldHVybiByYXcgc2VjdGlvbiBjb250ZW50LgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK0VsZl9EYXRhICoKK2VsZl9yYXdkYXRhIChzY24sIGRhdGEpCisgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgRWxmX0RhdGEgKmRhdGE7Cit7CisgIGlmIChzY24gPT0gTlVMTCB8fCBzY24tPmVsZi0+a2luZCAhPSBFTEZfS19FTEYpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBJZiBgZGF0YScgaXMgbm90IE5VTEwgdGhpcyBtZWFucyB3ZSBhcmUgbm90IGFkZHJlc3NpbmcgdGhlIGluaXRpYWwKKyAgICAgZGF0YSBpbiB0aGUgZmlsZS4gIEJ1dCB0aGlzIGFsc28gbWVhbnMgdGhpcyBkYXRhIGlzIGFscmVhZHkgcmVhZAorICAgICAoc2luY2Ugb3RoZXJ3aXNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIGEgdmFsaWQgYGRhdGEnIHBvaW50ZXIpCisgICAgIGFuZCBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQgYXMgd2VsbC4gIEluIHRoaXMgY2FzZQorICAgICB3ZSBjYW4gc2ltcGx5IHdhbGsgdGhlIGxpc3Qgb2YgZGF0YSByZWNvcmRzLiAgKi8KKyAgaWYgKGRhdGEgIT0gTlVMTAorICAgICAgfHwgKHNjbi0+ZGF0YV9yZWFkICE9IDAgJiYgKHNjbi0+ZmxhZ3MgJiBFTEZfRl9GSUxFREFUQSkgPT0gMCkpCisgICAgeworICAgICAgLyogV2UgZG9uJ3QgYWxsb3cgYWNjZXNzaW5nIGFueSBidXQgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBmaWxlCisJIGFzIHJhdy4gICovCisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogSWYgdGhlIGRhdGEgZm9yIHRoaXMgc2VjdGlvbiB3YXMgbm90IHlldCBpbml0aWFsaXplZCBkbyBpdCBub3cuICAqLworICBpZiAoc2NuLT5kYXRhX3JlYWQgPT0gMCkKKyAgICB7CisgICAgICAvKiBGaXJzdCB0aGluZyB3ZSBkbyBpcyB0byByZWFkIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUuICBUaGVyZSBpcworCSBhbHdheXMgYSBmaWxlIChvciBtZW1vcnkgcmVnaW9uKSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXNjcmlwdG9yCisJIHNpbmNlIG90aGVyd2lzZSB0aGUgYGRhdGFfcmVhZCcgZmxhZyB3b3VsZCBiZSBzZXQuICAqLworICAgICAgaWYgKF9fbGliZWxmX3NldF9yYXdkYXRhIChzY24pICE9IDApCisJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICBUaGUgZXJyb3IgdmFsdWUgaXMgYWxyZWFkeSBzZXQuICAqLworCXJldHVybiBOVUxMOworICAgIH0KKworICAvKiBSZXR1cm4gdGhlIGZpcnN0IGRhdGEgZWxlbWVudCBpbiB0aGUgbGlzdC4gICovCisgIHJldHVybiAmc2NuLT5yYXdkYXRhLmQ7Cit9CitJTlRERUYoZWxmX3Jhd2RhdGEpCmRpZmYgLS1naXQgYS9saWJlbGYvZWxmX3Jhd2ZpbGUuYyBiL2xpYmVsZi9lbGZfcmF3ZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmRjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX3Jhd2ZpbGUuYwpAQCAtMCwwICsxLDUxIEBACisvKiBSZXRyaWV2ZSB1bmludGVycHJldGVkIGZpbGUgY29udGVudHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworY2hhciAqCitlbGZfcmF3ZmlsZSAoZWxmLCBwdHIpCisgICAgIEVsZiAqZWxmOworICAgICBzaXplX3QgKnB0cjsKK3sKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE5vIHZhbGlkIGRlc2NyaXB0b3IuICAqLworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICBlcnJvcl9vdXQ6CisgICAgICBpZiAocHRyICE9IE5VTEwpCisJKnB0ciA9IDA7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogSWYgdGhlIGZpbGUgaXMgbm90IG1tYXAnZWQgYW5kIG5vdCBwcmV2aW91c2x5IGxvYWRlZCwgZG8gaXQgbm93LiAgKi8KKyAgaWYgKGVsZi0+bWFwX2FkZHJlc3MgPT0gTlVMTCAmJiBfX2xpYmVsZl9yZWFkYWxsIChlbGYpID09IE5VTEwpCisgICAgZ290byBlcnJvcl9vdXQ7CisKKyAgaWYgKHB0ciAhPSBOVUxMKQorICAgICpwdHIgPSBlbGYtPm1heGltdW1fc2l6ZTsKKworICByZXR1cm4gKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl9yZWFkYWxsLmMgYi9saWJlbGYvZWxmX3JlYWRhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZkYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl9yZWFkYWxsLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIFJlYWQgYWxsIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvci4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKworCitzdGF0aWMgdm9pZAorc2V0X2FkZHJlc3MgKEVsZiAqZWxmLCBzaXplX3Qgb2Zmc2V0KQoreworICBpZiAoZWxmLT5raW5kID09IEVMRl9LX0FSKQorICAgIHsKKyAgICAgIEVsZiAqY2hpbGQgPSBlbGYtPnN0YXRlLmFyLmNoaWxkcmVuOworCisgICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkKKwl7CisJICBpZiAoY2hpbGQtPm1hcF9hZGRyZXNzID09IE5VTEwpCisJICAgIHsKKwkgICAgICBjaGlsZC0+bWFwX2FkZHJlc3MgPSBlbGYtPm1hcF9hZGRyZXNzOworCSAgICAgIGNoaWxkLT5zdGFydF9vZmZzZXQgLT0gb2Zmc2V0OworCSAgICAgIGlmIChjaGlsZC0+a2luZCA9PSBFTEZfS19BUikKKwkJY2hpbGQtPnN0YXRlLmFyLm9mZnNldCAtPSBvZmZzZXQ7CisKKwkgICAgICBzZXRfYWRkcmVzcyAoY2hpbGQsIG9mZnNldCk7CisJICAgIH0KKworCSAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKwl9CisgICAgfQorfQorCisKK2NoYXIgKgorX19saWJlbGZfcmVhZGFsbCAoZWxmKQorICAgICBFbGYgKmVsZjsKK3sKKyAgLyogR2V0IHRoZSBmaWxlLiAgKi8KKyAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICBpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMICYmIHVubGlrZWx5IChlbGYtPmZpbGRlcyA9PSAtMSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogSWYgdGhlIGZpbGUgaXMgbm90IG1tYXAnZWQgYW5kIG5vdCBwcmV2aW91c2x5IGxvYWRlZCwgZG8gaXQgbm93LiAgKi8KKyAgaWYgKGVsZi0+bWFwX2FkZHJlc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICptZW07CisKKyAgICAgIC8qIElmIHRoaXMgaXMgYW4gYXJjaGl2ZSBhbmQgd2UgaGF2ZSBkZXJpdmVkIGRlc2NyaXB0b3JzIGdldCB0aGUKKwkgbG9ja3MgZm9yIGFsbCBvZiB0aGVtLiAgKi8KKyAgICAgIGxpYmVsZl9hY3F1aXJlX2FsbCAoZWxmKTsKKworICAgICAgLyogQWxsb2NhdGUgYWxsIHRoZSBtZW1vcnkgd2UgbmVlZC4gICovCisgICAgICBtZW0gPSAoY2hhciAqKSBtYWxsb2MgKGVsZi0+bWF4aW11bV9zaXplKTsKKyAgICAgIGlmIChtZW0gIT0gTlVMTCkKKwl7CisJICAvKiBSZWFkIHRoZSBmaWxlIGNvbnRlbnQuICAqLworCSAgaWYgKChzaXplX3QpIHByZWFkIChlbGYtPmZpbGRlcywgbWVtLCBlbGYtPm1heGltdW1fc2l6ZSwKKwkJCSAgICAgIGVsZi0+c3RhcnRfb2Zmc2V0KSAhPSBlbGYtPm1heGltdW1fc2l6ZSkKKwkgICAgeworCSAgICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgKi8KKwkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfUkVBRF9FUlJPUik7CisJICAgICAgZnJlZSAobWVtKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogUmVtZW1iZXIgdGhlIGFkZHJlc3MuICAqLworCSAgICAgIGVsZi0+bWFwX2FkZHJlc3MgPSBtZW07CisKKwkgICAgICAvKiBBbHNvIHJlbWVtYmVyIHRoYXQgd2UgYWxsb2NhdGVkIHRoZSBtZW1vcnkuICAqLworCSAgICAgIGVsZi0+ZmxhZ3MgfD0gRUxGX0ZfTUFMTE9DRUQ7CisKKwkgICAgICAvKiBQcm9wYWdhdGUgdGhlIGluZm9ybWF0aW9uIGRvd24gdG8gYWxsIGNoaWxkcmVuIGFuZAorCQkgdGhlaXIgY2hpbGRyZW4uICAqLworCSAgICAgIHNldF9hZGRyZXNzIChlbGYsIGVsZi0+c3RhcnRfb2Zmc2V0KTsKKworCSAgICAgIC8qIENvcnJlY3QgdGhlIG93biBvZmZzZXRzLiAgKi8KKwkgICAgICBpZiAoZWxmLT5raW5kID09IEVMRl9LX0FSKQorCQllbGYtPnN0YXRlLmFyLm9mZnNldCAtPSBlbGYtPnN0YXJ0X29mZnNldDsKKwkgICAgICBlbGYtPnN0YXJ0X29mZnNldCA9IDA7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKworICAgICAgLyogRnJlZSB0aGUgbG9ja3Mgb24gdGhlIGNoaWxkcmVuLiAgKi8KKyAgICAgIGxpYmVsZl9yZWxlYXNlX2FsbCAoZWxmKTsKKyAgICB9CisKKyAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKKworICByZXR1cm4gKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzczsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9lbGZfc3RycHRyLmMgYi9saWJlbGYvZWxmX3N0cnB0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2FkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZWxmX3N0cnB0ci5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiBSZXR1cm4gc3RyaW5nIHBvaW50ZXIgZnJvbSBzdHJpbmcgc2VjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitjaGFyICoKK2VsZl9zdHJwdHIgKGVsZiwgaWR4LCBvZmZzZXQpCisgICAgIEVsZiAqZWxmOworICAgICBzaXplX3QgaWR4OworICAgICBzaXplX3Qgb2Zmc2V0OworeworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOworCisgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CisgIEVsZl9TY24gKnN0cnNjbjsKKworICAvKiBGaW5kIHRoZSBzZWN0aW9uIGluIHRoZSBsaXN0LiAgKi8KKyAgRWxmX1Njbkxpc3QgKnJ1bnAgPSAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCisJCSAgICAgICB8fCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCisJCQkgICA9PSBvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmNjQuc2NucykpCisJCSAgICAgICA/ICZlbGYtPnN0YXRlLmVsZjMyLnNjbnMgOiAmZWxmLT5zdGF0ZS5lbGY2NC5zY25zKTsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKGlkeCA8IHJ1bnAtPm1heCkKKwl7CisJICBpZiAoaWR4IDwgcnVucC0+Y250KQorCSAgICBzdHJzY24gPSAmcnVucC0+ZGF0YVtpZHhdOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgICAgIGdvdG8gb3V0OworCSAgICB9CisJICBicmVhazsKKwl9CisKKyAgICAgIGlkeCAtPSBydW5wLT5tYXg7CisKKyAgICAgIHJ1bnAgPSBydW5wLT5uZXh0OworICAgICAgaWYgKHJ1bnAgPT0gTlVMTCkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisJICBnb3RvIG91dDsKKwl9CisgICAgfQorCisgIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgaWYgKHVubGlrZWx5IChzdHJzY24tPnNoZHIuZTMyLT5zaF90eXBlICE9IFNIVF9TVFJUQUIpKQorCXsKKwkgIC8qIFRoaXMgaXMgbm8gc3RyaW5nIHNlY3Rpb24uICAqLworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfU0VDVElPTik7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIGlmICh1bmxpa2VseSAob2Zmc2V0ID49IHN0cnNjbi0+c2hkci5lMzItPnNoX3NpemUpKQorCXsKKwkgIC8qIFRoZSBnaXZlbiBvZmZzZXQgaXMgdG9vIGJpZywgaXQgaXMgYmV5b25kIHRoaXMgc2VjdGlvbi4gICovCisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfT0ZGU0VUX1JBTkdFKTsKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAodW5saWtlbHkgKHN0cnNjbi0+c2hkci5lNjQtPnNoX3R5cGUgIT0gU0hUX1NUUlRBQikpCisJeworCSAgLyogVGhpcyBpcyBubyBzdHJpbmcgc2VjdGlvbi4gICovCisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9TRUNUSU9OKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgaWYgKHVubGlrZWx5IChvZmZzZXQgPj0gc3Ryc2NuLT5zaGRyLmU2NC0+c2hfc2l6ZSkpCisJeworCSAgLyogVGhlIGdpdmVuIG9mZnNldCBpcyB0b28gYmlnLCBpdCBpcyBiZXlvbmQgdGhpcyBzZWN0aW9uLiAgKi8KKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9PRkZTRVRfUkFOR0UpOworCSAgZ290byBvdXQ7CisJfQorICAgIH0KKworICBpZiAoc3Ryc2NuLT5yYXdkYXRhX2Jhc2UgPT0gTlVMTAorICAgICAgLyogUmVhZCB0aGUgc2VjdGlvbiBkYXRhLiAgKi8KKyAgICAgICYmIF9fbGliZWxmX3NldF9yYXdkYXRhIChzdHJzY24pICE9IDApCisgICAgZ290byBvdXQ7CisKKyAgcmVzdWx0ID0gJnN0cnNjbi0+cmF3ZGF0YV9iYXNlW29mZnNldF07CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KK0lOVERFRihlbGZfc3RycHRyKQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl91cGRhdGUuYyBiL2xpYmVsZi9lbGZfdXBkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2YzZiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9lbGZfdXBkYXRlLmMKQEAgLTAsMCArMSwxNzggQEAKKy8qIFVwZGF0ZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGNoYW5nZXMgYW5kIHdyaXRlIHRoZW0gb3V0LgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworc3RhdGljIG9mZl90Cit3cml0ZV9maWxlIChFbGYgKmVsZiwgb2ZmX3Qgc2l6ZSwgaW50IGNoYW5nZV9ibywgc2l6ZV90IHNobnVtKQoreworICBpbnQgY2xhc3MgPSBlbGYtPmNsYXNzOworCisgIC8qIEFkanVzdCB0aGUgc2l6ZSBpbiBhbnkgY2FzZS4gIFdlIGRvIHRoaXMgZXZlbiBpZiB3ZSB1c2UgYHdyaXRlJy4KKyAgICAgV2UgY2Fubm90IGRvIHRoaXMgaWYgdGhpcyBmaWxlIGlzIGluIGFuIGFyY2hpdmUuICBXZSBhbHNvIGRvbid0CisgICAgIGRvIGl0ICpub3cqIGlmIHdlIGFyZSBzaG9ydGVuaW5nIHRoZSBmaWxlIHNpbmNlIHRoaXMgd291bGQKKyAgICAgcHJldmVudCBwcm9ncmFtcyB0byB1c2UgdGhlIGRhdGEgb2YgdGhlIGZpbGUgaW4gZ2VuZXJhdGluZyB0aGUKKyAgICAgbmV3IGZpbGUuICBXZSB0cnVuY2F0ZSB0aGUgZmlsZSBsYXRlciBpbiB0aGlzIGNhc2UuICAqLworICBpZiAoZWxmLT5wYXJlbnQgPT0gTlVMTAorICAgICAgJiYgKGVsZi0+bWF4aW11bV9zaXplID09IH4oKHNpemVfdCkgMCkKKwkgIHx8IChzaXplX3QpIHNpemUgPiBlbGYtPm1heGltdW1fc2l6ZSkKKyAgICAgICYmIHVubGlrZWx5IChmdHJ1bmNhdGUgKGVsZi0+ZmlsZGVzLCBzaXplKSAhPSAwKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JJVEVfRVJST1IpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAvKiBUcnkgdG8gbWFwIHRoZSBmaWxlIGlmIHRoaXMgaXNuJ3QgZG9uZSB5ZXQuICAqLworICBpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMICYmIGVsZi0+Y21kID09IEVMRl9DX1dSSVRFX01NQVApCisgICAgeworI2lmIF9NVURGTEFQCisgICAgICAvKiBNdWRmbGFwIGRvZXNuJ3QgZ3JvayB0aGF0IG91ciBtbWFwJ2QgZGF0YSBpcyBvay4gICovCisjZWxzZQorICAgICAgZWxmLT5tYXBfYWRkcmVzcyA9IG1tYXAgKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkgICAgICAgTUFQX1NIQVJFRCwgZWxmLT5maWxkZXMsIDApOworICAgICAgaWYgKHVubGlrZWx5IChlbGYtPm1hcF9hZGRyZXNzID09IE1BUF9GQUlMRUQpKQorCWVsZi0+bWFwX2FkZHJlc3MgPSBOVUxMOworI2VuZGlmCisgICAgfQorCisgIGlmIChlbGYtPm1hcF9hZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgLyogVGhlIGZpbGUgaXMgbW1hcGVkLiAgKi8KKyAgICAgIGlmICgoY2xhc3MgPT0gRUxGQ0xBU1MzMgorCSAgID8gX19lbGYzMl91cGRhdGVtbWFwIChlbGYsIGNoYW5nZV9ibywgc2hudW0pCisJICAgOiBfX2VsZjY0X3VwZGF0ZW1tYXAgKGVsZiwgY2hhbmdlX2JvLCBzaG51bSkpICE9IDApCisJLyogU29tZSBwcm9ibGVtIHdoaWxlIHdyaXRpbmcuICAqLworCXNpemUgPSAtMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgZmlsZSBpcyBub3QgbW1hcGVkLiAgKi8KKyAgICAgIGlmICgoY2xhc3MgPT0gRUxGQ0xBU1MzMgorCSAgID8gX19lbGYzMl91cGRhdGVmaWxlIChlbGYsIGNoYW5nZV9ibywgc2hudW0pCisJICAgOiBfX2VsZjY0X3VwZGF0ZWZpbGUgKGVsZiwgY2hhbmdlX2JvLCBzaG51bSkpICE9IDApCisJLyogU29tZSBwcm9ibGVtIHdoaWxlIHdyaXRpbmcuICAqLworCXNpemUgPSAtMTsKKyAgICB9CisKKyAgaWYgKHNpemUgIT0gLTEKKyAgICAgICYmIGVsZi0+cGFyZW50ID09IE5VTEwKKyAgICAgICYmIGVsZi0+bWF4aW11bV9zaXplICE9IH4oKHNpemVfdCkgMCkKKyAgICAgICYmIChzaXplX3QpIHNpemUgPCBlbGYtPm1heGltdW1fc2l6ZQorICAgICAgJiYgdW5saWtlbHkgKGZ0cnVuY2F0ZSAoZWxmLT5maWxkZXMsIHNpemUpICE9IDApKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUklURV9FUlJPUik7CisgICAgICBzaXplID0gLTE7CisgICAgfQorCisgIGlmIChzaXplICE9IC0xICYmIGVsZi0+cGFyZW50ID09IE5VTEwpCisgICAgZWxmLT5tYXhpbXVtX3NpemUgPSBzaXplOworCisgIHJldHVybiBzaXplOworfQorCisKK29mZl90CitlbGZfdXBkYXRlIChlbGYsIGNtZCkKKyAgICAgRWxmICplbGY7CisgICAgIEVsZl9DbWQgY21kOworeworICBzaXplX3Qgc2hudW07CisgIG9mZl90IHNpemU7CisgIGludCBjaGFuZ2VfYm8gPSAwOworCisgIGlmIChjbWQgIT0gRUxGX0NfTlVMTAorICAgICAgJiYgY21kICE9IEVMRl9DX1dSSVRFCisgICAgICAmJiB1bmxpa2VseSAoY21kICE9IEVMRl9DX1dSSVRFX01NQVApKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0NNRCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBFTEYgaGVhZGVyLiAgKi8KKyAgaWYgKGVsZi0+c3RhdGUuZWxmLmVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JPTkdfT1JERVJfRUhEUik7CisgICAgICBzaXplID0gLTE7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMuICAqLworICBzaG51bSA9IChlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPmNudCA9PSAwCisJICAgPyAwCisJICAgOiAxICsgZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5kYXRhW2VsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdC0+Y250IC0gMV0uaW5kZXgpOworCisgIC8qIFVwZGF0ZSB0aGUgRUxGIGRlc2NyaXB0b3IuICBGaXJzdCwgcGxhY2UgdGhlIHByb2dyYW0gaGVhZGVyLiAgSXQKKyAgICAgd2lsbCBjb21lIHJpZ2h0IGFmdGVyIHRoZSBFTEYgaGVhZGVyLiAgVGhlIGNvdW50IHRoZSBzaXplIG9mIGFsbAorICAgICBzZWN0aW9ucyBhbmQgZmluYWxseSBwbGFjZSB0aGUgc2VjdGlvbiB0YWJsZS4gICovCisgIHNpemUgPSAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCisJICA/IF9fZWxmMzJfdXBkYXRlbnVsbCAoZWxmLCAmY2hhbmdlX2JvLCBzaG51bSkKKwkgIDogX19lbGY2NF91cGRhdGVudWxsIChlbGYsICZjaGFuZ2VfYm8sIHNobnVtKSk7CisgIGlmIChsaWtlbHkgKHNpemUgIT0gLTEpCisgICAgICAvKiBTZWUgd2hldGhlciB3ZSBhY3R1YWxseSBoYXZlIHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gICovCisgICAgICAmJiAoY21kID09IEVMRl9DX1dSSVRFIHx8IGNtZCA9PSBFTEZfQ19XUklURV9NTUFQKSkKKyAgICB7CisgICAgICBpZiAoZWxmLT5jbWQgIT0gRUxGX0NfUkRXUgorCSAgJiYgZWxmLT5jbWQgIT0gRUxGX0NfUkRXUl9NTUFQCisJICAmJiBlbGYtPmNtZCAhPSBFTEZfQ19XUklURQorCSAgJiYgdW5saWtlbHkgKGVsZi0+Y21kICE9IEVMRl9DX1dSSVRFX01NQVApKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9VUERBVEVfUk8pOworCSAgc2l6ZSA9IC0xOworCX0KKyAgICAgIGVsc2UgaWYgKHVubGlrZWx5IChlbGYtPmZpbGRlcyA9PSAtMSkpCisJeworCSAgLyogV2UgY2xvc2VkIHRoZSBmaWxlIGFscmVhZHkuICAqLworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0ZEX0RJU0FCTEVEKTsKKwkgIHNpemUgPSAtMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGVsZi0+cGFyZW50ICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBleHRlcm4gaW50IHB1dHMgKGNvbnN0IGNoYXIgKik7CisJICAgICAgcHV0cyAoInRoaXMgaXMgYW4gYXJjaGl2ZSBtZW1iZXIiKTsKKwkgICAgfQorCisJICBzaXplID0gd3JpdGVfZmlsZSAoZWxmLCBzaXplLCBjaGFuZ2VfYm8sIHNobnVtKTsKKwl9CisgICAgfQorCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiBzaXplOworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2VsZl92ZXJzaW9uLmMgYi9saWJlbGYvZWxmX3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmJmY2UxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2VsZl92ZXJzaW9uLmMKQEAgLTAsMCArMSw1OCBAQAorLyogQ29vcmRpbmF0ZSBFTEYgbGlicmFyeSBhbmQgYXBwbGljYXRpb24gdmVyc2lvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmUC5oPgorCisKKy8qIElzIHRoZSB2ZXJzaW9uIGluaXRpYWxpemVkPyAgKi8KK2ludCBfX2xpYmVsZl92ZXJzaW9uX2luaXRpYWxpemVkOworCisvKiBDdXJyZW50bHkgc2VsZWN0ZWQgdmVyc2lvbi4gICovCit1bnNpZ25lZCBpbnQgX19saWJlbGZfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7CisKKwordW5zaWduZWQgaW50CitlbGZfdmVyc2lvbiAodmVyc2lvbikKKyAgICAgdW5zaWduZWQgaW50IHZlcnNpb247Cit7CisgIGlmICh2ZXJzaW9uID09IEVWX05PTkUpCisgICAgcmV0dXJuIF9fbGliZWxmX3ZlcnNpb247CisKKyAgaWYgKGxpa2VseSAodmVyc2lvbiA8IEVWX05VTSkpCisgICAgeworICAgICAgLyogUGhldywgd2Uga25vdyB0aGlzIHZlcnNpb24uICAqLworICAgICAgdW5zaWduZWQgaW50IGxhc3RfdmVyc2lvbiA9IF9fbGliZWxmX3ZlcnNpb247CisKKyAgICAgIC8qIFN0b3JlIHRoZSBuZXcgdmVyc2lvbi4gICovCisgICAgICBfX2xpYmVsZl92ZXJzaW9uID0gdmVyc2lvbjsKKworICAgICAgLyogU2lnbmFsIHRoYXQgdGhlIHZlcnNpb24gaXMgbm93IGluaXRpYWxpemVkLiAgKi8KKyAgICAgIF9fbGliZWxmX3ZlcnNpb25faW5pdGlhbGl6ZWQgPSAxOworCisgICAgICAvKiBBbmQgcmV0dXJuIHRoZSBsYXN0IHZlcnNpb24uICAqLworICAgICAgcmV0dXJuIGxhc3RfdmVyc2lvbjsKKyAgICB9CisKKyAgLyogV2UgY2Fubm90IGhhbmRsZSB0aGlzIHZlcnNpb24uICAqLworICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfVU5LTk9XTl9WRVJTSU9OKTsKKyAgcmV0dXJuIEVWX05PTkU7Cit9CitJTlRERUYoZWxmX3ZlcnNpb24pCmRpZmYgLS1naXQgYS9saWJlbGYvZXh0dHlwZXMuaCBiL2xpYmVsZi9leHR0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YmRlODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZXh0dHlwZXMuaApAQCAtMCwwICsxLDg2IEBACisvKiBFeHRlcm5hbCBFTEYgdHlwZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9FWFRUWVBFU19ICisjZGVmaW5lCV9FWFRUWVBFU19IIDEKKworLyogSW50ZWdyYWwgdHlwZXMuICAqLwordHlwZWRlZiBjaGFyIEVsZjMyX0V4dF9BZGRyW0VMRjMyX0ZTWl9BRERSXTsKK3R5cGVkZWYgY2hhciBFbGYzMl9FeHRfT2ZmW0VMRjMyX0ZTWl9PRkZdOwordHlwZWRlZiBjaGFyIEVsZjMyX0V4dF9IYWxmW0VMRjMyX0ZTWl9IQUxGXTsKK3R5cGVkZWYgY2hhciBFbGYzMl9FeHRfU3dvcmRbRUxGMzJfRlNaX1NXT1JEXTsKK3R5cGVkZWYgY2hhciBFbGYzMl9FeHRfV29yZFtFTEYzMl9GU1pfV09SRF07Cit0eXBlZGVmIGNoYXIgRWxmMzJfRXh0X1N4d29yZFtFTEYzMl9GU1pfU1hXT1JEXTsKK3R5cGVkZWYgY2hhciBFbGYzMl9FeHRfWHdvcmRbRUxGMzJfRlNaX1hXT1JEXTsKKwordHlwZWRlZiBjaGFyIEVsZjY0X0V4dF9BZGRyW0VMRjY0X0ZTWl9BRERSXTsKK3R5cGVkZWYgY2hhciBFbGY2NF9FeHRfT2ZmW0VMRjY0X0ZTWl9PRkZdOwordHlwZWRlZiBjaGFyIEVsZjY0X0V4dF9IYWxmW0VMRjY0X0ZTWl9IQUxGXTsKK3R5cGVkZWYgY2hhciBFbGY2NF9FeHRfU3dvcmRbRUxGNjRfRlNaX1NXT1JEXTsKK3R5cGVkZWYgY2hhciBFbGY2NF9FeHRfV29yZFtFTEY2NF9GU1pfV09SRF07Cit0eXBlZGVmIGNoYXIgRWxmNjRfRXh0X1N4d29yZFtFTEY2NF9GU1pfU1hXT1JEXTsKK3R5cGVkZWYgY2hhciBFbGY2NF9FeHRfWHdvcmRbRUxGNjRfRlNaX1hXT1JEXTsKKworCisvKiBEZWZpbmUgdGhlIGNvbXBvc2VkIHR5cGVzLiAgKi8KKyNkZWZpbmUgU1RBUlQoQml0cywgTmFtZSwgRU5hbWUpIHR5cGVkZWYgc3RydWN0IHsKKyNkZWZpbmUgRU5EKEJpdHMsIE5hbWUpIH0gRWxmVzIoQml0cywgTmFtZSkKKyNkZWZpbmUgVFlQRV9OQU1FKFR5cGUsIE5hbWUpIFR5cGUgTmFtZTsKKyNkZWZpbmUgVFlQRV9FWFRSQShUZXh0KSBUZXh0CisjZGVmaW5lIFRZUEVfWExBVEUoVGV4dCkKKworLyogR2V0IHRoZSBhYnN0cmFjdCBkZWZpbml0aW9ucy4gKi8KKyNpbmNsdWRlICJhYnN0cmFjdC5oIgorCisvKiBBbmQgZGVmaW5lIHRoZSB0eXBlcy4gICovCitFaGRyMzIgKEV4dF8pOworUGhkcjMyIChFeHRfKTsKK1NoZHIzMiAoRXh0Xyk7CitTeW0zMiAoRXh0Xyk7CitSZWwzMiAoRXh0Xyk7CitSZWxhMzIgKEV4dF8pOworTm90ZTMyIChFeHRfKTsKK0R5bjMyIChFeHRfKTsKK1ZlcmRlZjMyIChFeHRfKTsKK1ZlcmRhdXgzMiAoRXh0Xyk7CitWZXJuZWVkMzIgKEV4dF8pOworVmVybmF1eDMyIChFeHRfKTsKK1N5bWluZm8zMiAoRXh0Xyk7CitNb3ZlMzIgKEV4dF8pOworCitFaGRyNjQgKEV4dF8pOworUGhkcjY0IChFeHRfKTsKK1NoZHI2NCAoRXh0Xyk7CitTeW02NCAoRXh0Xyk7CitSZWw2NCAoRXh0Xyk7CitSZWxhNjQgKEV4dF8pOworTm90ZTY0IChFeHRfKTsKK0R5bjY0IChFeHRfKTsKK1ZlcmRlZjY0IChFeHRfKTsKK1ZlcmRhdXg2NCAoRXh0Xyk7CitWZXJuZWVkNjQgKEV4dF8pOworVmVybmF1eDY0IChFeHRfKTsKK1N5bWluZm82NCAoRXh0Xyk7CitNb3ZlNjQgKEV4dF8pOworCisjdW5kZWYgU1RBUlQKKyN1bmRlZiBFTkQKKyN1bmRlZiBUWVBFX05BTUUKKyN1bmRlZiBUWVBFX0VYVFJBCisjdW5kZWYgVFlQRV9YTEFURQorCisjZW5kaWYJLyogZXh0dHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGYuaCBiL2xpYmVsZi9nZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5ZDZjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIGdlbmVyaWMgRUxGIHR5cGVzLCBzdHJ1Y3R1cmVzLCBhbmQgbWFjcm9zLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0dFTEZfSAorI2RlZmluZQlfR0VMRl9IIDEKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQ2xhc3MgaW5kZXBlbmRlbnQgdHlwZSBkZWZpbml0aW9ucy4gIENvcnJlY3RseSBzcGVha2luZyB0aGlzIGlzIG5vdAorICAgdHJ1ZS4gIFdlIGFzc3VtZSB0aGF0IDY0LWJpdCBiaW5hcmllcyBhcmUgdGhlIGxhcmdlc3QgY2xhc3MgYW5kCisgICB0aGVyZWZvcmUgYWxsIG90aGVyIGNsYXNzZXMgY2FuIGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgbG9zcy4gICovCisKKy8qIFR5cGUgZm9yIGEgMTYtYml0IHF1YW50aXR5LiAgKi8KK3R5cGVkZWYgRWxmNjRfSGFsZiBHRWxmX0hhbGY7CisKKy8qIFR5cGVzIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIDMyLWJpdCBxdWFudGl0aWVzLiAgKi8KK3R5cGVkZWYgRWxmNjRfV29yZCBHRWxmX1dvcmQ7Cit0eXBlZGVmCUVsZjY0X1N3b3JkIEdFbGZfU3dvcmQ7CisKKy8qIFR5cGVzIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIDY0LWJpdCBxdWFudGl0aWVzLiAgKi8KK3R5cGVkZWYgRWxmNjRfWHdvcmQgR0VsZl9Yd29yZDsKK3R5cGVkZWYJRWxmNjRfU3h3b3JkIEdFbGZfU3h3b3JkOworCisvKiBUeXBlIG9mIGFkZHJlc3Nlcy4gICovCit0eXBlZGVmIEVsZjY0X0FkZHIgR0VsZl9BZGRyOworCisvKiBUeXBlIG9mIGZpbGUgb2Zmc2V0cy4gICovCit0eXBlZGVmIEVsZjY0X09mZiBHRWxmX09mZjsKKworCisvKiBUaGUgRUxGIGZpbGUgaGVhZGVyLiAgVGhpcyBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiBldmVyeSBFTEYgZmlsZS4gICovCit0eXBlZGVmIEVsZjY0X0VoZHIgR0VsZl9FaGRyOworCisvKiBTZWN0aW9uIGhlYWRlci4gICovCit0eXBlZGVmIEVsZjY0X1NoZHIgR0VsZl9TaGRyOworCisvKiBTZWN0aW9uIGluZGV4LiAgKi8KKy8qIFhYWCBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIGxhcmdlciB0eXBlIGluIHByZXBhcmF0aW9uIG9mIHRpbWVzIHdoZW4KKyAgIHJlZ3VsYXIgc2VjdGlvbiBpbmRpY2VzIGNhbiBiZSBsYXJnZXIuICAqLwordHlwZWRlZiBFbGY2NF9TZWN0aW9uIEdFbGZfU2VjdGlvbjsKKworLyogU3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KK3R5cGVkZWYgRWxmNjRfU3ltIEdFbGZfU3ltOworCisvKiBUaGUgc3ltaW5mbyBzZWN0aW9uIGlmIGF2YWlsYWJsZSBjb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0CisgICBldmVyeSBkeW5hbWljIHN5bWJvbC4gICovCit0eXBlZGVmIEVsZjY0X1N5bWluZm8gR0VsZl9TeW1pbmZvOworCisvKiBSZWxvY2F0aW9uIHRhYmxlIGVudHJ5IHdpdGhvdXQgYWRkZW5kIChpbiBzZWN0aW9uIG9mIHR5cGUgU0hUX1JFTCkuICAqLwordHlwZWRlZiBFbGY2NF9SZWwgR0VsZl9SZWw7CisKKy8qIFJlbG9jYXRpb24gdGFibGUgZW50cnkgd2l0aCBhZGRlbmQgKGluIHNlY3Rpb24gb2YgdHlwZSBTSFRfUkVMQSkuICAqLwordHlwZWRlZiBFbGY2NF9SZWxhIEdFbGZfUmVsYTsKKworLyogUHJvZ3JhbSBzZWdtZW50IGhlYWRlci4gICovCit0eXBlZGVmIEVsZjY0X1BoZHIgR0VsZl9QaGRyOworCisvKiBEeW5hbWljIHNlY3Rpb24gZW50cnkuICAqLwordHlwZWRlZiBFbGY2NF9EeW4gR0VsZl9EeW47CisKKworLyogVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb25zLiAgKi8KK3R5cGVkZWYgRWxmNjRfVmVyZGVmIEdFbGZfVmVyZGVmOworCisvKiBBdXhpYWxpYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBFbGY2NF9WZXJkYXV4IEdFbGZfVmVyZGF1eDsKKworLyogVmVyc2lvbiBkZXBlbmRlbmN5IHNlY3Rpb24uICAqLwordHlwZWRlZiBFbGY2NF9WZXJuZWVkIEdFbGZfVmVybmVlZDsKKworLyogQXV4aWxpYXJ5IG5lZWRlZCB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KK3R5cGVkZWYgRWxmNjRfVmVybmF1eCBHRWxmX1Zlcm5hdXg7CisKKworLyogVHlwZSBmb3IgdmVyc2lvbiBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBFbGY2NF9WZXJzeW0gR0VsZl9WZXJzeW07CisKKworLyogQXV4aWxpYXJ5IHZlY3Rvci4gICovCit0eXBlZGVmIEVsZjY0X2F1eHZfdCBHRWxmX2F1eHZfdDsKKworCisvKiBOb3RlIHNlY3Rpb24gY29udGVudHMuICAqLwordHlwZWRlZiBFbGY2NF9OaGRyIEdFbGZfTmhkcjsKKworCisvKiBNb3ZlIHN0cnVjdHVyZS4gICovCit0eXBlZGVmIEVsZjY0X01vdmUgR0VsZl9Nb3ZlOworCisKKy8qIExpYnJhcnkgbGlzdCBzdHJ1Y3R1cmUuICAqLwordHlwZWRlZiBFbGY2NF9MaWIgR0VsZl9MaWI7CisKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSBzdF9pbmZvIGZpZWxkLiAgKi8KKworI2RlZmluZSBHRUxGX1NUX0JJTkQodmFsKQkJRUxGNjRfU1RfQklORCAodmFsKQorI2RlZmluZSBHRUxGX1NUX1RZUEUodmFsKQkJRUxGNjRfU1RfVFlQRSAodmFsKQorI2RlZmluZSBHRUxGX1NUX0lORk8oYmluZCwgdHlwZSkJRUxGNjRfU1RfSU5GTyAoYmluZCwgdHlwZSkKKworLyogSG93IHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gaGVsZCBpbiB0aGUgc3Rfb3RoZXIgZmllbGQuICAqLworCisjZGVmaW5lIEdFTEZfU1RfVklTSUJJTElUWSh2YWwpCQlFTEY2NF9TVF9WSVNJQklMSVRZICh2YWwpCisKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSByX2luZm8gZmllbGQuICAqLworCisjZGVmaW5lIEdFTEZfUl9TWU0oaW5mbykJCUVMRjY0X1JfU1lNIChpbmZvKQorI2RlZmluZSBHRUxGX1JfVFlQRShpbmZvKQkJRUxGNjRfUl9UWVBFIChpbmZvKQorI2RlZmluZSBHRUxGX1JfSU5GTyhzeW0sIHR5cGUpCQlFTEY2NF9SX0lORk8gKHN5bSwgdHlwZSkKKworCisvKiBIb3cgdG8gZXh0cmFjdCBhbmQgaW5zZXJ0IGluZm9ybWF0aW9uIGhlbGQgaW4gdGhlIG1faW5mbyBmaWVsZC4gICovCisjZGVmaW5lIEdFTEZfTV9TWU0oaW5mbykJCUVMRjY0X01fU1lNIChpbmZvKQorI2RlZmluZSBHRUxGX01fU0laRShpbmZvKQkJRUxGNjRfTV9TSVpFIChpbmZvKQorI2RlZmluZSBHRUxGX01fSU5GTyhzeW0sIHNpemUpCQlFTEY2NF9NX0lORk8gKHN5bSwgc2l6ZSkKKworCisvKiBHZXQgY2xhc3Mgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIEVMRi4gICovCitleHRlcm4gaW50IGdlbGZfZ2V0Y2xhc3MgKEVsZiAqX19lbGYpOworCisKKy8qIFJldHVybiBzaXplIG9mIGFycmF5IG9mIENPVU5UIGVsZW1lZW50cyBvZiB0aGUgdHlwZSBkZW5vdGVkIGJ5IFRZUEUKKyAgIGluIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbi4gIFRoZSBiaW5hcnkgY2xhc3MgaXMgdGFrZW4gZnJvbSBFTEYuCisgICBUaGUgcmVzdWx0IGlzIGJhc2VkIG9uIHZlcnNpb24gVkVSU0lPTiBvZiB0aGUgRUxGIHN0YW5kYXJkLiAgKi8KK2V4dGVybiBzaXplX3QgZ2VsZl9mc2l6ZSAoRWxmICpfX2VsZiwgRWxmX1R5cGUgX190eXBlLCBzaXplX3QgX19jb3VudCwKKwkJCSAgdW5zaWduZWQgaW50IF9fdmVyc2lvbik7CisKKy8qIFJldHJpZXZlIG9iamVjdCBmaWxlIGhlYWRlci4gICovCitleHRlcm4gR0VsZl9FaGRyICpnZWxmX2dldGVoZHIgKEVsZiAqX19lbGYsIEdFbGZfRWhkciAqX19kZXN0KTsKKworLyogVXBkYXRlIHRoZSBFTEYgaGVhZGVyLiAgKi8KK2V4dGVybiBpbnQgZ2VsZl91cGRhdGVfZWhkciAoRWxmICpfX2VsZiwgR0VsZl9FaGRyICpfX3NyYyk7CisKKy8qIENyZWF0ZSBuZXcgRUxGIGhlYWRlciBpZiBub25lIGV4aXN0cy4gICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgZ2VsZl9uZXdlaGRyIChFbGYgKl9fZWxmLCBpbnQgX19jbGFzcyk7CisKKy8qIFJldHJpZXZlIHNlY3Rpb24gaGVhZGVyLiAgKi8KK2V4dGVybiBHRWxmX1NoZHIgKmdlbGZfZ2V0c2hkciAoRWxmX1NjbiAqX19zY24sIEdFbGZfU2hkciAqX19kc3QpOworCisvKiBVcGRhdGUgc2VjdGlvbiBoZWFkZXIuICAqLworZXh0ZXJuIGludCBnZWxmX3VwZGF0ZV9zaGRyIChFbGZfU2NuICpfX3NjbiwgR0VsZl9TaGRyICpfX3NyYyk7CisKKy8qIFJldHJpZXZlIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5LiAgKi8KK2V4dGVybiBHRWxmX1BoZHIgKmdlbGZfZ2V0cGhkciAoRWxmICpfX2VsZiwgaW50IF9fbmR4LCBHRWxmX1BoZHIgKl9fZHN0KTsKKworLyogVXBkYXRlIHRoZSBwcm9ncmFtIGhlYWRlci4gICovCitleHRlcm4gaW50IGdlbGZfdXBkYXRlX3BoZHIgKEVsZiAqX19lbGYsIGludCBfX25keCwgR0VsZl9QaGRyICpfX3NyYyk7CisKKy8qIENyZWF0ZSBuZXcgcHJvZ3JhbSBoZWFkZXIgd2l0aCBQSE5VTSBlbnRyaWVzLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCBnZWxmX25ld3BoZHIgKEVsZiAqX19lbGYsIHNpemVfdCBfX3BobnVtKTsKKworCisvKiBDb252ZXJ0IGRhdGEgc3RydWN0dXJlIGZyb20gdGhlIHJlcHJlc2VudGF0aW9uIGluIHRoZSBmaWxlIHJlcHJlc2VudGVkCisgICBieSBFTEYgdG8gdGhlaXIgbWVtb3J5IHJlcHJlc2VudGF0aW9uLiAgKi8KK2V4dGVybiBFbGZfRGF0YSAqZ2VsZl94bGF0ZXRvbSAoRWxmICpfX2VsZiwgRWxmX0RhdGEgKl9fZGVzdCwKKwkJCQljb25zdCBFbGZfRGF0YSAqX19zcmMsIHVuc2lnbmVkIGludCBfX2VuY29kZSk7CisKKy8qIENvbnZlcnQgZGF0YSBzdHJ1Y3R1cmUgZnJvbSB0byB0aGUgcmVwcmVzZW50YXRpb24gaW4gbWVtb3J5CisgICByZXByZXNlbnRlZCBieSBFTEYgZmlsZSByZXByZXNlbnRhdGlvbi4gICovCitleHRlcm4gRWxmX0RhdGEgKmdlbGZfeGxhdGV0b2YgKEVsZiAqX19lbGYsIEVsZl9EYXRhICpfX2Rlc3QsCisJCQkJY29uc3QgRWxmX0RhdGEgKl9fc3JjLCB1bnNpZ25lZCBpbnQgX19lbmNvZGUpOworCisKKy8qIFJldHJpZXZlIFJFTCByZWxvY2F0aW9uIGluZm8gYXQgdGhlIGdpdmVuIGluZGV4LiAgKi8KK2V4dGVybiBHRWxmX1JlbCAqZ2VsZl9nZXRyZWwgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwgR0VsZl9SZWwgKl9fZHN0KTsKKworLyogUmV0cmlldmUgUkVMQSByZWxvY2F0aW9uIGluZm8gYXQgdGhlIGdpdmVuIGluZGV4LiAgKi8KK2V4dGVybiBHRWxmX1JlbGEgKmdlbGZfZ2V0cmVsYSAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fbmR4LCBHRWxmX1JlbGEgKl9fZHN0KTsKKworLyogVXBkYXRlIFJFTCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGF0IGdpdmVuIGluZGV4LiAgKi8KK2V4dGVybiBpbnQgZ2VsZl91cGRhdGVfcmVsIChFbGZfRGF0YSAqX19kc3QsIGludCBfX25keCwgR0VsZl9SZWwgKl9fc3JjKTsKKworLyogVXBkYXRlIFJFTEEgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhdCBnaXZlbiBpbmRleC4gICovCitleHRlcm4gaW50IGdlbGZfdXBkYXRlX3JlbGEgKEVsZl9EYXRhICpfX2RzdCwgaW50IF9fbmR4LCBHRWxmX1JlbGEgKl9fc3JjKTsKKworCisvKiBSZXRyaWV2ZSBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4gICovCitleHRlcm4gR0VsZl9TeW0gKmdlbGZfZ2V0c3ltIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19uZHgsIEdFbGZfU3ltICpfX2RzdCk7CisKKy8qIFVwZGF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguICAqLworZXh0ZXJuIGludCBnZWxmX3VwZGF0ZV9zeW0gKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwgR0VsZl9TeW0gKl9fc3JjKTsKKworCisvKiBSZXRyaWV2ZSBzeW1ib2wgaW5mb3JtYXRpb24gYW5kIHNlcGFyYXRlIHNlY3Rpb24gaW5kZXggZnJvbSB0aGUKKyAgIHN5bWJvbCB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguICAqLworZXh0ZXJuIEdFbGZfU3ltICpnZWxmX2dldHN5bXNobmR4IChFbGZfRGF0YSAqX19zeW1kYXRhLCBFbGZfRGF0YSAqX19zaG5keGRhdGEsCisJCQkJICAgaW50IF9fbmR4LCBHRWxmX1N5bSAqX19zeW0sCisJCQkJICAgRWxmMzJfV29yZCAqX194c2huZHgpOworCisvKiBVcGRhdGUgc3ltYm9sIGluZm9ybWF0aW9uIGFuZCBzZXBhcmF0ZSBzZWN0aW9uIGluZGV4IGluIHRoZSBzeW1ib2wKKyAgIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4gICovCitleHRlcm4gaW50IGdlbGZfdXBkYXRlX3N5bXNobmR4IChFbGZfRGF0YSAqX19zeW1kYXRhLCBFbGZfRGF0YSAqX19zaG5keGRhdGEsCisJCQkJIGludCBfX25keCwgR0VsZl9TeW0gKl9fc3ltLAorCQkJCSBFbGYzMl9Xb3JkIF9feHNobmR4KTsKKworCisvKiBSZXRyaWV2ZSBhZGRpdGlvbmFsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzeW1ib2wgdGFibGUgYXQgdGhlCisgICBnaXZlbiBpbmRleC4gICovCitleHRlcm4gR0VsZl9TeW1pbmZvICpnZWxmX2dldHN5bWluZm8gKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwKKwkJCQkgICAgICBHRWxmX1N5bWluZm8gKl9fZHN0KTsKKworLyogVXBkYXRlIGFkZGl0aW9uYWwgc3ltYm9sIGluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUgYXQgdGhlCisgICBnaXZlbiBpbmRleC4gICovCitleHRlcm4gaW50IGdlbGZfdXBkYXRlX3N5bWluZm8gKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwKKwkJCQlHRWxmX1N5bWluZm8gKl9fc3JjKTsKKworCisvKiBHZXQgaW5mb3JtYXRpb24gZnJvbSBkeW5hbWljIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4gICovCitleHRlcm4gR0VsZl9EeW4gKmdlbGZfZ2V0ZHluIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19uZHgsIEdFbGZfRHluICpfX2RzdCk7CisKKy8qIFVwZGF0ZSBpbmZvcm1hdGlvbiBpbiBkeW5hbWljIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4gICovCitleHRlcm4gaW50IGdlbGZfdXBkYXRlX2R5biAoRWxmX0RhdGEgKl9fZHN0LCBpbnQgX19uZHgsIEdFbGZfRHluICpfX3NyYyk7CisKKworLyogR2V0IG1vdmUgc3RydWN0dXJlIGF0IHRoZSBnaXZlbiBpbmRleC4gICovCitleHRlcm4gR0VsZl9Nb3ZlICpnZWxmX2dldG1vdmUgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwgR0VsZl9Nb3ZlICpfX2RzdCk7CisKKy8qIFVwZGF0ZSBtb3ZlIHN0cnVjdHVyZSBhdCB0aGUgZ2l2ZW4gaW5kZXguICAqLworZXh0ZXJuIGludCBnZWxmX3VwZGF0ZV9tb3ZlIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19uZHgsCisJCQkgICAgIEdFbGZfTW92ZSAqX19zcmMpOworCisKKy8qIEdldCBsaWJyYXJ5IGZyb20gdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LiAgKi8KK2V4dGVybiBHRWxmX0xpYiAqZ2VsZl9nZXRsaWIgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwgR0VsZl9MaWIgKl9fZHN0KTsKKworLyogVXBkYXRlIGxpYnJhcnkgaW4gdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LiAgKi8KK2V4dGVybiBpbnQgZ2VsZl91cGRhdGVfbGliIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19uZHgsIEdFbGZfTGliICpfX3NyYyk7CisKKworCisvKiBSZXRyaWV2ZSBzeW1ib2wgdmVyc2lvbiBpbmZvcm1hdGlvbiBhdCBnaXZlbiBpbmRleC4gICovCitleHRlcm4gR0VsZl9WZXJzeW0gKmdlbGZfZ2V0dmVyc3ltIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19uZHgsCisJCQkJICAgIEdFbGZfVmVyc3ltICpfX2RzdCk7CisKKy8qIFVwZGF0ZSBzeW1ib2wgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCitleHRlcm4gaW50IGdlbGZfdXBkYXRlX3ZlcnN5bSAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fbmR4LAorCQkJICAgICAgIEdFbGZfVmVyc3ltICpfX3NyYyk7CisKKworLyogUmV0cmlldmUgcmVxdWlyZWQgc3ltYm9sIHZlcnNpb24gaW5mb3JtYXRpb24gYXQgZ2l2ZW4gb2Zmc2V0LiAgKi8KK2V4dGVybiBHRWxmX1Zlcm5lZWQgKmdlbGZfZ2V0dmVybmVlZCAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fb2Zmc2V0LAorCQkJCSAgICAgIEdFbGZfVmVybmVlZCAqX19kc3QpOworCisvKiBVcGRhdGUgcmVxdWlyZWQgc3ltYm9sIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworZXh0ZXJuIGludCBnZWxmX3VwZGF0ZV92ZXJuZWVkIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19vZmZzZXQsCisJCQkJR0VsZl9WZXJuZWVkICpfX3NyYyk7CisKKy8qIFJldHJpZXZlIGFkZGl0aW9uYWwgcmVxdWlyZWQgc3ltYm9sIHZlcnNpb24gaW5mb3JtYXRpb24gYXQgZ2l2ZW4gb2Zmc2V0LiAgKi8KK2V4dGVybiBHRWxmX1Zlcm5hdXggKmdlbGZfZ2V0dmVybmF1eCAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fb2Zmc2V0LAorCQkJCSAgICAgIEdFbGZfVmVybmF1eCAqX19kc3QpOworCisvKiBVcGRhdGUgYWRkaXRpb25hbCByZXF1aXJlZCBzeW1ib2wgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCitleHRlcm4gaW50IGdlbGZfdXBkYXRlX3Zlcm5hdXggKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX29mZnNldCwKKwkJCQlHRWxmX1Zlcm5hdXggKl9fc3JjKTsKKworCisvKiBSZXRyaWV2ZSBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGF0IGdpdmVuIG9mZnNldC4gICovCitleHRlcm4gR0VsZl9WZXJkZWYgKmdlbGZfZ2V0dmVyZGVmIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19vZmZzZXQsCisJCQkJICAgIEdFbGZfVmVyZGVmICpfX2RzdCk7CisKKy8qIFVwZGF0ZSBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9uIGluZm9ybWF0aW9uLiAgKi8KK2V4dGVybiBpbnQgZ2VsZl91cGRhdGVfdmVyZGVmIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19vZmZzZXQsCisJCQkgICAgICAgR0VsZl9WZXJkZWYgKl9fc3JjKTsKKworLyogUmV0cmlldmUgYWRkaXRpb25hbCBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGF0IGdpdmVuCisgICBvZmZzZXQuICAqLworZXh0ZXJuIEdFbGZfVmVyZGF1eCAqZ2VsZl9nZXR2ZXJkYXV4IChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19vZmZzZXQsCisJCQkJICAgICAgR0VsZl9WZXJkYXV4ICpfX2RzdCk7CisKKy8qIFVwZGF0ZSBhZGRpdGlvbmFsIHN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb24gaW5mb3JtYXRpb24uICAqLworZXh0ZXJuIGludCBnZWxmX3VwZGF0ZV92ZXJkYXV4IChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19vZmZzZXQsCisJCQkJR0VsZl9WZXJkYXV4ICpfX3NyYyk7CisKKworLyogUmV0cmlldmUgdW5pbnRlcnByZXRlZCBjaHVuayBvZiB0aGUgZmlsZSBjb250ZW50cy4gICovCitleHRlcm4gY2hhciAqZ2VsZl9yYXdjaHVuayAoRWxmICpfX2VsZiwgR0VsZl9PZmYgX19vZmZzZXQsIEdFbGZfV29yZCBfX3NpemUpOworCisvKiBSZWxlYXNlIHVuaW50ZXJwcmV0ZWQgY2h1bmsgb2YgdGhlIGZpbGUgY29udGVudHMuICAqLworZXh0ZXJuIHZvaWQgZ2VsZl9mcmVlY2h1bmsgKEVsZiAqX19lbGYsIGNoYXIgKl9fcHRyKTsKKworCisvKiBDb21wdXRlIHNpbXBsZSBjaGVja3N1bSBmcm9tIHBlcm1hbmVudCBwYXJ0cyBvZiB0aGUgRUxGIGZpbGUuICAqLworZXh0ZXJuIGxvbmcgaW50IGdlbGZfY2hlY2tzdW0gKEVsZiAqX19lbGYpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYJLyogZ2VsZi5oICovCmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl9jaGVja3N1bS5jIGIvbGliZWxmL2dlbGZfY2hlY2tzdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmQwNGRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfY2hlY2tzdW0uYwpAQCAtMCwwICsxLDM3IEBACisvKiBDb252ZXJ0IGZyb20gZmlsZSB0byBtZW1vcnkgcmVwcmVzZW50YXRpb24uICBHZW5lcmljIEVMRiB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2xvbmcgaW50CitnZWxmX2NoZWNrc3VtIChlbGYpCisgICAgIEVsZiAqZWxmOworeworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIC0xbDsKKworICByZXR1cm4gKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgorCSAgPyBJTlRVU0UoZWxmMzJfY2hlY2tzdW0pIChlbGYpIDogSU5UVVNFKGVsZjY0X2NoZWNrc3VtKSAoZWxmKSk7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl9mcmVlY2h1bmsuYyBiL2xpYmVsZi9nZWxmX2ZyZWVjaHVuay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0N2VjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZ2VsZl9mcmVlY2h1bmsuYwpAQCAtMCwwICsxLDQ1IEBACisvKiBSZWxlYXNlIHVuaW50ZXJwcmV0ZWQgY2h1bmsgb2YgdGhlIGZpbGUgY29udGVudHMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKwordm9pZAorZ2VsZl9mcmVlY2h1bmsgKGVsZiwgcHRyKQorICAgICBFbGYgKmVsZjsKKyAgICAgY2hhciAqcHRyOworeworICBpZiAoZWxmID09IE5VTEwpCisgICAgLyogTm8gdmFsaWQgZGVzY3JpcHRvci4gICovCisgICAgcmV0dXJuOworCisgIC8qIFdlIGRvIG5vdCBoYXZlIHRvIGRvIGFueXRoaW5nIGlmIHRoZSBwb2ludGVyIHJldHVybmVkIGJ5CisgICAgIGdlbGZfcmF3Y2h1bmsgcG9pbnRzIGludG8gdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBFTEYKKyAgICAgZGVzY3JpcHRvci4gICovCisgIGlmIChwdHIgPCAoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQKKyAgICAgIHx8IHB0ciA+PSAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0CisJCSArIGVsZi0+bWF4aW11bV9zaXplKSkKKyAgICBmcmVlIChwdHIpOworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfZnNpemUuYyBiL2xpYmVsZi9nZWxmX2ZzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzMmJhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2ZzaXplLmMKQEAgLTAsMCArMSw5NiBAQAorLyogUmV0dXJuIHRoZSBzaXplIG9mIGFuIG9iamVjdCBmaWxlIHR5cGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworLyogVGhlc2UgYXJlIHRoZSBzaXplcyBmb3IgYWxsIHRoZSBrbm93biB0eXBlcy4gICovCitjb25zdCBzaXplX3QgX19saWJlbGZfdHlwZV9zaXplc1tFVl9OVU0gLSAxXVtFTEZDTEFTU05VTSAtIDFdW0VMRl9UX05VTV0gPQoreworICAvKiBXZSBoYXZlIG5vIGVudHJ5IGZvciBFVl9OT05FIHNpaW5jZSB3ZSBoYXZlIHRvIHNldCBhbiBlcnJvci4gICovCisgIFtFVl9DVVJSRU5UIC0gMV0gPSB7CisgICAgW0VMRkNMQVNTMzIgLSAxXSA9IHsKKyNkZWZpbmUgVFlQRV9TSVpFUyhMSUJFTEZCSVRTKSBcCisgICAgICBbRUxGX1RfQUREUl0JPSBFTEZXMihMSUJFTEZCSVRTLCBGU1pfQUREUiksCQkJICAgICAgXAorICAgICAgW0VMRl9UX09GRl0JPSBFTEZXMihMSUJFTEZCSVRTLCBGU1pfT0ZGKSwJCQkgICAgICBcCisgICAgICBbRUxGX1RfQllURV0JPSAxLAkJCQkJCSAgICAgIFwKKyAgICAgIFtFTEZfVF9IQUxGXQk9IEVMRlcyKExJQkVMRkJJVFMsIEZTWl9IQUxGKSwJCQkgICAgICBcCisgICAgICBbRUxGX1RfV09SRF0JPSBFTEZXMihMSUJFTEZCSVRTLCBGU1pfV09SRCksCQkJICAgICAgXAorICAgICAgW0VMRl9UX1NXT1JEXQk9IEVMRlcyKExJQkVMRkJJVFMsIEZTWl9TV09SRCksCQkJICAgICAgXAorICAgICAgW0VMRl9UX1hXT1JEXQk9IEVMRlcyKExJQkVMRkJJVFMsIEZTWl9YV09SRCksCQkJICAgICAgXAorICAgICAgW0VMRl9UX1NYV09SRF0JPSBFTEZXMihMSUJFTEZCSVRTLCBGU1pfU1hXT1JEKSwJCSAgICAgIFwKKyAgICAgIFtFTEZfVF9FSERSXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X0VoZHIpKSwJCSAgICAgIFwKKyAgICAgIFtFTEZfVF9TSERSXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X1NoZHIpKSwJCSAgICAgIFwKKyAgICAgIFtFTEZfVF9TWU1dCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfU3ltKSksCQkgICAgICBcCisgICAgICBbRUxGX1RfUkVMXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X1JlbCkpLAkJICAgICAgXAorICAgICAgW0VMRl9UX1JFTEFdCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfUmVsYSkpLAkJICAgICAgXAorICAgICAgW0VMRl9UX1BIRFJdCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfUGhkcikpLAkJICAgICAgXAorICAgICAgW0VMRl9UX0RZTl0JPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsIEV4dF9EeW4pKSwJCSAgICAgIFwKKyAgICAgIFtFTEZfVF9WREVGXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X1ZlcmRlZikpLAkgICAgICBcCisgICAgICBbRUxGX1RfVkRBVVhdCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfVmVyZGF1eCkpLAkgICAgICBcCisgICAgICBbRUxGX1RfVk5FRURdCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfVmVybmVlZCkpLAkgICAgICBcCisgICAgICBbRUxGX1RfVk5BVVhdCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfVmVybmF1eCkpLAkgICAgICBcCisgICAgICBbRUxGX1RfTkhEUl0JPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsIEV4dF9OaGRyKSksCQkgICAgICBcCisgICAgICBbRUxGX1RfU1lNSU5GT10JPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsIEV4dF9TeW1pbmZvKSksCSAgICAgIFwKKyAgICAgIFtFTEZfVF9NT1ZFXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X01vdmUpKQorICAgICAgVFlQRV9TSVpFUyAoMzIpCisgICAgfSwKKyAgICBbRUxGQ0xBU1M2NCAtIDFdID0geworICAgICAgVFlQRV9TSVpFUyAoNjQpCisgICAgfQorICB9Cit9OworCisKK3NpemVfdAorZ2VsZl9mc2l6ZSAoZWxmLCB0eXBlLCBjb3VudCwgdmVyc2lvbikKKyAgICAgRWxmICplbGY7CisgICAgIEVsZl9UeXBlIHR5cGU7CisgICAgIHNpemVfdCBjb3VudDsKKyAgICAgdW5zaWduZWQgaW50IHZlcnNpb247Cit7CisgIC8qIFdlIGRvIG5vdCBoYXZlIGRpZmZlcmVuY2VzIGJldHdlZW4gZmlsZSBhbmQgbWVtb3J5IHNpemVzLiAgQmV0dGVyCisgICAgIG5vdCBzaW5jZSBvdGhlcndpc2UgYG1tYXAnIHdvdWxkIG5vdCB3b3JrLiAgKi8KKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIGlmICh2ZXJzaW9uID09IEVWX05PTkUgfHwgdmVyc2lvbiA+PSBFVl9OVU0pCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1VOS05PV05fVkVSU0lPTik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHR5cGUgPj0gRUxGX1RfTlVNKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9VTktOT1dOX1RZUEUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWYgRVZfTlVNICE9IDIKKyAgcmV0dXJuIGNvdW50ICogX19saWJlbGZfdHlwZV9zaXplc1t2ZXJzaW9uIC0gMV1bZWxmLT5jbGFzcyAtIDFdW3R5cGVdOworI2Vsc2UKKyAgcmV0dXJuIGNvdW50ICogX19saWJlbGZfdHlwZV9zaXplc1swXVtlbGYtPmNsYXNzIC0gMV1bdHlwZV07CisjZW5kaWYKK30KK0lOVERFRihnZWxmX2ZzaXplKQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfZ2V0Y2xhc3MuYyBiL2xpYmVsZi9nZWxmX2dldGNsYXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlMWIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldGNsYXNzLmMKQEAgLTAsMCArMSwzMyBAQAorLyogUmV0dXJuIHRoZSBjbGFzcyBvZiBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvci4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitpbnQKK2dlbGZfZ2V0Y2xhc3MgKGVsZikKKyAgICAgRWxmICplbGY7Cit7CisgIHJldHVybiBlbGYgPT0gTlVMTCB8fCBlbGYtPmtpbmQgIT0gRUxGX0tfRUxGID8gRUxGQ0xBU1NOT05FIDogZWxmLT5jbGFzczsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX2dldGR5bi5jIGIvbGliZWxmL2dlbGZfZ2V0ZHluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NzQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldGR5bi5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIEdldCBpbmZvcm1hdGlvbiBmcm9tIGR5bmFtaWMgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK0dFbGZfRHluICoKK2dlbGZfZ2V0ZHluIChkYXRhLCBuZHgsIGRzdCkKKyAgICAgRWxmX0RhdGEgKmRhdGE7CisgICAgIGludCBuZHg7CisgICAgIEdFbGZfRHluICpkc3Q7Cit7CisgIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7CisgIEdFbGZfRHluICpyZXN1bHQgPSBOVUxMOworICBFbGYgKmVsZjsKKworICBpZiAoZGF0YV9zY24gPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9EWU4pKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZWxmID0gZGF0YV9zY24tPnMtPmVsZjsKKworICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOworCisgIC8qIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSB3aGVyZSB3ZSBoYXZlIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0CisgICAgIHRoYXQgYW4gYEVsZl9EYXRhJyBwb2ludGVyIGlzIGFsc28gYSBwb2ludGVyIHRvIGBFbGZfRGF0YV9TY24nLgorICAgICBUaGUgaW50ZXJmYWNlIGlzIGJyb2tlbiBzbyB0aGF0IGl0IHJlcXVpcmVzIHRoaXMgaGFjay4gICovCisgIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgRWxmMzJfRHluICpzcmM7CisKKyAgICAgIC8qIEhlcmUgaXQgZ2V0cyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLiAgVGhlIGZvcm1hdCBvZiB0aGUgc3ltYm9sCisJIHRhYmxlIGVudHJpZXMgaGFzIHRvIGJlIGFkb3B0ZWQuICBUaGUgdXNlciBiZXR0ZXIgaGFzIHByb3ZpZGVkCisJIGEgYnVmZmVyIHdoZXJlIHdlIGNhbiBzdG9yZSB0aGUgaW5mb3JtYXRpb24uICBXaGlsZSBjb3B5aW5nIHRoZQorCSBkYXRhIHdlIGFyZSBjb252ZXJ0aW5nIHRoZSBmb3JtYXQuICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjMyX0R5bikgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgc3JjID0gJigoRWxmMzJfRHluICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOworCisgICAgICAvKiBUaGlzIG1pZ2h0IGxvb2sgbGlrZSBhIHNpbXBsZSBjb3B5IG9wZXJhdGlvbiBidXQgaXQncworCSBub3QuICBUaGVyZSBhcmUgemVyby0gYW5kIHNpZ24tZXh0ZW5zaW9ucyBnb2luZyBvbi4gICovCisgICAgICBkc3QtPmRfdGFnID0gc3JjLT5kX3RhZzsKKyAgICAgIC8qIEl0IE9LIHRvIGNvcHkgYGRfdmFsJyBzaW5jZSBgZF9wdHInIGhhcyB0aGUgc2FtZSBzaXplLiAgKi8KKyAgICAgIGRzdC0+ZF91bi5kX3ZhbCA9IHNyYy0+ZF91bi5kX3ZhbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGlzIGlzIGEgNjQgYml0IG9iamVjdCBpdCdzIGVhc3kuICAqLworICAgICAgYXNzZXJ0IChzaXplb2YgKEdFbGZfRHluKSA9PSBzaXplb2YgKEVsZjY0X0R5bikpOworCisgICAgICAvKiBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGZvcm0uICBKdXN0IG1ha2Ugc3VyZSB0aGUKKwkgaW5kZXggaXMgT0suICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEdFbGZfRHluKSA+IGRhdGFfc2NuLT5kLmRfc2l6ZSkpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAqZHN0ID0gKChHRWxmX0R5biAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XTsKKyAgICB9CisKKyAgcmVzdWx0ID0gZHN0OworCisgb3V0OgorICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl9nZXRlaGRyLmMgYi9saWJlbGYvZ2VsZl9nZXRlaGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzMjNkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldGVoZHIuYwpAQCAtMCwwICsxLDg4IEBACisvKiBHZXQgRUxGIGhlYWRlci4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitHRWxmX0VoZHIgKgorZ2VsZl9nZXRlaGRyIChlbGYsIGRlc3QpCisgICAgIEVsZiAqZWxmOworICAgICBHRWxmX0VoZHIgKmRlc3Q7Cit7CisgIEdFbGZfRWhkciAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJ3bG9ja19yZGxvY2sgKGVsZi0+bG9jayk7CisKKyAgLyogVGhlIGZvbGxvd2luZyBpcyBhbiBvcHRpbWl6YXRpb246IHRoZSBlaGRyIGVsZW1lbnQgaXMgYXQgdGhlIHNhbWUKKyAgICAgcG9zaXRpb24gaW4gYm90aCB0aGUgZWxmMzIgYW5kIGVsZjY0IHN0cnVjdHVyZS4gICovCisgIGlmIChvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmMzIuZWhkcikKKyAgICAgICE9IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5laGRyKSkKKyAgICBhYm9ydCAoKTsKKyAgLyogSnVzdCBwaWNrIG9uZSBvZiB0aGUgdmFsdWVzLiAgKi8KKyBpZiAodW5saWtlbHkgKGVsZi0+c3RhdGUuZWxmNjQuZWhkciA9PSBOVUxMKSkKKyAgICAvKiBNYXliZSBubyBFTEYgaGVhZGVyIHdhcyBjcmVhdGVkIHlldC4gICovCisgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1dST05HX09SREVSX0VIRFIpOworICBlbHNlIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgRWxmMzJfRWhkciAqZWhkciA9IGVsZi0+c3RhdGUuZWxmMzIuZWhkcjsKKworICAgICAgLyogQ29udmVydCB0aGUgMzItYml0IHN0cnVjdCB0byBhbiA2NC1iaXQgb25lLiAgKi8KKyAgICAgIG1lbWNweSAoZGVzdC0+ZV9pZGVudCwgZWhkci0+ZV9pZGVudCwgRUlfTklERU5UKTsKKyNkZWZpbmUgQ09QWShuYW1lKSBcCisgICAgICBkZXN0LT5uYW1lID0gZWhkci0+bmFtZQorICAgICAgQ09QWSAoZV90eXBlKTsKKyAgICAgIENPUFkgKGVfbWFjaGluZSk7CisgICAgICBDT1BZIChlX3ZlcnNpb24pOworICAgICAgQ09QWSAoZV9lbnRyeSk7CisgICAgICBDT1BZIChlX3Bob2ZmKTsKKyAgICAgIENPUFkgKGVfc2hvZmYpOworICAgICAgQ09QWSAoZV9mbGFncyk7CisgICAgICBDT1BZIChlX2Voc2l6ZSk7CisgICAgICBDT1BZIChlX3BoZW50c2l6ZSk7CisgICAgICBDT1BZIChlX3BobnVtKTsKKyAgICAgIENPUFkgKGVfc2hlbnRzaXplKTsKKyAgICAgIENPUFkgKGVfc2hudW0pOworICAgICAgQ09QWSAoZV9zaHN0cm5keCk7CisKKyAgICAgIHJlc3VsdCA9IGRlc3Q7CisgICAgfQorICBlbHNlCisgICAgcmVzdWx0ID0gbWVtY3B5IChkZXN0LCBlbGYtPnN0YXRlLmVsZjY0LmVoZHIsIHNpemVvZiAoKmRlc3QpKTsKKworICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CitJTlRERUYoZ2VsZl9nZXRlaGRyKQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfZ2V0bGliLmMgYi9saWJlbGYvZ2VsZl9nZXRsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzY2Yzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfZ2V0bGliLmMKQEAgLTAsMCArMSw2OCBAQAorLyogR2V0IGxpYnJhcnkgZnJvbSB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworR0VsZl9MaWIgKgorZ2VsZl9nZXRsaWIgKGRhdGEsIG5keCwgZHN0KQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG5keDsKKyAgICAgR0VsZl9MaWIgKmRzdDsKK3sKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodW5saWtlbHkgKGRhdGEtPmRfdHlwZSAhPSBFTEZfVF9MSUIpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKKworICByd2xvY2tfcmRsb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICAvKiBUaGUgb24gZGlzayBmb3JtYXQgb2YgRWxmMzJfTGliIGFuZCBFbGY2NF9MaWIgaXMgaWRlbnRpY2FsLiAgU28KKyAgICAgd2UgY2FuIHNpbXBsaWZ5IHRoaW5ncyBzaWduaWZpY2FudGx5LiAgKi8KKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfTGliKSA9PSBzaXplb2YgKEVsZjMyX0xpYikpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9MaWIpID09IHNpemVvZiAoRWxmNjRfTGliKSk7CisKKyAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCisgICAgIGluZGV4IGlzIE9LLiAgKi8KKyAgR0VsZl9MaWIgKnJlc3VsdCA9IE5VTEw7CisgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChHRWxmX0xpYikgPiBkYXRhLT5kX3NpemUpKQorICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKyAgZWxzZQorICAgIHsKKyAgICAgICpkc3QgPSAoKEdFbGZfTGliICopIGRhdGEtPmRfYnVmKVtuZHhdOworCisgICAgICByZXN1bHQgPSBkc3Q7CisgICAgfQorCisgIHJ3bG9ja191bmxvY2sgKGRhdGFfc2NuLT5zLT5lbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl9nZXRtb3ZlLmMgYi9saWJlbGYvZ2VsZl9nZXRtb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiOTZiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldG1vdmUuYwpAQCAtMCwwICsxLDcwIEBACisvKiBHZXQgbW92ZSBzdHJ1Y3R1cmUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK0dFbGZfTW92ZSAqCitnZWxmX2dldG1vdmUgKGRhdGEsIG5keCwgZHN0KQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG5keDsKKyAgICAgR0VsZl9Nb3ZlICpkc3Q7Cit7CisgIEdFbGZfTW92ZSAqcmVzdWx0ID0gTlVMTDsKKyAgRWxmICplbGY7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodW5saWtlbHkgKGRhdGEtPmRfdHlwZSAhPSBFTEZfVF9NT1ZFKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIFRoZSB0eXBlcyBmb3IgMzIgYW5kIDY0IGJpdCBhcmUgdGhlIHNhbWUuICBMdWNreSB1cy4gICovCisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX01vdmUpID09IHNpemVvZiAoRWxmMzJfTW92ZSkpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9Nb3ZlKSA9PSBzaXplb2YgKEVsZjY0X01vdmUpKTsKKworICAvKiBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGZvcm0uICBKdXN0IG1ha2Ugc3VyZSB0aGUKKyAgICAgaW5kZXggaXMgT0suICAqLworICBpZiAodW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoR0VsZl9Nb3ZlKSA+IGRhdGEtPmRfc2l6ZSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVsZiA9ICgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGY7CisgIHJ3bG9ja19yZGxvY2sgKGVsZi0+bG9jayk7CisKKyAgKmRzdCA9ICgoR0VsZl9Nb3ZlICopIGRhdGEtPmRfYnVmKVtuZHhdOworCisgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisKKyAgcmVzdWx0ID0gZHN0OworCisgb3V0OgorICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfZ2V0cGhkci5jIGIvbGliZWxmL2dlbGZfZ2V0cGhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDMzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZ2VsZl9nZXRwaGRyLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIFJldHVybiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitHRWxmX1BoZHIgKgorZ2VsZl9nZXRwaGRyIChlbGYsIG5keCwgZHN0KQorICAgICBFbGYgKmVsZjsKKyAgICAgaW50IG5keDsKKyAgICAgR0VsZl9QaGRyICpkc3Q7Cit7CisgIEdFbGZfUGhkciAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChkc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9PUEVSQU5EKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOworCisgIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgLyogQ29weSB0aGUgZWxlbWVudHMgb25lLWJ5LW9uZS4gICovCisgICAgICBFbGYzMl9QaGRyICpwaGRyID0gZWxmLT5zdGF0ZS5lbGYzMi5waGRyOworCisgICAgICBpZiAocGhkciA9PSBOVUxMKQorCXsKKwkgIHBoZHIgPSBJTlRVU0UoZWxmMzJfZ2V0cGhkcikgKGVsZik7CisJICBpZiAocGhkciA9PSBOVUxMKQorCSAgICAvKiBUaGUgZXJyb3IgbnVtYmVyIGlzIGFscmVhZHkgc2V0LiAgKi8KKwkgICAgZ290byBvdXQ7CisJfQorCisgICAgICAvKiBUZXN0IHdoZXRoZXIgdGhlIGluZGV4IGlzIG9rLiAgKi8KKyAgICAgIGlmIChuZHggPj0gZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX3BobnVtKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogV2Uga25vdyB0aGUgcmVzdWx0IG5vdy4gICovCisgICAgICByZXN1bHQgPSBkc3Q7CisKKyAgICAgIC8qIE5vdyBjb3JyZWN0IHRoZSBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IGVsZW1lbnQuICAqLworICAgICAgcGhkciArPSBuZHg7CisKKyNkZWZpbmUgQ09QWShOYW1lKSByZXN1bHQtPk5hbWUgPSBwaGRyLT5OYW1lCisgICAgICBDT1BZIChwX3R5cGUpOworICAgICAgQ09QWSAocF9vZmZzZXQpOworICAgICAgQ09QWSAocF92YWRkcik7CisgICAgICBDT1BZIChwX3BhZGRyKTsKKyAgICAgIENPUFkgKHBfZmlsZXN6KTsKKyAgICAgIENPUFkgKHBfbWVtc3opOworICAgICAgQ09QWSAocF9mbGFncyk7CisgICAgICBDT1BZIChwX2FsaWduKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBDb3B5IHRoZSBlbGVtZW50cyBvbmUtYnktb25lLiAgKi8KKyAgICAgIEVsZjY0X1BoZHIgKnBoZHIgPSBlbGYtPnN0YXRlLmVsZjY0LnBoZHI7CisKKyAgICAgIGlmIChwaGRyID09IE5VTEwpCisJeworCSAgcGhkciA9IElOVFVTRShlbGY2NF9nZXRwaGRyKSAoZWxmKTsKKwkgIGlmIChwaGRyID09IE5VTEwpCisJICAgIC8qIFRoZSBlcnJvciBudW1iZXIgaXMgYWxyZWFkeSBzZXQuICAqLworCSAgICBnb3RvIG91dDsKKwl9CisKKyAgICAgIC8qIFRlc3Qgd2hldGhlciB0aGUgaW5kZXggaXMgb2suICAqLworICAgICAgaWYgKG5keCA+PSBlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfcGhudW0pCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAvKiBXZSBvbmx5IGhhdmUgdG8gY29weSB0aGUgZGF0YS4gICovCisgICAgICByZXN1bHQgPSBtZW1jcHkgKGRzdCwgcGhkciArIG5keCwgc2l6ZW9mIChHRWxmX1BoZHIpKTsKKyAgICB9CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX2dldHJlbC5jIGIvbGliZWxmL2dlbGZfZ2V0cmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjNzhhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldHJlbC5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIEdldCBSRUwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhdCBnaXZlbiBpbmRleC4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitHRWxmX1JlbCAqCitnZWxmX2dldHJlbCAoZGF0YSwgbmR4LCBkc3QpCisgICAgIEVsZl9EYXRhICpkYXRhOworICAgICBpbnQgbmR4OworICAgICBHRWxmX1JlbCAqZHN0OworeworICBFbGZfRGF0YV9TY24gKmRhdGFfc2NuID0gKEVsZl9EYXRhX1NjbiAqKSBkYXRhOworICBFbGZfU2NuICpzY247CisgIEdFbGZfUmVsICpyZXN1bHQ7CisKKyAgaWYgKGRhdGFfc2NuID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVubGlrZWx5IChuZHggPCAwKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfUkVMKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSB3aGVyZSB3ZSBoYXZlIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0CisgICAgIHRoYXQgYW4gYEVsZl9EYXRhJyBwb2ludGVyIGlzIGFsc28gYSBwb2ludGVyIHRvIGBFbGZfRGF0YV9TY24nLgorICAgICBUaGUgaW50ZXJmYWNlIGlzIGJyb2tlbiBzbyB0aGF0IGl0IHJlcXVpcmVzIHRoaXMgaGFjay4gICovCisgIHNjbiA9IGRhdGFfc2NuLT5zOworCisgIHJ3bG9ja19yZGxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICBpZiAoc2NuLT5lbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byBjb252ZXJ0IHRoZSBkYXRhLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChFbGYzMl9SZWwpID4gZGF0YV9zY24tPmQuZF9zaXplKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisJICByZXN1bHQgPSBOVUxMOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBFbGYzMl9SZWwgKnNyYyA9ICYoKEVsZjMyX1JlbCAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XTsKKworCSAgZHN0LT5yX29mZnNldCA9IHNyYy0+cl9vZmZzZXQ7CisJICBkc3QtPnJfaW5mbyA9IEdFTEZfUl9JTkZPIChFTEYzMl9SX1NZTSAoc3JjLT5yX2luZm8pLAorCQkJCSAgICAgRUxGMzJfUl9UWVBFIChzcmMtPnJfaW5mbykpOworCisJICByZXN1bHQgPSBkc3Q7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNpbXBseSBjb3B5IHRoZSBkYXRhIGFmdGVyIHdlIG1hZGUgc3VyZSB3ZSBhcmUgYWN0dWFsbHkgZ2V0dGluZworCSBjb3JyZWN0IGRhdGEuICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjY0X1JlbCkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIHJlc3VsdCA9IE5VTEw7CisJfQorICAgICAgZWxzZQorCXJlc3VsdCA9IG1lbWNweSAoZHN0LCAmKChFbGY2NF9SZWwgKikgZGF0YV9zY24tPmQuZF9idWYpW25keF0sCisJCQkgc2l6ZW9mIChFbGY2NF9SZWwpKTsKKyAgICB9CisKKyAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl9nZXRyZWxhLmMgYi9saWJlbGYvZ2VsZl9nZXRyZWxhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5NGIwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldHJlbGEuYwpAQCAtMCwwICsxLDk3IEBACisvKiBHZXQgUkVMQSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGF0IGdpdmVuIGluZGV4LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK0dFbGZfUmVsYSAqCitnZWxmX2dldHJlbGEgKGRhdGEsIG5keCwgZHN0KQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG5keDsKKyAgICAgR0VsZl9SZWxhICpkc3Q7Cit7CisgIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7CisgIEVsZl9TY24gKnNjbjsKKyAgR0VsZl9SZWxhICpyZXN1bHQ7CisKKyAgaWYgKGRhdGFfc2NuID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVubGlrZWx5IChuZHggPCAwKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfUkVMQSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGlzIGlzIHRoZSBvbmUgcGxhY2Ugd2hlcmUgd2UgaGF2ZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdAorICAgICB0aGF0IGFuIGBFbGZfRGF0YScgcG9pbnRlciBpcyBhbHNvIGEgcG9pbnRlciB0byBgRWxmX0RhdGFfU2NuJy4KKyAgICAgVGhlIGludGVyZmFjZSBpcyBicm9rZW4gc28gdGhhdCBpdCByZXF1aXJlcyB0aGlzIGhhY2suICAqLworICBzY24gPSBkYXRhX3Njbi0+czsKKworICByd2xvY2tfcmRsb2NrIChzY24tPmVsZi0+bG9jayk7CisKKyAgaWYgKHNjbi0+ZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgdG8gY29udmVydCB0aGUgZGF0YS4gICovCisgICAgICBpZiAodW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoRWxmMzJfUmVsYSkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIHJlc3VsdCA9IE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIEVsZjMyX1JlbGEgKnNyYyA9ICYoKEVsZjMyX1JlbGEgKikgZGF0YV9zY24tPmQuZF9idWYpW25keF07CisKKwkgIGRzdC0+cl9vZmZzZXQgPSBzcmMtPnJfb2Zmc2V0OworCSAgZHN0LT5yX2luZm8gPSBHRUxGX1JfSU5GTyAoRUxGMzJfUl9TWU0gKHNyYy0+cl9pbmZvKSwKKwkJCQkgICAgIEVMRjMyX1JfVFlQRSAoc3JjLT5yX2luZm8pKTsKKwkgIGRzdC0+cl9hZGRlbmQgPSBzcmMtPnJfYWRkZW5kOworCisJICByZXN1bHQgPSBkc3Q7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNpbXBseSBjb3B5IHRoZSBkYXRhIGFmdGVyIHdlIG1hZGUgc3VyZSB3ZSBhcmUgYWN0dWFsbHkgZ2V0dGluZworCSBjb3JyZWN0IGRhdGEuICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjY0X1JlbGEpID4gZGF0YV9zY24tPmQuZF9zaXplKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisJICByZXN1bHQgPSBOVUxMOworCX0KKyAgICAgIGVsc2UKKwlyZXN1bHQgPSBtZW1jcHkgKGRzdCwgJigoRWxmNjRfUmVsYSAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XSwKKwkJCSBzaXplb2YgKEVsZjY0X1JlbGEpKTsKKyAgICB9CisKKyAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl9nZXRzaGRyLmMgYi9saWJlbGYvZ2VsZl9nZXRzaGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhNTg4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldHNoZHIuYwpAQCAtMCwwICsxLDkxIEBACisvKiBSZXR1cm4gc2VjdGlvbiBoZWFkZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworR0VsZl9TaGRyICoKK2dlbGZfZ2V0c2hkciAoc2NuLCBkc3QpCisgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgR0VsZl9TaGRyICpkc3Q7Cit7CisgIEdFbGZfU2hkciAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAoc2NuID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGRzdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX09QRVJBTkQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJ3bG9ja19yZGxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICBpZiAoc2NuLT5lbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgLyogQ29weSB0aGUgZWxlbWVudHMgb25lLWJ5LW9uZS4gICovCisgICAgICBFbGYzMl9TaGRyICpzaGRyID0gc2NuLT5zaGRyLmUzMiA/OiBJTlRVU0UoZWxmMzJfZ2V0c2hkcikgKHNjbik7CisKKyAgICAgIGlmIChzaGRyID09IE5VTEwpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT1BFUkFORCk7CisJICBnb3RvIG91dDsKKwl9CisKKyNkZWZpbmUgQ09QWShuYW1lKSBcCisgICAgICBkc3QtPm5hbWUgPSBzaGRyLT5uYW1lCisgICAgICBDT1BZIChzaF9uYW1lKTsKKyAgICAgIENPUFkgKHNoX3R5cGUpOworICAgICAgQ09QWSAoc2hfZmxhZ3MpOworICAgICAgQ09QWSAoc2hfYWRkcik7CisgICAgICBDT1BZIChzaF9vZmZzZXQpOworICAgICAgQ09QWSAoc2hfc2l6ZSk7CisgICAgICBDT1BZIChzaF9saW5rKTsKKyAgICAgIENPUFkgKHNoX2luZm8pOworICAgICAgQ09QWSAoc2hfYWRkcmFsaWduKTsKKyAgICAgIENPUFkgKHNoX2VudHNpemUpOworCisgICAgICByZXN1bHQgPSBkc3Q7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgRWxmNjRfU2hkciAqc2hkciA9IHNjbi0+c2hkci5lNjQgPzogSU5UVVNFKGVsZjY0X2dldHNoZHIpIChzY24pOworCisgICAgICBpZiAoc2hkciA9PSBOVUxMKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX09QRVJBTkQpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAvKiBXZSBvbmx5IGhhdmUgdG8gY29weSB0aGUgZGF0YS4gICovCisgICAgICByZXN1bHQgPSBtZW1jcHkgKGRzdCwgc2hkciwgc2l6ZW9mIChHRWxmX1NoZHIpKTsKKyAgICB9CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQorSU5UREVGKGdlbGZfZ2V0c2hkcikKZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX2dldHN5bS5jIGIvbGliZWxmL2dlbGZfZ2V0c3ltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1MzZjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldHN5bS5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiBHZXQgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gc3ltYm9sIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitHRWxmX1N5bSAqCitnZWxmX2dldHN5bSAoZGF0YSwgbmR4LCBkc3QpCisgICAgIEVsZl9EYXRhICpkYXRhOworICAgICBpbnQgbmR4OworICAgICBHRWxmX1N5bSAqZHN0OworeworICBFbGZfRGF0YV9TY24gKmRhdGFfc2NuID0gKEVsZl9EYXRhX1NjbiAqKSBkYXRhOworICBHRWxmX1N5bSAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICh1bmxpa2VseSAoZGF0YS0+ZF90eXBlICE9IEVMRl9UX1NZTSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByd2xvY2tfcmRsb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICAvKiBUaGlzIGlzIHRoZSBvbmUgcGxhY2Ugd2hlcmUgd2UgaGF2ZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdAorICAgICB0aGF0IGFuIGBFbGZfRGF0YScgcG9pbnRlciBpcyBhbHNvIGEgcG9pbnRlciB0byBgRWxmX0RhdGFfU2NuJy4KKyAgICAgVGhlIGludGVyZmFjZSBpcyBicm9rZW4gc28gdGhhdCBpdCByZXF1aXJlcyB0aGlzIGhhY2suICAqLworICBpZiAoZGF0YV9zY24tPnMtPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKKyAgICB7CisgICAgICBFbGYzMl9TeW0gKnNyYzsKKworICAgICAgLyogSGVyZSBpdCBnZXRzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQuICBUaGUgZm9ybWF0IG9mIHRoZSBzeW1ib2wKKwkgdGFibGUgZW50cmllcyBoYXMgdG8gYmUgYWRvcHRlZC4gIFRoZSB1c2VyIGJldHRlciBoYXMgcHJvdmlkZWQKKwkgYSBidWZmZXIgd2hlcmUgd2UgY2FuIHN0b3JlIHRoZSBpbmZvcm1hdGlvbi4gIFdoaWxlIGNvcHlpbmcgdGhlCisJIGRhdGEgd2UgYXJlIGNvbnZlcnRpbmcgdGhlIGZvcm1hdC4gICovCisgICAgICBpZiAodW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoRWxmMzJfU3ltKSA+IGRhdGEtPmRfc2l6ZSkpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICBzcmMgPSAmKChFbGYzMl9TeW0gKikgZGF0YS0+ZF9idWYpW25keF07CisKKyAgICAgIC8qIFRoaXMgbWlnaHQgbG9vayBsaWtlIGEgc2ltcGxlIGNvcHkgb3BlcmF0aW9uIGJ1dCBpdCdzCisJIG5vdC4gIFRoZXJlIGFyZSB6ZXJvLSBhbmQgc2lnbi1leHRlbnNpb25zIGdvaW5nIG9uLiAgKi8KKyNkZWZpbmUgQ09QWShuYW1lKSBcCisgICAgICBkc3QtPm5hbWUgPSBzcmMtPm5hbWUKKyAgICAgIENPUFkgKHN0X25hbWUpOworICAgICAgLyogUGxlYXNlIG5vdGUgdGhhdCB3ZSBjYW4gc2ltcGx5IGNvcHkgdGhlIGBzdF9pbmZvJyBlbGVtZW50IHNpbmNlCisJIHRoZSBkZWZpbml0aW9ucyBvZiBFTEZ4eF9TVF9CSU5EIGFuZCBFTEZ4eF9TVF9UWVBFIGFyZSB0aGUgc2FtZQorCSBmb3IgdGhlIDY0IGJpdCB2YXJpYW50LiAgKi8KKyAgICAgIENPUFkgKHN0X2luZm8pOworICAgICAgQ09QWSAoc3Rfb3RoZXIpOworICAgICAgQ09QWSAoc3Rfc2huZHgpOworICAgICAgQ09QWSAoc3RfdmFsdWUpOworICAgICAgQ09QWSAoc3Rfc2l6ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhpcyBpcyBhIDY0IGJpdCBvYmplY3QgaXQncyBlYXN5LiAgKi8KKyAgICAgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1N5bSkgPT0gc2l6ZW9mIChFbGY2NF9TeW0pKTsKKworICAgICAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCisJIGluZGV4IGlzIE9LLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChHRWxmX1N5bSkgPiBkYXRhLT5kX3NpemUpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgKmRzdCA9ICgoR0VsZl9TeW0gKikgZGF0YS0+ZF9idWYpW25keF07CisgICAgfQorCisgIHJlc3VsdCA9IGRzdDsKKworIG91dDoKKyAgcndsb2NrX3VubG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KK0lOVERFRihnZWxmX2dldHN5bSkKZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX2dldHN5bWluZm8uYyBiL2xpYmVsZi9nZWxmX2dldHN5bWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGNmZGNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfZ2V0c3ltaW5mby5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIEdldCBhZGRpdGlvbmFsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHN5bWJvbCB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworR0VsZl9TeW1pbmZvICoKK2dlbGZfZ2V0c3ltaW5mbyAoZGF0YSwgbmR4LCBkc3QpCisgICAgIEVsZl9EYXRhICpkYXRhOworICAgICBpbnQgbmR4OworICAgICBHRWxmX1N5bWluZm8gKmRzdDsKK3sKKyAgR0VsZl9TeW1pbmZvICpyZXN1bHQgPSBOVUxMOworCisgIGlmIChkYXRhID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVubGlrZWx5IChkYXRhLT5kX3R5cGUgIT0gRUxGX1RfU1lNSU5GTykpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGUgdHlwZXMgZm9yIDMyIGFuZCA2NCBiaXQgYXJlIHRoZSBzYW1lLiAgTHVja3kgdXMuICAqLworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9TeW1pbmZvKSA9PSBzaXplb2YgKEVsZjMyX1N5bWluZm8pKTsKKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfU3ltaW5mbykgPT0gc2l6ZW9mIChFbGY2NF9TeW1pbmZvKSk7CisKKyAgcndsb2NrX3JkbG9jayAoKChFbGZfRGF0YV9TY24gKikgZGF0YSktPnMtPmVsZi0+bG9jayk7CisKKyAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCisgICAgIGluZGV4IGlzIE9LLiAgKi8KKyAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEdFbGZfU3ltaW5mbykgPiBkYXRhLT5kX3NpemUpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAqZHN0ID0gKChHRWxmX1N5bWluZm8gKikgZGF0YS0+ZF9idWYpW25keF07CisKKyAgcmVzdWx0ID0gZHN0OworCisgb3V0OgorICByd2xvY2tfdW5sb2NrICgoKEVsZl9EYXRhX1NjbiAqKSBkYXRhKS0+cy0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfZ2V0c3ltc2huZHguYyBiL2xpYmVsZi9nZWxmX2dldHN5bXNobmR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2ZjQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldHN5bXNobmR4LmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIEdldCBzeW1ib2wgaW5mb3JtYXRpb24gYW5kIHNlcGFyYXRlIHNlY3Rpb24gaW5kZXggZnJvbSBzeW1ib2wgdGFibGUKKyAgIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitHRWxmX1N5bSAqCitnZWxmX2dldHN5bXNobmR4IChzeW1kYXRhLCBzaG5keGRhdGEsIG5keCwgZHN0LCBkc3RzaG5keCkKKyAgICAgRWxmX0RhdGEgKnN5bWRhdGE7CisgICAgIEVsZl9EYXRhICpzaG5keGRhdGE7CisgICAgIGludCBuZHg7CisgICAgIEdFbGZfU3ltICpkc3Q7CisgICAgIEVsZjMyX1dvcmQgKmRzdHNobmR4OworeworICBFbGZfRGF0YV9TY24gKnN5bWRhdGFfc2NuID0gKEVsZl9EYXRhX1NjbiAqKSBzeW1kYXRhOworICBFbGZfRGF0YV9TY24gKnNobmR4ZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIHNobmR4ZGF0YTsKKyAgR0VsZl9TeW0gKnJlc3VsdCA9IE5VTEw7CisgIEVsZjMyX1dvcmQgc2huZHggPSAwOworCisgIGlmIChzeW1kYXRhID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVubGlrZWx5IChzeW1kYXRhLT5kX3R5cGUgIT0gRUxGX1RfU1lNKQorICAgICAgfHwgKGxpa2VseSAoc2huZHhkYXRhX3NjbiAhPSBOVUxMKQorCSAgJiYgdW5saWtlbHkgKHNobmR4ZGF0YS0+ZF90eXBlICE9IEVMRl9UX1dPUkQpKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJ3bG9ja19yZGxvY2sgKHN5bWRhdGFfc2NuLT5zLT5lbGYtPmxvY2spOworCisgIC8qIFRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byBwYXNzIGEgZGF0YSBkZXNjcmlwdG9yIGZvciBhbiBleHRlbmRlZAorICAgICBzZWN0aW9uIGluZGV4IHRhYmxlLiAgKi8KKyAgaWYgKGxpa2VseSAoc2huZHhkYXRhX3NjbiAhPSBOVUxMKSkKKyAgICB7CisgICAgICBpZiAodW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoRWxmMzJfV29yZCkgPiBzaG5keGRhdGFfc2NuLT5kLmRfc2l6ZSkpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICBzaG5keCA9ICgoRWxmMzJfV29yZCAqKSBzaG5keGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOworICAgIH0KKworICAvKiBUaGlzIGlzIHRoZSBvbmUgcGxhY2Ugd2hlcmUgd2UgaGF2ZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdAorICAgICB0aGF0IGFuIGBFbGZfRGF0YScgcG9pbnRlciBpcyBhbHNvIGEgcG9pbnRlciB0byBgRWxmX0RhdGFfU2NuJy4KKyAgICAgVGhlIGludGVyZmFjZSBpcyBicm9rZW4gc28gdGhhdCBpdCByZXF1aXJlcyB0aGlzIGhhY2suICAqLworICBpZiAoc3ltZGF0YV9zY24tPnMtPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKKyAgICB7CisgICAgICBFbGYzMl9TeW0gKnNyYzsKKworICAgICAgLyogSGVyZSBpdCBnZXRzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQuICBUaGUgZm9ybWF0IG9mIHRoZSBzeW1ib2wKKwkgdGFibGUgZW50cmllcyBoYXMgdG8gYmUgYWRvcHRlZC4gIFRoZSB1c2VyIGJldHRlciBoYXMgcHJvdmlkZWQKKwkgYSBidWZmZXIgd2hlcmUgd2UgY2FuIHN0b3JlIHRoZSBpbmZvcm1hdGlvbi4gIFdoaWxlIGNvcHlpbmcgdGhlCisJIGRhdGEgd2UgYXJlIGNvbnZlcnRpbmcgdGhlIGZvcm1hdC4gICovCisgICAgICBpZiAodW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoRWxmMzJfU3ltKSA+IHN5bWRhdGEtPmRfc2l6ZSkpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICBzcmMgPSAmKChFbGYzMl9TeW0gKikgc3ltZGF0YS0+ZF9idWYpW25keF07CisKKyAgICAgIC8qIFRoaXMgbWlnaHQgbG9vayBsaWtlIGEgc2ltcGxlIGNvcHkgb3BlcmF0aW9uIGJ1dCBpdCdzCisJIG5vdC4gIFRoZXJlIGFyZSB6ZXJvLSBhbmQgc2lnbi1leHRlbnNpb25zIGdvaW5nIG9uLiAgKi8KKyNkZWZpbmUgQ09QWShuYW1lKSBcCisgICAgICBkc3QtPm5hbWUgPSBzcmMtPm5hbWUKKyAgICAgIENPUFkgKHN0X25hbWUpOworICAgICAgLyogUGxlYXNlIG5vdGUgdGhhdCB3ZSBjYW4gc2ltcGx5IGNvcHkgdGhlIGBzdF9pbmZvJyBlbGVtZW50IHNpbmNlCisJIHRoZSBkZWZpbml0aW9ucyBvZiBFTEZ4eF9TVF9CSU5EIGFuZCBFTEZ4eF9TVF9UWVBFIGFyZSB0aGUgc2FtZQorCSBmb3IgdGhlIDY0IGJpdCB2YXJpYW50LiAgKi8KKyAgICAgIENPUFkgKHN0X2luZm8pOworICAgICAgQ09QWSAoc3Rfb3RoZXIpOworICAgICAgQ09QWSAoc3Rfc2huZHgpOworICAgICAgQ09QWSAoc3RfdmFsdWUpOworICAgICAgQ09QWSAoc3Rfc2l6ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhpcyBpcyBhIDY0IGJpdCBvYmplY3QgaXQncyBlYXN5LiAgKi8KKyAgICAgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1N5bSkgPT0gc2l6ZW9mIChFbGY2NF9TeW0pKTsKKworICAgICAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCisJIGluZGV4IGlzIE9LLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChHRWxmX1N5bSkgPiBzeW1kYXRhLT5kX3NpemUpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgKmRzdCA9ICgoR0VsZl9TeW0gKikgc3ltZGF0YS0+ZF9idWYpW25keF07CisgICAgfQorCisgIC8qIE5vdyB3ZSBjYW4gc3RvcmUgdGhlIHNlY3Rpb24gaW5kZXguICAqLworICBpZiAoZHN0c2huZHggIT0gTlVMTCkKKyAgICAqZHN0c2huZHggPSBzaG5keDsKKworICByZXN1bHQgPSBkc3Q7CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKHN5bWRhdGFfc2NuLT5zLT5lbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl9nZXR2ZXJkYXV4LmMgYi9saWJlbGYvZ2VsZl9nZXR2ZXJkYXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExNGIxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldHZlcmRhdXguYwpAQCAtMCwwICsxLDcwIEBACisvKiBHZXQgYWRkaXRpb25hbCBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworR0VsZl9WZXJkYXV4ICoKK2dlbGZfZ2V0dmVyZGF1eCAoZGF0YSwgb2Zmc2V0LCBkc3QpCisgICAgIEVsZl9EYXRhICpkYXRhOworICAgICBpbnQgb2Zmc2V0OworICAgICBHRWxmX1ZlcmRhdXggKmRzdDsKK3sKKyAgR0VsZl9WZXJkYXV4ICpyZXN1bHQ7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodW5saWtlbHkgKGRhdGEtPmRfdHlwZSAhPSBFTEZfVF9WREVGKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIEl0J3MgZWFzeSB0byBoYW5kbGUgdGhpcyB0eXBlLiAgSXQgaGFzIHRoZSBzYW1lIHNpemUgZm9yIDMyIGFuZAorICAgICA2NCBiaXQgb2JqZWN0cy4gICovCisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcmRhdXgpID09IHNpemVvZiAoRWxmMzJfVmVyZGF1eCkpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJkYXV4KSA9PSBzaXplb2YgKEVsZjY0X1ZlcmRhdXgpKTsKKworICByd2xvY2tfcmRsb2NrICgoKEVsZl9EYXRhX1NjbiAqKSBkYXRhKS0+cy0+ZWxmLT5sb2NrKTsKKworICAvKiBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGZvcm0uICBKdXN0IG1ha2Ugc3VyZSB0aGUKKyAgICAgaW5kZXggaXMgT0suICAqLworICBpZiAodW5saWtlbHkgKG9mZnNldCA8IDApCisgICAgICB8fCB1bmxpa2VseSAob2Zmc2V0ICsgc2l6ZW9mIChHRWxmX1ZlcmRhdXgpID4gZGF0YS0+ZF9zaXplKQorICAgICAgfHwgdW5saWtlbHkgKG9mZnNldCAlIF9fYWxpZ25vZl9fIChHRWxmX1ZlcmRhdXgpICE9IDApKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9PRkZTRVRfUkFOR0UpOworICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICByZXN1bHQgPSAoR0VsZl9WZXJkYXV4ICopIG1lbWNweSAoZHN0LCAoY2hhciAqKSBkYXRhLT5kX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICBzaXplb2YgKEdFbGZfVmVyZGF1eCkpOworCisKKyAgcndsb2NrX3VubG9jayAoKChFbGZfRGF0YV9TY24gKikgZGF0YSktPnMtPmVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX2dldHZlcmRlZi5jIGIvbGliZWxmL2dlbGZfZ2V0dmVyZGVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0OTJlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldHZlcmRlZi5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIEdldCBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworR0VsZl9WZXJkZWYgKgorZ2VsZl9nZXR2ZXJkZWYgKGRhdGEsIG9mZnNldCwgZHN0KQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG9mZnNldDsKKyAgICAgR0VsZl9WZXJkZWYgKmRzdDsKK3sKKyAgR0VsZl9WZXJkZWYgKnJlc3VsdDsKKworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICh1bmxpa2VseSAoZGF0YS0+ZF90eXBlICE9IEVMRl9UX1ZERUYpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogSXQncyBlYXN5IHRvIGhhbmRsZSB0aGlzIHR5cGUuICBJdCBoYXMgdGhlIHNhbWUgc2l6ZSBmb3IgMzIgYW5kCisgICAgIDY0IGJpdCBvYmplY3RzLiAgKi8KKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyZGVmKSA9PSBzaXplb2YgKEVsZjMyX1ZlcmRlZikpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJkZWYpID09IHNpemVvZiAoRWxmNjRfVmVyZGVmKSk7CisKKyAgcndsb2NrX3JkbG9jayAoKChFbGZfRGF0YV9TY24gKikgZGF0YSktPnMtPmVsZi0+bG9jayk7CisKKyAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCisgICAgIGluZGV4IGlzIE9LLiAgKi8KKyAgaWYgKHVubGlrZWx5IChvZmZzZXQgPCAwKQorICAgICAgfHwgdW5saWtlbHkgKG9mZnNldCArIHNpemVvZiAoR0VsZl9WZXJkZWYpID4gZGF0YS0+ZF9zaXplKQorICAgICAgfHwgdW5saWtlbHkgKG9mZnNldCAlIF9fYWxpZ25vZl9fIChHRWxmX1ZlcmRlZikgIT0gMCkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX09GRlNFVF9SQU5HRSk7CisgICAgICByZXN1bHQgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHJlc3VsdCA9IChHRWxmX1ZlcmRlZiAqKSBtZW1jcHkgKGRzdCwgKGNoYXIgKikgZGF0YS0+ZF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBzaXplb2YgKEdFbGZfVmVyZGVmKSk7CisKKyAgcndsb2NrX3VubG9jayAoKChFbGZfRGF0YV9TY24gKikgZGF0YSktPnMtPmVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX2dldHZlcm5hdXguYyBiL2xpYmVsZi9nZWxmX2dldHZlcm5hdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFhMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfZ2V0dmVybmF1eC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEdldCBhZGRpdGlvbmFsIHJlcXVpcmVkIHN5bWJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworR0VsZl9WZXJuYXV4ICoKK2dlbGZfZ2V0dmVybmF1eCAoZGF0YSwgb2Zmc2V0LCBkc3QpCisgICAgIEVsZl9EYXRhICpkYXRhOworICAgICBpbnQgb2Zmc2V0OworICAgICBHRWxmX1Zlcm5hdXggKmRzdDsKK3sKKyAgR0VsZl9WZXJuYXV4ICpyZXN1bHQ7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodW5saWtlbHkgKGRhdGEtPmRfdHlwZSAhPSBFTEZfVF9WTkVFRCkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBJdCdzIGVhc3kgdG8gaGFuZGxlIHRoaXMgdHlwZS4gIEl0IGhhcyB0aGUgc2FtZSBzaXplIGZvciAzMiBhbmQKKyAgICAgNjQgYml0IG9iamVjdHMuICBBbmQgZm9ydHVuYXRlbHkgdGhlIGBFbGZYWFhfVmVybmF1eCcgcmVjb3JkcworICAgICBhbHNvIGhhdmUgdGhlIHNhbWUgc2l6ZS4gICovCisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1Zlcm5hdXgpID09IHNpemVvZiAoRWxmMzJfVmVybmVlZCkpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuYXV4KSA9PSBzaXplb2YgKEVsZjY0X1Zlcm5lZWQpKTsKKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmF1eCkgPT0gc2l6ZW9mIChFbGYzMl9WZXJuYXV4KSk7CisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1Zlcm5hdXgpID09IHNpemVvZiAoRWxmNjRfVmVybmF1eCkpOworCisgIHJ3bG9ja19yZGxvY2sgKCgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGYtPmxvY2spOworCisgIC8qIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybS4gIEp1c3QgbWFrZSBzdXJlIHRoZQorICAgICBpbmRleCBpcyBPSy4gICovCisgIGlmICh1bmxpa2VseSAob2Zmc2V0IDwgMCkKKyAgICAgIHx8IHVubGlrZWx5IChvZmZzZXQgKyBzaXplb2YgKEdFbGZfVmVybmF1eCkgPiBkYXRhLT5kX3NpemUpCisgICAgICB8fCB1bmxpa2VseSAob2Zmc2V0ICUgc2l6ZW9mIChHRWxmX1Zlcm5hdXgpICE9IDApKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9PRkZTRVRfUkFOR0UpOworICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICByZXN1bHQgPSAoR0VsZl9WZXJuYXV4ICopIG1lbWNweSAoZHN0LCAoY2hhciAqKSBkYXRhLT5kX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICBzaXplb2YgKEdFbGZfVmVybmVlZCkpOworCisgIHJ3bG9ja191bmxvY2sgKCgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl9nZXR2ZXJuZWVkLmMgYi9saWJlbGYvZ2VsZl9nZXR2ZXJuZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczZTExNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldHZlcm5lZWQuYwpAQCAtMCwwICsxLDcyIEBACisvKiBHZXQgcmVxdWlyZWQgc3ltYm9sIHZlcnNpb24gaW5mb3JtYXRpb24gYXQgdGhlIGdpdmVuIG9mZnNldC4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitHRWxmX1Zlcm5lZWQgKgorZ2VsZl9nZXR2ZXJuZWVkIChkYXRhLCBvZmZzZXQsIGRzdCkKKyAgICAgRWxmX0RhdGEgKmRhdGE7CisgICAgIGludCBvZmZzZXQ7CisgICAgIEdFbGZfVmVybmVlZCAqZHN0OworeworICBHRWxmX1Zlcm5lZWQgKnJlc3VsdDsKKworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICh1bmxpa2VseSAoZGF0YS0+ZF90eXBlICE9IEVMRl9UX1ZORUVEKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIEl0J3MgZWFzeSB0byBoYW5kbGUgdGhpcyB0eXBlLiAgSXQgaGFzIHRoZSBzYW1lIHNpemUgZm9yIDMyIGFuZAorICAgICA2NCBiaXQgb2JqZWN0cy4gIEFuZCBmb3J0dW5hdGVseSB0aGUgYEVsZlhYWF9WZXJuYXV4JyByZWNvcmRzCisgICAgIGFsc28gaGF2ZSB0aGUgc2FtZSBzaXplLiAgKi8KKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmVlZCkgPT0gc2l6ZW9mIChFbGYzMl9WZXJuZWVkKSk7CisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1Zlcm5lZWQpID09IHNpemVvZiAoRWxmNjRfVmVybmVlZCkpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuZWVkKSA9PSBzaXplb2YgKEVsZjMyX1Zlcm5hdXgpKTsKKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmVlZCkgPT0gc2l6ZW9mIChFbGY2NF9WZXJuYXV4KSk7CisKKyAgcndsb2NrX3JkbG9jayAoKChFbGZfRGF0YV9TY24gKikgZGF0YSktPnMtPmVsZi0+bG9jayk7CisKKyAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCisgICAgIGluZGV4IGlzIE9LLiAgKi8KKyAgaWYgKHVubGlrZWx5IChvZmZzZXQgPCAwKQorICAgICAgfHwgdW5saWtlbHkgKG9mZnNldCArIHNpemVvZiAoR0VsZl9WZXJuZWVkKSA+IGRhdGEtPmRfc2l6ZSkKKyAgICAgIHx8IHVubGlrZWx5IChvZmZzZXQgJSBzaXplb2YgKEdFbGZfVmVybmVlZCkgIT0gMCkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX09GRlNFVF9SQU5HRSk7CisgICAgICByZXN1bHQgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHJlc3VsdCA9IChHRWxmX1Zlcm5lZWQgKikgbWVtY3B5IChkc3QsIChjaGFyICopIGRhdGEtPmRfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgIHNpemVvZiAoR0VsZl9WZXJuZWVkKSk7CisKKyAgcndsb2NrX3VubG9jayAoKChFbGZfRGF0YV9TY24gKikgZGF0YSktPnMtPmVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX2dldHZlcnN5bS5jIGIvbGliZWxmL2dlbGZfZ2V0dmVyc3ltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3NGIxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX2dldHZlcnN5bS5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIEdldCBzeW1ib2wgdmVyc2lvbiBpbmZvcm1hdGlvbiBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworR0VsZl9WZXJzeW0gKgorZ2VsZl9nZXR2ZXJzeW0gKGRhdGEsIG5keCwgZHN0KQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG5keDsKKyAgICAgR0VsZl9WZXJzeW0gKmRzdDsKK3sKKyAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKKyAgRWxmX1NjbiAqc2NuOworICBHRWxmX1ZlcnN5bSAqcmVzdWx0OworCisgIGlmIChkYXRhID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHVubGlrZWx5IChkYXRhLT5kX3R5cGUgIT0gRUxGX1RfSEFMRikpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGlzIGlzIHRoZSBvbmUgcGxhY2Ugd2hlcmUgd2UgaGF2ZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdAorICAgICB0aGF0IGFuIGBFbGZfRGF0YScgcG9pbnRlciBpcyBhbHNvIGEgcG9pbnRlciB0byBgRWxmX0RhdGFfU2NuJy4KKyAgICAgVGhlIGludGVyZmFjZSBpcyBicm9rZW4gc28gdGhhdCBpdCByZXF1aXJlcyB0aGlzIGhhY2suICAqLworICBzY24gPSBkYXRhX3Njbi0+czsKKworICAvKiBJdCdzIGVhc3kgdG8gaGFuZGxlIHRoaXMgdHlwZS4gIEl0IGhhcyB0aGUgc2FtZSBzaXplIGZvciAzMiBhbmQKKyAgICAgNjQgYml0IG9iamVjdHMuICAqLworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJzeW0pID09IHNpemVvZiAoRWxmMzJfVmVyc3ltKSk7CisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcnN5bSkgPT0gc2l6ZW9mIChFbGY2NF9WZXJzeW0pKTsKKworICByd2xvY2tfcmRsb2NrIChzY24tPmVsZi0+bG9jayk7CisKKyAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCisgICAgIGluZGV4IGlzIE9LLiAgKi8KKyAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEdFbGZfVmVyc3ltKSA+IGRhdGEtPmRfc2l6ZSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqZHN0ID0gKChHRWxmX1ZlcnN5bSAqKSBkYXRhLT5kX2J1ZilbbmR4XTsKKworICAgICAgcmVzdWx0ID0gZHN0OworICAgIH0KKworICByd2xvY2tfdW5sb2NrIChzY24tPmVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX25ld2VoZHIuYyBiL2xpYmVsZi9nZWxmX25ld2VoZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODcyODNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfbmV3ZWhkci5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIENyZWF0ZSBuZXcgRUxGIGhlYWRlci4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCit1bnNpZ25lZCBsb25nIGludAorZ2VsZl9uZXdlaGRyIChlbGYsIGNsYXNzKQorICAgICBFbGYgKmVsZjsKKyAgICAgaW50IGNsYXNzOworeworICByZXR1cm4gKGNsYXNzID09IEVMRkNMQVNTMzIKKwkgID8gKHVuc2lnbmVkIGxvbmcgaW50KSBJTlRVU0UoZWxmMzJfbmV3ZWhkcikgKGVsZikKKwkgIDogKHVuc2lnbmVkIGxvbmcgaW50KSBJTlRVU0UoZWxmNjRfbmV3ZWhkcikgKGVsZikpOworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfbmV3cGhkci5jIGIvbGliZWxmL2dlbGZfbmV3cGhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZDQzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZ2VsZl9uZXdwaGRyLmMKQEAgLTAsMCArMSwzNiBAQAorLyogQ3JlYXRlIG5ldyBFTEYgcHJvZ3JhbSBoZWFkZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKwordW5zaWduZWQgbG9uZyBpbnQKK2dlbGZfbmV3cGhkciAoZWxmLCBwaG51bSkKKyAgICAgRWxmICplbGY7CisgICAgIHNpemVfdCBwaG51bTsKK3sKKyAgcmV0dXJuIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKKwkgID8gKHVuc2lnbmVkIGxvbmcgaW50KSBJTlRVU0UoZWxmMzJfbmV3cGhkcikgKGVsZiwgcGhudW0pCisJICA6ICh1bnNpZ25lZCBsb25nIGludCkgSU5UVVNFKGVsZjY0X25ld3BoZHIpIChlbGYsIHBobnVtKSk7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl9yYXdjaHVuay5jIGIvbGliZWxmL2dlbGZfcmF3Y2h1bmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjdmMzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfcmF3Y2h1bmsuYwpAQCAtMCwwICsxLDcxIEBACisvKiBSZXRyaWV2ZSB1bmludGVycHJldGVkIGNodW5rIG9mIHRoZSBmaWxlIGNvbnRlbnRzLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2NoYXIgKgorZ2VsZl9yYXdjaHVuayAoZWxmLCBvZmZzZXQsIHNpemUpCisgICAgIEVsZiAqZWxmOworICAgICBHRWxmX09mZiBvZmZzZXQ7CisgICAgIEdFbGZfV29yZCBzaXplOworeworICBpZiAoZWxmID09IE5VTEwpCisgICAgeworICAgICAgLyogTm8gdmFsaWQgZGVzY3JpcHRvci4gICovCisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChvZmZzZXQgPj0gZWxmLT5tYXhpbXVtX3NpemUKKyAgICAgIHx8IG9mZnNldCArIHNpemUgPj0gZWxmLT5tYXhpbXVtX3NpemUKKyAgICAgIHx8IG9mZnNldCArIHNpemUgPCBvZmZzZXQpCisgICAgeworICAgICAgLyogSW52YWxpZCByZXF1ZXN0LiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX09QKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBJZiB0aGUgZmlsZSBpcyBtbWFwJ2VkIHJldHVybiBhbiBhcHByb3ByaWF0ZSBwb2ludGVyLiAgKi8KKyAgaWYgKGVsZi0+bWFwX2FkZHJlc3MgIT0gTlVMTCkKKyAgICByZXR1cm4gKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0ICsgb2Zmc2V0OworCisgIC8qIFdlIGFsbG9jYXRlIHRoZSBtZW1vcnkgYW5kIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4gICovCisgIGNoYXIgKnJlc3VsdCA9IChjaGFyICopIG1hbGxvYyAoc2l6ZSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOworICBlbHNlCisgICAgLyogUmVhZCB0aGUgZmlsZSBjb250ZW50LiAgKi8KKyAgICBpZiAoKHNpemVfdCkgcHJlYWQgKGVsZi0+ZmlsZGVzLCByZXN1bHQsIHNpemUsIGVsZi0+c3RhcnRfb2Zmc2V0ICsgb2Zmc2V0KQorCSE9IHNpemUpCisgICAgICB7CisJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLworCV9fbGliZWxmX3NldGVycm5vIChFTEZfRV9SRUFEX0VSUk9SKTsKKwlmcmVlIChyZXN1bHQpOworICAgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl91cGRhdGVfZHluLmMgYi9saWJlbGYvZ2VsZl91cGRhdGVfZHluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2NmZkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV9keW4uYwpAQCAtMCwwICsxLDEwNCBAQAorLyogVXBkYXRlIGluZm9ybWF0aW9uIGluIGR5bmFtaWMgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2ludAorZ2VsZl91cGRhdGVfZHluIChkYXRhLCBuZHgsIHNyYykKKyAgICAgRWxmX0RhdGEgKmRhdGE7CisgICAgIGludCBuZHg7CisgICAgIEdFbGZfRHluICpzcmM7Cit7CisgIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7CisgIEVsZl9TY24gKnNjbjsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBpZiAodW5saWtlbHkgKG5keCA8IDApKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9EWU4pKQorICAgIHsKKyAgICAgIC8qIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJldHRlciBzaG91bGQgbWF0Y2guICAqLworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RBVEFfTUlTTUFUQ0gpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHNjbiA9IGRhdGFfc2NuLT5zOworICByd2xvY2tfd3Jsb2NrIChzY24tPmVsZi0+bG9jayk7CisKKyAgaWYgKHNjbi0+ZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQorICAgIHsKKyAgICAgIEVsZjMyX0R5biAqZHluOworCisgICAgICAvKiBUaGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgdmFsdWVzIGluIHRoZSBpbnB1dCBhcmUKKwkgdG9vIGxhcmdlLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoc3JjLT5kX3RhZyA8IC0weDgwMDAwMDAwbGwpCisJICB8fCB1bmxpa2VseSAoc3JjLT5kX3RhZyA+IDB4N2ZmZmZmZmZsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPmRfdW4uZF92YWwgPiAweGZmZmZmZmZmdWxsKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjMyX0R5bikgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgZHluID0gJigoRWxmMzJfRHluICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOworCisgICAgICBkeW4tPmRfdGFnID0gc3JjLT5kX3RhZzsKKyAgICAgIGR5bi0+ZF91bi5kX3ZhbCA9IHNyYy0+ZF91bi5kX3ZhbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCisgICAgICBpZiAodW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoRWxmNjRfRHluKSA+IGRhdGFfc2NuLT5kLmRfc2l6ZSkpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAoKEVsZjY0X0R5biAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XSA9ICpzcmM7CisgICAgfQorCisgIHJlc3VsdCA9IDE7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIHNjbi0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfdXBkYXRlX2VoZHIuYyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV9laGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMTIxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV9laGRyLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qIFVwZGF0ZSBFTEYgaGVhZGVyLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2ludAorZ2VsZl91cGRhdGVfZWhkciAoRWxmICplbGYsIEdFbGZfRWhkciAqc3JjKQoreworICBpbnQgcmVzdWx0ID0gMDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJ3bG9ja193cmxvY2sgKGVsZi0+bG9jayk7CisKKyAgaWYgKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKKyAgICB7CisgICAgICBFbGYzMl9FaGRyICplaGRyID0gZWxmLT5zdGF0ZS5lbGYzMi5laGRyOworCisgICAgICBpZiAoZWhkciA9PSBOVUxMKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUk9OR19PUkRFUl9FSERSKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogV2UgaGF2ZSB0byBjb252ZXJ0IHRoZSBkYXRhIHRvIHRoZSAzMiBiaXQgZm9ybWF0LiAgVGhpcyBtaWdodAorCSBvdmVyZmxvdyBzb21lIGZpZWxkcyBzbyB3ZSBoYXZlIHRvIHRlc3QgZm9yIHRoaXMgY2FzZSBiZWZvcmUKKwkgY29weWluZy4gICovCisgICAgICBpZiAodW5saWtlbHkgKHNyYy0+ZV9lbnRyeSA+IDB4ZmZmZmZmZmZ1bGwpCisJICB8fCB1bmxpa2VseSAoc3JjLT5lX3Bob2ZmID4gMHhmZmZmZmZmZnVsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPmVfc2hvZmYgPiAweGZmZmZmZmZmdWxsKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogQ29weSB0aGUgZGF0YS4gICovCisgICAgICBtZW1jcHkgKGVoZHItPmVfaWRlbnQsIHNyYy0+ZV9pZGVudCwgRUlfTklERU5UKTsKKyNkZWZpbmUgQ09QWShuYW1lKSBcCisgICAgICBlaGRyLT5uYW1lID0gc3JjLT5uYW1lCisgICAgICBDT1BZIChlX3R5cGUpOworICAgICAgQ09QWSAoZV9tYWNoaW5lKTsKKyAgICAgIENPUFkgKGVfdmVyc2lvbik7CisgICAgICBDT1BZIChlX2VudHJ5KTsKKyAgICAgIENPUFkgKGVfcGhvZmYpOworICAgICAgQ09QWSAoZV9zaG9mZik7CisgICAgICBDT1BZIChlX2ZsYWdzKTsKKyAgICAgIENPUFkgKGVfZWhzaXplKTsKKyAgICAgIENPUFkgKGVfcGhlbnRzaXplKTsKKyAgICAgIENPUFkgKGVfcGhudW0pOworICAgICAgQ09QWSAoZV9zaGVudHNpemUpOworICAgICAgQ09QWSAoZV9zaG51bSk7CisgICAgICBDT1BZIChlX3Noc3RybmR4KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBFbGY2NF9FaGRyICplaGRyID0gZWxmLT5zdGF0ZS5lbGY2NC5laGRyOworCisgICAgICBpZiAoZWhkciA9PSBOVUxMKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUk9OR19PUkRFUl9FSERSKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogSnVzdCBjb3B5IHRoZSBkYXRhLiAgKi8KKyAgICAgIG1lbWNweSAoZWhkciwgc3JjLCBzaXplb2YgKEVsZjY0X0VoZHIpKTsKKyAgICB9CisKKyAgcmVzdWx0ID0gMTsKKworIG91dDoKKyAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfdXBkYXRlX2xpYi5jIGIvbGliZWxmL2dlbGZfdXBkYXRlX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Y2UyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZ2VsZl91cGRhdGVfbGliLmMKQEAgLTAsMCArMSw3MiBAQAorLyogVXBkYXRlIGxpYnJhcnkgaW4gdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2ludAorZ2VsZl91cGRhdGVfbGliIChkYXRhLCBuZHgsIHNyYykKKyAgICAgRWxmX0RhdGEgKmRhdGE7CisgICAgIGludCBuZHg7CisgICAgIEdFbGZfTGliICpzcmM7Cit7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHVubGlrZWx5IChuZHggPCAwKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKKyAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfTElCKSkKKyAgICB7CisgICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBFbGZfU2NuICpzY24gPSBkYXRhX3Njbi0+czsKKyAgcndsb2NrX3dybG9jayAoc2NuLT5lbGYtPmxvY2spOworCisgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KKyAgaW50IHJlc3VsdCA9IDA7CisgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChFbGY2NF9MaWIpID4gZGF0YV9zY24tPmQuZF9zaXplKSkKKyAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisgIGVsc2UKKyAgICB7CisgICAgICAoKEVsZjY0X0xpYiAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XSA9ICpzcmM7CisKKyAgICAgIHJlc3VsdCA9IDE7CisKKyAgICAgIC8qIE1hcmsgdGhlIHNlY3Rpb24gYXMgbW9kaWZpZWQuICAqLworICAgICAgc2NuLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKKyAgICB9CisKKyAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl91cGRhdGVfbW92ZS5jIGIvbGliZWxmL2dlbGZfdXBkYXRlX21vdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTBlMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfdXBkYXRlX21vdmUuYwpAQCAtMCwwICsxLDY5IEBACisvKiBVcGRhdGUgbW92ZSBzdHJ1Y3R1cmUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2ludAorZ2VsZl91cGRhdGVfbW92ZSAoZGF0YSwgbmR4LCBzcmMpCisgICAgIEVsZl9EYXRhICpkYXRhOworICAgICBpbnQgbmR4OworICAgICBHRWxmX01vdmUgKnNyYzsKK3sKKyAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKKworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIC8qIFRoZSB0eXBlcyBmb3IgMzIgYW5kIDY0IGJpdCBhcmUgdGhlIHNhbWUuICBMdWNreSB1cy4gICovCisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX01vdmUpID09IHNpemVvZiAoRWxmMzJfTW92ZSkpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9Nb3ZlKSA9PSBzaXplb2YgKEVsZjY0X01vdmUpKTsKKworICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCisgIGlmICh1bmxpa2VseSAobmR4IDwgMCkKKyAgICAgIHx8IHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEdFbGZfTW92ZSkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9NT1ZFKSkKKyAgICB7CisgICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByd2xvY2tfd3Jsb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICAoKEdFbGZfTW92ZSAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XSA9ICpzcmM7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIGRhdGFfc2NuLT5zLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKKworICByd2xvY2tfdW5sb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX3VwZGF0ZV9waGRyLmMgYi9saWJlbGYvZ2VsZl91cGRhdGVfcGhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZDRlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZ2VsZl91cGRhdGVfcGhkci5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiBVcGRhdGUgcHJvZ3JhbSBoZWFkZXIgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworaW50CitnZWxmX3VwZGF0ZV9waGRyIChFbGYgKmVsZiwgaW50IG5keCwgR0VsZl9QaGRyICpzcmMpCit7CisgIGludCByZXN1bHQgPSAwOworCisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICBpZiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQorICAgIHsKKyAgICAgIEVsZjMyX1BoZHIgKnBoZHIgPSBlbGYtPnN0YXRlLmVsZjMyLnBoZHI7CisKKyAgICAgIC8qIFdlIGhhdmUgdG8gY29udmVydCB0aGUgZGF0YSB0byB0aGUgMzIgYml0IGZvcm1hdC4gIFRoaXMgbWlnaHQKKwkgb3ZlcmZsb3cgc29tZSBmaWVsZHMgc28gd2UgaGF2ZSB0byB0ZXN0IGZvciB0aGlzIGNhc2UgYmVmb3JlCisJIGNvcHlpbmcuICAqLworICAgICAgaWYgKHVubGlrZWx5IChzcmMtPnBfb2Zmc2V0ID4gMHhmZmZmZmZmZnVsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPnBfdmFkZHIgPiAweGZmZmZmZmZmdWxsKQorCSAgfHwgdW5saWtlbHkgKHNyYy0+cF9wYWRkciA+IDB4ZmZmZmZmZmZ1bGwpCisJICB8fCB1bmxpa2VseSAoc3JjLT5wX2ZpbGVzeiA+IDB4ZmZmZmZmZmZ1bGwpCisJICB8fCB1bmxpa2VseSAoc3JjLT5wX21lbXN6ID4gMHhmZmZmZmZmZnVsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPnBfYWxpZ24gPiAweGZmZmZmZmZmdWxsKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgaWYgKHBoZHIgPT0gTlVMTCkKKwl7CisJICBwaGRyID0gSU5UVVNFKGVsZjMyX2dldHBoZHIpIChlbGYpOworCSAgaWYgKHBoZHIgPT0gTlVMTCkKKwkgICAgLyogVGhlIGVycm9yIG51bWJlciBpcyBhbHJlYWR5IHNldC4gICovCisJICAgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogVGVzdCB3aGV0aGVyIHRoZSBpbmRleCBpcyBvay4gICovCisgICAgICBpZiAodW5saWtlbHkgKG5keCA+PSBlbGYtPnN0YXRlLmVsZjMyLmVoZHItPmVfcGhudW0pKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogTm93IGNvcnJlY3QgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgZWxlbWVudC4gICovCisgICAgICBwaGRyICs9IG5keDsKKworI2RlZmluZSBDT1BZKG5hbWUpIFwKKyAgICAgIHBoZHItPm5hbWUgPSBzcmMtPm5hbWUKKyAgICAgIENPUFkgKHBfdHlwZSk7CisgICAgICBDT1BZIChwX29mZnNldCk7CisgICAgICBDT1BZIChwX3ZhZGRyKTsKKyAgICAgIENPUFkgKHBfcGFkZHIpOworICAgICAgQ09QWSAocF9maWxlc3opOworICAgICAgQ09QWSAocF9tZW1zeik7CisgICAgICBDT1BZIChwX2ZsYWdzKTsKKyAgICAgIENPUFkgKHBfYWxpZ24pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEVsZjY0X1BoZHIgKnBoZHIgPSBlbGYtPnN0YXRlLmVsZjY0LnBoZHI7CisKKyAgICAgIGlmIChwaGRyID09IE5VTEwpCisJeworCSAgcGhkciA9IElOVFVTRShlbGY2NF9nZXRwaGRyKSAoZWxmKTsKKwkgIGlmIChwaGRyID09IE5VTEwpCisJICAgIC8qIFRoZSBlcnJvciBudW1iZXIgaXMgYWxyZWFkeSBzZXQuICAqLworCSAgICBnb3RvIG91dDsKKwl9CisKKyAgICAgIC8qIFRlc3Qgd2hldGhlciB0aGUgaW5kZXggaXMgb2suICAqLworICAgICAgaWYgKHVubGlrZWx5IChuZHggPj0gZWxmLT5zdGF0ZS5lbGY2NC5laGRyLT5lX3BobnVtKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIC8qIEp1c3QgY29weSB0aGUgZGF0YS4gICovCisgICAgICBtZW1jcHkgKHBoZHIgKyBuZHgsIHNyYywgc2l6ZW9mIChFbGY2NF9QaGRyKSk7CisgICAgfQorCisgIHJlc3VsdCA9IDE7CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX3VwZGF0ZV9yZWwuYyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV9yZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTljNmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfdXBkYXRlX3JlbC5jCkBAIC0wLDAgKzEsMTAyIEBACisvKiBVcGRhdGUgUkVMIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXQgZ2l2ZW4gaW5kZXguCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworaW50CitnZWxmX3VwZGF0ZV9yZWwgKEVsZl9EYXRhICpkc3QsIGludCBuZHgsIEdFbGZfUmVsICpzcmMpCit7CisgIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRzdDsKKyAgRWxmX1NjbiAqc2NuOworICBpbnQgcmVzdWx0ID0gMDsKKworICBpZiAoZHN0ID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHVubGlrZWx5IChuZHggPCAwKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfUkVMKSkKKyAgICB7CisgICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBzY24gPSBkYXRhX3Njbi0+czsKKyAgcndsb2NrX3dybG9jayAoc2NuLT5lbGYtPmxvY2spOworCisgIGlmIChzY24tPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKKyAgICB7CisgICAgICBFbGYzMl9SZWwgKnJlbDsKKworICAgICAgLyogVGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIHZhbHVlcyBpbiB0aGUgaW5wdXQgYXJlCisJIHRvbyBsYXJnZS4gICovCisgICAgICBpZiAodW5saWtlbHkgKHNyYy0+cl9vZmZzZXQgPiAweGZmZmZmZmZmdWxsKQorCSAgfHwgdW5saWtlbHkgKEdFTEZfUl9TWU0gKHNyYy0+cl9pbmZvKSA+IDB4ZmZmZmZmKQorCSAgfHwgdW5saWtlbHkgKEdFTEZfUl9UWVBFIChzcmMtPnJfaW5mbykgPiAweGZmKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjMyX1JlbCkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgcmVsID0gJigoRWxmMzJfUmVsICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOworCisgICAgICByZWwtPnJfb2Zmc2V0ID0gc3JjLT5yX29mZnNldDsKKyAgICAgIHJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChHRUxGX1JfU1lNIChzcmMtPnJfaW5mbyksCisJCQkJICBHRUxGX1JfVFlQRSAoc3JjLT5yX2luZm8pKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCisgICAgICBpZiAodW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoRWxmNjRfUmVsKSA+IGRhdGFfc2NuLT5kLmRfc2l6ZSkpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAoKEVsZjY0X1JlbCAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XSA9ICpzcmM7CisgICAgfQorCisgIHJlc3VsdCA9IDE7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIHNjbi0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfdXBkYXRlX3JlbGEuYyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV9yZWxhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzMmMwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV9yZWxhLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIFVwZGF0ZSBSRUxBIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXQgZ2l2ZW4gaW5kZXguCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworaW50CitnZWxmX3VwZGF0ZV9yZWxhIChFbGZfRGF0YSAqZHN0LCBpbnQgbmR4LCBHRWxmX1JlbGEgKnNyYykKK3sKKyAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZHN0OworICBFbGZfU2NuICpzY247CisgIGludCByZXN1bHQgPSAwOworCisgIGlmIChkc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBpZiAodW5saWtlbHkgKG5keCA8IDApKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9SRUxBKSkKKyAgICB7CisgICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBzY24gPSBkYXRhX3Njbi0+czsKKyAgcndsb2NrX3dybG9jayAoc2NuLT5lbGYtPmxvY2spOworCisgIGlmIChzY24tPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKKyAgICB7CisgICAgICBFbGYzMl9SZWxhICpyZWw7CisKKyAgICAgIC8qIFRoZXJlIGlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIGlucHV0IGFyZQorCSB0b28gbGFyZ2UuICAqLworICAgICAgaWYgKHVubGlrZWx5IChzcmMtPnJfb2Zmc2V0ID4gMHhmZmZmZmZmZnVsbCkKKwkgIHx8IHVubGlrZWx5IChHRUxGX1JfU1lNIChzcmMtPnJfaW5mbykgPiAweGZmZmZmZikKKwkgIHx8IHVubGlrZWx5IChHRUxGX1JfVFlQRSAoc3JjLT5yX2luZm8pID4gMHhmZikKKwkgIHx8IHVubGlrZWx5IChzcmMtPnJfYWRkZW5kIDwgLTB4ODAwMDAwMDBsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPnJfYWRkZW5kID4gMHg3ZmZmZmZmZmxsKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjMyX1JlbGEpID4gZGF0YV9zY24tPmQuZF9zaXplKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIHJlbCA9ICYoKEVsZjMyX1JlbGEgKikgZGF0YV9zY24tPmQuZF9idWYpW25keF07CisKKyAgICAgIHJlbC0+cl9vZmZzZXQgPSBzcmMtPnJfb2Zmc2V0OworICAgICAgcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEdFTEZfUl9TWU0gKHNyYy0+cl9pbmZvKSwKKwkJCQkgIEdFTEZfUl9UWVBFIChzcmMtPnJfaW5mbykpOworICAgICAgcmVsLT5yX2FkZGVuZCA9IHNyYy0+cl9hZGRlbmQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjY0X1JlbGEpID4gZGF0YV9zY24tPmQuZF9zaXplKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgICgoRWxmNjRfUmVsYSAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XSA9ICpzcmM7CisgICAgfQorCisgIHJlc3VsdCA9IDE7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIHNjbi0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfdXBkYXRlX3NoZHIuYyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV9zaGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0ZThjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV9zaGRyLmMKQEAgLTAsMCArMSw5NCBAQAorLyogVXBkYXRlIHNlY3Rpb24gaGVhZGVyLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2ludAorZ2VsZl91cGRhdGVfc2hkciAoRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNyYykKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIEVsZiAqZWxmOworCisgIGlmIChzY24gPT0gTlVMTCB8fCBzcmMgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBlbGYgPSBzY24tPmVsZjsKKyAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKKworICBpZiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQorICAgIHsKKyAgICAgIEVsZjMyX1NoZHIgKnNoZHIgPSBzY24tPnNoZHIuZTMyID86IElOVFVTRShlbGYzMl9nZXRzaGRyKSAoc2NuKTsKKworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9PUEVSQU5EKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgaWYgKHVubGlrZWx5IChzcmMtPnNoX2ZsYWdzID4gMHhmZmZmZmZmZnVsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPnNoX2FkZHIgPiAweGZmZmZmZmZmdWxsKQorCSAgfHwgdW5saWtlbHkgKHNyYy0+c2hfb2Zmc2V0ID4gMHhmZmZmZmZmZnVsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPnNoX3NpemUgPiAweGZmZmZmZmZmdWxsKQorCSAgfHwgdW5saWtlbHkgKHNyYy0+c2hfYWRkcmFsaWduID4gMHhmZmZmZmZmZnVsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPnNoX2VudHNpemUgPiAweGZmZmZmZmZmdWxsKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKKwkgIGdvdG8gb3V0OworCX0KKworI2RlZmluZSBDT1BZKG5hbWUpIFwKKyAgICAgIHNoZHItPm5hbWUgPSBzcmMtPm5hbWUKKyAgICAgIENPUFkgKHNoX25hbWUpOworICAgICAgQ09QWSAoc2hfdHlwZSk7CisgICAgICBDT1BZIChzaF9mbGFncyk7CisgICAgICBDT1BZIChzaF9hZGRyKTsKKyAgICAgIENPUFkgKHNoX29mZnNldCk7CisgICAgICBDT1BZIChzaF9zaXplKTsKKyAgICAgIENPUFkgKHNoX2xpbmspOworICAgICAgQ09QWSAoc2hfaW5mbyk7CisgICAgICBDT1BZIChzaF9hZGRyYWxpZ24pOworICAgICAgQ09QWSAoc2hfZW50c2l6ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgRWxmNjRfU2hkciAqc2hkciA9IHNjbi0+c2hkci5lNjQgPzogSU5UVVNFKGVsZjY0X2dldHNoZHIpIChzY24pOworCisgICAgICBpZiAoc2hkciA9PSBOVUxMKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX09QRVJBTkQpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICAvKiBXZSBvbmx5IGhhdmUgdG8gY29weSB0aGUgZGF0YS4gICovCisgICAgICAodm9pZCkgbWVtY3B5IChzaGRyLCBzcmMsIHNpemVvZiAoR0VsZl9TaGRyKSk7CisgICAgfQorCisgIHJlc3VsdCA9IDE7CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX3VwZGF0ZV9zeW0uYyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV9zeW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM3ZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfdXBkYXRlX3N5bS5jCkBAIC0wLDAgKzEsMTEzIEBACisvKiBVcGRhdGUgc3ltYm9sIGluZm9ybWF0aW9uIGluIHN5bWJvbCB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworaW50CitnZWxmX3VwZGF0ZV9zeW0gKGRhdGEsIG5keCwgc3JjKQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG5keDsKKyAgICAgR0VsZl9TeW0gKnNyYzsKK3sKKyAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKKyAgRWxmX1NjbiAqc2NuOworICBpbnQgcmVzdWx0ID0gMDsKKworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIGlmICh1bmxpa2VseSAobmR4IDwgMCkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICh1bmxpa2VseSAoZGF0YV9zY24tPmQuZF90eXBlICE9IEVMRl9UX1NZTSkpCisgICAgeworICAgICAgLyogVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmV0dGVyIHNob3VsZCBtYXRjaC4gICovCisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgc2NuID0gZGF0YV9zY24tPnM7CisgIHJ3bG9ja193cmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICBpZiAoc2NuLT5lbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgRWxmMzJfU3ltICpzeW07CisKKyAgICAgIC8qIFRoZXJlIGlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIGlucHV0IGFyZQorCSB0b28gbGFyZ2UuICAqLworICAgICAgaWYgKHVubGlrZWx5IChzcmMtPnN0X3ZhbHVlID4gMHhmZmZmZmZmZnVsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPnN0X3NpemUgPiAweGZmZmZmZmZmdWxsKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjMyX1N5bSkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgc3ltID0gJigoRWxmMzJfU3ltICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOworCisjZGVmaW5lIENPUFkobmFtZSkgXAorICAgICAgc3ltLT5uYW1lID0gc3JjLT5uYW1lCisgICAgICBDT1BZIChzdF9uYW1lKTsKKyAgICAgIENPUFkgKHN0X3ZhbHVlKTsKKyAgICAgIENPUFkgKHN0X3NpemUpOworICAgICAgLyogUGxlYXNlIG5vdGUgdGhhdCB3ZSBjYW4gc2ltcGx5IGNvcHkgdGhlIGBzdF9pbmZvJyBlbGVtZW50IHNpbmNlCisJIHRoZSBkZWZpbml0aW9ucyBvZiBFTEZ4eF9TVF9CSU5EIGFuZCBFTEZ4eF9TVF9UWVBFIGFyZSB0aGUgc2FtZQorCSBmb3IgdGhlIDY0IGJpdCB2YXJpYW50LiAgKi8KKyAgICAgIENPUFkgKHN0X2luZm8pOworICAgICAgQ09QWSAoc3Rfb3RoZXIpOworICAgICAgQ09QWSAoc3Rfc2huZHgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChFbGY2NF9TeW0pID4gZGF0YV9zY24tPmQuZF9zaXplKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgICgoRWxmNjRfU3ltICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdID0gKnNyYzsKKyAgICB9CisKKyAgcmVzdWx0ID0gMTsKKworICAvKiBNYXJrIHRoZSBzZWN0aW9uIGFzIG1vZGlmaWVkLiAgKi8KKyAgc2NuLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKKworIG91dDoKKyAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl91cGRhdGVfc3ltaW5mby5jIGIvbGliZWxmL2dlbGZfdXBkYXRlX3N5bWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjBhYTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfdXBkYXRlX3N5bWluZm8uYwpAQCAtMCwwICsxLDgwIEBACisvKiBVcGRhdGUgYWRkaXRpb25hbCBzeW1ib2wgaW5mb3JtYXRpb24gaW4gc3ltYm9sIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitpbnQKK2dlbGZfdXBkYXRlX3N5bWluZm8gKGRhdGEsIG5keCwgc3JjKQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG5keDsKKyAgICAgR0VsZl9TeW1pbmZvICpzcmM7Cit7CisgIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7CisgIEVsZl9TY24gKnNjbjsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBpZiAodW5saWtlbHkgKG5keCA8IDApKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9TWU1JTkZPKSkKKyAgICB7CisgICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBUaGUgdHlwZXMgZm9yIDMyIGFuZCA2NCBiaXQgYXJlIHRoZSBzYW1lLiAgTHVja3kgdXMuICAqLworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9TeW1pbmZvKSA9PSBzaXplb2YgKEVsZjMyX1N5bWluZm8pKTsKKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfU3ltaW5mbykgPT0gc2l6ZW9mIChFbGY2NF9TeW1pbmZvKSk7CisKKyAgc2NuID0gZGF0YV9zY24tPnM7CisgIHJ3bG9ja193cmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCisgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChHRWxmX1N5bWluZm8pID4gZGF0YV9zY24tPmQuZF9zaXplKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgKChHRWxmX1N5bWluZm8gKikgZGF0YV9zY24tPmQuZF9idWYpW25keF0gPSAqc3JjOworCisgIHJlc3VsdCA9IDE7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIHNjbi0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfdXBkYXRlX3N5bXNobmR4LmMgYi9saWJlbGYvZ2VsZl91cGRhdGVfc3ltc2huZHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM3NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfdXBkYXRlX3N5bXNobmR4LmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qIFVwZGF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gYW5kIHNlY3Rpb24gaW5kZXggaW4gc3ltYm9sIHRhYmxlIGF0IHRoZQorICAgZ2l2ZW4gaW5kZXguCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworaW50CitnZWxmX3VwZGF0ZV9zeW1zaG5keCAoc3ltZGF0YSwgc2huZHhkYXRhLCBuZHgsIHNyYywgc3Jjc2huZHgpCisgICAgIEVsZl9EYXRhICpzeW1kYXRhOworICAgICBFbGZfRGF0YSAqc2huZHhkYXRhOworICAgICBpbnQgbmR4OworICAgICBHRWxmX1N5bSAqc3JjOworICAgICBFbGYzMl9Xb3JkIHNyY3NobmR4OworeworICBFbGZfRGF0YV9TY24gKnN5bWRhdGFfc2NuID0gKEVsZl9EYXRhX1NjbiAqKSBzeW1kYXRhOworICBFbGZfRGF0YV9TY24gKnNobmR4ZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIHNobmR4ZGF0YTsKKyAgRWxmX1NjbiAqc2NuOworICBFbGYzMl9Xb3JkICpzaG5keCA9IE5VTEw7CisgIGludCByZXN1bHQgPSAwOworCisgIGlmIChzeW1kYXRhID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHVubGlrZWx5IChuZHggPCAwKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChzeW1kYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfU1lNKSkKKyAgICB7CisgICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBzY24gPSBzeW1kYXRhX3Njbi0+czsKKyAgLyogV2Ugc2ltcGx5IGhhdmUgdG8gYmVsaWV2ZSB0aGUgdXNlciB0aGF0IHRoZSB0d28gc2VjdGlvbnMgYmVsb25nIHRvCisgICAgIHRoZSBzYW1lIEVMRiBmaWxlLiAgKi8KKyAgcndsb2NrX3dybG9jayAoc2NuLT5lbGYtPmxvY2spOworCisgIC8qIFRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byBwYXNzIGEgZGF0YSBkZXNjcmlwdG9yIGZvciBhbiBleHRlbmRlZAorICAgICBzZWN0aW9uIGluZGV4IHRhYmxlLiAgKi8KKyAgaWYgKHNobmR4ZGF0YV9zY24gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAodW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoRWxmMzJfV29yZCkgPiBzaG5keGRhdGFfc2NuLT5kLmRfc2l6ZSkpCisJeworCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworCSAgZ290byBvdXQ7CisJfQorCisgICAgICBzaG5keCA9ICYoKEVsZjMyX1dvcmQgKikgc2huZHhkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XTsKKyAgICB9CisgIC8qIEJ1dCBpZiBzL2hlIGRvZXMgbm90IHRoZSBleHRlbmRlZCBzZWN0aW8gaW5kZXggbXVzdCBiZSB6ZXJvLiAgKi8KKyAgZWxzZSBpZiAodW5saWtlbHkgKHNyY3NobmR4ICE9IDApKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc2NuLT5lbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgRWxmMzJfU3ltICpzeW07CisKKyAgICAgIC8qIFRoZXJlIGlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIGlucHV0IGFyZQorCSB0b28gbGFyZ2UuICAqLworICAgICAgaWYgKHVubGlrZWx5IChzcmMtPnN0X3ZhbHVlID4gMHhmZmZmZmZmZnVsbCkKKwkgIHx8IHVubGlrZWx5IChzcmMtPnN0X3NpemUgPiAweGZmZmZmZmZmdWxsKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLworICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjMyX1N5bSkgPiBzeW1kYXRhX3Njbi0+ZC5kX3NpemUpKQorCXsKKwkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgc3ltID0gJigoRWxmMzJfU3ltICopIHN5bWRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOworCisjZGVmaW5lIENPUFkobmFtZSkgXAorICAgICAgc3ltLT5uYW1lID0gc3JjLT5uYW1lCisgICAgICBDT1BZIChzdF9uYW1lKTsKKyAgICAgIENPUFkgKHN0X3ZhbHVlKTsKKyAgICAgIENPUFkgKHN0X3NpemUpOworICAgICAgLyogUGxlYXNlIG5vdGUgdGhhdCB3ZSBjYW4gc2ltcGx5IGNvcHkgdGhlIGBzdF9pbmZvJyBlbGVtZW50IHNpbmNlCisJIHRoZSBkZWZpbml0aW9ucyBvZiBFTEZ4eF9TVF9CSU5EIGFuZCBFTEZ4eF9TVF9UWVBFIGFyZSB0aGUgc2FtZQorCSBmb3IgdGhlIDY0IGJpdCB2YXJpYW50LiAgKi8KKyAgICAgIENPUFkgKHN0X2luZm8pOworICAgICAgQ09QWSAoc3Rfb3RoZXIpOworICAgICAgQ09QWSAoc3Rfc2huZHgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChFbGY2NF9TeW0pID4gc3ltZGF0YV9zY24tPmQuZF9zaXplKSkKKwl7CisJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgICgoRWxmNjRfU3ltICopIHN5bWRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdID0gKnNyYzsKKyAgICB9CisKKyAgLyogTm93IHdlIGNhbiBzdG9yZSB0aGUgc2VjdGlvbiBpbmRleC4gICovCisgIGlmIChzaG5keCAhPSBOVUxMKQorICAgICpzaG5keCA9IHNyY3NobmR4OworCisgIHJlc3VsdCA9IDE7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIHNjbi0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7CisKKyBvdXQ6CisgIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfdXBkYXRlX3ZlcmRhdXguYyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJkYXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxNDI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJkYXV4LmMKQEAgLTAsMCArMSw2OSBAQAorLyogVXBkYXRlIGFkZGl0aW9uYWwgc3ltYm9sIHZlcnNpb24gZGVmaW5pdGlvbiBpbmZvcm1hdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitpbnQKK2dlbGZfdXBkYXRlX3ZlcmRhdXggKGRhdGEsIG9mZnNldCwgc3JjKQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG9mZnNldDsKKyAgICAgR0VsZl9WZXJkYXV4ICpzcmM7Cit7CisgIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICAvKiBUaGUgdHlwZXMgZm9yIDMyIGFuZCA2NCBiaXQgYXJlIHRoZSBzYW1lLiAgTHVja3kgdXMuICAqLworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJkYXV4KSA9PSBzaXplb2YgKEVsZjMyX1ZlcmRhdXgpKTsKKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyZGF1eCkgPT0gc2l6ZW9mIChFbGY2NF9WZXJkYXV4KSk7CisKKyAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLworICBpZiAodW5saWtlbHkgKG9mZnNldCA8IDApCisgICAgICB8fCB1bmxpa2VseSAoKG9mZnNldCArIHNpemVvZiAoR0VsZl9WZXJkYXV4KSkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9WREVGKSkKKyAgICB7CisgICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByd2xvY2tfd3Jsb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICBtZW1jcHkgKChjaGFyICopIGRhdGFfc2NuLT5kLmRfYnVmICsgb2Zmc2V0LCBzcmMsIHNpemVvZiAoR0VsZl9WZXJkYXV4KSk7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIGRhdGFfc2NuLT5zLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKKworICByd2xvY2tfdW5sb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJkZWYuYyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJkZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzNhMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfdXBkYXRlX3ZlcmRlZi5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIFVwZGF0ZSBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9uIGluZm9ybWF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2ludAorZ2VsZl91cGRhdGVfdmVyZGVmIChkYXRhLCBvZmZzZXQsIHNyYykKKyAgICAgRWxmX0RhdGEgKmRhdGE7CisgICAgIGludCBvZmZzZXQ7CisgICAgIEdFbGZfVmVyZGVmICpzcmM7Cit7CisgIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICAvKiBUaGUgdHlwZXMgZm9yIDMyIGFuZCA2NCBiaXQgYXJlIHRoZSBzYW1lLiAgTHVja3kgdXMuICAqLworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJkZWYpID09IHNpemVvZiAoRWxmMzJfVmVyZGVmKSk7CisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcmRlZikgPT0gc2l6ZW9mIChFbGY2NF9WZXJkZWYpKTsKKworICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCisgIGlmICh1bmxpa2VseSAob2Zmc2V0IDwgMCkKKyAgICAgIHx8IHVubGlrZWx5ICgob2Zmc2V0ICsgc2l6ZW9mIChHRWxmX1ZlcmRlZikpID4gZGF0YV9zY24tPmQuZF9zaXplKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfVkRFRikpCisgICAgeworICAgICAgLyogVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmV0dGVyIHNob3VsZCBtYXRjaC4gICovCisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcndsb2NrX3dybG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7CisKKyAgbWVtY3B5ICgoY2hhciAqKSBkYXRhX3Njbi0+ZC5kX2J1ZiArIG9mZnNldCwgc3JjLCBzaXplb2YgKEdFbGZfVmVyZGVmKSk7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIGRhdGFfc2NuLT5zLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKKworICByd2xvY2tfdW5sb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJuYXV4LmMgYi9saWJlbGYvZ2VsZl91cGRhdGVfdmVybmF1eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTA2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZ2VsZl91cGRhdGVfdmVybmF1eC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIFVwZGF0ZSBhZGRpdGlvbmFsIHJlcXVpcmVkIHN5bWJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK2ludAorZ2VsZl91cGRhdGVfdmVybmF1eCAoZGF0YSwgb2Zmc2V0LCBzcmMpCisgICAgIEVsZl9EYXRhICpkYXRhOworICAgICBpbnQgb2Zmc2V0OworICAgICBHRWxmX1Zlcm5hdXggKnNyYzsKK3sKKyAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKKworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIC8qIFRoZSB0eXBlcyBmb3IgMzIgYW5kIDY0IGJpdCBhcmUgdGhlIHNhbWUuICBMdWNreSB1cy4gICovCisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1Zlcm5hdXgpID09IHNpemVvZiAoRWxmMzJfVmVybmF1eCkpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuYXV4KSA9PSBzaXplb2YgKEVsZjY0X1Zlcm5hdXgpKTsKKworICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCisgIGlmICh1bmxpa2VseSAob2Zmc2V0IDwgMCkKKyAgICAgIHx8IHVubGlrZWx5ICgob2Zmc2V0ICsgc2l6ZW9mIChHRWxmX1Zlcm5hdXgpKSA+IGRhdGFfc2NuLT5kLmRfc2l6ZSkpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICh1bmxpa2VseSAoZGF0YV9zY24tPmQuZF90eXBlICE9IEVMRl9UX1ZORUVEKSkKKyAgICB7CisgICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByd2xvY2tfd3Jsb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICBtZW1jcHkgKChjaGFyICopIGRhdGFfc2NuLT5kLmRfYnVmICsgb2Zmc2V0LCBzcmMsIHNpemVvZiAoR0VsZl9WZXJuYXV4KSk7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIGRhdGFfc2NuLT5zLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKKworICByd2xvY2tfdW5sb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJuZWVkLmMgYi9saWJlbGYvZ2VsZl91cGRhdGVfdmVybmVlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmY2NkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZ2VsZl91cGRhdGVfdmVybmVlZC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIFVwZGF0ZSByZXF1aXJlZCBzeW1ib2wgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworCitpbnQKK2dlbGZfdXBkYXRlX3Zlcm5lZWQgKGRhdGEsIG9mZnNldCwgc3JjKQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG9mZnNldDsKKyAgICAgR0VsZl9WZXJuZWVkICpzcmM7Cit7CisgIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICAvKiBUaGUgdHlwZXMgZm9yIDMyIGFuZCA2NCBiaXQgYXJlIHRoZSBzYW1lLiAgTHVja3kgdXMuICAqLworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuZWVkKSA9PSBzaXplb2YgKEVsZjMyX1Zlcm5lZWQpKTsKKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmVlZCkgPT0gc2l6ZW9mIChFbGY2NF9WZXJuZWVkKSk7CisKKyAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLworICBpZiAodW5saWtlbHkgKG9mZnNldCA8IDApCisgICAgICB8fCB1bmxpa2VseSAoKG9mZnNldCArIHNpemVvZiAoR0VsZl9WZXJuZWVkKSkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQorICAgIHsKKyAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9WTkVFRCkpCisgICAgeworICAgICAgLyogVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmV0dGVyIHNob3VsZCBtYXRjaC4gICovCisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcndsb2NrX3dybG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7CisKKyAgbWVtY3B5ICgoY2hhciAqKSBkYXRhX3Njbi0+ZC5kX2J1ZiArIG9mZnNldCwgc3JjLCBzaXplb2YgKEdFbGZfVmVybmVlZCkpOworCisgIC8qIE1hcmsgdGhlIHNlY3Rpb24gYXMgbW9kaWZpZWQuICAqLworICBkYXRhX3Njbi0+cy0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7CisKKyAgcndsb2NrX3VubG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl91cGRhdGVfdmVyc3ltLmMgYi9saWJlbGYvZ2VsZl91cGRhdGVfdmVyc3ltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0ZDViYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJzeW0uYwpAQCAtMCwwICsxLDY5IEBACisvKiBVcGRhdGUgc3ltYm9sIHZlcnNpb24gaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworaW50CitnZWxmX3VwZGF0ZV92ZXJzeW0gKGRhdGEsIG5keCwgc3JjKQorICAgICBFbGZfRGF0YSAqZGF0YTsKKyAgICAgaW50IG5keDsKKyAgICAgR0VsZl9WZXJzeW0gKnNyYzsKK3sKKyAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKKworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIC8qIFRoZSB0eXBlcyBmb3IgMzIgYW5kIDY0IGJpdCBhcmUgdGhlIHNhbWUuICBMdWNreSB1cy4gICovCisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcnN5bSkgPT0gc2l6ZW9mIChFbGYzMl9WZXJzeW0pKTsKKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyc3ltKSA9PSBzaXplb2YgKEVsZjY0X1ZlcnN5bSkpOworCisgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KKyAgaWYgKHVubGlrZWx5IChuZHggPCAwKQorICAgICAgfHwgdW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoR0VsZl9WZXJzeW0pID4gZGF0YV9zY24tPmQuZF9zaXplKSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfSEFMRikpCisgICAgeworICAgICAgLyogVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmV0dGVyIHNob3VsZCBtYXRjaC4gICovCisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcndsb2NrX3dybG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7CisKKyAgKChHRWxmX1ZlcnN5bSAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XSA9ICpzcmM7CisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCisgIGRhdGFfc2NuLT5zLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKKworICByd2xvY2tfdW5sb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX3hsYXRlLmMgYi9saWJlbGYvZ2VsZl94bGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjEzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZ2VsZl94bGF0ZS5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBUcmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIEVMRiBkYXRhIHR5cGVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmVsZlAuaCIKKworI2lmbmRlZiBMSUJFTEZCSVRTCisjIGRlZmluZSBMSUJFTEZCSVRTCTMyCisjZW5kaWYKKworCisvKiBXZWxsLCB3aGF0IHNoYWxsIEkgc2F5LiAgTm90aGluZyB0byBkbyBoZXJlLiAgKi8KKyNkZWZpbmUgZWxmX2N2dF9CeXRlKGRlc3QsIHNyYywgbikgXAorICAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pICYmIChuKSA9PSAxCQkJCQkgICAgICBcCisgICA/ICh2b2lkKSAoKigoY2hhciAqKSAoZGVzdCkpID0gKigoY2hhciAqKSAoc3JjKSkpCQkJICAgICAgXAorICAgOiBFbGYzMl9jdnRfQnl0ZSAoZGVzdCwgc3JjLCBuKSkKK3N0YXRpYyB2b2lkCisoZWxmX2N2dF9CeXRlKSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbiwKKwkJaW50IGVuY29kZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIG1lbW1vdmUgKGRlc3QsIHNyYywgbik7Cit9CisKKworLyogV2UnbGwgb3B0aW1pemUgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGhlcmUgYQorICAgYml0LiAgV2UgbmVlZCBvbmx5IGZ1bmN0aW9ucyBmb3IgMTYsIDMyLCBhbmQgNjQgYml0cy4gIFRoZQorICAgZnVuY3Rpb25zIHJlZmVyZW5jZWQgaW4gdGhlIHRhYmxlIHdpbGwgYmUgYWxpYXNlcyBmb3Igb25lIG9mIHRoZXNlCisgICBmdW5jdGlvbnMuICBXaGljaCBvbmUgaXMgZGVjaWRlZCBieSB0aGUgRUxGeHhfRlNaX3R5cGUuICAqLworI2RlZmluZSBMRU4yX1NXQVAoU3JjKSAgYnN3YXBfMTYgKCooKHVpbnQxNl90ICopIFNyYykpCisjZGVmaW5lIHdvcmQyX3QgdWludDE2X3QKKworI2RlZmluZSBMRU40X1NXQVAoU3JjKSAgYnN3YXBfMzIgKCooKHVpbnQzMl90ICopIFNyYykpCisjZGVmaW5lIHdvcmQ0X3QgdWludDMyX3QKKworI2RlZmluZSBMRU44X1NXQVAoU3JjKSAgYnN3YXBfNjQgKCooKHVpbnQ2NF90ICopIFNyYykpCisjZGVmaW5lIHdvcmQ4X3QgdWludDY0X3QKKworCisvKiBOb3cgZGVmaW5lIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IgdGhlIGJhc2ljIHR5cGVzLiAgV2UgdXNlIGhlcmUKKyAgIHRoZSBmYWN0IHRoYXQgZmlsZSBhbmQgbWVtb3J5IHR5cGVzIGFyZSB0aGUgc2FtZSBhbmQgdGhhdCB3ZSBoYXZlIHRoZQorICAgRUxGeHhfRlNaXyogbWFjcm9zLgorCisgICBBdCB0aGUgc2FtZSB0aW1lIHdlIGRlZmluZSBpbmxpbmUgZnVuY3Rpb25zIHdoaWNoIHdlIHdpbGwgdXNlIHRvCisgICBjb252ZXJ0IHRoZSBjb21wbGV4IHR5cGVzLiAgKi8KKyNkZWZpbmUgRlVOREFNRU5UQUwoTkFNRSwgTmFtZSwgQml0cykgXAorICBJTkxJTkUyIChFTEZXMihCaXRzLEZTWl8jI05BTUUpLCBFbGZXMihCaXRzLGN2dF8jI05hbWUpLCBFbGZXMihCaXRzLE5hbWUpKQorI2RlZmluZSBJTkxJTkUyKEJ5dGVzLCBGTmFtZSwgVE5hbWUpIFwKKyAgSU5MSU5FMyAoQnl0ZXMsIEZOYW1lLCBUTmFtZSkKKyNkZWZpbmUgSU5MSU5FMyhCeXRlcywgRk5hbWUsIFROYW1lKSBcCisgIHN0YXRpYyB2b2lkIEZOYW1lICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBsZW4sCQkgICAgICBcCisJCSAgICAgaW50IGVuY29kZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCQkgICAgICBcCisgIHsJCQkJCQkJCQkgICAgICBcCisgICAgc2l6ZV90IG4gPSBsZW4gLyBzaXplb2YgKFROYW1lKTsJCQkJCSAgICAgIFwKKyAgICBpZiAoZGVzdCA8IHB0cikJCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwl3b3JkIyNCeXRlcyMjX3QgKnRkZXN0ID0gKHdvcmQjI0J5dGVzIyNfdCAqKSBkZXN0OwkJICAgICAgXAorICAgICAgICBjb25zdCB3b3JkIyNCeXRlcyMjX3QgKnRwdHIgPSAoY29uc3Qgd29yZCMjQnl0ZXMjI190ICopIHB0cjsJICAgICAgXAorICAgICAgICB3aGlsZSAobi0tID4gMCkJCQkJCQkJICAgICAgXAorCSAgewkJCQkJCQkJICAgICAgXAorCSAgICAqdGRlc3QrKyA9IExFTiMjQnl0ZXMjI19TV0FQICh0cHRyKTsJCQkgICAgICBcCisJICAgIHRwdHIrKzsJCQkJCQkJICAgICAgXAorCSAgfQkJCQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCXdvcmQjI0J5dGVzIyNfdCAqdGRlc3QgPSAod29yZCMjQnl0ZXMjI190ICopIGRlc3QgKyBuOwkJICAgICAgXAorCWNvbnN0IHdvcmQjI0J5dGVzIyNfdCAqdHB0ciA9IChjb25zdCB3b3JkIyNCeXRlcyMjX3QgKikgcHRyICsgbjsgICAgICBcCisJd2hpbGUgKG4tLSA+IDApCQkJCQkJCSAgICAgIFwKKwkgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgLS10cHRyOwkJCQkJCQkgICAgICBcCisJICAgICotLXRkZXN0ID0gTEVOIyNCeXRlcyMjX1NXQVAgKHRwdHIpOwkJCSAgICAgIFwKKwkgIH0JCQkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgfQkJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgc3RhdGljIGlubGluZSB2b2lkIEZOYW1lIyMxICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpwdHIpCQkgICAgICBcCisgIHsJCQkJCQkJCQkgICAgICBcCisgICAgKigod29yZCMjQnl0ZXMjI190ICopIGRlc3QpID0JCQkJCSAgICAgIFwKKyAgICAgIExFTiMjQnl0ZXMjI19TV0FQICgoKCh3b3JkIyNCeXRlcyMjX3QgKikgcHRyKSkpOwkJCSAgICAgIFwKKyAgfQorCisKKy8qIE5vdyB0aGUgdHJpY2t5IHBhcnQ6IGRlZmluZSB0aGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGZvciB0aGUKKyAgIGNvbXBsZXggdHlwZXMuICBXZSB3aWxsIHVzZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIHR5cGVzIGluCisgICBhYnN0cmFjdC5oLiAgKi8KKyNkZWZpbmUgU1RBUlQoQml0cywgTmFtZSwgRU5hbWUpIFwKKyAgc3RhdGljIHZvaWQJCQkJCQkJCSAgICAgIFwKKyAgRWxmVzIgKEJpdHMsIGN2dF8jI05hbWUpICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4sCSAgICAgIFwKKwkJCSAgICBpbnQgZW5jb2RlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkJICAgICAgXAorICB7IEVsZlcyKEJpdHMsIE5hbWUpICp0ZGVzdCA9IChFbGZXMihCaXRzLCBOYW1lKSAqKSBkZXN0OwkJICAgICAgXAorICAgIEVsZlcyKEJpdHMsIE5hbWUpICp0c3JjID0gKEVsZlcyKEJpdHMsIE5hbWUpICopIHNyYzsJCSAgICAgIFwKKyAgICBzaXplX3QgbjsJCQkJCQkJCSAgICAgIFwKKyAgICBmb3IgKG4gPSBsZW4gLyBzaXplb2YgKEVsZlcyKEJpdHMsIE5hbWUpKTsgbiA+IDA7ICsrdGRlc3QsICsrdHNyYywgLS1uKSB7CisjZGVmaW5lIEVORChCaXRzLCBOYW1lKSB9IH0KKyNkZWZpbmUgVFlQRV9FWFRSQShDb2RlKQorI2RlZmluZSBUWVBFX1hMQVRFKENvZGUpIENvZGUKKyNkZWZpbmUgVFlQRV9OQU1FKFR5cGUsIE5hbWUpIFRZUEVfTkFNRTIgKFR5cGUsIE5hbWUpCisjZGVmaW5lIFRZUEVfTkFNRTIoVHlwZSwgTmFtZSkgVHlwZSMjMSAoJnRkZXN0LT5OYW1lLCAmdHNyYy0+TmFtZSk7CisjZGVmaW5lIFRZUEUoTmFtZSwgQml0cykgVFlQRTIgKE5hbWUsIEJpdHMpCisjZGVmaW5lIFRZUEUyKE5hbWUsIEJpdHMpIFRZUEUzIChOYW1lIyNCaXRzKQorI2RlZmluZSBUWVBFMyhOYW1lKSBOYW1lIChjdnRfKQorCisvKiBTaWduYWwgdGhhdCB3ZSBhcmUgZ2VuZXJhdGluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIEdFTkVSQVRFX0NPTlZFUlNJT04KKworLyogRmlyc3QgZ2VuZXJhdGUgdGhlIDMyLWJpdCBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIExJQkVMRkJJVFMgMzIKKyNpbmNsdWRlICJnZWxmX3hsYXRlLmgiCisKKy8qIE5vdyBnZW5lcmF0ZSB0aGUgNjQtYml0IGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgKi8KKyNkZWZpbmUgTElCRUxGQklUUyA2NAorI2luY2x1ZGUgImdlbGZfeGxhdGUuaCIKKworCisvKiBXZSBoYXZlIGEgZmV3IGZ1bmN0aW9ucyB3aGljaCB3ZSBtdXN0IGNyZWF0ZSBieSBoYW5kIHNpbmNlIHRoZSBzZWN0aW9ucworICAgZG8gbm90IGNvbnRhaW4gcmVjb3JkcyBvZiBvbmx5IG9uZSB0eXBlLiAgKi8KKyNpbmNsdWRlICJ2ZXJzaW9uX3hsYXRlLmgiCisKKworLyogTm93IHRoZSBleHRlcm5hbGx5IHZpc2libGUgdGFibGUgd2l0aCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMuICAqLworY29uc3QgeGZjdF90IF9fZWxmX3hmY3RzdG9tW0VWX05VTSAtIDFdW0VWX05VTSAtIDFdW0VMRkNMQVNTTlVNIC0gMV1bRUxGX1RfTlVNXSA9Cit7CisgIFtFVl9DVVJSRU5UIC0gMV0gPSB7CisgICAgW0VWX0NVUlJFTlQgLSAxXSA9IHsKKyAgICAgIFtFTEZDTEFTUzMyIC0gMV0gPSB7CisjZGVmaW5lIGRlZmluZV94ZmN0cyhCaXRzKSBcCisJW0VMRl9UX0JZVEVdCT0gZWxmX2N2dF9CeXRlLAkJCQkJICAgICAgXAorCVtFTEZfVF9BRERSXQk9IEVsZlcyKEJpdHMsIGN2dF9BZGRyKSwJCQkgICAgICBcCisJW0VMRl9UX0RZTl0JPSBFbGZXMihCaXRzLCBjdnRfRHluKSwJCQkJICAgICAgXAorCVtFTEZfVF9FSERSXQk9IEVsZlcyKEJpdHMsIGN2dF9FaGRyKSwJCQkgICAgICBcCisJW0VMRl9UX0hBTEZdCT0gRWxmVzIoQml0cywgY3Z0X0hhbGYpLAkJCSAgICAgIFwKKwlbRUxGX1RfT0ZGXQk9IEVsZlcyKEJpdHMsIGN2dF9PZmYpLAkJCQkgICAgICBcCisJW0VMRl9UX1BIRFJdCT0gRWxmVzIoQml0cywgY3Z0X1BoZHIpLAkJCSAgICAgIFwKKwlbRUxGX1RfUkVMQV0JPSBFbGZXMihCaXRzLCBjdnRfUmVsYSksCQkJICAgICAgXAorCVtFTEZfVF9SRUxdCT0gRWxmVzIoQml0cywgY3Z0X1JlbCksCQkJCSAgICAgIFwKKwlbRUxGX1RfU0hEUl0JPSBFbGZXMihCaXRzLCBjdnRfU2hkciksCQkJICAgICAgXAorCVtFTEZfVF9TV09SRF0JPSBFbGZXMihCaXRzLCBjdnRfU3dvcmQpLAkJCSAgICAgIFwKKwlbRUxGX1RfU1lNXQk9IEVsZlcyKEJpdHMsIGN2dF9TeW0pLAkJCQkgICAgICBcCisJW0VMRl9UX1dPUkRdCT0gRWxmVzIoQml0cywgY3Z0X1dvcmQpLAkJCSAgICAgIFwKKwlbRUxGX1RfWFdPUkRdCT0gRWxmVzIoQml0cywgY3Z0X1h3b3JkKSwJCQkgICAgICBcCisJW0VMRl9UX1NYV09SRF0JPSBFbGZXMihCaXRzLCBjdnRfU3h3b3JkKSwJCQkgICAgICBcCisJW0VMRl9UX1ZERUZdCT0gZWxmX2N2dF9WZXJkZWYsCQkJCSAgICAgIFwKKwlbRUxGX1RfVkRBVVhdCT0gZWxmX2N2dF9WZXJkZWYsCQkJCSAgICAgIFwKKwlbRUxGX1RfVk5FRURdCT0gZWxmX2N2dF9WZXJuZWVkLAkJCQkgICAgICBcCisJW0VMRl9UX1ZOQVVYXQk9IGVsZl9jdnRfVmVybmVlZCwJCQkJICAgICAgXAorCVtFTEZfVF9OSERSXQk9IEVsZlcyKEJpdHMsIGN2dF9OaGRyKSwJCQkgICAgICBcCisJW0VMRl9UX1NZTUlORk9dID0gRWxmVzIoQml0cywgY3Z0X1N5bWluZm8pLAkJCSAgICAgIFwKKwlbRUxGX1RfTU9WRV0JPSBFbGZXMihCaXRzLCBjdnRfTW92ZSksCQkJICAgICAgXAorCVtFTEZfVF9MSUJdCT0gRWxmVzIoQml0cywgY3Z0X0xpYikKKyAgICAgICAgZGVmaW5lX3hmY3RzICgzMikKKyAgICAgIH0sCisgICAgICBbRUxGQ0xBU1M2NCAtIDFdID0geworCWRlZmluZV94ZmN0cyAoNjQpCisgICAgICB9CisgICAgfQorICB9Cit9OworLyogRm9yIG5vdyB3ZSBvbmx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgbWVtb3J5IHJlcHJlc2VudGF0aW9uIGlzIHRoZQorICAgc2FtZSBhcyB0aGUgZmlsZSByZXByZXNlbnRhdGlvbi4gIFNob3VsZCB0aGlzIGNoYW5nZSB3ZSBoYXZlIHRvIGRlZmluZQorICAgc2VwYXJhdGUgZnVuY3Rpb25zLiAgRm9yIG5vdyByZXVzZSB0aGVtLiAgKi8KK3N0cm9uZ19hbGlhcyAoX19lbGZfeGZjdHN0b20sIF9fZWxmX3hmY3RzdG9mKQpkaWZmIC0tZ2l0IGEvbGliZWxmL2dlbGZfeGxhdGUuaCBiL2xpYmVsZi9nZWxmX3hsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlOTFjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9nZWxmX3hsYXRlLmgKQEAgLTAsMCArMSw0MyBAQAorLyogSGVscGVyIGZpbGUgZm9yIHR5cGUgY29udmVyc2lvbiBmdW5jdGlvbiBnZW5lcmF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBTaW1wbGUgdHlwZXMuICAqLworRlVOREFNRU5UQUwgKEFERFIsIEFkZHIsIExJQkVMRkJJVFMpOworRlVOREFNRU5UQUwgKE9GRiwgT2ZmLCBMSUJFTEZCSVRTKTsKK0ZVTkRBTUVOVEFMIChIQUxGLCBIYWxmLCBMSUJFTEZCSVRTKTsKK0ZVTkRBTUVOVEFMIChXT1JELCBXb3JkLCBMSUJFTEZCSVRTKTsKK0ZVTkRBTUVOVEFMIChTV09SRCwgU3dvcmQsIExJQkVMRkJJVFMpOworRlVOREFNRU5UQUwgKFhXT1JELCBYd29yZCwgTElCRUxGQklUUyk7CitGVU5EQU1FTlRBTCAoU1hXT1JELCBTeHdvcmQsIExJQkVMRkJJVFMpOworCisvKiBUaGUgc3RydWN0dXJlZCB0eXBlcy4gICovCitUWVBFIChFaGRyLCBMSUJFTEZCSVRTKQorVFlQRSAoUGhkciwgTElCRUxGQklUUykKK1RZUEUgKFNoZHIsIExJQkVMRkJJVFMpCitUWVBFIChTeW0sIExJQkVMRkJJVFMpCitUWVBFIChSZWwsIExJQkVMRkJJVFMpCitUWVBFIChSZWxhLCBMSUJFTEZCSVRTKQorVFlQRSAoTm90ZSwgTElCRUxGQklUUykKK1RZUEUgKER5biwgTElCRUxGQklUUykKK1RZUEUgKFN5bWluZm8sIExJQkVMRkJJVFMpCitUWVBFIChNb3ZlLCBMSUJFTEZCSVRTKQorVFlQRSAoTGliLCBMSUJFTEZCSVRTKQorCisKKy8qIFByZXBhcmUgZm9yIHRoZSBuZXh0IHJvdW5kLiAgKi8KKyN1bmRlZiBMSUJFTEZCSVRTCmRpZmYgLS1naXQgYS9saWJlbGYvZ2VsZl94bGF0ZXRvZi5jIGIvbGliZWxmL2dlbGZfeGxhdGV0b2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2NmYWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2dlbGZfeGxhdGV0b2YuYwpAQCAtMCwwICsxLDQxIEBACisvKiBDb252ZXJ0IGZyb20gbWVtb3J5IHRvIGZpbGUgcmVwcmVzZW50YXRpb24uICBHZW5lcmljIEVMRiB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK0VsZl9EYXRhICoKK2dlbGZfeGxhdGV0b2YgKGVsZiwgZGVzdCwgc3JjLCBlbmNvZGUpCisgICAgIEVsZiAqZWxmOworICAgICBFbGZfRGF0YSAqZGVzdDsKKyAgICAgY29uc3QgRWxmX0RhdGEgKiBzcmM7CisgICAgIHVuc2lnbmVkIGludCBlbmNvZGU7Cit7CisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgorCSAgPyBJTlRVU0UoZWxmMzJfeGxhdGV0b2YpIChkZXN0LCBzcmMsIGVuY29kZSkKKwkgIDogSU5UVVNFKGVsZjY0X3hsYXRldG9mKSAoZGVzdCwgc3JjLCBlbmNvZGUpKTsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9nZWxmX3hsYXRldG9tLmMgYi9saWJlbGYvZ2VsZl94bGF0ZXRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTVlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvZ2VsZl94bGF0ZXRvbS5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIENvbnZlcnQgZnJvbSBmaWxlIHRvIG1lbW9yeSByZXByZXNlbnRhdGlvbi4gIEdlbmVyaWMgRUxGIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJlbGZQLmgiCisKKworRWxmX0RhdGEgKgorZ2VsZl94bGF0ZXRvbSAoZWxmLCBkZXN0LCBzcmMsIGVuY29kZSkKKyAgICAgRWxmICplbGY7CisgICAgIEVsZl9EYXRhICpkZXN0OworICAgICBjb25zdCBFbGZfRGF0YSAqIHNyYzsKKyAgICAgdW5zaWduZWQgaW50IGVuY29kZTsKK3sKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCisJICA/IElOVFVTRShlbGYzMl94bGF0ZXRvbSkgKGRlc3QsIHNyYywgZW5jb2RlKQorCSAgOiBJTlRVU0UoZWxmNjRfeGxhdGV0b20pIChkZXN0LCBzcmMsIGVuY29kZSkpOworfQpkaWZmIC0tZ2l0IGEvbGliZWxmL2xpYmVsZi5oIGIvbGliZWxmL2xpYmVsZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViM2RjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvbGliZWxmLmgKQEAgLTAsMCArMSwzNDMgQEAKKy8qIEludGVyZmFjZSBmb3IgbGliZWxmLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDA0IFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0xJQkVMRl9ICisjZGVmaW5lIF9MSUJFTEZfSCAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogR2V0IHRoZSBFTEYgdHlwZXMuICAqLworI2luY2x1ZGUgPGVsZi5oPgorCisKKy8qIEtub3duIHRyYW5zbGF0aW9uIHR5cGVzLiAgKi8KK3R5cGVkZWYgZW51bQoreworICBFTEZfVF9CWVRFLCAgICAgICAgICAgICAgICAgICAvKiB1bnNpZ25lZCBjaGFyICovCisgIEVMRl9UX0FERFIsICAgICAgICAgICAgICAgICAgIC8qIEVsZjMyX0FkZHIsIEVsZjY0X0FkZHIsIC4uLiAqLworICBFTEZfVF9EWU4sICAgICAgICAgICAgICAgICAgICAvKiBEeW5hbWljIHNlY3Rpb24gcmVjb3JkLiAgKi8KKyAgRUxGX1RfRUhEUiwgICAgICAgICAgICAgICAgICAgLyogRUxGIGhlYWRlci4gICovCisgIEVMRl9UX0hBTEYsICAgICAgICAgICAgICAgICAgIC8qIEVsZjMyX0hhbGYsIEVsZjY0X0hhbGYsIC4uLiAqLworICBFTEZfVF9PRkYsICAgICAgICAgICAgICAgICAgICAvKiBFbGYzMl9PZmYsIEVsZjY0X09mZiwgLi4uICovCisgIEVMRl9UX1BIRFIsICAgICAgICAgICAgICAgICAgIC8qIFByb2dyYW0gaGVhZGVyLiAgKi8KKyAgRUxGX1RfUkVMQSwgICAgICAgICAgICAgICAgICAgLyogUmVsb2NhdGlvbiBlbnRyeSB3aXRoIGFkZGVuZC4gICovCisgIEVMRl9UX1JFTCwgICAgICAgICAgICAgICAgICAgIC8qIFJlbG9jYXRpb24gZW50cnkuICAqLworICBFTEZfVF9TSERSLCAgICAgICAgICAgICAgICAgICAvKiBTZWN0aW9uIGhlYWRlci4gICovCisgIEVMRl9UX1NXT1JELCAgICAgICAgICAgICAgICAgIC8qIEVsZjMyX1N3b3JkLCBFbGY2NF9Td29yZCwgLi4uICovCisgIEVMRl9UX1NZTSwgICAgICAgICAgICAgICAgICAgIC8qIFN5bWJvbCByZWNvcmQuICAqLworICBFTEZfVF9XT1JELCAgICAgICAgICAgICAgICAgICAvKiBFbGYzMl9Xb3JkLCBFbGY2NF9Xb3JkLCAuLi4gKi8KKyAgRUxGX1RfWFdPUkQsICAgICAgICAgICAgICAgICAgLyogRWxmMzJfWHdvcmQsIEVsZjY0X1h3b3JkLCAuLi4gKi8KKyAgRUxGX1RfU1hXT1JELCAgICAgICAgICAgICAgICAgLyogRWxmMzJfU3h3b3JkLCBFbGY2NF9TeHdvcmQsIC4uLiAqLworICBFTEZfVF9WREVGLCAgICAgICAgICAgICAgICAgICAvKiBFbGYzMl9WZXJkZWYsIEVsZjY0X1ZlcmRlZiwgLi4uICovCisgIEVMRl9UX1ZEQVVYLCAgICAgICAgICAgICAgICAgIC8qIEVsZjMyX1ZlcmRhdXgsIEVsZjY0X1ZlcmRhdXgsIC4uLiAqLworICBFTEZfVF9WTkVFRCwgICAgICAgICAgICAgICAgICAvKiBFbGYzMl9WZXJuZWVkLCBFbGY2NF9WZXJuZWVkLCAuLi4gKi8KKyAgRUxGX1RfVk5BVVgsICAgICAgICAgICAgICAgICAgLyogRWxmMzJfVmVybmF1eCwgRWxmNjRfVmVybmF1eCwgLi4uICovCisgIEVMRl9UX05IRFIsICAgICAgICAgICAgICAgICAgIC8qIEVsZjMyX05oZHIsIEVsZjY0X05oZHIsIC4uLiAqLworICBFTEZfVF9TWU1JTkZPLAkJLyogRWxmMzJfU3ltaW5mbywgRWxmNjRfU3ltaW5mbywgLi4uICovCisgIEVMRl9UX01PVkUsCQkJLyogRWxmMzJfTW92ZSwgRWxmNjRfTW92ZSwgLi4uICovCisgIEVMRl9UX0xJQiwJCQkvKiBFbGYzMl9MaWIsIEVsZjY0X0xpYiwgLi4uICovCisgIC8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisgIEVMRl9UX05VTQorfSBFbGZfVHlwZTsKKworLyogRGVzY3JpcHRvciBmb3IgZGF0YSB0byBiZSBjb252ZXJ0ZWQgdG8gb3IgZnJvbSBtZW1vcnkgZm9ybWF0LiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHZvaWQgKmRfYnVmOwkJCS8qIFBvaW50ZXIgdG8gdGhlIGFjdHVhbCBkYXRhLiAgKi8KKyAgRWxmX1R5cGUgZF90eXBlOwkJLyogVHlwZSBvZiB0aGlzIHBpZWNlIG9mIGRhdGEuICAqLworICB1bnNpZ25lZCBpbnQgZF92ZXJzaW9uOwkvKiBFTEYgdmVyc2lvbi4gICovCisgIHNpemVfdCBkX3NpemU7CQkvKiBTaXplIGluIGJ5dGVzLiAgKi8KKyAgb2ZmX3QgZF9vZmY7CQkJLyogT2Zmc2V0IGludG8gc2VjdGlvbi4gICovCisgIHNpemVfdCBkX2FsaWduOwkJLyogQWxpZ25tZW50IGluIHNlY3Rpb24uICAqLworfSBFbGZfRGF0YTsKKworCisvKiBDb21tYW5kcyBmb3IgYC4uLicuICAqLwordHlwZWRlZiBlbnVtCit7CisgIEVMRl9DX05VTEwsCQkJLyogTm90aGluZywgdGVybWluYXRlLCBvciBjb21wdXRlIG9ubHkuICAqLworICBFTEZfQ19SRUFELAkJCS8qIFJlYWQgLi4gKi8KKyAgRUxGX0NfUkRXUiwJCQkvKiBSZWFkIGFuZCB3cml0ZSAuLiAqLworICBFTEZfQ19XUklURSwJCQkvKiBXcml0ZSAuLiAqLworICBFTEZfQ19DTFIsCQkJLyogQ2xlYXIgZmxhZy4gICovCisgIEVMRl9DX1NFVCwJCQkvKiBTZXQgZmxhZy4gICovCisgIEVMRl9DX0ZERE9ORSwJCQkvKiBTaWduYWwgdGhhdCBmaWxlIGRlc2NyaXB0b3Igd2lsbCBub3QgYmUKKwkJCQkgICB1c2VkIGFueW1vcmUuICAqLworICBFTEZfQ19GRFJFQUQsCQkJLyogUmVhZCByZXN0IG9mIGRhdGEgc28gdGhhdCBmaWxlIGRlc2NyaXB0b3IKKwkJCQkgICBpcyBub3QgdXNlZCBhbnltb3JlLiAgKi8KKyAgLyogVGhlIGZvbGxvd2luZyBhcmUgZXh0ZW5zaW9ucy4gICovCisgIEVMRl9DX1JFQURfTU1BUCwJCS8qIFJlYWQsIGJ1dCBtbWFwIHRoZSBmaWxlIGlmIHBvc3NpYmxlLiAgKi8KKyAgRUxGX0NfUkRXUl9NTUFQLAkJLyogUmVhZCBhbmQgd3JpdGUsIHdpdGggbW1hcC4gICovCisgIEVMRl9DX1dSSVRFX01NQVAsCQkvKiBXcml0ZSwgd2l0aCBtbWFwLiAgKi8KKyAgRUxGX0NfUkVBRF9NTUFQX1BSSVZBVEUsCS8qIFJlYWQsIGJ1dCBtZW1vcnkgaXMgd3JpdGFibGUsIHJlc3VsdHMgYXJlCisJCQkJICAgbm90IHdyaXR0ZW4gdG8gdGhlIGZpbGUuICAqLworICBFTEZfQ19FTVBUWSwJCQkvKiBDb3B5IGJhc2ljIGZpbGUgZGF0YSBidXQgbm90IHRoZSBjb250ZW50LiAqLworICAvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworICBFTEZfQ19OVU0KK30gRWxmX0NtZDsKKworCisvKiBGbGFncyBmb3IgdGhlIEVMRiBzdHJ1Y3R1cmVzLiAgKi8KK2VudW0KK3sKKyAgRUxGX0ZfRElSVFkgPSAweDEsCisjZGVmaW5lIEVMRl9GX0RJUlRZCQlFTEZfRl9ESVJUWQorICBFTEZfRl9MQVlPVVQgPSAweDQsCisjZGVmaW5lIEVMRl9GX0xBWU9VVAkJRUxGX0ZfTEFZT1VUCisgIEVMRl9GX1BFUk1JU1NJVkUgPSAweDgKKyNkZWZpbmUgRUxGX0ZfUEVSTUlTU0lWRQlFTEZfRl9QRVJNSVNTSVZFCit9OworCisKKy8qIElkZW50aWZpY2F0aW9uIHZhbHVlcyBmb3IgcmVjb2duaXplZCBvYmplY3QgZmlsZXMuICAqLwordHlwZWRlZiBlbnVtCit7CisgIEVMRl9LX05PTkUsCQkJLyogVW5rbm93bi4gICovCisgIEVMRl9LX0FSLAkJCS8qIEFyY2hpdmUuICAqLworICBFTEZfS19DT0ZGLAkJCS8qIFN0dXBpZCBvbGQgQ09GRi4gICovCisgIEVMRl9LX0VMRiwJCQkvKiBFTEYgZmlsZS4gICovCisgIC8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisgIEVMRl9LX05VTQorfSBFbGZfS2luZDsKKworCisvKiBBcmNoaXZlIG1lbWJlciBoZWFkZXIuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqYXJfbmFtZTsJCS8qIE5hbWUgb2YgYXJjaGl2ZSBtZW1iZXIuICAqLworICB0aW1lX3QgYXJfZGF0ZTsJCS8qIEZpbGUgZGF0ZS4gICovCisgIHVpZF90IGFyX3VpZDsJCQkvKiBVc2VyIElELiAgKi8KKyAgZ2lkX3QgYXJfZ2lkOwkJCS8qIEdyb3VwIElELiAgKi8KKyAgbW9kZV90IGFyX21vZGU7CQkvKiBGaWxlIG1vZGUuICAqLworICBvZmZfdCBhcl9zaXplOwkJLyogRmlsZSBzaXplLiAgKi8KKyAgY2hhciAqYXJfcmF3bmFtZTsJCS8qIE9yaWdpbmFsIG5hbWUgb2YgYXJjaGl2ZSBtZW1iZXIuICAqLworfSBFbGZfQXJoZHI7CisKKworLyogQXJjaGl2ZSBzeW1ib2wgdGFibGUgZW50cnkuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqYXNfbmFtZTsJCS8qIFN5bWJvbCBuYW1lLiAgKi8KKyAgc2l6ZV90IGFzX29mZjsJCS8qIE9mZnNldCBmb3IgdGhpcyBmaWxlIGluIHRoZSBhcmNoaXZlLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgYXNfaGFzaDsJLyogSGFzaCB2YWx1ZSBvZiB0aGUgbmFtZS4gICovCit9IEVsZl9BcnN5bTsKKworCisvKiBEZXNjcmlwdG9yIGZvciB0aGUgRUxGIGZpbGUuICAqLwordHlwZWRlZiBzdHJ1Y3QgRWxmIEVsZjsKKworLyogRGVzY3JpcHRvciBmb3IgRUxGIGZpbGUgc2VjdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdCBFbGZfU2NuIEVsZl9TY247CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBSZXR1cm4gZGVzY3JpcHRvciBmb3IgRUxGIGZpbGUgdG8gd29yayBhY2NvcmRpbmcgdG8gQ01ELiAgKi8KK2V4dGVybiBFbGYgKmVsZl9iZWdpbiAoaW50IF9fZmlsZGVzLCBFbGZfQ21kIF9fY21kLCBFbGYgKl9fcmVmKTsKKworLyogQ3JlYXRlIGEgY2xvbmUgb2YgYW4gZXhpc3RpbmcgRUxGIGRlc2NyaXB0b3IuICAqLworICBleHRlcm4gRWxmICplbGZfY2xvbmUgKEVsZiAqX19lbGYsIEVsZl9DbWQgX19jbWQpOworCisvKiBDcmVhdGUgZGVzY3JpcHRvciBmb3IgbWVtb3J5IHJlZ2lvbi4gICovCitleHRlcm4gRWxmICplbGZfbWVtb3J5IChjaGFyICpfX2ltYWdlLCBzaXplX3QgX19zaXplKTsKKworLyogQWR2YW5jZSBhcmNoaXZlIGRlc2NyaXB0b3IgdG8gbmV4dCBlbGVtZW50LiAgKi8KK2V4dGVybiBFbGZfQ21kIGVsZl9uZXh0IChFbGYgKl9fZWxmKTsKKworLyogRnJlZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBFTEYuICAqLworZXh0ZXJuIGludCBlbGZfZW5kIChFbGYgKl9fZWxmKTsKKworLyogVXBkYXRlIEVMRiBkZXNjcmlwdG9yIGFuZCB3cml0ZSBmaWxlIHRvIGRpc2suICAqLworZXh0ZXJuIG9mZl90IGVsZl91cGRhdGUgKEVsZiAqX19lbGYsIEVsZl9DbWQgX19jbWQpOworCisvKiBEZXRlcm1pbmUgd2hhdCBraW5kIG9mIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIEVMRi4gICovCitleHRlcm4gRWxmX0tpbmQgZWxmX2tpbmQgKEVsZiAqX19lbGYpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisvKiBHZXQgdGhlIGJhc2Ugb2Zmc2V0IGZvciBhbiBvYmplY3QgZmlsZS4gICovCitleHRlcm4gb2ZmX3QgZWxmX2dldGJhc2UgKEVsZiAqX19lbGYpOworCisKKy8qIFJldHJpZXZlIGZpbGUgaWRlbnRpZmljYXRpb24gZGF0YS4gICovCitleHRlcm4gY2hhciAqZWxmX2dldGlkZW50IChFbGYgKl9fZWxmLCBzaXplX3QgKl9fcHRyKTsKKworLyogUmV0cmlldmUgY2xhc3MtZGVwZW5kZW50IG9iamVjdCBmaWxlIGhlYWRlci4gICovCitleHRlcm4gRWxmMzJfRWhkciAqZWxmMzJfZ2V0ZWhkciAoRWxmICpfX2VsZik7CisvKiBTaW1pbGFyIGJ1dCB0aGlzIHRpbWUgdGhlIGJpbmFyeSBjYWxscyBpcyBFTEZDTEFTUzY0LiAgKi8KK2V4dGVybiBFbGY2NF9FaGRyICplbGY2NF9nZXRlaGRyIChFbGYgKl9fZWxmKTsKKworLyogQ3JlYXRlIEVMRiBoZWFkZXIgaWYgbm9uZSBleGlzdHMuICAqLworZXh0ZXJuIEVsZjMyX0VoZHIgKmVsZjMyX25ld2VoZHIgKEVsZiAqX19lbGYpOworLyogU2ltaWxhciBidXQgdGhpcyB0aW1lIHRoZSBiaW5hcnkgY2FsbHMgaXMgRUxGQ0xBU1M2NC4gICovCitleHRlcm4gRWxmNjRfRWhkciAqZWxmNjRfbmV3ZWhkciAoRWxmICpfX2VsZik7CisKKy8qIFJldHJpZXZlIGNsYXNzLWRlcGVuZGVudCBwcm9ncmFtIGhlYWRlciB0YWJsZS4gICovCitleHRlcm4gRWxmMzJfUGhkciAqZWxmMzJfZ2V0cGhkciAoRWxmICpfX2VsZik7CisvKiBTaW1pbGFyIGJ1dCB0aGlzIHRpbWUgdGhlIGJpbmFyeSBjYWxscyBpcyBFTEZDTEFTUzY0LiAgKi8KK2V4dGVybiBFbGY2NF9QaGRyICplbGY2NF9nZXRwaGRyIChFbGYgKl9fZWxmKTsKKworLyogQ3JlYXRlIEVMRiBwcm9ncmFtIGhlYWRlci4gICovCitleHRlcm4gRWxmMzJfUGhkciAqZWxmMzJfbmV3cGhkciAoRWxmICpfX2VsZiwgc2l6ZV90IF9fY250KTsKKy8qIFNpbWlsYXIgYnV0IHRoaXMgdGltZSB0aGUgYmluYXJ5IGNhbGxzIGlzIEVMRkNMQVNTNjQuICAqLworZXh0ZXJuIEVsZjY0X1BoZHIgKmVsZjY0X25ld3BoZHIgKEVsZiAqX19lbGYsIHNpemVfdCBfX2NudCk7CisKKworLyogR2V0IHNlY3Rpb24gYXQgSU5ERVguICAqLworZXh0ZXJuIEVsZl9TY24gKmVsZl9nZXRzY24gKEVsZiAqX19lbGYsIHNpemVfdCBfX2luZGV4KTsKKworLyogR2V0IGluZGV4IG9mIHNlY3Rpb24uICAqLworZXh0ZXJuIHNpemVfdCBlbGZfbmR4c2NuIChFbGZfU2NuICpfX3Njbik7CisKKy8qIEdldCBzZWN0aW9uIHdpdGggbmV4dCBzZWN0aW9uIGluZGV4LiAgKi8KK2V4dGVybiBFbGZfU2NuICplbGZfbmV4dHNjbiAoRWxmICpfX2VsZiwgRWxmX1NjbiAqX19zY24pOworCisvKiBDcmVhdGUgYSBuZXcgc2VjdGlvbiBhbmQgYXBwZW5kIGl0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KK2V4dGVybiBFbGZfU2NuICplbGZfbmV3c2NuIChFbGYgKl9fZWxmKTsKKworLyogR2V0IHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgaW4gdGhlIEVMRiBmaWxlLiAgSWYgdGhlIGZpbGUgdXNlcyBtb3JlCisgICBzZWN0aW9ucyB0aGFuIGNhbiBiZSByZXByZXNlbnRlZCBpbiB0aGUgZV9zaG51bSBmaWVsZCBvZiB0aGUgRUxGCisgICBoZWFkZXIgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHNoX3NpemUgZmllbGQgaW4gdGhlIHplcm90aCBzZWN0aW9uCisgICBoZWFkZXIgaXMgdXNlZC4gICovCitleHRlcm4gaW50IGVsZl9nZXRzaG51bSAoRWxmICpfX2VsZiwgc2l6ZV90ICpfX2RzdCk7CisKKworLyogR2V0IHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW4gdGhlIEVMRgorICAgZmlsZS4gIElmIHRoZSBpbmRleCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIGVfc2hudW0gZmllbGQgb2YKKyAgIHRoZSBFTEYgaGVhZGVyIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzaF9saW5rIGZpZWxkIGluIHRoZSB6ZXJvdGgKKyAgIHNlY3Rpb24gaGVhZGVyIGlzIHVzZWQuICAqLworZXh0ZXJuIGludCBlbGZfZ2V0c2hzdHJuZHggKEVsZiAqX19lbGYsIHNpemVfdCAqX19kc3QpOworCisKKy8qIFJldHJpZXZlIHNlY3Rpb24gaGVhZGVyIG9mIEVMRkNMQVNTMzIgYmluYXJ5LiAgKi8KK2V4dGVybiBFbGYzMl9TaGRyICplbGYzMl9nZXRzaGRyIChFbGZfU2NuICpfX3Njbik7CisvKiBTaW1pbGFyIGZvciBFTEZDTEFTUzY0LiAgKi8KK2V4dGVybiBFbGY2NF9TaGRyICplbGY2NF9nZXRzaGRyIChFbGZfU2NuICpfX3Njbik7CisKKworLyogU2V0IG9yIGNsZWFyIGZsYWdzIGZvciBFTEYgZmlsZS4gICovCitleHRlcm4gdW5zaWduZWQgaW50IGVsZl9mbGFnZWxmIChFbGYgKl9fZWxmLCBFbGZfQ21kIF9fY21kLAorCQkJCSB1bnNpZ25lZCBpbnQgX19mbGFncyk7CisvKiBTaW1pbGFybHkgZm9yIHRoZSBFTEYgaGVhZGVyLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgZWxmX2ZsYWdlaGRyIChFbGYgKl9fZWxmLCBFbGZfQ21kIF9fY21kLAorCQkJCSAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworLyogU2ltaWxhcmx5IGZvciB0aGUgRUxGIHByb2dyYW0gaGVhZGVyLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgZWxmX2ZsYWdwaGRyIChFbGYgKl9fZWxmLCBFbGZfQ21kIF9fY21kLAorCQkJCSAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworLyogU2ltaWxhcmx5IGZvciB0aGUgZ2l2ZW4gRUxGIHNlY3Rpb24uICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBlbGZfZmxhZ3NjbiAoRWxmX1NjbiAqX19zY24sIEVsZl9DbWQgX19jbWQsCisJCQkJIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKy8qIFNpbWlsYXJseSBmb3IgdGhlIGdpdmVuIEVMRiBkYXRhLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgZWxmX2ZsYWdkYXRhIChFbGZfRGF0YSAqX19kYXRhLCBFbGZfQ21kIF9fY21kLAorCQkJCSAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworLyogU2ltaWxhcmx5IGZvciB0aGUgZ2l2ZW4gRUxGIHNlY3Rpb24gaGVhZGVyLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgZWxmX2ZsYWdzaGRyIChFbGZfU2NuICpfX3NjbiwgRWxmX0NtZCBfX2NtZCwKKwkJCQkgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKworCisvKiBHZXQgZGF0YSBmcm9tIHNlY3Rpb24gd2hpbGUgdHJhbnNsYXRpbmcgZnJvbSBmaWxlIHJlcHJlc2VudGF0aW9uCisgICB0byBtZW1vcnkgcmVwcmVzZW50YXRpb24uICAqLworZXh0ZXJuIEVsZl9EYXRhICplbGZfZ2V0ZGF0YSAoRWxmX1NjbiAqX19zY24sIEVsZl9EYXRhICpfX2RhdGEpOworCisvKiBHZXQgdW5pbnRlcnByZXRlZCBzZWN0aW9uIGNvbnRlbnQuICAqLworZXh0ZXJuIEVsZl9EYXRhICplbGZfcmF3ZGF0YSAoRWxmX1NjbiAqX19zY24sIEVsZl9EYXRhICpfX2RhdGEpOworCisvKiBDcmVhdGUgbmV3IGRhdGEgZGVzY3JpcHRvciBmb3Igc2VjdGlvbiBTQ04uICAqLworZXh0ZXJuIEVsZl9EYXRhICplbGZfbmV3ZGF0YSAoRWxmX1NjbiAqX19zY24pOworCisKKy8qIFJldHVybiBwb2ludGVyIHRvIHN0cmluZyBhdCBPRkZTRVQgaW4gc2VjdGlvbiBJTkRFWC4gICovCitleHRlcm4gY2hhciAqZWxmX3N0cnB0ciAoRWxmICpfX2VsZiwgc2l6ZV90IF9faW5kZXgsIHNpemVfdCBfX29mZnNldCk7CisKKworLyogUmV0dXJuIGhlYWRlciBvZiBhcmNoaXZlLiAgKi8KK2V4dGVybiBFbGZfQXJoZHIgKmVsZl9nZXRhcmhkciAoRWxmICpfX2VsZik7CisKKy8qIFNlbGVjdCBhcmNoaXZlIGVsZW1lbnQgYXQgT0ZGU0VULiAgKi8KK2V4dGVybiBzaXplX3QgZWxmX3JhbmQgKEVsZiAqX19lbGYsIHNpemVfdCBfX29mZnNldCk7CisKKy8qIEdldCBzeW1ib2wgdGFibGUgb2YgYXJjaGhpdmUuICAqLworZXh0ZXJuIEVsZl9BcnN5bSAqZWxmX2dldGFyc3ltIChFbGYgKl9fZWxmLCBzaXplX3QgKl9fcHRyKTsKKworCisvKiBDb250cm9sIEVMRiBkZXNjcmlwdG9yLiAgKi8KK2V4dGVybiBpbnQgZWxmX2NudGwgKEVsZiAqX19lbGYsIEVsZl9DbWQgX19jbWQpOworCisvKiBSZXRyaWV2ZSB1bmludGVycHJldGVkIGZpbGUgY29udGVudHMuICAqLworZXh0ZXJuIGNoYXIgKmVsZl9yYXdmaWxlIChFbGYgKl9fZWxmLCBzaXplX3QgKl9fcHRyKTsKKworCisvKiBSZXR1cm4gc2l6ZSBvZiBhcnJheSBvZiBDT1VOVCBlbGVtZW50cyBvZiB0aGUgdHlwZSBkZW5vdGVkIGJ5IFRZUEUKKyAgIGluIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbi4gIFRoZSBiaW5hcnkgY2xhc3MgaXMgdGFrZW4gZnJvbSBFTEYuCisgICBUaGUgcmVzdWx0IGlzIGJhc2VkIG9uIHZlcnNpb24gVkVSU0lPTiBvZiB0aGUgRUxGIHN0YW5kYXJkLiAgKi8KK2V4dGVybiBzaXplX3QgZWxmMzJfZnNpemUgKEVsZl9UeXBlIF9fdHlwZSwgc2l6ZV90IF9fY291bnQsCisJCQkgICB1bnNpZ25lZCBpbnQgX192ZXJzaW9uKQorICAgICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKy8qIFNpbWlsYXIgYnV0IHRoaXMgdGltZSB0aGUgYmluYXJ5IGNhbGxzIGlzIEVMRkNMQVNTNjQuICAqLworZXh0ZXJuIHNpemVfdCBlbGY2NF9mc2l6ZSAoRWxmX1R5cGUgX190eXBlLCBzaXplX3QgX19jb3VudCwKKwkJCSAgIHVuc2lnbmVkIGludCBfX3ZlcnNpb24pCisgICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisKKy8qIENvbnZlcnQgZGF0YSBzdHJ1Y3R1cmUgZnJvbSB0aGUgcmVwcmVzZW50YXRpb24gaW4gdGhlIGZpbGUgcmVwcmVzZW50ZWQKKyAgIGJ5IEVMRiB0byB0aGVpciBtZW1vcnkgcmVwcmVzZW50YXRpb24uICAqLworZXh0ZXJuIEVsZl9EYXRhICplbGYzMl94bGF0ZXRvbSAoRWxmX0RhdGEgKl9fZGVzdCwgY29uc3QgRWxmX0RhdGEgKl9fc3JjLAorCQkJCSB1bnNpZ25lZCBpbnQgX19lbmNvZGUpOworLyogU2FtZSBmb3IgNjQgYml0IGNsYXNzLiAgKi8KK2V4dGVybiBFbGZfRGF0YSAqZWxmNjRfeGxhdGV0b20gKEVsZl9EYXRhICpfX2Rlc3QsIGNvbnN0IEVsZl9EYXRhICpfX3NyYywKKwkJCQkgdW5zaWduZWQgaW50IF9fZW5jb2RlKTsKKworLyogQ29udmVydCBkYXRhIHN0cnVjdHVyZSBmcm9tIHRvIHRoZSByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkKKyAgIHJlcHJlc2VudGVkIGJ5IEVMRiBmaWxlIHJlcHJlc2VudGF0aW9uLiAgKi8KK2V4dGVybiBFbGZfRGF0YSAqZWxmMzJfeGxhdGV0b2YgKEVsZl9EYXRhICpfX2Rlc3QsIGNvbnN0IEVsZl9EYXRhICpfX3NyYywKKwkJCQkgdW5zaWduZWQgaW50IF9fZW5jb2RlKTsKKy8qIFNhbWUgZm9yIDY0IGJpdCBjbGFzcy4gICovCitleHRlcm4gRWxmX0RhdGEgKmVsZjY0X3hsYXRldG9mIChFbGZfRGF0YSAqX19kZXN0LCBjb25zdCBFbGZfRGF0YSAqX19zcmMsCisJCQkJIHVuc2lnbmVkIGludCBfX2VuY29kZSk7CisKKworLyogUmV0dXJuIGVycm9yIGNvZGUgb2YgbGFzdCBmYWlsaW5nIGZ1bmN0aW9uIGNhbGwuICBUaGlzIHZhbHVlIGlzIGtlcHQKKyAgIHNlcGFyYXRlbHkgZm9yIGVhY2ggdGhyZWFkLiAgKi8KK2V4dGVybiBpbnQgZWxmX2Vycm5vICh2b2lkKTsKKworLyogUmV0dXJuIGVycm9yIHN0cmluZyBmb3IgRVJST1IuICBJZiBFUlJPUiBpcyB6ZXJvLCByZXR1cm4gZXJyb3Igc3RyaW5nCisgICBmb3IgbW9zdCByZWNlbnQgZXJyb3Igb3IgTlVMTCBpcyBub25lIG9jY3VycmVkLiAgSWYgRVJST1IgaXMgLTEgdGhlCisgICBiZWhhdmlvdXIgaXMgc2ltaWxhciB0byB0aGUgbGFzdCBjYXNlIGV4Y2VwdCB0aGF0IG5vdCBOVUxMIGJ1dCBhIGxlZ2FsCisgICBzdHJpbmcgaXMgcmV0dXJuZWQuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmVsZl9lcnJtc2cgKGludCBfX2Vycm9yKTsKKworCisvKiBDb29yZGluYXRlIEVMRiBsaWJyYXJ5IGFuZCBhcHBsaWNhdGlvbiB2ZXJzaW9ucy4gICovCitleHRlcm4gdW5zaWduZWQgaW50IGVsZl92ZXJzaW9uICh1bnNpZ25lZCBpbnQgX192ZXJzaW9uKTsKKworLyogU2V0IGZpbGwgYnl0ZXMgdXNlZCB0byBmaWxsIGhvbGVzIGluIGRhdGEgc3RydWN0dXJlcy4gICovCitleHRlcm4gdm9pZCBlbGZfZmlsbCAoaW50IF9fZmlsbCk7CisKKy8qIENvbXB1dGUgaGFzaCB2YWx1ZS4gICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgZWxmX2hhc2ggKGNvbnN0IGNoYXIgKl9fc3RyaW5nKQorICAgICAgIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisKKy8qIENvbXB1dGUgc2ltcGxlIGNoZWNrc3VtIGZyb20gcGVybWFuZW50IHBhcnRzIG9mIHRoZSBFTEYgZmlsZS4gICovCitleHRlcm4gbG9uZyBpbnQgZWxmMzJfY2hlY2tzdW0gKEVsZiAqX19lbGYpOworLyogU2ltaWxhciBidXQgdGhpcyB0aW1lIHRoZSBiaW5hcnkgY2FsbHMgaXMgRUxGQ0xBU1M2NC4gICovCitleHRlcm4gbG9uZyBpbnQgZWxmNjRfY2hlY2tzdW0gKEVsZiAqX19lbGYpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qIGxpYmVsZi5oICovCmRpZmYgLS1naXQgYS9saWJlbGYvbGliZWxmLm1hcCBiL2xpYmVsZi9saWJlbGYubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTZkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvbGliZWxmLm1hcApAQCAtMCwwICsxLDEwNiBAQAorRUxGVVRJTFNfMS4wIHsKKyAgZ2xvYmFsOgorICAgIGVsZjMyX2NoZWNrc3VtOworICAgIGVsZjMyX2ZzaXplOworICAgIGVsZjMyX2dldGVoZHI7CisgICAgZWxmMzJfZ2V0cGhkcjsKKyAgICBlbGYzMl9nZXRzaGRyOworICAgIGVsZjMyX25ld2VoZHI7CisgICAgZWxmMzJfbmV3cGhkcjsKKyAgICBlbGYzMl94bGF0ZXRvZjsKKyAgICBlbGYzMl94bGF0ZXRvbTsKKyAgICBlbGY2NF9jaGVja3N1bTsKKyAgICBlbGY2NF9mc2l6ZTsKKyAgICBlbGY2NF9nZXRlaGRyOworICAgIGVsZjY0X2dldHBoZHI7CisgICAgZWxmNjRfZ2V0c2hkcjsKKyAgICBlbGY2NF9uZXdlaGRyOworICAgIGVsZjY0X25ld3BoZHI7CisgICAgZWxmNjRfeGxhdGV0b2Y7CisgICAgZWxmNjRfeGxhdGV0b207CisgICAgZWxmX2JlZ2luOworICAgIGVsZl9jbG9uZTsKKyAgICBlbGZfY250bDsKKyAgICBlbGZfZW5kOworICAgIGVsZl9lcnJtc2c7CisgICAgZWxmX2Vycm5vOworICAgIGVsZl9maWxsOworICAgIGVsZl9mbGFnZGF0YTsKKyAgICBlbGZfZmxhZ2VoZHI7CisgICAgZWxmX2ZsYWdlbGY7CisgICAgZWxmX2ZsYWdwaGRyOworICAgIGVsZl9mbGFnc2NuOworICAgIGVsZl9mbGFnc2hkcjsKKyAgICBlbGZfZ2V0YXJoZHI7CisgICAgZWxmX2dldGFyc3ltOworICAgIGVsZl9nZXRiYXNlOworICAgIGVsZl9nZXRkYXRhOworICAgIGVsZl9nZXRpZGVudDsKKyAgICBlbGZfZ2V0c2NuOworICAgIGVsZl9nZXRzaG51bTsKKyAgICBlbGZfZ2V0c2hzdHJuZHg7CisgICAgZWxmX2hhc2g7CisgICAgZWxmX2tpbmQ7CisgICAgZWxmX21lbW9yeTsKKyAgICBlbGZfbmR4c2NuOworICAgIGVsZl9uZXdkYXRhOworICAgIGVsZl9uZXdzY247CisgICAgZWxmX25leHQ7CisgICAgZWxmX25leHRzY247CisgICAgZWxmX3JhbmQ7CisgICAgZWxmX3Jhd2RhdGE7CisgICAgZWxmX3Jhd2ZpbGU7CisgICAgZWxmX3NjbmNudDsKKyAgICBlbGZfc3RycHRyOworICAgIGVsZl91cGRhdGU7CisgICAgZWxmX3ZlcnNpb247CisgICAgZ2VsZl9jaGVja3N1bTsKKyAgICBnZWxmX2ZyZWVjaHVuazsKKyAgICBnZWxmX2ZzaXplOworICAgIGdlbGZfZ2V0Y2xhc3M7CisgICAgZ2VsZl9nZXRkeW47CisgICAgZ2VsZl9nZXRlaGRyOworICAgIGdlbGZfZ2V0bW92ZTsKKyAgICBnZWxmX2dldHBoZHI7CisgICAgZ2VsZl9nZXRyZWw7CisgICAgZ2VsZl9nZXRyZWxhOworICAgIGdlbGZfZ2V0c2hkcjsKKyAgICBnZWxmX2dldHN5bTsKKyAgICBnZWxmX2dldHN5bWluZm87CisgICAgZ2VsZl9nZXRzeW1zaG5keDsKKyAgICBnZWxmX2dldHZlcmRhdXg7CisgICAgZ2VsZl9nZXR2ZXJkZWY7CisgICAgZ2VsZl9nZXR2ZXJuYXV4OworICAgIGdlbGZfZ2V0dmVybmVlZDsKKyAgICBnZWxmX2dldHZlcnN5bTsKKyAgICBnZWxmX25ld2VoZHI7CisgICAgZ2VsZl9uZXdwaGRyOworICAgIGdlbGZfcmF3Y2h1bms7CisgICAgZ2VsZl91cGRhdGVfZHluOworICAgIGdlbGZfdXBkYXRlX2VoZHI7CisgICAgZ2VsZl91cGRhdGVfbW92ZTsKKyAgICBnZWxmX3VwZGF0ZV9waGRyOworICAgIGdlbGZfdXBkYXRlX3JlbDsKKyAgICBnZWxmX3VwZGF0ZV9yZWxhOworICAgIGdlbGZfdXBkYXRlX3NoZHI7CisgICAgZ2VsZl91cGRhdGVfc3ltOworICAgIGdlbGZfdXBkYXRlX3N5bWluZm87CisgICAgZ2VsZl91cGRhdGVfc3ltc2huZHg7CisgICAgZ2VsZl91cGRhdGVfdmVyZGF1eDsKKyAgICBnZWxmX3VwZGF0ZV92ZXJkZWY7CisgICAgZ2VsZl91cGRhdGVfdmVybmF1eDsKKyAgICBnZWxmX3VwZGF0ZV92ZXJuZWVkOworICAgIGdlbGZfdXBkYXRlX3ZlcnN5bTsKKyAgICBnZWxmX3hsYXRldG9mOworICAgIGdlbGZfeGxhdGV0b207CisgICAgbmxpc3Q7CisKKyAgbG9jYWw6CisgICAgKjsKK307CisKK0VMRlVUSUxTXzEuMSB7CisgIGdsb2JhbDoKKyAgICBnZWxmX2dldGxpYjsKKyAgICBnZWxmX3VwZGF0ZV9saWI7Cit9IEVMRlVUSUxTXzEuMDsKZGlmZiAtLWdpdCBhL2xpYmVsZi9saWJlbGZQLmggYi9saWJlbGYvbGliZWxmUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMGYzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvbGliZWxmUC5oCkBAIC0wLDAgKzEsNTM0IEBACisvKiBJbnRlcm5hbCBpbnRlcmZhY2VzIGZvciBsaWJlbGYuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9MSUJFTEZQX0gKKyNkZWZpbmUgX0xJQkVMRlBfSCAxCisKKyNpbmNsdWRlIDxhci5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogZ2V0dGV4dCBoZWxwZXIgbWFjcm9zLiAgKi8KKyNkZWZpbmUgXyhTdHIpIGRnZXR0ZXh0ICgibGliZWxmIiwgU3RyKQorCisKKy8qIEhlbHBlciBNYWNyb3MgdG8gd3JpdGUgMzIgYml0IGFuZCA2NCBiaXQgZnVuY3Rpb25zLiAgKi8KKyNkZWZpbmUgX19lbGZ3Ml8oQml0cywgTmFtZSkgX19lbGYjI0JpdHMjI18jI05hbWUKKyNkZWZpbmUgZWxmdzJfKEJpdHMsIE5hbWUpIGVsZiMjQml0cyMjXyMjTmFtZQorI2RlZmluZSBFbGZXMl8oQml0cywgTmFtZSkgRWxmIyNCaXRzIyNfIyNOYW1lCisjZGVmaW5lIEVMRlcyXyhCaXRzLCBOYW1lKSBFTEYjI0JpdHMjI18jI05hbWUKKyNkZWZpbmUgRUxGV18oTmFtZSwgQml0cykgTmFtZSMjQml0cworI2RlZmluZSBfX2VsZncyKEJpdHMsIE5hbWUpIF9fZWxmdzJfKEJpdHMsIE5hbWUpCisjZGVmaW5lIGVsZncyKEJpdHMsIE5hbWUpIGVsZncyXyhCaXRzLCBOYW1lKQorI2RlZmluZSBFbGZXMihCaXRzLCBOYW1lKSBFbGZXMl8oQml0cywgTmFtZSkKKyNkZWZpbmUgRUxGVzIoQml0cywgTmFtZSkgRUxGVzJfKEJpdHMsIE5hbWUpCisjZGVmaW5lIEVMRlcoTmFtZSwgQml0cykgIEVMRldfKE5hbWUsIEJpdHMpCisKKworLyogU2l6ZXMgb2YgdGhlIGV4dGVybmFsIHR5cGVzLCBmb3IgMzIgYml0cyBvYmplY3RzLiAgKi8KKyNkZWZpbmUgRUxGMzJfRlNaX0FERFIgICA0CisjZGVmaW5lIEVMRjMyX0ZTWl9PRkYgICAgNAorI2RlZmluZSBFTEYzMl9GU1pfSEFMRiAgIDIKKyNkZWZpbmUgRUxGMzJfRlNaX1dPUkQgICA0CisjZGVmaW5lIEVMRjMyX0ZTWl9TV09SRCAgNAorI2RlZmluZSBFTEYzMl9GU1pfWFdPUkQgIDgKKyNkZWZpbmUgRUxGMzJfRlNaX1NYV09SRCA4CisKKy8qIFNhbWUgZm9yIDY0IGJpdHMgb2JqZWN0cy4gICovCisjZGVmaW5lIEVMRjY0X0ZTWl9BRERSICAgOAorI2RlZmluZSBFTEY2NF9GU1pfT0ZGICAgIDgKKyNkZWZpbmUgRUxGNjRfRlNaX0hBTEYgICAyCisjZGVmaW5lIEVMRjY0X0ZTWl9XT1JEICAgNAorI2RlZmluZSBFTEY2NF9GU1pfU1dPUkQgIDQKKyNkZWZpbmUgRUxGNjRfRlNaX1hXT1JEICA4CisjZGVmaW5lIEVMRjY0X0ZTWl9TWFdPUkQgOAorCisKKy8qIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBFTEZfRl8qIGVudW1lcmF0aW9uLiAgVGhlIHZhbHVlcyBoZXJlIGFyZQorICAgbm90IHBhcnQgb2YgdGhlIGxpYnJhcnkgaW50ZXJmYWNlLCB0aGV5IGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseS4gICovCitlbnVtCit7CisgIEVMRl9GX01NQVBQRUQgPSAweDQwLAorICBFTEZfRl9NQUxMT0NFRCA9IDB4ODAsCisgIEVMRl9GX0ZJTEVEQVRBID0gMHgxMDAKK307CisKKworLyogR2V0IGRlZmluaXRpb24gb2YgYWxsIHRoZSBleHRlcm5hbCB0eXBlcy4gICovCisjaW5jbHVkZSAiZXh0dHlwZXMuaCIKKworCisvKiBFcnJvciB2YWx1ZXMuICAqLworZW51bQoreworICBFTEZfRV9OT0VSUk9SID0gMCwKKyAgRUxGX0VfVU5LTk9XTl9FUlJPUiwKKyAgRUxGX0VfVU5LTk9XTl9WRVJTSU9OLAorICBFTEZfRV9VTktOT1dOX1RZUEUsCisgIEVMRl9FX0lOVkFMSURfSEFORExFLAorICBFTEZfRV9TT1VSQ0VfU0laRSwKKyAgRUxGX0VfREVTVF9TSVpFLAorICBFTEZfRV9JTlZBTElEX0VOQ09ESU5HLAorICBFTEZfRV9OT01FTSwKKyAgRUxGX0VfSU5WQUxJRF9GSUxFLAorICBFTEZfRV9JTlZBTElEX09QLAorICBFTEZfRV9OT19WRVJTSU9OLAorICBFTEZfRV9JTlZBTElEX0NNRCwKKyAgRUxGX0VfUkFOR0UsCisgIEVMRl9FX0FSQ0hJVkVfRk1BRywKKyAgRUxGX0VfSU5WQUxJRF9BUkNISVZFLAorICBFTEZfRV9OT19BUkNISVZFLAorICBFTEZfRV9OT19JTkRFWCwKKyAgRUxGX0VfUkVBRF9FUlJPUiwKKyAgRUxGX0VfV1JJVEVfRVJST1IsCisgIEVMRl9FX0lOVkFMSURfQ0xBU1MsCisgIEVMRl9FX0lOVkFMSURfSU5ERVgsCisgIEVMRl9FX0lOVkFMSURfT1BFUkFORCwKKyAgRUxGX0VfSU5WQUxJRF9TRUNUSU9OLAorICBFTEZfRV9JTlZBTElEX0NPTU1BTkQsCisgIEVMRl9FX1dST05HX09SREVSX0VIRFIsCisgIEVMRl9FX0ZEX0RJU0FCTEVELAorICBFTEZfRV9GRF9NSVNNQVRDSCwKKyAgRUxGX0VfT0ZGU0VUX1JBTkdFLAorICBFTEZfRV9OT1RfTlVMX1NFQ1RJT04sCisgIEVMRl9FX0RBVEFfTUlTTUFUQ0gsCisgIEVMRl9FX0lOVkFMSURfU0VDVElPTl9IRUFERVIsCisgIEVMRl9FX0lOVkFMSURfREFUQSwKKyAgRUxGX0VfREFUQV9FTkNPRElORywKKyAgRUxGX0VfU0VDVElPTl9UT09fU01BTEwsCisgIEVMRl9FX0lOVkFMSURfQUxJR04sCisgIEVMRl9FX0lOVkFMSURfU0hFTlRTSVpFLAorICBFTEZfRV9VUERBVEVfUk8sCisgIEVMRl9FX05PRklMRSwKKyAgRUxGX0VfR1JPVVBfTk9UX1JFTCwKKyAgRUxGX0VfSU5WQUxJRF9QSERSLAorICBFTEZfRV9OT19QSERSLAorICAvKiBLZWVwIHRoaXMgYXMgdGhlIGxhc3QgZW50cnkuICAqLworICBFTEZfRV9OVU0KK307CisKKworLyogVGhlIHZpc2libGUgYEVsZl9EYXRhJyB0eXBlIGlzIG5vdCBzdWZmaWNlbnQgZm9yIHNvbWUgb3BlcmF0aW9ucyBkdWUKKyAgIHRvIGEgbWlzZGVzaWduZWQgaW50ZXJmYWNlLiAgRXh0ZW5kIGl0IGZvciBpbnRlcm5hbCBwdXJwb3Nlcy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBFbGZfRGF0YSBkOworICBFbGZfU2NuICpzOworfSBFbGZfRGF0YV9TY247CisKKworLyogTGlzdCBvZiBgRWxmX0RhdGEnIGRlc2NyaXB0b3JzLiAgVGhpcyBpcyB3aGF0IG1ha2VzIHVwIHRoZSBzZWN0aW9uCisgICBjb250ZW50cy4gICovCit0eXBlZGVmIHN0cnVjdCBFbGZfRGF0YV9MaXN0Cit7CisgIC8qIGBkYXRhJyAqbXVzdCogYmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHN0cnVjdC4gICovCisgIEVsZl9EYXRhX1NjbiBkYXRhOworICBzdHJ1Y3QgRWxmX0RhdGFfTGlzdCAqbmV4dDsKKyAgaW50IGZsYWdzOworfSBFbGZfRGF0YV9MaXN0OworCisKKy8qIERlc2NyaXB0b3IgZm9yIEVMRiBzZWN0aW9uLiAgKi8KK3N0cnVjdCBFbGZfU2NuCit7CisgIC8qIFdlIGhhdmUgdG8gZGlzdGluZ3Vpc2ggc2V2ZXJhbCBkaWZmZXJlbnQgc2l0dWF0aW9uczoKKworICAgICAxLiB0aGUgc2VjdGlvbiBpcyB1c2VyIGNyZWF0ZWQuICBUaGVyZWZvcmUgdGhlcmUgaXMgbm8gZmlsZSBvciBtZW1vcnkKKyAgICAgICAgcmVnaW9uIHRvIHJlYWQgdGhlIGRhdGEgZnJvbS4gIEhlcmUgd2UgaGF2ZSB0d28gZGlmZmVyZW50IHN1YmNhc2VzOgorCisgICAgICAgIGEpIGRhdGEgd2FzIG5vdCB5ZXQgYWRkZWQgKGJlZm9yZSB0aGUgZmlyc3QgYGVsZl9uZXdkYXRhJyBjYWxsKQorCisgICAgICAgIGIpIGF0IGxlYXN0IG9uZSBkYXRhIHNldCBpcyBhdmFpbGFibGUKKworICAgICAyLiB0aGlzIGlzIGEgc2VjdGlvbiBmcm9tIGEgZmlsZS9tZW1vcnkgcmVnaW9uLiAgV2UgaGF2ZSB0byByZWFkIHRoZQorICAgICAgICBjdXJyZW50IGNvbnRlbnQgaW4gb25lIGRhdGEgYmxvY2sgaWYgd2UgaGF2ZSB0by4gIEJ1dCB3ZSBkb24ndAorICAgICAgICByZWFkIHRoZSBkYXRhIHVudGlsIGl0IGlzIG5lY2Vzc2FyeS4gIFNvIHdlIGhhdmUgdGhlIHN1YmNhc2VzOgorCisgICAgICAgIGEpIHRoZSBzZWN0aW9uIGluIHRoZSBmaWxlIGhhcyBzaXplIHplcm8gKGZvciB3aGF0ZXZlciByZWFzb24pCisKKyAgICAgICAgYikgdGhlIGRhdGEgb2YgdGhlIGZpbGUgaXMgbm90ICh5ZXQpIHJlYWQKKworICAgICAgICBjKSB0aGUgZGF0YSBpcyByZWFkIGFuZCBhdmFpbGFibGUuCisKKyAgICAgSW4gYWRkaXRpb24gdG8gdGhpcyB3ZSBoYXZlIGRpZmZlcmVudCBkYXRhIHNldHMsIHRoZSByYXcgYW5kIHRoZSBjb252ZXJ0ZWQKKyAgICAgZGF0YS4gIFRoaXMgZGlzdGluY3Rpb24gb25seSBleGlzdHMgZm9yIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgZmlsZS4KKyAgICAgQWxsIHVzZXItYWRkZWQgZGF0YSBzZXQgKGFsbCBidXQgdGhlIGZpcnN0IHdoZW4gcmVhZCBmcm9tIHRoZSBmaWxlIG9yCisgICAgIGFsbCBvZiB0aGVtIGZvciB1c2VyLWNyZWF0ZSBzZWN0aW9ucykgYXJlIHRoZSBzYW1lIGluIGJvdGggZm9ybWF0cy4KKyAgICAgV2UgZG9uJ3QgY3JlYXRlIHRoZSBjb252ZXJ0ZWQgZGF0YSBiZWZvcmUgaXQgaXMgbmVjZXNzYXJ5LgorCisgICAgIFRoZSBgZGF0YV9yZWFkJyBlbGVtZW50IHNpZ25hbHMgd2hldGhlciBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUKKyAgICAgcmF3IGZvcm1hdC4KKworICAgICBJZiB0aGVyZSBpcyBkYXRhIGZyb20gdGhlIGZpbGUvbWVtb3J5IHJlZ2lvbiBvciBpZiByZWFkIG9uZSBkYXRhCisgICAgIHNldCBpcyBhZGRlZCB0aGUgYHJhd2RhdGFfbGlzdF9yZWFkJyBwb2ludGVyIGluIG5vbi1OVUxMIGFuZCBwb2ludHMKKyAgICAgdG8gdGhlIGxhc3QgZmlsbGVkIGRhdGEgc2V0LiAgYHJhd19kYXRhbGlzdF9yZWFyJyBpcyB0aGVyZWZvcmUgTlVMTAorICAgICBvbmx5IGlmIHRoZXJlIGlzIG5vIGRhdGEgc2V0IGF0IGFsbC4KKworICAgICBUaGlzIHNvIGZhciBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggYWxsIGJ1dCB0d28gY2FzZXMgKGdpdmVuIHRoYXQgdGhlCisgICAgIGByYXdkYXRhX2xpc3QnIGFuZCBgZGF0YV9saXN0JyBlbnRyaWVzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvKSBpcworICAgICBiZXR3ZWVuIG5vdCB5ZXQgbG9hZGVkIGRhdGEgZnJvbSB0aGUgZmlsZS9tZW1vcnkgcmVnaW9uIGFuZCBhIHNlY3Rpb24KKyAgICAgd2l0aCB6ZXJvIHNpemUgYW5kIHR5cGUgRUxGX1RfQllURS4gICAqLworICBFbGZfRGF0YV9MaXN0IGRhdGFfbGlzdDsJLyogTGlzdCBvZiBkYXRhIGJ1ZmZlcnMuICAqLworICBFbGZfRGF0YV9MaXN0ICpkYXRhX2xpc3RfcmVhcjsgLyogUG9pbnRlciB0byB0aGUgcmVhciBvZiB0aGUgZGF0YSBsaXN0LiAqLworCisgIEVsZl9EYXRhX1NjbiByYXdkYXRhOwkJLyogVW5pbnRlcnByZXRlZCBkYXRhIG9mIHRoZSBzZWN0aW9uLiAgKi8KKworICBpbnQgZGF0YV9yZWFkOwkJLyogTm9uemVybyBpZiB0aGUgc2VjdGlvbiB3YXMgY3JlYXRlZCBieSB0aGUKKwkJCQkgICB1c2VyIG9yIGlmIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUvbWVtb3J5CisJCQkJICAgaXMgcmVhZC4gICovCisKKyAgc2l6ZV90IGluZGV4OwkJCS8qIEluZGV4IG9mIHRoaXMgc2VjdGlvbi4gICovCisgIHN0cnVjdCBFbGYgKmVsZjsJCS8qIFRoZSB1bmRlcmx5aW5nIEVMRiBmaWxlLiAgKi8KKworICB1bmlvbgorICB7CisgICAgRWxmMzJfU2hkciAqZTMyOwkJLyogUG9pbnRlciB0byAzMmJpdCBzZWN0aW9uIGhlYWRlci4gICovCisgICAgRWxmNjRfU2hkciAqZTY0OwkJLyogUG9pbnRlciB0byA2NGJpdCBzZWN0aW9uIGhlYWRlci4gICovCisgIH0gc2hkcjsKKworICB1bnNpZ25lZCBpbnQgc2hkcl9mbGFnczsJLyogU2VjdGlvbiBoZWFkZXIgbW9kaWZpZWQ/ICAqLworICB1bnNpZ25lZCBpbnQgZmxhZ3M7CQkvKiBTZWN0aW9uIGNoYW5nZWQgaW4gc2l6ZT8gICovCisKKyAgY2hhciAqcmF3ZGF0YV9iYXNlOwkJLyogVGhlIHVubW9kaWZpZWQgZGF0YSBvZiB0aGUgc2VjdGlvbi4gICovCisgIGNoYXIgKmRhdGFfYmFzZTsJCS8qIFRoZSBjb252ZXJ0ZWQgZGF0YSBvZiB0aGUgc2VjdGlvbi4gICovCisKKyAgc3RydWN0IEVsZl9TY25MaXN0ICpsaXN0OwkvKiBQb2ludGVyIHRoZSB0aGUgc2VjdGlvbiBsaXN0IGVsZW1lbnQgdGhlCisJCQkJICAgZGF0YSBpcyBpbi4gICovCit9OworCisKKy8qIExpc3Qgb2Ygc2VjdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdCBFbGZfU2NuTGlzdAoreworICB1bnNpZ25lZCBpbnQgY250OwkJLyogTnVtYmVyIG9mIGVsZW1lbnRzIG9mICdkYXRhJyB1c2VkLiAgKi8KKyAgdW5zaWduZWQgaW50IG1heDsJCS8qIE51bWJlciBvZiBlbGVtZW50cyBvZiAnZGF0YScgYWxsb2NhdGVkLiAgKi8KKyAgc3RydWN0IEVsZl9TY25MaXN0ICpuZXh0OwkvKiBOZXh0IGJsb2NrIG9mIHNlY3Rpb25zLiAgKi8KKyAgc3RydWN0IEVsZl9TY24gZGF0YVswXTsJLyogU2VjdGlvbiBkYXRhLiAgKi8KK30gRWxmX1Njbkxpc3Q7CisKKworLyogVGhlIEVMRiBkZXNjcmlwdG9yLiAgKi8KK3N0cnVjdCBFbGYKK3sKKyAgLyogV2hhdCBraW5kIG9mIGZpbGUgaXMgdW5kZXJuZWF0aCAoRUxGIGZpbGUsIGFyY2hpdmUuLi4pLiAgKi8KKyAgRWxmX0tpbmQga2luZDsKKworICAvKiBDb21tYW5kIHVzZWQgdG8gY3JlYXRlIHRoaXMgZGVzY3JpcHRvci4gICovCisgIEVsZl9DbWQgY21kOworCisgIC8qIFRoZSBiaW5hcnkgY2xhc3MuICAqLworICB1bnNpZ25lZCBpbnQgY2xhc3M7CisKKyAgLyogVGhlIHVzZWQgZmlsZSBkZXNjcmlwdG9yLiAgLTEgaWYgbm90IGF2YWlsYWJsZSBhbnltb3JlLiAgKi8KKyAgaW50IGZpbGRlczsKKworICAvKiBPZmZzZXQgaW4gdGhlIGFyY2hpdmUgdGhpcyBmaWxlIHN0YXJ0cyBvciB6ZXJvLiAgKi8KKyAgb2ZmX3Qgc3RhcnRfb2Zmc2V0OworCisgIC8qIFNpemUgb2YgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUgb3IgdGhlIGVudGlyZSBmaWxlIHNpemUsIG9yIH4wCisgICAgIGZvciBhbiAoeWV0KSB1bmtub3duIHNpemUuICAqLworICBzaXplX3QgbWF4aW11bV9zaXplOworCisgIC8qIEFkZHJlc3MgdG8gd2hpY2ggdGhlIGZpbGUgd2FzIG1hcHBlZC4gIE5VTEwgaWYgbm90IG1hcHBlZC4gICovCisgIHZvaWQgKm1hcF9hZGRyZXNzOworCisgIC8qIERlc2NyaWJlcyB0aGUgd2F5IHRoZSBtZW1vcnkgd2FzIGFsbG9jYXRlZCBhbmQgaWYgdGhlIGRpcnR5IGJpdCBpcworICAgICBzaWduYWxsZWQgaXQgbWVhbnMgdGhhdCB0aGUgd2hvbGUgZmlsZSBoYXMgdG8gYmUgcmV3cml0dGVuIHNpbmNlCisgICAgIHRoZSBsYXlvdXQgY2hhbmdlZC4gICovCisgIGludCBmbGFnczsKKworICAvKiBXaGVuIGNyZWF0ZWQgZm9yIGFuIGFyY2hpdmUgbWVtYmVyIHRoaXMgcG9pbnRzIHRvIHRoZSBkZXNjcmlwdG9yCisgICAgIGZvciB0aGUgYXJjaGl2ZS4gKi8KKyAgRWxmICpwYXJlbnQ7CisKKyAgLyogTG9jayB0byBoYW5kbGUgbXVsdGl0aHJlYWRlZCBwcm9ncmFtcy4gICovCisgIHJ3bG9ja19kZWZpbmUgKCxsb2NrKTsKKworICAvKiBSZWZlcmVuY2UgY291bnRpbmcgZm9yIHRoZSBkZXNjcmlwdG9yLiAgKi8KKyAgaW50IHJlZl9jb3VudDsKKworICBzdHJ1Y3QgRWxmICpuZXh0OyAgICAgICAgICAgICAvKiBVc2VkIGluIGxpc3Qgb2YgYXJjaGl2ZSBkZXNjcmlwdG9ycy4gICovCisKKyAgdW5pb24KKyAgeworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIGludCBlaGRyX2ZsYWdzOwkJLyogRmxhZ3MgKGRpcnR5KSBmb3IgRUxGIGhlYWRlci4gICovCisgICAgICBpbnQgcGhkcl9mbGFnczsJCS8qIEZsYWdzIChkaXJ0eXxtYWxsb2MpIGZvciBwcm9ncmFtIGhlYWRlci4gICovCisgICAgICBpbnQgc2hkcl9tYWxsb2NlZDsJLyogTm9uemVybyBpZiBzaGRyIGFycmF5IHdhcyBhbGxvY2F0ZWQuICAqLworCisgICAgICAvKiBUaGUgbmV4dCBmaWVsZHMgYXJlIG9ubHkgdXNlZnVsIHdoZW4gdGVzdGluZyBmb3IgPT0vIT0gTlVMTC4gICovCisgICAgICB2b2lkICplaGRyOworICAgICAgdm9pZCAqc2hkcjsKKyAgICAgIHZvaWQgKnBoZHI7CisKKyAgICAgIEVsZl9TY25MaXN0ICpzY25zX2xhc3Q7CS8qIExhc3QgZWxlbWVudCBpbiB0aGUgc2VjdGlvbiBsaXN0LgorCQkJCSAgIElmIE5VTEwgdGhlIGRhdGEgaGFzIG5vdCB5ZXQgYmVlbgorCQkJCSAgIHJlYWQgZnJvbSB0aGUgZmlsZS4gICovCisgICAgICB1bnNpZ25lZCBpbnQgc2NuaW5jcjsJLyogTnVtYmVyIG9mIHNlY3Rpb25zIGFsbG9jYXRlIHRoZSBsYXN0CisJCQkJICAgdGltZS4gICovCisgICAgICBvZmY2NF90IHNpemVzdHJfb2Zmc2V0OwkvKiBPZmZzZXQgb2YgdGhlIHNpemUgc3RyaW5nIGluIHRoZSBwYXJlbnQKKwkJCQkgICBpZiB0aGlzIGlzIGFuIGFyY2hpdmUgbWVtYmVyLiAgKi8KKyAgICB9IGVsZjsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIGludCBlaGRyX2ZsYWdzOwkJLyogRmxhZ3MgKGRpcnR5KSBmb3IgRUxGIGhlYWRlci4gICovCisgICAgICBpbnQgcGhkcl9mbGFnczsJCS8qIEZsYWdzIChkaXJ0eXxtYWxsb2MpIGZvciBwcm9ncmFtIGhlYWRlci4gICovCisgICAgICBpbnQgc2hkcl9tYWxsb2NlZDsJLyogTm9uemVybyBpZiBzaGRyIGFycmF5IHdhcyBhbGxvY2F0ZWQuICAqLworCisgICAgICBFbGYzMl9FaGRyICplaGRyOwkJLyogUG9pbnRlciB0byB0aGUgRUxGIGhlYWRlci4gIFRoaXMgaXMKKwkJCQkgICBuZXZlciBtYWxsb2NlZC4gICovCisgICAgICBFbGYzMl9TaGRyICpzaGRyOwkJLyogVXNlZCB3aGVuIHJlYWRpbmcgZnJvbSBhIGZpbGUuICAqLworICAgICAgRWxmMzJfUGhkciAqcGhkcjsJCS8qIFBvaW50ZXIgdG8gdGhlIHByb2dyYW0gaGVhZGVyIGFycmF5LiAgKi8KKyAgICAgIEVsZl9TY25MaXN0ICpzY25zX2xhc3Q7CS8qIExhc3QgZWxlbWVudCBpbiB0aGUgc2VjdGlvbiBsaXN0LgorCQkJCSAgIElmIE5VTEwgdGhlIGRhdGEgaGFzIG5vdCB5ZXQgYmVlbgorCQkJCSAgIHJlYWQgZnJvbSB0aGUgZmlsZS4gICovCisgICAgICB1bnNpZ25lZCBpbnQgc2NuaW5jcjsJLyogTnVtYmVyIG9mIHNlY3Rpb25zIGFsbG9jYXRlIHRoZSBsYXN0CisJCQkJICAgdGltZS4gICovCisgICAgICBvZmY2NF90IHNpemVzdHJfb2Zmc2V0OwkvKiBPZmZzZXQgb2YgdGhlIHNpemUgc3RyaW5nIGluIHRoZSBwYXJlbnQKKwkJCQkgICBpZiB0aGlzIGlzIGFuIGFyY2hpdmUgbWVtYmVyLiAgKi8KKyAgICAgIEVsZjMyX0VoZHIgZWhkcl9tZW07CS8qIE1lbW9yeSB1c2VkIGZvciBFTEYgaGVhZGVyIHdoZW4gbm90CisJCQkJICAgbW1hcGVkLiAgKi8KKyAgICAgIGNoYXIgX19lMzJzY25zcGFkW3NpemVvZiAoRWxmNjRfRWhkcikgLSBzaXplb2YgKEVsZjMyX0VoZHIpXTsKKworICAgICAgLyogVGhlIHNlY3Rpb24gYXJyYXkuICAqLworICAgICAgRWxmX1Njbkxpc3Qgc2NuczsKKyAgICB9IGVsZjMyOworCisgICAgc3RydWN0CisgICAgeworICAgICAgaW50IGVoZHJfZmxhZ3M7CQkvKiBGbGFncyAoZGlydHkpIGZvciBFTEYgaGVhZGVyLiAgKi8KKyAgICAgIGludCBwaGRyX2ZsYWdzOwkJLyogRmxhZ3MgKGRpcnR5fG1hbGxvYykgZm9yIHByb2dyYW0gaGVhZGVyLiAgKi8KKyAgICAgIGludCBzaGRyX21hbGxvY2VkOwkvKiBOb256ZXJvIGlmIHNoZHIgYXJyYXkgd2FzIGFsbG9jYXRlZC4gICovCisKKyAgICAgIEVsZjY0X0VoZHIgKmVoZHI7CQkvKiBQb2ludGVyIHRvIHRoZSBFTEYgaGVhZGVyLiAgVGhpcyBpcworCQkJCSAgIG5ldmVyIG1hbGxvY2VkLiAgKi8KKyAgICAgIEVsZjY0X1NoZHIgKnNoZHI7CQkvKiBVc2VkIHdoZW4gcmVhZGluZyBmcm9tIGEgZmlsZS4gICovCisgICAgICBFbGY2NF9QaGRyICpwaGRyOwkJLyogUG9pbnRlciB0byB0aGUgcHJvZ3JhbSBoZWFkZXIgYXJyYXkuICAqLworICAgICAgRWxmX1Njbkxpc3QgKnNjbnNfbGFzdDsJLyogTGFzdCBlbGVtZW50IGluIHRoZSBzZWN0aW9uIGxpc3QuCisJCQkJICAgSWYgTlVMTCB0aGUgZGF0YSBoYXMgbm90IHlldCBiZWVuCisJCQkJICAgcmVhZCBmcm9tIHRoZSBmaWxlLiAgKi8KKyAgICAgIHVuc2lnbmVkIGludCBzY25pbmNyOwkvKiBOdW1iZXIgb2Ygc2VjdGlvbnMgYWxsb2NhdGUgdGhlIGxhc3QKKwkJCQkgICB0aW1lLiAgKi8KKyAgICAgIG9mZjY0X3Qgc2l6ZXN0cl9vZmZzZXQ7CS8qIE9mZnNldCBvZiB0aGUgc2l6ZSBzdHJpbmcgaW4gdGhlIHBhcmVudAorCQkJCSAgIGlmIHRoaXMgaXMgYW4gYXJjaGl2ZSBtZW1iZXIuICAqLworICAgICAgRWxmNjRfRWhkciBlaGRyX21lbTsJLyogTWVtb3J5IHVzZWQgZm9yIEVMRiBoZWFkZXIgd2hlbiBub3QKKwkJCQkgICBtbWFwZWQuICAqLworCisgICAgICAvKiBUaGUgc2VjdGlvbiBhcnJheS4gICovCisgICAgICBFbGZfU2NuTGlzdCBzY25zOworICAgIH0gZWxmNjQ7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBpbnQgaGFzX2luZGV4OwkJLyogU2V0IHdoZW4gZmlsZSBoYXMgaW5kZXguICAwIG1lYW5zCisJCQkJICAgdW5kZWNpZGVkLCA+IDAgbWVhbnMgaXQgaGFzIG9uZS4gICovCisgICAgICBFbGZfQXJzeW0gKmFyX3N5bTsJLyogU3ltYm9sIHRhYmxlIHJldHVybmVkIGJ5IGVsZl9nZXRhcnN5bS4gICovCisgICAgICBzaXplX3QgYXJfc3ltX251bTsJLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYGFyX3N5bScuICAqLworICAgICAgY2hhciAqbG9uZ19uYW1lczsJCS8qIElmIG5vIGluZGV4IGlzIGF2YWlsYWJsZSBidXQgbG9uZyBuYW1lcworCQkJCSAgIGFyZSB1c2VkIHRoaXMgZWxlbWVudHMgcG9pbnRzIHRvIHRoZSBkYXRhLiovCisgICAgICBzaXplX3QgbG9uZ19uYW1lc19sZW47CS8qIExlbmd0aCBvZiB0aGUgbG9uZyBuYW1lIHRhYmxlLiAgKi8KKyAgICAgIG9mZl90IG9mZnNldDsJCS8qIE9mZnNldCBpbiBmaWxlIHdlIGFyZSBjdXJyZW50bHkgYXQuCisJCQkJICAgZWxmX25leHQoKSBhZHZhbmNlcyB0aGlzIHRvIHRoZSBuZXh0CisJCQkJICAgbWVtYmVyIG9mIHRoZSBhcmNoaXZlLiAgKi8KKyAgICAgIEVsZl9BcmhkciBlbGZfYXJfaGRyOwkvKiBTdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgJ2VsZl9nZXRhcmhkcicuICAqLworICAgICAgc3RydWN0IGFyX2hkciBhcl9oZHI7CS8qIEhlYWRlciByZWFkIGZyb20gZmlsZS4gICovCisgICAgICBjaGFyIGFyX25hbWVbMTZdOwkJLyogTlVMIHRlcm1pbmF0ZWQgYXJfbmFtZSBvZiBlbGZfYXJfaGRyLiAgKi8KKyAgICAgIGNoYXIgcmF3X25hbWVbMTddOwkvKiBUaGlzIGlzIGEgYnVmZmVyIGZvciB0aGUgTlVMIHRlcm1pbmF0ZWQKKwkJCQkgICBuYW1lZCByYXdfbmFtZSB1c2VkIGluIHRoZSBlbGZfYXJfaGRyLiAgKi8KKyAgICAgIHN0cnVjdCBFbGYgKmNoaWxkcmVuOwkvKiBMaXN0IG9mIGFsbCBkZXNjcmlwdG9ycyBmb3IgdGhpcyBhcmNoaXZlLiAqLworICAgIH0gYXI7CisgIH0gc3RhdGU7CisKKyAgLyogVGhlcmUgYWJzb2x1dGVseSBuZXZlciBtdXN0IGJlIGFueXRoaW5nIGZvbGxvd2luZyB0aGUgdW5pb24uICAqLworfTsKKworCisvKiBUeXBlIG9mIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGNvbnZlcnQgdGhlCisgICBieXRlIG9yZGVyLiAgKi8KK3R5cGVkZWYgdm9pZCAoKnhmY3RfdCkgKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CisKKy8qIFRoZSB0YWJsZSB3aXRoIHRoZSBmdW5jdGlvbiBwb2ludGVycy4gICovCitleHRlcm4gY29uc3QgeGZjdF90IF9fZWxmX3hmY3RzdG9tW0VWX05VTSAtIDFdW0VWX05VTSAtIDFdW0VMRkNMQVNTTlVNIC0gMV1bRUxGX1RfTlVNXSBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIGNvbnN0IHhmY3RfdCBfX2VsZl94ZmN0c3RvZltFVl9OVU0gLSAxXVtFVl9OVU0gLSAxXVtFTEZDTEFTU05VTSAtIDFdW0VMRl9UX05VTV0gYXR0cmlidXRlX2hpZGRlbjsKKworCisvKiBBcnJheSB3aXRoIHNpemVzIG9mIHRoZSBleHRlcm5hbCB0eXBlcyBpbmRleGVkIGJ5IEVMRiB2ZXJzaW9uLCBiaW5hcnkKKyAgIGNsYXNzLCBhbmQgdHlwZS4gKi8KK2V4dGVybiBjb25zdCBzaXplX3QgX19saWJlbGZfdHlwZV9zaXplc1tFVl9OVU0gLSAxXVtFTEZDTEFTU05VTSAtIDFdW0VMRl9UX05VTV0gYXR0cmlidXRlX2hpZGRlbjsKKy8qIFdlIG9mdGVuIGhhdmUgdG8gYWNjZXNzIHRoZSBzaXplIGZvciBhIHR5cGUgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbi4gICovCisjaWYgRVZfTlVNICE9IDIKKyMgZGVmaW5lIGVsZl90eXBlc2l6ZShjbGFzcyx0eXBlLG4pIFwKKyAgZWxmdzIoY2xhc3MsZnNpemUpICh0eXBlLCBuLCBfX2xpYmVsZl92ZXJzaW9uKQorI2Vsc2UKKyMgZGVmaW5lIGVsZl90eXBlc2l6ZShjbGFzcyx0eXBlLG4pIFwKKyAgKF9fbGliZWxmX3R5cGVfc2l6ZXNbRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsY2xhc3MpIC0gMV1bdHlwZV0gKiBuKQorI2VuZGlmCisKKy8qIEN1cnJlbnRseSBzZWxlY3RlZCB2ZXJzaW9uIG9mIHRoZSBFTEYgc3BlY2lmaWNhdGlvbi4gICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fbGliZWxmX3ZlcnNpb24gYXR0cmlidXRlX2hpZGRlbjsKKworLyogVGhlIGJ5dGUgdmFsdWUgdXNlZCBmb3IgZmlsbGluZyBnYXBzLiAgKi8KK2V4dGVybiBpbnQgX19saWJlbGZfZmlsbF9ieXRlIGF0dHJpYnV0ZV9oaWRkZW47CisKKy8qIE5vbnplcm8gaWYgdGhlIHZlcnNpb24gd2FzIHNldC4gICovCitleHRlcm4gaW50IF9fbGliZWxmX3ZlcnNpb25faW5pdGlhbGl6ZWQgYXR0cmlidXRlX2hpZGRlbjsKKworCisvKiBUaGUgbGliZWxmIEFQSSBkb2VzIG5vdCBoYXZlIHN1Y2ggYSBmdW5jdGlvbiBidXQgaXQgaXMgc3RpbGwgdXNlZnVsLgorICAgR2V0IHRoZSBtZW1vcnkgc2l6ZSBmb3IgdGhlIGdpdmVuIHR5cGUuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWFya2VkIGludGVybmFsIHNpbmNlIHRoZXkgYXJlIGFsaWFzZXMKKyAgIG9mIHRoZSBleHBvcnQgZWxmWFhfZnNpemUgZnVuY3Rpb25zLiovCitleHRlcm4gc2l6ZV90IF9fZWxmMzJfbXNpemUgKEVsZl9UeXBlIF9fdHlwZSwgc2l6ZV90IF9fY291bnQsCisJCQkgICAgIHVuc2lnbmVkIGludCBfX3ZlcnNpb24pOworZXh0ZXJuIHNpemVfdCBfX2VsZjY0X21zaXplIChFbGZfVHlwZSBfX3R5cGUsIHNpemVfdCBfX2NvdW50LAorCQkJICAgICB1bnNpZ25lZCBpbnQgX192ZXJzaW9uKTsKKworCisvKiBDcmVhdGUgRWxmIGRlc2NyaXB0b3IgZnJvbSBtZW1vcnkgaW1hZ2UuICAqLworZXh0ZXJuIEVsZiAqX19saWJlbGZfcmVhZF9tbWFwZWRfZmlsZSAoaW50IGZpbGRlcywgdm9pZCAqbWFwX2FkZHJlc3MsCisJCQkJICAgICAgIG9mZl90IG9mZnNldCwgc2l6ZV90IG1heHNpemUsCisJCQkJICAgICAgIEVsZl9DbWQgY21kLCBFbGYgKnBhcmVudCkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisKKy8qIFNldCBlcnJvciB2YWx1ZS4gICovCitleHRlcm4gdm9pZCBfX2xpYmVsZl9zZXRlcnJubyAoaW50IHZhbHVlKSBpbnRlcm5hbF9mdW5jdGlvbjsKKworLyogR2V0IHRoZSBuZXh0IGFyY2hpdmUgaGVhZGVyLiAgKi8KK2V4dGVybiBpbnQgX19saWJlbGZfbmV4dF9hcmhkciAoRWxmICplbGYpIGludGVybmFsX2Z1bmN0aW9uOworCisvKiBSZWFkIGFsbCBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IuICAqLworZXh0ZXJuIGNoYXIgKl9fbGliZWxmX3JlYWRhbGwgKEVsZiAqZWxmKSBpbnRlcm5hbF9mdW5jdGlvbjsKKworLyogUmVhZCB0aGUgY29tcGxldGUgc2VjdGlvbiB0YWJsZSBhbmQgY29udmVydCB0aGUgYnl0ZSBvcmRlciBpZiBuZWNlc3NhcnkuICAqLworZXh0ZXJuIGludCBfX2xpYmVsZl9yZWFkc2VjdGlvbnMgKEVsZiAqZWxmKSBpbnRlcm5hbF9mdW5jdGlvbjsKKworLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgcmF3IGRhdGEgaW4gdGhlIGByYXdkYXRhX2xpc3QnIGVsZW1lbnQuICAqLworZXh0ZXJuIGludCBfX2xpYmVsZl9zZXRfcmF3ZGF0YSAoRWxmX1NjbiAqc2NuKSBpbnRlcm5hbF9mdW5jdGlvbjsKKworCisvKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBlbGZfdXBkYXRlLiAgKi8KK2V4dGVybiBvZmZfdCBfX2VsZjMyX3VwZGF0ZW51bGwgKEVsZiAqZWxmLCBpbnQgKmNoYW5nZV9ib3AsIHNpemVfdCBzaG51bSkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CitleHRlcm4gb2ZmX3QgX19lbGY2NF91cGRhdGVudWxsIChFbGYgKmVsZiwgaW50ICpjaGFuZ2VfYm9wLCBzaXplX3Qgc2hudW0pCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworCitleHRlcm4gaW50IF9fZWxmMzJfdXBkYXRlbW1hcCAoRWxmICplbGYsIGludCBjaGFuZ2VfYm8sIHNpemVfdCBzaG51bSkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CitleHRlcm4gaW50IF9fZWxmNjRfdXBkYXRlbW1hcCAoRWxmICplbGYsIGludCBjaGFuZ2VfYm8sIHNpemVfdCBzaG51bSkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CitleHRlcm4gaW50IF9fZWxmMzJfdXBkYXRlZmlsZSAoRWxmICplbGYsIGludCBjaGFuZ2VfYm8sIHNpemVfdCBzaG51bSkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CitleHRlcm4gaW50IF9fZWxmNjRfdXBkYXRlZmlsZSAoRWxmICplbGYsIGludCBjaGFuZ2VfYm8sIHNpemVfdCBzaG51bSkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisKKworLyogQWxpYXMgZm9yIGV4cG9ydGVkIGZ1bmN0aW9ucyB0byBhdm9pZCBQTFQgZW50cmllcy4gICovCitleHRlcm4gaW50IF9fZWxmX2VuZF9pbnRlcm5hbCAoRWxmICpfX2VsZik7CitleHRlcm4gRWxmICpfX2VsZl9iZWdpbl9pbnRlcm5hbCAoaW50IF9fZmlsZGVzLCBFbGZfQ21kIF9fY21kLCBFbGYgKl9fcmVmKQorICAgICBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIEVsZjMyX0VoZHIgKl9fZWxmMzJfZ2V0ZWhkcl9pbnRlcm5hbCAoRWxmICpfX2VsZikgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBFbGY2NF9FaGRyICpfX2VsZjY0X2dldGVoZHJfaW50ZXJuYWwgKEVsZiAqX19lbGYpIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gRWxmMzJfRWhkciAqX19lbGYzMl9uZXdlaGRyX2ludGVybmFsIChFbGYgKl9fZWxmKSBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIEVsZjY0X0VoZHIgKl9fZWxmNjRfbmV3ZWhkcl9pbnRlcm5hbCAoRWxmICpfX2VsZikgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBFbGYzMl9QaGRyICpfX2VsZjMyX2dldHBoZHJfaW50ZXJuYWwgKEVsZiAqX19lbGYpIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gRWxmNjRfUGhkciAqX19lbGY2NF9nZXRwaGRyX2ludGVybmFsIChFbGYgKl9fZWxmKSBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIEVsZjMyX1BoZHIgKl9fZWxmMzJfbmV3cGhkcl9pbnRlcm5hbCAoRWxmICpfX2VsZiwgc2l6ZV90IF9fY250KQorICAgICBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIEVsZjY0X1BoZHIgKl9fZWxmNjRfbmV3cGhkcl9pbnRlcm5hbCAoRWxmICpfX2VsZiwgc2l6ZV90IF9fY250KQorICAgICBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIGludCBfX2VsZl9nZXRzaG51bV9pbnRlcm5hbCAoRWxmICpfX2VsZiwgc2l6ZV90ICpfX2RzdCkKKyAgICAgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBpbnQgX19lbGZfZ2V0c2hzdHJuZHhfaW50ZXJuYWwgKEVsZiAqX19lbGYsIHNpemVfdCAqX19kc3QpCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gRWxmMzJfU2hkciAqX19lbGYzMl9nZXRzaGRyX2ludGVybmFsIChFbGZfU2NuICpfX3NjbikgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBFbGY2NF9TaGRyICpfX2VsZjY0X2dldHNoZHJfaW50ZXJuYWwgKEVsZl9TY24gKl9fc2NuKSBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIEVsZl9TY24gKl9fZWxmX2dldHNjbl9pbnRlcm5hbCAoRWxmICpfX2VsZiwgc2l6ZV90IF9faW5kZXgpCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gRWxmX1NjbiAqX19lbGZfbmV4dHNjbl9pbnRlcm5hbCAoRWxmICpfX2VsZiwgRWxmX1NjbiAqX19zY24pCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gRWxmX0RhdGEgKl9fZWxmX2dldGRhdGFfaW50ZXJuYWwgKEVsZl9TY24gKl9fc2NuLCBFbGZfRGF0YSAqX19kYXRhKQorICAgICBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIEVsZl9EYXRhICpfX2VsZl9yYXdkYXRhX2ludGVybmFsIChFbGZfU2NuICpfX3NjbiwgRWxmX0RhdGEgKl9fZGF0YSkKKyAgICAgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBjaGFyICpfX2VsZl9zdHJwdHJfaW50ZXJuYWwgKEVsZiAqX19lbGYsIHNpemVfdCBfX2luZGV4LAorCQkJCSAgICBzaXplX3QgX19vZmZzZXQpIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gRWxmX0RhdGEgKl9fZWxmMzJfeGxhdGV0b21faW50ZXJuYWwgKEVsZl9EYXRhICpfX2Rlc3QsCisJCQkJCSAgICBjb25zdCBFbGZfRGF0YSAqX19zcmMsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgX19lbmNvZGUpCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gRWxmX0RhdGEgKl9fZWxmNjRfeGxhdGV0b21faW50ZXJuYWwgKEVsZl9EYXRhICpfX2Rlc3QsCisJCQkJCSAgICBjb25zdCBFbGZfRGF0YSAqX19zcmMsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgX19lbmNvZGUpCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gRWxmX0RhdGEgKl9fZWxmMzJfeGxhdGV0b2ZfaW50ZXJuYWwgKEVsZl9EYXRhICpfX2Rlc3QsCisJCQkJCSAgICBjb25zdCBFbGZfRGF0YSAqX19zcmMsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgX19lbmNvZGUpCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gRWxmX0RhdGEgKl9fZWxmNjRfeGxhdGV0b2ZfaW50ZXJuYWwgKEVsZl9EYXRhICpfX2Rlc3QsCisJCQkJCSAgICBjb25zdCBFbGZfRGF0YSAqX19zcmMsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgX19lbmNvZGUpCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gdW5zaWduZWQgaW50IF9fZWxmX3ZlcnNpb25faW50ZXJuYWwgKHVuc2lnbmVkIGludCBfX3ZlcnNpb24pCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX19lbGZfaGFzaF9pbnRlcm5hbCAoY29uc3QgY2hhciAqX19zdHJpbmcpCisgICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fLCB2aXNpYmlsaXR5ICgiaGlkZGVuIikpKTsKK2V4dGVybiBsb25nIGludCBfX2VsZjMyX2NoZWNrc3VtX2ludGVybmFsIChFbGYgKl9fZWxmKSBhdHRyaWJ1dGVfaGlkZGVuOworZXh0ZXJuIGxvbmcgaW50IF9fZWxmNjRfY2hlY2tzdW1faW50ZXJuYWwgKEVsZiAqX19lbGYpIGF0dHJpYnV0ZV9oaWRkZW47CisKKworZXh0ZXJuIEdFbGZfRWhkciAqX19nZWxmX2dldGVoZHJfaW50ZXJuYWwgKEVsZiAqX19lbGYsIEdFbGZfRWhkciAqX19kZXN0KTsKK2V4dGVybiBzaXplX3QgX19nZWxmX2ZzaXplX2ludGVybmFsIChFbGYgKl9fZWxmLCBFbGZfVHlwZSBfX3R5cGUsCisJCQkJICAgICBzaXplX3QgX19jb3VudCwgdW5zaWduZWQgaW50IF9fdmVyc2lvbikKKyAgICAgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBHRWxmX1NoZHIgKl9fZ2VsZl9nZXRzaGRyX2ludGVybmFsIChFbGZfU2NuICpfX3NjbiwgR0VsZl9TaGRyICpfX2RzdCkKKyAgICAgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBHRWxmX1N5bSAqX19nZWxmX2dldHN5bV9pbnRlcm5hbCAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fbmR4LAorCQkJCQkgR0VsZl9TeW0gKl9fZHN0KSBhdHRyaWJ1dGVfaGlkZGVuOworCisKK2V4dGVybiB1aW50MzJfdCBfX2xpYmVsZl9jcmMzMiAodWludDMyX3QgY3JjLCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCisgICAgIGF0dHJpYnV0ZV9oaWRkZW47CisKKworLyogV2Ugb2Z0ZW4gaGF2ZSB0byB1cGRhdGUgYSBmbGFnIGlmZiBhIHZhbHVlIGNoYW5nZWQuICBNYWtlIHRoaXMKKyAgIGNvbnZlbmllbnQuICBOb25lIG9mIHRoZSBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBhIHNpZGUgZWZmZWN0LiAgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgdXBkYXRlX2lmX2NoYW5nZWQodmFyLCBleHAsIGZsYWcpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3R5cGVvZl9fICh2YXIpICpfdmFyID0gJih2YXIpOwkJCQkJICAgICAgXAorICAgIF9fdHlwZW9mX18gKGV4cCkgX2V4cCA9IChleHApOwkJCQkJICAgICAgXAorICAgIGlmICgqX3ZhciAhPSBfZXhwKQkJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCSpfdmFyID0gX2V4cDsJCQkJCQkJICAgICAgXAorCShmbGFnKSB8PSBFTEZfRl9ESVJUWTsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIHVwZGF0ZV9pZl9jaGFuZ2VkKHZhciwgZXhwLCBmbGFnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKCh2YXIpICE9IChleHApKQkJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCSh2YXIpID0gKGV4cCk7CQkJCQkJCSAgICAgIFwKKwkoZmxhZykgfD0gRUxGX0ZfRElSVFk7CQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZW5kaWYgIC8qIGxpYmVsZlAuaCAqLwpkaWZmIC0tZ2l0IGEvbGliZWxmL2xpYmVsZl9jcmMzMi5jIGIvbGliZWxmL2xpYmVsZl9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NzFiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJlbGYvbGliZWxmX2NyYzMyLmMKQEAgLTAsMCArMSwyMyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgY3JjMzIgYXR0cmlidXRlX2hpZGRlbiBfX2xpYmVsZl9jcmMzMgorI2RlZmluZSBMSUJfU1lTVEVNX0gJMQorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgIi4uL2xpYi9jcmMzMi5jIgpkaWZmIC0tZ2l0IGEvbGliZWxmL2xpYmVsZl9uZXh0X3ByaW1lLmMgYi9saWJlbGYvbGliZWxmX25leHRfcHJpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTcxYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL2xpYmVsZl9uZXh0X3ByaW1lLmMKQEAgLTAsMCArMSwyMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgbmV4dF9wcmltZSBhdHRyaWJ1dGVfaGlkZGVuIF9fbGliZWxmX25leHRfcHJpbWUKKyNpbmNsdWRlICIuLi9saWIvbmV4dF9wcmltZS5jIgpkaWZmIC0tZ2l0IGEvbGliZWxmL25saXN0LmMgYi9saWJlbGYvbmxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWZmMjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZWxmL25saXN0LmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qIEV4dHJhY3Qgc3ltYm9sIGxpc3QgZnJvbSBiaW5hcnkuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxubGlzdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK3N0cnVjdCBoYXNoZW50cnkKK3sKKyAgY29uc3QgY2hhciAqc3RyOworICBHRWxmX1N5bSBzeW07Cit9OworI2RlZmluZSBUWVBFIHN0cnVjdCBoYXNoZW50cnkKKy8qIFhYWCBVc2UgYSBiZXR0ZXIgaGFzaCBmdW5jdGlvbiBzb21lIGRheS4gICovCisjZGVmaW5lIEhBU0hGQ1Qoc3RyLCBsZW4pIElOVFVTRShlbGZfaGFzaCkgKHN0cikKKyNkZWZpbmUgQ09NUEFSRShwMSwgcDIpIHN0cmNtcCAoKHAxKS0+c3RyLCAocDIpLT5zdHIpCisjZGVmaW5lIENMQVNTIHN0YXRpYworI2RlZmluZSBQUkVGSVggbmxpc3RfCisjZGVmaW5lIHhjYWxsb2MobiwgbSkgY2FsbG9jIChuLCBtKQorI2RlZmluZSBuZXh0X3ByaW1lKHMpIF9fbGliZWxmX25leHRfcHJpbWUgKHMpCisjaW5jbHVkZSA8Zml4ZWRzaXplaGFzaC5oPgorCisKK2ludAorbmxpc3QgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3Qgbmxpc3QgKm5sKQoreworICBpbnQgZmQ7CisgIEVsZiAqZWxmOworICBFbGZfU2NuICpzY24gPSBOVUxMOworICBFbGZfU2NuICpzeW1zY24gPSBOVUxMOworICBHRWxmX1NoZHIgc2hkcl9tZW07CisgIEdFbGZfU2hkciAqc2hkciA9IE5VTEw7CisgIEVsZl9EYXRhICpkYXRhOworICBzdHJ1Y3Qgbmxpc3RfZnNoYXNoICp0YWJsZTsKKyAgc2l6ZV90IG5zeW1zOworICBzaXplX3QgY250OworCisgIC8qIE9wZW4gdGhlIGZpbGUuICAqLworICBmZCA9IG9wZW4gKGZpbGVuYW1lLCBPX1JET05MWSk7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9GSUxFKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgLyogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyAoYG5saXN0JyBleGlzdGVkIGJlZm9yZSBFTEYgYW5kIGxpYmVsZikKKyAgICAgd2UgZG9uJ3QgZXhwZWN0IHRoZSBjYWxsZXIgdG8gc2V0IHRoZSBFTEYgdmVyc2lvbi4gIERvIHRoaXMgaGVyZQorICAgICBpZiBpdCBoYXNuJ3QgaGFwcGVuZWQgeWV0LiAgKi8KKyAgaWYgKF9fbGliZWxmX3ZlcnNpb25faW5pdGlhbGl6ZWQgPT0gMCkKKyAgICBJTlRVU0UoZWxmX3ZlcnNpb24pIChFVl9DVVJSRU5UKTsKKworICAvKiBOb3cgZ2V0IGFuIEVMRiBkZXNjcmlwdG9yLiAgKi8KKyAgZWxmID0gSU5UVVNFKGVsZl9iZWdpbikgKGZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOworICBpZiAoZWxmID09IE5VTEwpCisgICAgZ290byBmYWlsOworCisgIC8qIEZpbmQgYSBzeW1ib2wgdGFibGUuICBXZSBwcmVmZXIgdGhlIHJlYWwgc3ltYm9sIHRhYmxlIGJ1dCBpZiBpdAorICAgICBkb2VzIG5vdCBleGlzdCB1c2UgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KKyAgd2hpbGUgKChzY24gPSBJTlRVU0UoZWxmX25leHRzY24pIChlbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgc2hkciA9IElOVFVTRShnZWxmX2dldHNoZHIpIChzY24sICZzaGRyX21lbSk7CisgICAgICBpZiAoc2hkciA9PSBOVUxMKQorCWdvdG8gZmFpbF9jbG9zZTsKKworICAgICAgLyogVGhhdCBpcyB3aGF0IHdlIGFyZSBsb29raW5nIGZvci4gICovCisgICAgICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCKQorCXsKKwkgIHN5bXNjbiA9IHNjbjsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogQmV0dGVyIHRoYW4gbm90aGluZy4gIFJlbWVtYmVyIHRoaXMgc2VjdGlvbi4gICovCisgICAgICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKQorCXN5bXNjbiA9IHNjbjsKKyAgICB9CisKKyAgaWYgKHN5bXNjbiA9PSBOVUxMKQorICAgIC8qIFdlIGhhdmVuJ3QgZm91bmQgYW55dGhpbmcuICBGYWlsLiAgKi8KKyAgICBnb3RvIGZhaWxfY2xvc2U7CisKKyAgLyogUmUtZ2V0IHRoZSBzZWN0aW9uIGhlYWRlciBpbiBjYXNlIHdlIGZvdW5kIG9ubHkgdGhlIGR5bmFtaWMgc3ltYm9sCisgICAgIHRhYmxlLiAgKi8KKyAgaWYgKHNjbiA9PSBOVUxMKQorICAgIHNoZHIgPSBJTlRVU0UoZ2VsZl9nZXRzaGRyKSAoc3ltc2NuLCAmc2hkcl9tZW0pOworICAvKiBTSERSLT5TSF9MSU5LIG5vdyBjb250YWlucyB0aGUgaW5kZXggb2YgdGhlIHN0cmluZyBzZWN0aW9uLiAgKi8KKworICAvKiBHZXQgdGhlIGRhdGEgZm9yIHRoZSBzeW1ib2wgc2VjdGlvbi4gICovCisgIGRhdGEgPSBJTlRVU0UoZWxmX2dldGRhdGEpIChzeW1zY24sIE5VTEwpOworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbF9jbG9zZTsKKworICAvKiBIb3cgbWFueSBzeW1ib2xzIGFyZSB0aGVyZT8gICovCisgIG5zeW1zID0gKHNoZHItPnNoX3NpemUKKwkgICAvIElOVFVTRShnZWxmX2ZzaXplKSAoZWxmLCBFTEZfVF9TWU0sIDEsIGRhdGEtPmRfdmVyc2lvbikpOworCisgIC8qIENyZWF0ZSB0aGUgaGFzaCB0YWJsZS4gICovCisgIHRhYmxlID0gbmxpc3RfZnNoYXNoX2luaXQgKG5zeW1zKTsKKyAgaWYgKHRhYmxlID09IE5VTEwpCisgICAgeworICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKKyAgICAgIGdvdG8gZmFpbF9jbG9zZTsKKyAgICB9CisKKyAgLyogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgc2VjdGlvbi4gICovCisgIGZvciAoY250ID0gMDsgY250IDwgbnN5bXM7ICsrY250KQorICAgIHsKKyAgICAgIHN0cnVjdCBoYXNoZW50cnkgbWVtOworICAgICAgR0VsZl9TeW0gKnN5bTsKKworICAgICAgLyogR2V0IHRoZSBzeW1ib2wuICAqLworICAgICAgc3ltID0gSU5UVVNFKGdlbGZfZ2V0c3ltKSAoZGF0YSwgY250LCAmbWVtLnN5bSk7CisgICAgICBpZiAoc3ltID09IE5VTEwpCisJZ290byBmYWlsX2RlYWxsb2M7CisKKyAgICAgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLiAgKi8KKyAgICAgIG1lbS5zdHIgPSBJTlRVU0UoZWxmX3N0cnB0cikgKGVsZiwgc2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKTsKKyAgICAgIGlmIChtZW0uc3RyID09IE5VTEwpCisJZ290byBmYWlsX2RlYWxsb2M7CisKKyAgICAgIC8qIERvbid0IGFsbG93IHplcm8tbGVuZ3RoIHN0cmluZ3MuICAqLworICAgICAgaWYgKG1lbS5zdHJbMF0gPT0gJ1wwJykKKwljb250aW51ZTsKKworICAgICAgLyogQW5kIGFkZCBpdCB0byB0aGUgaGFzaCB0YWJsZS4gIE5vdGUgdGhhdCB3ZSBhcmUgdXNpbmcgdGhlCisgICAgICAgICBvdmVyd3JpdGUgdmVyc2lvbi4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdAorCSBhKSBnbG9iYWwgc3ltYm9scyBhcmUgcHJlZmVycmVkIG92ZXIgbG9jYWwgc3ltYm9scyBzaW5jZQorCSAgICB0aGV5IGFyZSBhbGwgbG9jYXRlZCBhdCB0aGUgZW5kCisJIGIpIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBsb2NhbCBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZQorCSAgICB0aGUgbGFzdCBvbmUgaXMgdXNlZC4KKyAgICAgICovCisgICAgICAodm9pZCkgbmxpc3RfZnNoYXNoX292ZXJ3cml0ZSAodGFibGUsIG1lbS5zdHIsIDAsICZtZW0pOworICAgIH0KKworICAvKiBOb3cgaXQgaXMgdGltZSB0byBsb29rIGZvciB0aGUgc3ltYm9scyB0aGUgdXNlciBhc2tlZCBmb3IuCisgICAgIFhYWCBXaGF0IGlzIGEgYG51bGwgbmFtZS9udWxsIHN0cmluZyc/ICBUaGlzIGlzIHdoYXQgdGhlCisgICAgIHN0YW5kYXJkIHNheXMgdGVybWluYXRlcyB0aGUgbGlzdC4gIElzIGl0IGEgbnVsbCBwb2ludGVyCisgICAgIG9yIGEgemVyby1sZW5ndGggc3RyaW5nPyAgV2UgdGVzdCBmb3IgYm90aC4uLiAgKi8KKyAgd2hpbGUgKG5sLT5uX25hbWUgIT0gTlVMTCAmJiBubC0+bl9uYW1lWzBdICE9ICdcMCcpCisgICAgeworICAgICAgc3RydWN0IGhhc2hlbnRyeSBzZWFyY2g7CisgICAgICBjb25zdCBzdHJ1Y3QgaGFzaGVudHJ5ICpmb3VuZDsKKworICAgICAgLyogU2VhcmNoIGZvciBhIG1hdGNoaW5nIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KKyAgICAgIHNlYXJjaC5zdHIgPSBubC0+bl9uYW1lOworICAgICAgZm91bmQgPSBubGlzdF9mc2hhc2hfZmluZCAodGFibGUsIG5sLT5uX25hbWUsIDAsICZzZWFyY2gpOworCisgICAgICBpZiAoZm91bmQgIT0gTlVMTCkKKwl7CisJICAvKiBGb3VuZCBpdC4gICovCisJICBubC0+bl92YWx1ZSA9IGZvdW5kLT5zeW0uc3RfdmFsdWU7CisJICBubC0+bl9zY251bSA9IGZvdW5kLT5zeW0uc3Rfc2huZHg7CisJICBubC0+bl90eXBlID0gR0VMRl9TVF9UWVBFIChmb3VuZC0+c3ltLnN0X2luZm8pOworCSAgLyogWFhYIFdoYXQgc2hhbGwgd2UgZmlsbCBpbiB0aGUgbmV4dCBmaWVsZHM/ICAqLworCSAgbmwtPm5fc2NsYXNzID0gMDsKKwkgIG5sLT5uX251bWF1eCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE5vdCB0aGVyZS4gICovCisJICBubC0+bl92YWx1ZSA9IDA7CisJICBubC0+bl9zY251bSA9IDA7CisJICBubC0+bl90eXBlID0gMDsKKwkgIG5sLT5uX3NjbGFzcyA9IDA7CisJICBubC0+bl9udW1hdXggPSAwOworCX0KKworICAgICAgLyogTmV4dCBzZWFyY2ggcmVxdWVzdC4gICovCisgICAgICArK25sOworICAgIH0KKworICAvKiBGcmVlIHRoZSByZXNvdXJjZXMuICAqLworICBubGlzdF9mc2hhc2hfZmluaSAodGFibGUpOworCisgIC8qIFdlIGRvIG5vdCBuZWVkIHRoZSBFTEYgZGVzY3JpcHRvciBhbnltb3JlLiAgKi8KKyAgKHZvaWQpIElOVFVTRShlbGZfZW5kKSAoZWxmKTsKKworICByZXR1cm4gMDsKKworIGZhaWxfZGVhbGxvYzoKKyAgbmxpc3RfZnNoYXNoX2ZpbmkgKHRhYmxlKTsKKworIGZhaWxfY2xvc2U6CisgIC8qIFdlIGRvIG5vdCBuZWVkIHRoZSBFTEYgZGVzY3JpcHRvciBhbnltb3JlLiAgKi8KKyAgKHZvaWQpIElOVFVTRShlbGZfZW5kKSAoZWxmKTsKKworIGZhaWw6CisgIC8qIFdlIGhhdmUgdG8gc2V0IGFsbCBlbnRyaWVzIHRvIHplcm8uICAqLworICB3aGlsZSAobmwtPm5fbmFtZSAhPSBOVUxMICYmIG5sLT5uX25hbWVbMF0gIT0gJ1wwJykKKyAgICB7CisgICAgICBubC0+bl92YWx1ZSA9IDA7CisgICAgICBubC0+bl9zY251bSA9IDA7CisgICAgICBubC0+bl90eXBlID0gMDsKKyAgICAgIG5sLT5uX3NjbGFzcyA9IDA7CisgICAgICBubC0+bl9udW1hdXggPSAwOworCisgICAgICAvKiBOZXh0IGVudHJ5LiAgKi8KKyAgICAgICsrbmw7CisgICAgfQorCisgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2xpYmVsZi9ubGlzdC5oIGIvbGliZWxmL25saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4ZjlhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi9ubGlzdC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIEludGVyZmFjZSBmb3Igbmxpc3QuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfTkxJU1RfSAorI2RlZmluZSBfTkxJU1RfSCAxCisKKworLyogU3ltYm9sIGxpc3QgdHlwZS4gICovCitzdHJ1Y3Qgbmxpc3QKK3sKKyAgY2hhciAqbl9uYW1lOwkJCS8qIFN5bWJvbCBuYW1lLiAgKi8KKyAgbG9uZyBpbnQgbl92YWx1ZTsJCS8qIFZhbHVlIG9mIHN5bWJvbC4gICovCisgIHNob3J0IGludCBuX3NjbnVtOwkJLyogU2VjdGlvbiBudW1iZXIgZm91bmQgaW4uICAqLworICB1bnNpZ25lZCBzaG9ydCBpbnQgbl90eXBlOwkvKiBUeXBlIG9mIHN5bWJvbC4gICovCisgIGNoYXIgbl9zY2xhc3M7CQkvKiBTdG9yYWdlIGNsYXNzLiAgKi8KKyAgY2hhciBuX251bWF1eDsJCS8qIE51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcy4gICovCit9OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogR2V0IHNwZWNpZmllZCBlbnRyaWVzIGZyb20gZmlsZS4gICovCitleHRlcm4gaW50IG5saXN0IChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsIHN0cnVjdCBubGlzdCAqX19ubCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLyogbmxpc3QuaCAqLwpkaWZmIC0tZ2l0IGEvbGliZWxmL3ZlcnNpb25feGxhdGUuaCBiL2xpYmVsZi92ZXJzaW9uX3hsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2NmNiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmVsZi92ZXJzaW9uX3hsYXRlLmgKQEAgLTAsMCArMSwyMDggQEAKKy8qIENvbnZlcnNpb24gZnVuY3Rpb25zIGZvciB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorCisjaW5jbHVkZSAibGliZWxmUC5oIgorCisKK3N0YXRpYyB2b2lkCitlbGZfY3Z0X1ZlcmRlZiAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuLCBpbnQgZW5jb2RlKQoreworICAvKiBXZSBoYXZlIHR3byBkaWZmZXJlbnQgcmVjb3JkIHR5cGVzOiBFbGZYWF9WZXJuZGVmIGFuZCBFbGZYWF9WZXJkYXV4LgorICAgICBUbyByZWNvZ25pemUgdGhlbSB3ZSBoYXZlIHRvIHdhbGsgdGhlIGRhdGEgc3RydWN0dXJlIGFuZCBjb252ZXJ0CisgICAgIHRoZW0gb25lIGFmdGVyIHRoZSBvdGhlci4gIFRoZSBFTkNPREUgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGV0aGVyCisgICAgIHdlIGFyZSBlbmNvZGluZyBvciBkZWNvZGluZy4gIFdoZW4gd2UgYXJlIGVuY29kaW5nIHdlIGNhbiBpbW1lZGlhdGVseQorICAgICB1c2UgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlcjsgaWYgbm90LCB3ZSBoYXZlIHRvIGRlY29kZSB0aGUgZGF0YSBiZWZvcmUKKyAgICAgdXNpbmcgaXQuICAqLworICBzaXplX3QgZGVmX29mZnNldCA9IDA7CisgIEdFbGZfVmVyZGVmICpkZGVzdDsKKyAgR0VsZl9WZXJkZWYgKmRzcmM7CisKKyAgLyogV2UgcmVseSBvbiB0aGUgdHlwZXMgYmVpbmcgYWxsIHRoZSBzYW1lIHNpemUuICAqLworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJkZWYpID09IHNpemVvZiAoRWxmMzJfVmVyZGVmKSk7CisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcmRhdXgpID09IHNpemVvZiAoRWxmMzJfVmVyZGF1eCkpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJkZWYpID09IHNpemVvZiAoRWxmNjRfVmVyZGVmKSk7CisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcmRhdXgpID09IHNpemVvZiAoRWxmNjRfVmVyZGF1eCkpOworCisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm47CisKKyAgZG8KKyAgICB7CisgICAgICBzaXplX3QgYXV4X29mZnNldDsKKyAgICAgIEdFbGZfVmVyZGF1eCAqYXNyYzsKKworICAgICAgLyogVGVzdCBmb3IgY29ycmVjdCBvZmZzZXQuICAqLworICAgICAgaWYgKGRlZl9vZmZzZXQgKyBzaXplb2YgKEdFbGZfVmVyZGVmKSA+IGxlbikKKwlyZXR1cm47CisKKyAgICAgIC8qIFdvcmsgdGhlIHRyZWUgZnJvbSB0aGUgZmlyc3QgcmVjb3JkLiAgKi8KKyAgICAgIGRkZXN0ID0gKEdFbGZfVmVyZGVmICopICgoY2hhciAqKSBkZXN0ICsgZGVmX29mZnNldCk7CisgICAgICBkc3JjID0gKEdFbGZfVmVyZGVmICopICgoY2hhciAqKSBzcmMgKyBkZWZfb2Zmc2V0KTsKKworICAgICAgLyogRGVjb2RlIGZpcnN0IGlmIG5lY2Vzc2FyeS4gICovCisgICAgICBpZiAoISBlbmNvZGUpCisJeworCSAgZGRlc3QtPnZkX3ZlcnNpb24gPSBic3dhcF8xNiAoZHNyYy0+dmRfdmVyc2lvbik7CisJICBkZGVzdC0+dmRfZmxhZ3MgPSBic3dhcF8xNiAoZHNyYy0+dmRfZmxhZ3MpOworCSAgZGRlc3QtPnZkX25keCA9IGJzd2FwXzE2IChkc3JjLT52ZF9uZHgpOworCSAgZGRlc3QtPnZkX2NudCA9IGJzd2FwXzE2IChkc3JjLT52ZF9jbnQpOworCSAgZGRlc3QtPnZkX2hhc2ggPSBic3dhcF8zMiAoZHNyYy0+dmRfaGFzaCk7CisJICBkZGVzdC0+dmRfYXV4ID0gYnN3YXBfMzIgKGRzcmMtPnZkX2F1eCk7CisJICBkZGVzdC0+dmRfbmV4dCA9IGJzd2FwXzMyIChkc3JjLT52ZF9uZXh0KTsKKworCSAgYXV4X29mZnNldCA9IGRlZl9vZmZzZXQgKyBkZGVzdC0+dmRfYXV4OworCX0KKyAgICAgIGVsc2UKKwlhdXhfb2Zmc2V0ID0gZGVmX29mZnNldCArIGRzcmMtPnZkX2F1eDsKKworICAgICAgLyogSGFuZGxlIGFsbCB0aGUgYXV4aWxpYXJ5IHJlY29yZHMgYmVsb25naW5nIHRvIHRoaXMgZGVmaW5pdGlvbi4gICovCisgICAgICBkbworCXsKKwkgIEdFbGZfVmVyZGF1eCAqYWRlc3Q7CisKKwkgIC8qIFRlc3QgZm9yIGNvcnJlY3Qgb2Zmc2V0LiAgKi8KKwkgIGlmIChhdXhfb2Zmc2V0ICsgc2l6ZW9mIChHRWxmX1ZlcmRhdXgpID4gbGVuKQorCSAgICByZXR1cm47CisKKwkgIGFkZXN0ID0gKEdFbGZfVmVyZGF1eCAqKSAoKGNoYXIgKikgZGVzdCArIGF1eF9vZmZzZXQpOworCSAgYXNyYyA9IChHRWxmX1ZlcmRhdXggKikgKChjaGFyICopIHNyYyArIGF1eF9vZmZzZXQpOworCisJICBpZiAoZW5jb2RlKQorCSAgICBhdXhfb2Zmc2V0ICs9IGFzcmMtPnZkYV9uZXh0OworCisJICBhZGVzdC0+dmRhX25hbWUgPSBic3dhcF8zMiAoYXNyYy0+dmRhX25hbWUpOworCSAgYWRlc3QtPnZkYV9uZXh0ID0gYnN3YXBfMzIgKGFzcmMtPnZkYV9uZXh0KTsKKworCSAgaWYgKCEgZW5jb2RlKQorCSAgICBhdXhfb2Zmc2V0ICs9IGFkZXN0LT52ZGFfbmV4dDsKKwl9CisgICAgICB3aGlsZSAoYXNyYy0+dmRhX25leHQgIT0gMCk7CisKKyAgICAgIC8qIEVuY29kZSBub3cgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIGlmIChlbmNvZGUpCisJeworCSAgZGVmX29mZnNldCArPSBkc3JjLT52ZF9uZXh0OworCisJICBkZGVzdC0+dmRfdmVyc2lvbiA9IGJzd2FwXzE2IChkc3JjLT52ZF92ZXJzaW9uKTsKKwkgIGRkZXN0LT52ZF9mbGFncyA9IGJzd2FwXzE2IChkc3JjLT52ZF9mbGFncyk7CisJICBkZGVzdC0+dmRfbmR4ID0gYnN3YXBfMTYgKGRzcmMtPnZkX25keCk7CisJICBkZGVzdC0+dmRfY250ID0gYnN3YXBfMTYgKGRzcmMtPnZkX2NudCk7CisJICBkZGVzdC0+dmRfaGFzaCA9IGJzd2FwXzMyIChkc3JjLT52ZF9oYXNoKTsKKwkgIGRkZXN0LT52ZF9hdXggPSBic3dhcF8zMiAoZHNyYy0+dmRfYXV4KTsKKwkgIGRkZXN0LT52ZF9uZXh0ID0gYnN3YXBfMzIgKGRzcmMtPnZkX25leHQpOworCX0KKyAgICAgIGVsc2UKKwlkZWZfb2Zmc2V0ICs9IGRkZXN0LT52ZF9uZXh0OworICAgIH0KKyAgd2hpbGUgKGRzcmMtPnZkX25leHQgIT0gMCk7Cit9CisKKworc3RhdGljIHZvaWQKK2VsZl9jdnRfVmVybmVlZCAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuLCBpbnQgZW5jb2RlKQoreworICAvKiBXZSBoYXZlIHR3byBkaWZmZXJlbnQgcmVjb3JkIHR5cGVzOiBFbGZYWF9WZXJuZGVmIGFuZCBFbGZYWF9WZXJkYXV4LgorICAgICBUbyByZWNvZ25pemUgdGhlbSB3ZSBoYXZlIHRvIHdhbGsgdGhlIGRhdGEgc3RydWN0dXJlIGFuZCBjb252ZXJ0CisgICAgIHRoZW0gb25lIGFmdGVyIHRoZSBvdGhlci4gIFRoZSBFTkNPREUgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGV0aGVyCisgICAgIHdlIGFyZSBlbmNvZGluZyBvciBkZWNvZGluZy4gIFdoZW4gd2UgYXJlIGVuY29kaW5nIHdlIGNhbiBpbW1lZGlhdGVseQorICAgICB1c2UgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlcjsgaWYgbm90LCB3ZSBoYXZlIHRvIGRlY29kZSB0aGUgZGF0YSBiZWZvcmUKKyAgICAgdXNpbmcgaXQuICAqLworICBzaXplX3QgbmVlZF9vZmZzZXQgPSAwOworICBHRWxmX1Zlcm5lZWQgKm5kZXN0OworICBHRWxmX1Zlcm5lZWQgKm5zcmM7CisKKyAgLyogV2UgcmVseSBvbiB0aGUgdHlwZXMgYmVpbmcgYWxsIHRoZSBzYW1lIHNpemUuICAqLworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuZWVkKSA9PSBzaXplb2YgKEVsZjMyX1Zlcm5lZWQpKTsKKyAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmF1eCkgPT0gc2l6ZW9mIChFbGYzMl9WZXJuYXV4KSk7CisgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1Zlcm5lZWQpID09IHNpemVvZiAoRWxmNjRfVmVybmVlZCkpOworICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuYXV4KSA9PSBzaXplb2YgKEVsZjY0X1Zlcm5hdXgpKTsKKworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuOworCisgIGRvCisgICAgeworICAgICAgc2l6ZV90IGF1eF9vZmZzZXQ7CisgICAgICBHRWxmX1Zlcm5hdXggKmFzcmM7CisKKyAgICAgIC8qIFRlc3QgZm9yIGNvcnJlY3Qgb2Zmc2V0LiAgKi8KKyAgICAgIGlmIChuZWVkX29mZnNldCArIHNpemVvZiAoR0VsZl9WZXJuZWVkKSA+IGxlbikKKwlyZXR1cm47CisKKyAgICAgIC8qIFdvcmsgdGhlIHRyZWUgZnJvbSB0aGUgZmlyc3QgcmVjb3JkLiAgKi8KKyAgICAgIG5kZXN0ID0gKEdFbGZfVmVybmVlZCAqKSAoKGNoYXIgKikgZGVzdCArIG5lZWRfb2Zmc2V0KTsKKyAgICAgIG5zcmMgPSAoR0VsZl9WZXJuZWVkICopICgoY2hhciAqKSBzcmMgKyBuZWVkX29mZnNldCk7CisKKyAgICAgIC8qIERlY29kZSBmaXJzdCBpZiBuZWNlc3NhcnkuICAqLworICAgICAgaWYgKCEgZW5jb2RlKQorCXsKKwkgIG5kZXN0LT52bl92ZXJzaW9uID0gYnN3YXBfMTYgKG5zcmMtPnZuX3ZlcnNpb24pOworCSAgbmRlc3QtPnZuX2NudCA9IGJzd2FwXzE2IChuc3JjLT52bl9jbnQpOworCSAgbmRlc3QtPnZuX2ZpbGUgPSBic3dhcF8zMiAobnNyYy0+dm5fZmlsZSk7CisJICBuZGVzdC0+dm5fYXV4ID0gYnN3YXBfMzIgKG5zcmMtPnZuX2F1eCk7CisJICBuZGVzdC0+dm5fbmV4dCA9IGJzd2FwXzMyIChuc3JjLT52bl9uZXh0KTsKKworCSAgYXV4X29mZnNldCA9IG5lZWRfb2Zmc2V0ICsgbmRlc3QtPnZuX2F1eDsKKwl9CisgICAgICBlbHNlCisJYXV4X29mZnNldCA9IG5lZWRfb2Zmc2V0ICsgbnNyYy0+dm5fYXV4OworCisgICAgICAvKiBIYW5kbGUgYWxsIHRoZSBhdXhpbGlhcnkgcmVjb3JkcyBiZWxvbmdpbmcgdG8gdGhpcyByZXF1aXJlbWVudC4gICovCisgICAgICBkbworCXsKKwkgIEdFbGZfVmVybmF1eCAqYWRlc3Q7CisKKwkgIC8qIFRlc3QgZm9yIGNvcnJlY3Qgb2Zmc2V0LiAgKi8KKwkgIGlmIChhdXhfb2Zmc2V0ICsgc2l6ZW9mIChHRWxmX1Zlcm5hdXgpID4gbGVuKQorCSAgICByZXR1cm47CisKKwkgIGFkZXN0ID0gKEdFbGZfVmVybmF1eCAqKSAoKGNoYXIgKikgZGVzdCArIGF1eF9vZmZzZXQpOworCSAgYXNyYyA9IChHRWxmX1Zlcm5hdXggKikgKChjaGFyICopIHNyYyArIGF1eF9vZmZzZXQpOworCisJICBpZiAoZW5jb2RlKQorCSAgICBhdXhfb2Zmc2V0ICs9IGFzcmMtPnZuYV9uZXh0OworCisJICBhZGVzdC0+dm5hX2hhc2ggPSBic3dhcF8zMiAoYXNyYy0+dm5hX2hhc2gpOworCSAgYWRlc3QtPnZuYV9mbGFncyA9IGJzd2FwXzE2IChhc3JjLT52bmFfZmxhZ3MpOworCSAgYWRlc3QtPnZuYV9vdGhlciA9IGJzd2FwXzE2IChhc3JjLT52bmFfb3RoZXIpOworCSAgYWRlc3QtPnZuYV9uYW1lID0gYnN3YXBfMzIgKGFzcmMtPnZuYV9uYW1lKTsKKwkgIGFkZXN0LT52bmFfbmV4dCA9IGJzd2FwXzMyIChhc3JjLT52bmFfbmV4dCk7CisKKwkgIGlmICghIGVuY29kZSkKKwkgICAgYXV4X29mZnNldCArPSBhZGVzdC0+dm5hX25leHQ7CisJfQorICAgICAgd2hpbGUgKGFzcmMtPnZuYV9uZXh0ICE9IDApOworCisgICAgICAvKiBFbmNvZGUgbm93IGlmIG5lY2Vzc2FyeS4gICovCisgICAgICBpZiAoZW5jb2RlKQorCXsKKwkgIG5lZWRfb2Zmc2V0ICs9IG5zcmMtPnZuX25leHQ7CisKKwkgIG5kZXN0LT52bl92ZXJzaW9uID0gYnN3YXBfMTYgKG5zcmMtPnZuX3ZlcnNpb24pOworCSAgbmRlc3QtPnZuX2NudCA9IGJzd2FwXzE2IChuc3JjLT52bl9jbnQpOworCSAgbmRlc3QtPnZuX2ZpbGUgPSBic3dhcF8zMiAobnNyYy0+dm5fZmlsZSk7CisJICBuZGVzdC0+dm5fYXV4ID0gYnN3YXBfMzIgKG5zcmMtPnZuX2F1eCk7CisJICBuZGVzdC0+dm5fbmV4dCA9IGJzd2FwXzMyIChuc3JjLT52bl9uZXh0KTsKKwl9CisgICAgICBlbHNlCisJbmVlZF9vZmZzZXQgKz0gbmRlc3QtPnZuX25leHQ7CisgICAgfQorICB3aGlsZSAobnNyYy0+dm5fbmV4dCAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL200Ly5jdnNpZ25vcmUgYi9tNC8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODQ1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tNC8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK01ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9tNC9DaGFuZ2VMb2cgYi9tNC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyYzljNwotLS0gL2Rldi9udWxsCisrKyBiL200L0NoYW5nZUxvZwpAQCAtMCwwICsxLDMxIEBACisyMDA1LTAyLTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBSZW1vdmUgZ2xpYmMyMS5tNCwgaW50ZGl2MC5tNCwKKwlpbnR0eXBlcy5tNCwgaW50dHlwZXNfaC5tNCwgaW50dHlwZXMtcHJpLm00LCBpc2MtcG9zaXgubTQsCisJbGliLWxkLm00LCBsaWItbGluay5tNCwgbGliLXByZWZpeC5tNCwgc3RkaW50X2gubTQsIHVpbnRtYXhfdC5tNCwKKwlhbmQgdWxvbmdsb25nLm00LgorCSogZ2xpYmMyMS5tNDogUmVtb3ZlZC4KKwkqIGludHR5cGVzX2gubTQ6IFJlbW92ZWQuCisJKiBpbnR0eXBlcy5tNDogUmVtb3ZlZC4KKwkqIGludHR5cGVzLXByaS5tNDogUmVtb3ZlZC4KKwkqIGlzYy1wb3NpeC5tNDogUmVtb3ZlZC4KKwkqIGxpYi1sZC5tNDogUmVtb3ZlZC4KKwkqIGxpYi1saW5rLm00OiBSZW1vdmVkLgorCSogbGliLXByZWZpeC5tNDogUmVtb3ZlZC4KKwkqIHN0ZGludF9oLm00OiBSZW1vdmVkLgorCSogdWludG1heF90Lm00OiBSZW1vdmVkLgorCSogdWxvbmdsb25nLm00OiBSZW1vdmVkLgorCisyMDAyLTAzLTIyICBnZXR0ZXh0aXplICA8YnVnLWdudS1nZXR0ZXh0QGdudS5vcmc+CisKKwkqIGNvZGVzZXQubTQ6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjExLgorCSogZ2V0dGV4dC5tNDogVXBncmFkZSB0byBnZXR0ZXh0LTAuMTEuCisJKiBnbGliYzIxLm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xMS4KKwkqIGljb252Lm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xMS4KKwkqIGlzYy1wb3NpeC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjExLgorCSogbGNtZXNzYWdlLm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xMS4KKwkqIGxpYi1sZC5tNDogVXBncmFkZSB0byBnZXR0ZXh0LTAuMTEuCisJKiBsaWItbGluay5tNDogVXBncmFkZSB0byBnZXR0ZXh0LTAuMTEuCisJKiBsaWItcHJlZml4Lm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xMS4KKwkqIHByb2d0ZXN0Lm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xMS4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRoZSBuZXcgZmlsZXMuCmRpZmYgLS1naXQgYS9tNC9NYWtlZmlsZS5hbSBiL200L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3N2UzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIwIEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4gLSotTWFrZWZpbGUtKi0KKyMjCisjIyBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIworIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIyBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIyMKKworIyNtNC1maWxlcy1iZWdpbgorRVhUUkFfRElTVCA9IGNvZGVzZXQubTQgZ2V0dGV4dC5tNCBpY29udi5tNCBsY21lc3NhZ2UubTQgcHJvZ3Rlc3QubTQKZGlmZiAtLWdpdCBhL200L2NvZGVzZXQubTQgYi9tNC9jb2Rlc2V0Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NTM1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9jb2Rlc2V0Lm00CkBAIC0wLDAgKzEsMjMgQEAKKyMgY29kZXNldC5tNCBzZXJpYWwgQU0xIChnZXR0ZXh0LTAuMTAuNDApCitkbmwgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworQUNfREVGVU4oW0FNX0xBTkdJTkZPX0NPREVTRVRdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIG5sX2xhbmdpbmZvIGFuZCBDT0RFU0VUXSwgYW1fY3ZfbGFuZ2luZm9fY29kZXNldCwKKyAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsYW5naW5mby5oPl0sCisgICAgICBbY2hhciogY3MgPSBubF9sYW5naW5mbyhDT0RFU0VUKTtdLAorICAgICAgYW1fY3ZfbGFuZ2luZm9fY29kZXNldD15ZXMsCisgICAgICBhbV9jdl9sYW5naW5mb19jb2Rlc2V0PW5vKQorICAgIF0pCisgIGlmIHRlc3QgJGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9MQU5HSU5GT19DT0RFU0VULCAxLAorICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSA8bGFuZ2luZm8uaD4gYW5kIG5sX2xhbmdpbmZvKENPREVTRVQpLl0pCisgIGZpCitdKQpkaWZmIC0tZ2l0IGEvbTQvZ2V0dGV4dC5tNCBiL200L2dldHRleHQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3NThhNgotLS0gL2Rldi9udWxsCisrKyBiL200L2dldHRleHQubTQKQEAgLTAsMCArMSw1ODcgQEAKKyMgZ2V0dGV4dC5tNCBzZXJpYWwgMTYgKGdldHRleHQtMC4xMS40KQorZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorZG5sCitkbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgorZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK2RubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0CitkbmwgZnVuY3Rpb25hbGl0eS4KK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCitkbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCitkbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCitkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK2RubCBBdXRob3JzOgorZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUtMjAwMC4KK2RubCAgIEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPiwgMjAwMC0yMDAyLgorCitkbmwgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKworZG5sIFVzYWdlOiBBTV9HTlVfR0VUVEVYVChbSU5UTFNZTUJPTF0sIFtORUVEU1lNQk9MXSwgW0lOVExESVJdKS4KK2RubCBJTlRMU1lNQk9MIGNhbiBiZSBvbmUgb2YgJ2V4dGVybmFsJywgJ25vLWxpYnRvb2wnLCAndXNlLWxpYnRvb2wnLiBUaGUKK2RubCAgICBkZWZhdWx0IChpZiBpdCBpcyBub3Qgc3BlY2lmaWVkIG9yIGVtcHR5KSBpcyAnbm8tbGlidG9vbCcuCitkbmwgICAgSU5UTFNZTUJPTCBzaG91bGQgYmUgJ2V4dGVybmFsJyBmb3IgcGFja2FnZXMgd2l0aCBubyBpbnRsIGRpcmVjdG9yeSwKK2RubCAgICBhbmQgJ25vLWxpYnRvb2wnIG9yICd1c2UtbGlidG9vbCcgZm9yIHBhY2thZ2VzIHdpdGggYW4gaW50bCBkaXJlY3RvcnkuCitkbmwgICAgSWYgSU5UTFNZTUJPTCBpcyAndXNlLWxpYnRvb2wnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5CitkbmwgICAgJCh0b3BfYnVpbGRkaXIpL2ludGwvbGliaW50bC5sYSB3aWxsIGJlIGNyZWF0ZWQgKHNoYXJlZCBhbmQvb3Igc3RhdGljLAorZG5sICAgIGRlcGVuZGluZyBvbiAtLXtlbmFibGUsZGlzYWJsZX0te3NoYXJlZCxzdGF0aWN9IGFuZCBvbiB0aGUgcHJlc2VuY2Ugb2YKK2RubCAgICBBTS1ESVNBQkxFLVNIQVJFRCkuIElmIElOVExTWU1CT0wgaXMgJ25vLWxpYnRvb2wnLCBhIHN0YXRpYyBsaWJyYXJ5CitkbmwgICAgJCh0b3BfYnVpbGRkaXIpL2ludGwvbGliaW50bC5hIHdpbGwgYmUgY3JlYXRlZC4KK2RubCBJZiBORUVEU1lNQk9MIGlzIHNwZWNpZmllZCBhbmQgaXMgJ25lZWQtbmdldHRleHQnLCB0aGVuIEdOVSBnZXR0ZXh0CitkbmwgICAgaW1wbGVtZW50YXRpb25zIChpbiBsaWJjIG9yIGxpYmludGwpIHdpdGhvdXQgdGhlIG5nZXR0ZXh0KCkgZnVuY3Rpb24KK2RubCAgICB3aWxsIGJlIGlnbm9yZWQuICBJZiBORUVEU1lNQk9MIGlzIHNwZWNpZmllZCBhbmQgaXMKK2RubCAgICAnbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zJywgdGhlbiBHTlUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkb24ndAorZG5sICAgIHN1cHBvcnQgdGhlIElTTyBDIDk5IDxpbnR0eXBlcy5oPiBmb3JtYXRzdHJpbmcgbWFjcm9zIHdpbGwgYmUgaWdub3JlZC4KK2RubCBJTlRMRElSIGlzIHVzZWQgdG8gZmluZCB0aGUgaW50bCBsaWJyYXJpZXMuICBJZiBlbXB0eSwKK2RubCAgICB0aGUgdmFsdWUgYCQodG9wX2J1aWxkZGlyKS9pbnRsLycgaXMgdXNlZC4KK2RubAorZG5sIFRoZSByZXN1bHQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgb25lIG9mIHRocmVlIGNhc2VzOgorZG5sIDEpIEdOVSBnZXR0ZXh0LCBhcyBpbmNsdWRlZCBpbiB0aGUgaW50bCBzdWJkaXJlY3RvcnksIHdpbGwgYmUgY29tcGlsZWQKK2RubCAgICBhbmQgdXNlZC4KK2RubCAgICBDYXRhbG9nIGZvcm1hdDogR05VIC0tPiBpbnN0YWxsIGluICQoZGF0YWRpcikKK2RubCAgICBDYXRhbG9nIGV4dGVuc2lvbjogLm1vIGFmdGVyIGluc3RhbGxhdGlvbiwgLmdtbyBpbiBzb3VyY2UgdHJlZQorZG5sIDIpIEdOVSBnZXR0ZXh0IGhhcyBiZWVuIGZvdW5kIGluIHRoZSBzeXN0ZW0ncyBDIGxpYnJhcnkuCitkbmwgICAgQ2F0YWxvZyBmb3JtYXQ6IEdOVSAtLT4gaW5zdGFsbCBpbiAkKGRhdGFkaXIpCitkbmwgICAgQ2F0YWxvZyBleHRlbnNpb246IC5tbyBhZnRlciBpbnN0YWxsYXRpb24sIC5nbW8gaW4gc291cmNlIHRyZWUKK2RubCAzKSBObyBpbnRlcm5hdGlvbmFsaXphdGlvbiwgYWx3YXlzIHVzZSBFbmdsaXNoIG1zZ2lkLgorZG5sICAgIENhdGFsb2cgZm9ybWF0OiBub25lCitkbmwgICAgQ2F0YWxvZyBleHRlbnNpb246IG5vbmUKK2RubCBJZiBJTlRMU1lNQk9MIGlzICdleHRlcm5hbCcsIG9ubHkgY2FzZXMgMiBhbmQgMyBjYW4gb2NjdXIuCitkbmwgVGhlIHVzZSBvZiAuZ21vIGlzIGhpc3RvcmljYWwgKGl0IHdhcyBuZWVkZWQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdGhlCitkbmwgR05VIGZvcm1hdCBjYXRhbG9ncyB3aGVuIGJ1aWxkaW5nIG9uIGEgcGxhdGZvcm0gd2l0aCBhbiBYL09wZW4gZ2V0dGV4dCksCitkbmwgYnV0IHdlIGtlZXAgaXQgaW4gb3JkZXIgbm90IHRvIGZvcmNlIGlycmVsZXZhbnQgZmlsZW5hbWUgY2hhbmdlcyBvbiB0aGUKK2RubCBtYWludGFpbmVycy4KK2RubAorQUNfREVGVU4oW0FNX0dOVV9HRVRURVhUXSwKK1sKKyAgZG5sIEFyZ3VtZW50IGNoZWNraW5nLgorICBpZmVsc2UoWyQxXSwgW10sICwgW2lmZWxzZShbJDFdLCBbZXh0ZXJuYWxdLCAsIFtpZmVsc2UoWyQxXSwgW25vLWxpYnRvb2xdLCAsIFtpZmVsc2UoWyQxXSwgW3VzZS1saWJ0b29sXSwgLAorICAgIFtlcnJwcmludChbRVJST1I6IGludmFsaWQgZmlyc3QgYXJndW1lbnQgdG8gQU1fR05VX0dFVFRFWFQKK10pXSldKV0pXSkKKyAgaWZlbHNlKFskMl0sIFtdLCAsIFtpZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCAsIFtpZmVsc2UoWyQyXSwgW25lZWQtZm9ybWF0c3RyaW5nLW1hY3Jvc10sICwKKyAgICBbZXJycHJpbnQoW0VSUk9SOiBpbnZhbGlkIHNlY29uZCBhcmd1bWVudCB0byBBTV9HTlVfR0VUVEVYVAorXSldKV0pXSkKKyAgZGVmaW5lKGd0X2luY2x1ZGVkX2ludGwsIGlmZWxzZShbJDFdLCBbZXh0ZXJuYWxdLCBbbm9dLCBbeWVzXSkpCisgIGRlZmluZShndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXgsIGlmZWxzZShbJDFdLCBbdXNlLWxpYnRvb2xdLCBbbF0sIFtdKSkKKworICBBQ19SRVFVSVJFKFtBTV9QT19TVUJESVJTXSlkbmwKKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgIEFDX1JFUVVJUkUoW0FNX0lOVExfU1VCRElSXSlkbmwKKyAgXSkKKworICBkbmwgUHJlcmVxdWlzaXRlcyBvZiBBQ19MSUJfTElOS0ZMQUdTX0JPRFkuCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9QUkVQQVJFX1BSRUZJWF0pCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9SUEFUSF0pCisKKyAgZG5sIFNvbWV0aW1lcyBsaWJpbnRsIHJlcXVpcmVzIGxpYmljb252LCBzbyBmaXJzdCBzZWFyY2ggZm9yIGxpYmljb252LgorICBkbmwgSWRlYWxseSB3ZSB3b3VsZCBkbyB0aGlzIHNlYXJjaCBvbmx5IGFmdGVyIHRoZQorICBkbmwgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICBkbmwgICAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKyAgZG5sIHRlc3RzLiBCdXQgaWYgY29uZmlndXJlLmluIGludm9rZXMgQU1fSUNPTlYgYWZ0ZXIgQU1fR05VX0dFVFRFWFQKKyAgZG5sIHRoZSBjb25maWd1cmUgc2NyaXB0IHdvdWxkIG5lZWQgdG8gY29udGFpbiB0aGUgc2FtZSBzaGVsbCBjb2RlCisgIGRubCBhZ2Fpbiwgb3V0c2lkZSBhbnkgJ2lmJy4gVGhlcmUgYXJlIHR3byBzb2x1dGlvbnM6CisgIGRubCAtIEludm9rZSBBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWSBoZXJlLCBvdXRzaWRlIGFueSAnaWYnLgorICBkbmwgLSBDb250cm9sIHRoZSBleHBhbnNpb25zIGluIG1vcmUgZGV0YWlsIHVzaW5nIEFDX1BST1ZJREVfSUZFTFNFLgorICBkbmwgU2luY2UgQUNfUFJPVklERV9JRkVMU0UgaXMgb25seSBpbiBhdXRvY29uZiA+PSAyLjUyIGFuZCBub3QKKyAgZG5sIGRvY3VtZW50ZWQsIHdlIGF2b2lkIGl0LgorICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCAsIFsKKyAgICBBQ19SRVFVSVJFKFtBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWV0pCisgIF0pCisKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQorICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUworICBBQ19BUkdfRU5BQkxFKG5scywKKyAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKKyAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQorICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQorICBBQ19TVUJTVChVU0VfTkxTKQorCisgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsIFsKKyAgICBCVUlMRF9JTkNMVURFRF9MSUJJTlRMPW5vCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKyAgXSkKKyAgTElCSU5UTD0KKyAgTFRMSUJJTlRMPQorICBQT1NVQj0KKworICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCisgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0PW5vCisgICAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKKyAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCisgICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKKyAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgXSkKKyAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAorICAgICAgICBkbmwgdG8gdXNlLiAgSWYgR05VIGdldHRleHQgaXMgYXZhaWxhYmxlIHdlIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlCisgICAgICAgIGRubCB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgorCisgICAgICAgIGRubCBBZGQgYSB2ZXJzaW9uIG51bWJlciB0byB0aGUgY2FjaGUgbWFjcm9zLgorICAgICAgICBkZWZpbmUoW2d0X2FwaV92ZXJzaW9uXSwgaWZlbHNlKFskMl0sIFtuZWVkLWZvcm1hdHN0cmluZy1tYWNyb3NdLCAzLCBpZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCAyLCAxKSkpCisgICAgICAgIGRlZmluZShbZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmNdLCBbZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0XWd0X2FwaV92ZXJzaW9uW19saWJjXSkKKyAgICAgICAgZGVmaW5lKFtndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bF0sIFtndF9jdl9mdW5jX2dudWdldHRleHRdZ3RfYXBpX3ZlcnNpb25bX2xpYmludGxdKQorCisgICAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgR05VIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjLAorICAgICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPgorXWlmZWxzZShbJDJdLCBbbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zXSwKK1sjaWZuZGVmIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OCisjZGVmaW5lIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKG1ham9yKSAoKG1ham9yKSA9PSAwID8gMCA6IC0xKQorI2VuZGlmCitjaGFuZ2VxdW90ZSgsKWRubAordHlwZWRlZiBpbnQgYXJyYXkgWzIgKiAoX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04oMCkgPj0gMSkgLSAxXTsKK2NoYW5nZXF1b3RlKFssXSlkbmwKK10sIFtdKVtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CitleHRlcm4gaW50ICpfbmxfZG9tYWluX2JpbmRpbmdzO10sCisgICAgICAgICAgICBbYmluZHRleHRkb21haW4gKCIiLCAiIik7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXWlmZWxzZShbJDJdLCBbbmVlZC1uZ2V0dGV4dF0sIFsgKyAoaW50KSBuZ2V0dGV4dCAoIiIsICIiLCAwKV0sIFtdKVsgKyBfbmxfbXNnX2NhdF9jbnRyICsgKl9ubF9kb21haW5fYmluZGluZ3NdLAorICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmM9eWVzLAorICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmM9bm8pXSkKKworICAgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgZG5sIFNvbWV0aW1lcyBsaWJpbnRsIHJlcXVpcmVzIGxpYmljb252LCBzbyBmaXJzdCBzZWFyY2ggZm9yIGxpYmljb252LgorICAgICAgICAgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsICwgWworICAgICAgICAgICAgQU1fSUNPTlZfTElOSworICAgICAgICAgIF0pCisgICAgICAgICAgZG5sIFNlYXJjaCBmb3IgbGliaW50bCBhbmQgZGVmaW5lIExJQklOVEwsIExUTElCSU5UTCBhbmQgSU5DSU5UTAorICAgICAgICAgIGRubCBhY2NvcmRpbmdseS4gRG9uJ3QgdXNlIEFDX0xJQl9MSU5LRkxBR1NfQk9EWShbaW50bF0sW2ljb252XSkKKyAgICAgICAgICBkbmwgYmVjYXVzZSB0aGF0IHdvdWxkIGFkZCAiLWxpY29udiIgdG8gTElCSU5UTCBhbmQgTFRMSUJJTlRMCisgICAgICAgICAgZG5sIGV2ZW4gaWYgbGliaWNvbnYgZG9lc24ndCBleGlzdC4KKyAgICAgICAgICBBQ19MSUJfTElOS0ZMQUdTX0JPRFkoW2ludGxdKQorICAgICAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgR05VIGdldHRleHQgaW4gbGliaW50bF0sCisgICAgICAgICAgICBndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bCwKKyAgICAgICAgICAgW2d0X3NhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJElOQ0lOVEwiCisgICAgICAgICAgICBndF9zYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICAgICAgTElCUz0iJExJQlMgJExJQklOVEwiCisgICAgICAgICAgICBkbmwgTm93IHNlZSB3aGV0aGVyIGxpYmludGwgZXhpc3RzIGFuZCBkb2VzIG5vdCBkZXBlbmQgb24gbGliaWNvbnYuCisgICAgICAgICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD4KK11pZmVsc2UoWyQyXSwgW25lZWQtZm9ybWF0c3RyaW5nLW1hY3Jvc10sCitbI2lmbmRlZiBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTgorI2RlZmluZSBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTihtYWpvcikgKChtYWpvcikgPT0gMCA/IDAgOiAtMSkKKyNlbmRpZgorY2hhbmdlcXVvdGUoLClkbmwKK3R5cGVkZWYgaW50IGFycmF5IFsyICogKF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKDApID49IDEpIC0gMV07CitjaGFuZ2VxdW90ZShbLF0pZG5sCitdLCBbXSlbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworZXh0ZXJuCisjaWZkZWYgX19jcGx1c3BsdXMKKyJDIgorI2VuZGlmCitjb25zdCBjaGFyICpfbmxfZXhwYW5kX2FsaWFzICgpO10sCisgICAgICAgICAgICAgIFtiaW5kdGV4dGRvbWFpbiAoIiIsICIiKTsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildaWZlbHNlKFskMl0sIFtuZWVkLW5nZXR0ZXh0XSwgWyArIChpbnQpIG5nZXR0ZXh0ICgiIiwgIiIsIDApXSwgW10pWyArIF9ubF9tc2dfY2F0X2NudHIgKyAqX25sX2V4cGFuZF9hbGlhcyAoMCldLAorICAgICAgICAgICAgICBndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bD15ZXMsCisgICAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsPW5vKQorICAgICAgICAgICAgZG5sIE5vdyBzZWUgd2hldGhlciBsaWJpbnRsIGV4aXN0cyBhbmQgZGVwZW5kcyBvbiBsaWJpY29udi4KKyAgICAgICAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bCIgIT0geWVzICYmIHRlc3QgLW4gIiRMSUJJQ09OViI7IHRoZW4KKyAgICAgICAgICAgICAgTElCUz0iJExJQlMgJExJQklDT05WIgorICAgICAgICAgICAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD4KK11pZmVsc2UoWyQyXSwgW25lZWQtZm9ybWF0c3RyaW5nLW1hY3Jvc10sCitbI2lmbmRlZiBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTgorI2RlZmluZSBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTihtYWpvcikgKChtYWpvcikgPT0gMCA/IDAgOiAtMSkKKyNlbmRpZgorY2hhbmdlcXVvdGUoLClkbmwKK3R5cGVkZWYgaW50IGFycmF5IFsyICogKF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKDApID49IDEpIC0gMV07CitjaGFuZ2VxdW90ZShbLF0pZG5sCitdLCBbXSlbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworZXh0ZXJuCisjaWZkZWYgX19jcGx1c3BsdXMKKyJDIgorI2VuZGlmCitjb25zdCBjaGFyICpfbmxfZXhwYW5kX2FsaWFzICgpO10sCisgICAgICAgICAgICAgICAgW2JpbmR0ZXh0ZG9tYWluICgiIiwgIiIpOworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV1pZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCBbICsgKGludCkgbmdldHRleHQgKCIiLCAiIiwgMCldLCBbXSlbICsgX25sX21zZ19jYXRfY250ciArICpfbmxfZXhwYW5kX2FsaWFzICgwKV0sCisgICAgICAgICAgICAgICBbTElCSU5UTD0iJExJQklOVEwgJExJQklDT05WIgorICAgICAgICAgICAgICAgIExUTElCSU5UTD0iJExUTElCSU5UTCAkTFRMSUJJQ09OViIKKyAgICAgICAgICAgICAgICBndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bD15ZXMKKyAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgQ1BQRkxBR1M9IiRndF9zYXZlX0NQUEZMQUdTIgorICAgICAgICAgICAgTElCUz0iJGd0X3NhdmVfTElCUyJdKQorICAgICAgICBmaQorCisgICAgICAgIGRubCBJZiBhbiBhbHJlYWR5IHByZXNlbnQgb3IgcHJlaW5zdGFsbGVkIEdOVSBnZXR0ZXh0KCkgaXMgZm91bmQsCisgICAgICAgIGRubCB1c2UgaXQuICBCdXQgaWYgdGhpcyBtYWNybyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0LCBhbmQgR05VCisgICAgICAgIGRubCBnZXR0ZXh0IGlzIGFscmVhZHkgcHJlaW5zdGFsbGVkIGluIGxpYmludGwsIHdlIHVwZGF0ZSB0aGlzCisgICAgICAgIGRubCBsaWJpbnRsLiAgKENmLiB0aGUgaW5zdGFsbCBydWxlIGluIGludGwvTWFrZWZpbGUuaW4uKQorICAgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmMiID0gInllcyIgXAorICAgICAgICAgICB8fCB7IHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bCIgPSAieWVzIiBcCisgICAgICAgICAgICAgICAgJiYgdGVzdCAiJFBBQ0tBR0UiICE9IGdldHRleHQ7IH07IHRoZW4KKyAgICAgICAgICBndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQ9eWVzCisgICAgICAgIGVsc2UKKyAgICAgICAgICBkbmwgUmVzZXQgdGhlIHZhbHVlcyBzZXQgYnkgc2VhcmNoaW5nIGZvciBsaWJpbnRsLgorICAgICAgICAgIExJQklOVEw9CisgICAgICAgICAgTFRMSUJJTlRMPQorICAgICAgICAgIElOQ0lOVEw9CisgICAgICAgIGZpCisKKyAgICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCBbCisgICAgICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgZG5sIEdOVSBnZXR0ZXh0IGlzIG5vdCBmb3VuZCBpbiB0aGUgQyBsaWJyYXJ5LgorICAgICAgICAgIGRubCBGYWxsIGJhY2sgb24gaW5jbHVkZWQgR05VIGdldHRleHQgbGlicmFyeS4KKyAgICAgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KKyAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgQlVJTERfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIExJQklOVEw9ImlmZWxzZShbJDNdLFtdLFwke3RvcF9idWlsZGRpcn0vaW50bCxbJDNdKS9saWJpbnRsLltdZ3RfbGlidG9vbF9zdWZmaXhfcHJlZml4W11hICRMSUJJQ09OViIKKyAgICAgICAgTFRMSUJJTlRMPSJpZmVsc2UoWyQzXSxbXSxcJHt0b3BfYnVpbGRkaXJ9L2ludGwsWyQzXSkvbGliaW50bC5bXWd0X2xpYnRvb2xfc3VmZml4X3ByZWZpeFtdYSAkTFRMSUJJQ09OViIKKyAgICAgICAgTElCUz1gZWNobyAiICRMSUJTICIgfCBzZWQgLWUgJ3MvIC1saW50bCAvIC8nIC1lICdzL14gLy8nIC1lICdzLyAkLy8nYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dCIgPSAieWVzIiBcCisgICAgICAgICB8fCB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHRvIHVzZSBHTlUgZ2V0dGV4dCB0b29scy4KKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgIGZpCisgICAgXSkKKworICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyIgXAorICAgICAgIHx8IHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwKKyAgICAgICAgW0RlZmluZSB0byAxIGlmIHRyYW5zbGF0aW9uIG9mIHByb2dyYW0gbWVzc2FnZXMgdG8gdGhlIHVzZXIncyBuYXRpdmUgbGFuZ3VhZ2UKKyAgIGlzIHJlcXVlc3RlZC5dKQorICAgIGVsc2UKKyAgICAgIFVTRV9OTFM9bm8KKyAgICBmaQorICBmaQorCisgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisKKyAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gbGluayB3aXRoIGxpYmludGxdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKFskTElCSU5UTF0pCisgICAgICAgIEFDX0xJQl9BUFBFTkRUT1ZBUihbQ1BQRkxBR1NdLCBbJElOQ0lOVExdKQorICAgICAgZmkKKworICAgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIHBhY2thZ2VzIG1heSBiZSB1c2luZyB0aGlzLgorICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKKyAgICAgICBbRGVmaW5lIGlmIHRoZSBHTlUgZ2V0dGV4dCgpIGZ1bmN0aW9uIGlzIGFscmVhZHkgcHJlc2VudCBvciBwcmVpbnN0YWxsZWQuXSkKKyAgICAgIEFDX0RFRklORShIQVZFX0RDR0VUVEVYVCwgMSwKKyAgICAgICBbRGVmaW5lIGlmIHRoZSBHTlUgZGNnZXR0ZXh0KCkgZnVuY3Rpb24gaXMgYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZC5dKQorICAgIGZpCisKKyAgICBkbmwgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgIFBPU1VCPXBvCisgIGZpCisKKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgIGRubCBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgQlVJTERfSU5DTFVERURfTElCSU5UTAorICAgIGRubCB0byAneWVzJyBiZWNhdXNlIHNvbWUgb2YgdGhlIHRlc3RzdWl0ZSByZXF1aXJlcyBpdC4KKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCisgICAgICBCVUlMRF9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KKyAgICBBQ19TVUJTVChCVUlMRF9JTkNMVURFRF9MSUJJTlRMKQorICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQorICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKKyAgICBBQ19TVUJTVChJTlRMT0JKUykKKworICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBjb25maWd1cmUuaW5zIG1heSBiZSB1c2luZyB0aGlzLgorICAgIG5sc19jdl9oZWFkZXJfaW50bD0KKyAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PQorCisgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQorCisgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgICBJTlNUT0JKRVhUPS5tbworICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCisKKyAgICBkbmwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFNvbWUgTWFrZWZpbGVzIG1heSBiZSB1c2luZyB0aGlzLgorICAgIEdFTkNBVD1nZW5jYXQKKyAgICBBQ19TVUJTVChHRU5DQVQpCisKKyAgICBkbmwgRW5hYmxlIGxpYnRvb2wgc3VwcG9ydCBpZiB0aGUgc3Vycm91bmRpbmcgcGFja2FnZSB3aXNoZXMgaXQuCisgICAgSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVg9Z3RfbGlidG9vbF9zdWZmaXhfcHJlZml4CisgICAgQUNfU1VCU1QoSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVgpCisgIF0pCisKKyAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgSU5UTExJQlM9IiRMSUJJTlRMIgorICBBQ19TVUJTVChJTlRMTElCUykKKworICBkbmwgTWFrZSBhbGwgZG9jdW1lbnRlZCB2YXJpYWJsZXMga25vd24gdG8gYXV0b2NvbmYuCisgIEFDX1NVQlNUKExJQklOVEwpCisgIEFDX1NVQlNUKExUTElCSU5UTCkKKyAgQUNfU1VCU1QoUE9TVUIpCitdKQorCisKK2RubCBDaGVja3MgZm9yIGFsbCBwcmVyZXF1aXNpdGVzIG9mIHRoZSBwbyBzdWJkaXJlY3RvcnksCitkbmwgZXhjZXB0IGZvciBVU0VfTkxTLgorQUNfREVGVU4oW0FNX1BPX1NVQkRJUlNdLAorWworICBBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKKyAgQUNfUkVRVUlSRShbQU1fTUtJTlNUQUxMRElSU10pZG5sCisKKyAgZG5sIFBlcmZvcm0gdGhlIGZvbGxvd2luZyB0ZXN0cyBhbHNvIGlmIC0tZGlzYWJsZS1ubHMgaGFzIGJlZW4gZ2l2ZW4sCisgIGRubCBiZWNhdXNlIHRoZXkgYXJlIG5lZWRlZCBmb3IgIm1ha2UgZGlzdCIgdG8gd29yay4KKworICBkbmwgU2VhcmNoIGZvciBHTlUgbXNnZm10IGluIHRoZSBQQVRILgorICBkbmwgVGhlIGZpcnN0IHRlc3QgZXhjbHVkZXMgU29sYXJpcyBtc2dmbXQgYW5kIGVhcmx5IEdOVSBtc2dmbXQgdmVyc2lvbnMuCisgIGRubCBUaGUgc2Vjb25kIHRlc3QgZXhjbHVkZXMgRnJlZUJTRCBtc2dmbXQuCisgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCisgICAgWyRhY19kaXIvJGFjX3dvcmQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgKGlmICRhY19kaXIvJGFjX3dvcmQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpXSwKKyAgICA6KQorICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKworICBkbmwgU2VhcmNoIGZvciBHTlUgeGdldHRleHQgMC4xMSBvciBuZXdlciBpbiB0aGUgUEFUSC4KKyAgZG5sIFRoZSBmaXJzdCB0ZXN0IGV4Y2x1ZGVzIFNvbGFyaXMgeGdldHRleHQgYW5kIGVhcmx5IEdOVSB4Z2V0dGV4dCB2ZXJzaW9ucy4KKyAgZG5sIFRoZSBzZWNvbmQgdGVzdCBleGNsdWRlcyBGcmVlQlNEIHhnZXR0ZXh0LgorICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKKyAgICBbJGFjX2Rpci8kYWNfd29yZCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJgorICAgICAoaWYgJGFjX2Rpci8kYWNfd29yZCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gL2Rldi9udWxsIDI+JjEgPi9kZXYvbnVsbCB8IGdyZXAgdXNhZ2UgPi9kZXYvbnVsbDsgdGhlbiBleGl0IDE7IGVsc2UgZXhpdCAwOyBmaSldLAorICAgIDopCisgIGRubCBSZW1vdmUgbGVmdG92ZXIgZnJvbSBGcmVlQlNEIHhnZXR0ZXh0IGNhbGwuCisgIHJtIC1mIG1lc3NhZ2VzLnBvCisKKyAgZG5sIFNlYXJjaCBmb3IgR05VIG1zZ21lcmdlIDAuMTEgb3IgbmV3ZXIgaW4gdGhlIFBBVEguCisgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHTUVSR0UsIG1zZ21lcmdlLAorICAgIFskYWNfZGlyLyRhY193b3JkIC0tdXBkYXRlIC1xIC9kZXYvbnVsbCAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxXSwgOikKKworICBkbmwgVGhpcyBjb3VsZCBnbyBhd2F5IHNvbWUgZGF5OyB0aGUgUEFUSF9QUk9HX1dJVEhfVEVTVCBhbHJlYWR5IGRvZXMgaXQuCisgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSBtc2dmbXQuCisgIGlmIHRlc3QgIiRHTVNHRk1UIiAhPSAiOiI7IHRoZW4KKyAgICBkbmwgSWYgaXQgaXMgbm8gR05VIG1zZ2ZtdCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQorICAgIGRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCisgICAgaWYgJEdNU0dGTVQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAoaWYgJEdNU0dGTVQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisgICAgICA6IDsKKyAgICBlbHNlCisgICAgICBHTVNHRk1UPWBlY2hvICIkR01TR0ZNVCIgfCBzZWQgLWUgJ3MsXi4qLywsJ2AKKyAgICAgIEFDX01TR19SRVNVTFQoCisgICAgICAgIFtmb3VuZCAkR01TR0ZNVCBwcm9ncmFtIGlzIG5vdCBHTlUgbXNnZm10OyBpZ25vcmUgaXRdKQorICAgICAgR01TR0ZNVD0iOiIKKyAgICBmaQorICBmaQorCisgIGRubCBUaGlzIGNvdWxkIGdvIGF3YXkgc29tZSBkYXk7IHRoZSBQQVRIX1BST0dfV0lUSF9URVNUIGFscmVhZHkgZG9lcyBpdC4KKyAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgorICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorICAgIGRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKKyAgICBkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgorICAgIGlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJgorICAgICAgIChpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAtLWNvcHlyaWdodC1ob2xkZXI9IC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisgICAgICA6IDsKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKAorICAgICAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbSBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQorICAgICAgWEdFVFRFWFQ9IjoiCisgICAgZmkKKyAgICBkbmwgUmVtb3ZlIGxlZnRvdmVyIGZyb20gRnJlZUJTRCB4Z2V0dGV4dCBjYWxsLgorICAgIHJtIC1mIG1lc3NhZ2VzLnBvCisgIGZpCisKKyAgQUNfT1VUUFVUX0NPTU1BTkRTKFsKKyAgICBmb3IgYWNfZmlsZSBpbiAkQ09ORklHX0ZJTEVTOyBkbworICAgICAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIgorICAgICAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICAgICAgICo6KikgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICAgICBlc2FjCisgICAgICAjIFBPIGRpcmVjdG9yaWVzIGhhdmUgYSBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbi5pbi4KKyAgICAgIGNhc2UgIiRhY19maWxlIiBpbiAqL01ha2VmaWxlLmluKQorICAgICAgICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2Rpci4KKyAgICAgICAgYWNfZGlyPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gIiRhY19kaXIifHNlZCAncyVeXC4vJSUnYCIKKyAgICAgICAgYWNfZG90cz1gZWNobyAiJGFjX2Rpcl9zdWZmaXgifHNlZCAncyUvW14vXSolLi4vJWcnYAorICAgICAgICAjIEluIGF1dG9jb25mLTIuMTMgaXQgaXMgY2FsbGVkICRhY19naXZlbl9zcmNkaXIuCisgICAgICAgICMgSW4gYXV0b2NvbmYtMi41MCBpdCBpcyBjYWxsZWQgJHNyY2Rpci4KKyAgICAgICAgdGVzdCAtbiAiJGFjX2dpdmVuX3NyY2RpciIgfHwgYWNfZ2l2ZW5fc3JjZGlyPSIkc3JjZGlyIgorICAgICAgICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAgICAgICAgIC4pICB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2AgOzsKKyAgICAgICAgICAvKikgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgICAgICAgICAqKSAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAgICAgICBlc2FjCisgICAgICAgIGlmIHRlc3QgLWYgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9QT1RGSUxFUy5pbiI7IHRoZW4KKyAgICAgICAgICBybSAtZiAiJGFjX2Rpci9QT1RGSUxFUyIKKyAgICAgICAgICB0ZXN0IC1uICIkYXNfbWUiICYmIGVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2Rpci9QT1RGSUxFUyIgfHwgZWNobyAiY3JlYXRpbmcgJGFjX2Rpci9QT1RGSUxFUyIKKyAgICAgICAgICBjYXQgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9QT1RGSUxFUy5pbiIgfCBzZWQgLWUgIi9eIy9kIiAtZSAiL15bIAldKlwkL2QiIC1lICJzLC4qLCAgICAgJHRvcF9zcmNkaXIvJiBcXFxcLCIgfCBzZWQgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iID4gIiRhY19kaXIvUE9URklMRVMiCisgICAgICAgICAgIyBBTExfTElOR1VBUywgUE9GSUxFUywgR01PRklMRVMsIFVQREFURVBPRklMRVMsIERVTU1ZUE9GSUxFUyBkZXBlbmQKKyAgICAgICAgICAjIG9uICRhY19kaXIgYnV0IGRvbid0IGRlcGVuZCBvbiB1c2VyLXNwZWNpZmllZCBjb25maWd1cmF0aW9uCisgICAgICAgICAgIyBwYXJhbWV0ZXJzLgorICAgICAgICAgIGlmIHRlc3QgLWYgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTIjsgdGhlbgorICAgICAgICAgICAgIyBUaGUgTElOR1VBUyBmaWxlIGNvbnRhaW5zIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGxhbmd1YWdlcy4KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRBTExfTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgICAgdGVzdCAtbiAiJGFzX21lIiAmJiBlY2hvICIkYXNfbWU6IHNldHRpbmcgQUxMX0xJTkdVQVMgaW4gY29uZmlndXJlLmluIGlzIG9ic29sZXRlIiB8fCBlY2hvICJzZXR0aW5nIEFMTF9MSU5HVUFTIGluIGNvbmZpZ3VyZS5pbiBpcyBvYnNvbGV0ZSIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBBTExfTElOR1VBU189YHNlZCAtZSAiL14jL2QiICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyJgCisgICAgICAgICAgICAjIEhpZGUgdGhlIEFMTF9MSU5HVUFTIGFzc2lnbWVudCBmcm9tIGF1dG9tYWtlLgorICAgICAgICAgICAgZXZhbCAnQUxMX0xJTkdVQVMnJz0kQUxMX0xJTkdVQVNfJworICAgICAgICAgIGZpCisgICAgICAgICAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgICAgICAgICAgIC4pIHNyY2RpcnByZT0gOzsKKyAgICAgICAgICAgICopIHNyY2RpcnByZT0nJChzcmNkaXIpLycgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgICAgUE9GSUxFUz0KKyAgICAgICAgICBHTU9GSUxFUz0KKyAgICAgICAgICBVUERBVEVQT0ZJTEVTPQorICAgICAgICAgIERVTU1ZUE9GSUxFUz0KKyAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICAgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkc3JjZGlycHJlJGxhbmcucG8iCisgICAgICAgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRzcmNkaXJwcmUkbGFuZy5nbW8iCisgICAgICAgICAgICBVUERBVEVQT0ZJTEVTPSIkVVBEQVRFUE9GSUxFUyAkbGFuZy5wby11cGRhdGUiCisgICAgICAgICAgICBEVU1NWVBPRklMRVM9IiREVU1NWVBPRklMRVMgJGxhbmcubm9wIgorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIENBVEFMT0dTIGRlcGVuZHMgb24gYm90aCAkYWNfZGlyIGFuZCB0aGUgdXNlcidzIExJTkdVQVMKKyAgICAgICAgICAjIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAgICAgIElOU1RfTElOR1VBUz0KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkQUxMX0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICBmb3IgcHJlc2VudGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgICAgICAgICB1c2VpdD1ubworICAgICAgICAgICAgICBpZiB0ZXN0ICIlVU5TRVQlIiAhPSAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICAgICAgZGVzaXJlZGxhbmd1YWdlcz0iJExJTkdVQVMiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkQUxMX0xJTkdVQVMiCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZvciBkZXNpcmVkbGFuZyBpbiAkZGVzaXJlZGxhbmd1YWdlczsgZG8KKyAgICAgICAgICAgICAgICAjIFVzZSB0aGUgcHJlc2VudGxhbmcgY2F0YWxvZyBpZiBkZXNpcmVkbGFuZyBpcworICAgICAgICAgICAgICAgICMgICBhLiBlcXVhbCB0byBwcmVzZW50bGFuZywgb3IKKyAgICAgICAgICAgICAgICAjICAgYi4gYSB2YXJpYW50IG9mIHByZXNlbnRsYW5nIChiZWNhdXNlIGluIHRoaXMgY2FzZSwKKyAgICAgICAgICAgICAgICAjICAgICAgcHJlc2VudGxhbmcgY2FuIGJlIHVzZWQgYXMgYSBmYWxsYmFjayBmb3IgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAjICAgICAgd2hpY2ggYXJlIG5vdCB0cmFuc2xhdGVkIGluIHRoZSBkZXNpcmVkbGFuZyBjYXRhbG9nKS4KKyAgICAgICAgICAgICAgICBjYXNlICIkZGVzaXJlZGxhbmciIGluCisgICAgICAgICAgICAgICAgICAiJHByZXNlbnRsYW5nIiopIHVzZWl0PXllczs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgIGlmIHRlc3QgJHVzZWl0ID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgSU5TVF9MSU5HVUFTPSIkSU5TVF9MSU5HVUFTICRwcmVzZW50bGFuZyIKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorICAgICAgICAgIENBVEFMT0dTPQorICAgICAgICAgIGlmIHRlc3QgLW4gIiRJTlNUX0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICBmb3IgbGFuZyBpbiAkSU5TVF9MSU5HVUFTOyBkbworICAgICAgICAgICAgICBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nLmdtbyIKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIiB8fCBlY2hvICJjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIgorICAgICAgICAgIHNlZCAtZSAiL15QT1RGSUxFUyA9L3IgJGFjX2Rpci9QT1RGSUxFUyIgLWUgIi9eIyBNYWtldmFycy9yICRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9NYWtldmFycyIgLWUgInN8QFBPRklMRVNAfCRQT0ZJTEVTfGciIC1lICJzfEBHTU9GSUxFU0B8JEdNT0ZJTEVTfGciIC1lICJzfEBVUERBVEVQT0ZJTEVTQHwkVVBEQVRFUE9GSUxFU3xnIiAtZSAic3xARFVNTVlQT0ZJTEVTQHwkRFVNTVlQT0ZJTEVTfGciIC1lICJzfEBDQVRBTE9HU0B8JENBVEFMT0dTfGciICIkYWNfZGlyL01ha2VmaWxlLmluIiA+ICIkYWNfZGlyL01ha2VmaWxlIgorICAgICAgICAgIGZvciBmIGluICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIiL1J1bGVzLSo7IGRvCisgICAgICAgICAgICBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKyAgICAgICAgICAgICAgY2FzZSAiJGYiIGluCisgICAgICAgICAgICAgICAgKi5vcmlnIHwgKi5iYWsgfCAqfikgOzsKKyAgICAgICAgICAgICAgICAqKSBjYXQgIiRmIiA+PiAiJGFjX2Rpci9NYWtlZmlsZSIgOzsKKyAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZG9uZV0sCisgICBbIyBDYXB0dXJlIHRoZSB2YWx1ZSBvZiBvYnNvbGV0ZSAkQUxMX0xJTkdVQVMgYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGNvbXB1dGUKKyAgICAjIFBPRklMRVMsIEdNT0ZJTEVTLCBVUERBVEVQT0ZJTEVTLCBEVU1NWVBPRklMRVMsIENBVEFMT0dTLiBCdXQgaGlkZSBpdAorICAgICMgZnJvbSBhdXRvbWFrZS4KKyAgICBldmFsICdBTExfTElOR1VBUycnPSIkQUxMX0xJTkdVQVMiJworICAgICMgQ2FwdHVyZSB0aGUgdmFsdWUgb2YgTElOR1VBUyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gY29tcHV0ZSBDQVRBTE9HUy4KKyAgICBMSU5HVUFTPSIke0xJTkdVQVMtJVVOU0VUJX0iCisgICBdKQorXSkKKworCitkbmwgQ2hlY2tzIGZvciBhbGwgcHJlcmVxdWlzaXRlcyBvZiB0aGUgaW50bCBzdWJkaXJlY3RvcnksCitkbmwgZXhjZXB0IGZvciBJTlRMX0xJQlRPT0xfU1VGRklYX1BSRUZJWCAoYW5kIHBvc3NpYmx5IExJQlRPT0wpLCBJTlRMT0JKUywKK2RubCAgICAgICAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMLCBCVUlMRF9JTkNMVURFRF9MSUJJTlRMLgorQUNfREVGVU4oW0FNX0lOVExfU1VCRElSXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKKyAgQUNfUkVRVUlSRShbQU1fTUtJTlNUQUxMRElSU10pZG5sCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAorICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAorICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAorICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCisgIEFDX1JFUVVJUkUoW2ptX0dMSUJDMjFdKWRubAorICBBQ19SRVFVSVJFKFtndF9JTlRESVYwXSlkbmwKKyAgQUNfUkVRVUlSRShbam1fQUNfVFlQRV9VSU5UTUFYX1RdKWRubAorICBBQ19SRVFVSVJFKFtndF9IRUFERVJfSU5UVFlQRVNfSF0pZG5sCisgIEFDX1JFUVVJUkUoW2d0X0lOVFRZUEVTX1BSSV0pZG5sCisKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RkZGVmLmggXAorc3RkbGliLmggc3RyaW5nLmggdW5pc3RkLmggc3lzL3BhcmFtLmhdKQorICBBQ19DSEVDS19GVU5DUyhbZmVvZl91bmxvY2tlZCBmZ2V0c191bmxvY2tlZCBnZXRjX3VubG9ja2VkIGdldGN3ZCBnZXRlZ2lkIFwKK2dldGV1aWQgZ2V0Z2lkIGdldHVpZCBtZW1wY3B5IG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHBjcHkgXAorc3RyY2FzZWNtcCBzdHJkdXAgc3RydG91bCB0c2VhcmNoIF9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKKworICBBTV9JQ09OVgorICBBTV9MQU5HSU5GT19DT0RFU0VUCisgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIEFNX0xDX01FU1NBR0VTCisgIGZpCisKKyAgZG5sIGludGwvcGx1cmFsLmMgaXMgZ2VuZXJhdGVkIGZyb20gaW50bC9wbHVyYWwueS4gSXQgcmVxdWlyZXMgYmlzb24sCisgIGRubCBiZWNhdXNlIHBsdXJhbC55IHVzZXMgYmlzb24gc3BlY2lmaWMgZmVhdHVyZXMuIEl0IHJlcXVpcmVzIGF0IGxlYXN0CisgIGRubCBiaXNvbi0xLjI2IGJlY2F1c2UgZWFybGllciB2ZXJzaW9ucyBnZW5lcmF0ZSBhIHBsdXJhbC5jIHRoYXQgZG9lc24ndAorICBkbmwgY29tcGlsZS4KKyAgZG5sIGJpc29uIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgbWFpbnRhaW5lciAod2hvIHRvdWNoZXMgcGx1cmFsLnkpLiBCdXQgaW4KKyAgZG5sIG9yZGVyIHRvIGF2b2lkIHNlcGFyYXRlIE1ha2VmaWxlcyBvciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUsIHdlIHB1dAorICBkbmwgdGhlIHJ1bGUgaW4gZ2VuZXJhbCBNYWtlZmlsZS4gTm93LCBzb21lIHBlb3BsZSBjYXJlbGVzc2x5IHRvdWNoIHRoZQorICBkbmwgZmlsZXMgb3IgaGF2ZSBhIGJyb2tlbiAibWFrZSIgcHJvZ3JhbSwgaGVuY2UgdGhlIHBsdXJhbC5jIHJ1bGUgd2lsbAorICBkbmwgc29tZXRpbWVzIGZpcmUuIFRvIGF2b2lkIGFuIGVycm9yLCBkZWZpbmVzIEJJU09OIHRvICI6IiBpZiBpdCBpcyBub3QKKyAgZG5sIHByZXNlbnQgb3IgdG9vIG9sZC4KKyAgQUNfQ0hFQ0tfUFJPR1MoW0lOVExCSVNPTl0sIFtiaXNvbl0pCisgIGlmIHRlc3QgLXogIiRJTlRMQklTT04iOyB0aGVuCisgICAgYWNfdmVyY19mYWlsPXllcworICBlbHNlCisgICAgZG5sIEZvdW5kIGl0LCBub3cgY2hlY2sgdGhlIHZlcnNpb24uCisgICAgQUNfTVNHX0NIRUNLSU5HKFt2ZXJzaW9uIG9mIGJpc29uXSkKK2NoYW5nZXF1b3RlKDw8LD4+KWRubAorICAgIGFjX3Byb2dfdmVyc2lvbj1gJElOVExCSVNPTiAtLXZlcnNpb24gMj4mMSB8IHNlZCAtbiAncy9eLipHTlUgQmlzb24uKiBcKFswLTldKlwuWzAtOS5dKlwpLiokL1wxL3AnYAorICAgIGNhc2UgJGFjX3Byb2dfdmVyc2lvbiBpbgorICAgICAgJycpIGFjX3Byb2dfdmVyc2lvbj0idi4gPy4/PywgYmFkIjsgYWNfdmVyY19mYWlsPXllczs7CisgICAgICAxLjJbNi05XSogfCAxLlszLTldWzAtOV0qIHwgWzItOV0uKikKK2NoYW5nZXF1b3RlKFssXSlkbmwKKyAgICAgICAgIGFjX3Byb2dfdmVyc2lvbj0iJGFjX3Byb2dfdmVyc2lvbiwgb2siOyBhY192ZXJjX2ZhaWw9bm87OworICAgICAgKikgYWNfcHJvZ192ZXJzaW9uPSIkYWNfcHJvZ192ZXJzaW9uLCBiYWQiOyBhY192ZXJjX2ZhaWw9eWVzOzsKKyAgICBlc2FjCisgICAgQUNfTVNHX1JFU1VMVChbJGFjX3Byb2dfdmVyc2lvbl0pCisgIGZpCisgIGlmIHRlc3QgJGFjX3ZlcmNfZmFpbCA9IHllczsgdGhlbgorICAgIElOVExCSVNPTj06CisgIGZpCitdKQorCisKK0FDX0RFRlVOKFtBTV9NS0lOU1RBTExESVJTXSwKK1sKKyAgZG5sIElmIHRoZSBBQ19DT05GSUdfQVVYX0RJUiBtYWNybyBmb3IgYXV0b2NvbmYgaXMgdXNlZCB3ZSBwb3NzaWJseQorICBkbmwgZmluZCB0aGUgbWtpbnN0YWxsZGlycyBzY3JpcHQgaW4gYW5vdGhlciBzdWJkaXIgYnV0ICQodG9wX3NyY2RpcikuCisgIGRubCBUcnkgdG8gbG9jYXRlIGlzLgorICBNS0lOU1RBTExESVJTPQorICBpZiB0ZXN0IC1uICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgICBNS0lOU1RBTExESVJTPSIkYWNfYXV4X2Rpci9ta2luc3RhbGxkaXJzIgorICBmaQorICBpZiB0ZXN0IC16ICIkTUtJTlNUQUxMRElSUyI7IHRoZW4KKyAgICBNS0lOU1RBTExESVJTPSJcJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzIgorICBmaQorICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQorXSkKKworCitkbmwgVXNhZ2U6IEFNX0dOVV9HRVRURVhUX1ZFUlNJT04oW2dldHRleHQtdmVyc2lvbl0pCitBQ19ERUZVTihbQU1fR05VX0dFVFRFWFRfVkVSU0lPTl0sIFtdKQpkaWZmIC0tZ2l0IGEvbTQvaWNvbnYubTQgYi9tNC9pY29udi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWYzNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvaWNvbnYubTQKQEAgLTAsMCArMSwxMDMgQEAKKyMgaWNvbnYubTQgc2VyaWFsIEFNNCAoZ2V0dGV4dC0wLjExLjMpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworQUNfREVGVU4oW0FNX0lDT05WX0xJTktGTEFHU19CT0RZXSwKK1sKKyAgZG5sIFByZXJlcXVpc2l0ZXMgb2YgQUNfTElCX0xJTktGTEFHU19CT0RZLgorICBBQ19SRVFVSVJFKFtBQ19MSUJfUFJFUEFSRV9QUkVGSVhdKQorICBBQ19SRVFVSVJFKFtBQ19MSUJfUlBBVEhdKQorCisgIGRubCBTZWFyY2ggZm9yIGxpYmljb252IGFuZCBkZWZpbmUgTElCSUNPTlYsIExUTElCSUNPTlYgYW5kIElOQ0lDT05WCisgIGRubCBhY2NvcmRpbmdseS4KKyAgQUNfTElCX0xJTktGTEFHU19CT0RZKFtpY29udl0pCitdKQorCitBQ19ERUZVTihbQU1fSUNPTlZfTElOS10sCitbCisgIGRubCBTb21lIHN5c3RlbXMgaGF2ZSBpY29udiBpbiBsaWJjLCBzb21lIGhhdmUgaXQgaW4gbGliaWNvbnYgKE9TRi8xIGFuZAorICBkbmwgdGhvc2Ugd2l0aCB0aGUgc3RhbmRhbG9uZSBwb3J0YWJsZSBHTlUgbGliaWNvbnYgaW5zdGFsbGVkKS4KKworICBkbmwgU2VhcmNoIGZvciBsaWJpY29udiBhbmQgZGVmaW5lIExJQklDT05WLCBMVExJQklDT05WIGFuZCBJTkNJQ09OVgorICBkbmwgYWNjb3JkaW5nbHkuCisgIEFDX1JFUVVJUkUoW0FNX0lDT05WX0xJTktGTEFHU19CT0RZXSkKKworICBkbmwgQWRkICRJTkNJQ09OViB0byBDUFBGTEFHUyBiZWZvcmUgcGVyZm9ybWluZyB0aGUgZm9sbG93aW5nIGNoZWNrcywKKyAgZG5sIGJlY2F1c2UgaWYgdGhlIHVzZXIgaGFzIGluc3RhbGxlZCBsaWJpY29udiBhbmQgbm90IGRpc2FibGVkIGl0cyB1c2UKKyAgZG5sIHZpYSAtLXdpdGhvdXQtbGliaWNvbnYtcHJlZml4LCBoZSB3YW50cyB0byB1c2UgaXQuIFRoZSBmaXJzdAorICBkbmwgQUNfVFJZX0xJTksgd2lsbCB0aGVuIGZhaWwsIHRoZSBzZWNvbmQgQUNfVFJZX0xJTksgd2lsbCBzdWNjZWVkLgorICBhbV9zYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgIEFDX0xJQl9BUFBFTkRUT1ZBUihbQ1BQRkxBR1NdLCBbJElOQ0lDT05WXSkKKworICBBQ19DQUNIRV9DSEVDSyhmb3IgaWNvbnYsIGFtX2N2X2Z1bmNfaWNvbnYsIFsKKyAgICBhbV9jdl9mdW5jX2ljb252PSJubywgY29uc2lkZXIgaW5zdGFsbGluZyBHTlUgbGliaWNvbnYiCisgICAgYW1fY3ZfbGliX2ljb252PW5vCisgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpY29udi5oPl0sCisgICAgICBbaWNvbnZfdCBjZCA9IGljb252X29wZW4oIiIsIiIpOworICAgICAgIGljb252KGNkLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworICAgICAgIGljb252X2Nsb3NlKGNkKTtdLAorICAgICAgYW1fY3ZfZnVuY19pY29udj15ZXMpCisgICAgaWYgdGVzdCAiJGFtX2N2X2Z1bmNfaWNvbnYiICE9IHllczsgdGhlbgorICAgICAgYW1fc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIExJQlM9IiRMSUJTICRMSUJJQ09OViIKKyAgICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aWNvbnYuaD5dLAorICAgICAgICBbaWNvbnZfdCBjZCA9IGljb252X29wZW4oIiIsIiIpOworICAgICAgICAgaWNvbnYoY2QsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgICBpY29udl9jbG9zZShjZCk7XSwKKyAgICAgICAgYW1fY3ZfbGliX2ljb252PXllcworICAgICAgICBhbV9jdl9mdW5jX2ljb252PXllcykKKyAgICAgIExJQlM9IiRhbV9zYXZlX0xJQlMiCisgICAgZmkKKyAgXSkKKyAgaWYgdGVzdCAiJGFtX2N2X2Z1bmNfaWNvbnYiID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfSUNPTlYsIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGljb252KCkgZnVuY3Rpb24uXSkKKyAgZmkKKyAgaWYgdGVzdCAiJGFtX2N2X2xpYl9pY29udiIgPSB5ZXM7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBsaW5rIHdpdGggbGliaWNvbnZdKQorICAgIEFDX01TR19SRVNVTFQoWyRMSUJJQ09OVl0pCisgIGVsc2UKKyAgICBkbmwgSWYgJExJQklDT05WIGRpZG4ndCBsZWFkIHRvIGEgdXNhYmxlIGxpYnJhcnksIHdlIGRvbid0IG5lZWQgJElOQ0lDT05WCisgICAgZG5sIGVpdGhlci4KKyAgICBDUFBGTEFHUz0iJGFtX3NhdmVfQ1BQRkxBR1MiCisgICAgTElCSUNPTlY9CisgICAgTFRMSUJJQ09OVj0KKyAgZmkKKyAgQUNfU1VCU1QoTElCSUNPTlYpCisgIEFDX1NVQlNUKExUTElCSUNPTlYpCitdKQorCitBQ19ERUZVTihbQU1fSUNPTlZdLAorWworICBBTV9JQ09OVl9MSU5LCisgIGlmIHRlc3QgIiRhbV9jdl9mdW5jX2ljb252IiA9IHllczsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGljb252IGRlY2xhcmF0aW9uXSkKKyAgICBBQ19DQUNIRV9WQUwoYW1fY3ZfcHJvdG9faWNvbnYsIFsKKyAgICAgIEFDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpY29udi5oPgorZXh0ZXJuCisjaWZkZWYgX19jcGx1c3BsdXMKKyJDIgorI2VuZGlmCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK3NpemVfdCBpY29udiAoaWNvbnZfdCBjZCwgY2hhciAqICppbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwgY2hhciAqICpvdXRidWYsIHNpemVfdCAqb3V0Ynl0ZXNsZWZ0KTsKKyNlbHNlCitzaXplX3QgaWNvbnYoKTsKKyNlbmRpZgorXSwgW10sIGFtX2N2X3Byb3RvX2ljb252X2FyZzE9IiIsIGFtX2N2X3Byb3RvX2ljb252X2FyZzE9ImNvbnN0IikKKyAgICAgIGFtX2N2X3Byb3RvX2ljb252PSJleHRlcm4gc2l6ZV90IGljb252IChpY29udl90IGNkLCAkYW1fY3ZfcHJvdG9faWNvbnZfYXJnMSBjaGFyICogKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LCBjaGFyICogKm91dGJ1Ziwgc2l6ZV90ICpvdXRieXRlc2xlZnQpOyJdKQorICAgIGFtX2N2X3Byb3RvX2ljb252PWBlY2hvICJbJF1hbV9jdl9wcm90b19pY29udiIgfCB0ciAtcyAnICcgfCBzZWQgLWUgJ3MvKCAvKC8nYAorICAgIEFDX01TR19SRVNVTFQoWyRde2FjX3Q6LQorICAgICAgICAgfVskXWFtX2N2X3Byb3RvX2ljb252KQorICAgIEFDX0RFRklORV9VTlFVT1RFRChJQ09OVl9DT05TVCwgJGFtX2N2X3Byb3RvX2ljb252X2FyZzEsCisgICAgICBbRGVmaW5lIGFzIGNvbnN0IGlmIHRoZSBkZWNsYXJhdGlvbiBvZiBpY29udigpIG5lZWRzIGNvbnN0Ll0pCisgIGZpCitdKQpkaWZmIC0tZ2l0IGEvbTQvbGNtZXNzYWdlLm00IGIvbTQvbGNtZXNzYWdlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYmY5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9sY21lc3NhZ2UubTQKQEAgLTAsMCArMSwzMiBAQAorIyBsY21lc3NhZ2UubTQgc2VyaWFsIDIgKGdldHRleHQtMC4xMC40MCkKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KK2RubAorZG5sIFRoaXMgZmlsZSBjYW4gY2FuIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIKK2RubCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorZG5sIGZ1bmN0aW9uYWxpdHkuCitkbmwgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgb2YgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaXMgY292ZXJlZAorZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQorZG5sIGdldHRleHQgcGFja2FnZSBwYWNrYWdlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorZG5sIFRoZXkgYXJlICpub3QqIGluIHRoZSBwdWJsaWMgZG9tYWluLgorCitkbmwgQXV0aG9yczoKK2RubCAgIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisKK0FDX0RFRlVOKFtBTV9MQ19NRVNTQUdFU10sCisgIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAorICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCisgICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCisgICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKKyAgICAgICAgW0RlZmluZSBpZiB5b3VyIDxsb2NhbGUuaD4gZmlsZSBkZWZpbmVzIExDX01FU1NBR0VTLl0pCisgICAgZmkKKyAgZmldKQpkaWZmIC0tZ2l0IGEvbTQvcHJvZ3Rlc3QubTQgYi9tNC9wcm9ndGVzdC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDNjOGUzCi0tLSAvZGV2L251bGwKKysrIGIvbTQvcHJvZ3Rlc3QubTQKQEAgLTAsMCArMSw1OSBAQAorIyBwcm9ndGVzdC5tNCBzZXJpYWwgMiAoZ2V0dGV4dC0wLjEwLjQwKQorZG5sIENvcHlyaWdodCAoQykgMTk5Ni0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorZG5sCitkbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgorZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK2RubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0CitkbmwgZnVuY3Rpb25hbGl0eS4KK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCitkbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCitkbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCitkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK2RubCBBdXRob3JzOgorZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisKK2RubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKK2RubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKK0FDX0RFRlVOKFtBTV9QQVRIX1BST0dfV0lUSF9URVNUXSwKK1sjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKK1tjYXNlICJbJF0kMSIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIFskM107IHRoZW4KKwlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitkbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAorZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCitpZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgorXSlkbmwKKyAgOzsKK2VzYWNdKWRubAorJDE9IiRhY19jdl9wYXRoXyQxIgoraWYgdGVzdCBpZmVsc2UoWyQ0XSwgLCBbLW4gIlskXSQxIl0sIFsiWyRdJDEiICE9ICIkNCJdKTsgdGhlbgorICBBQ19NU0dfUkVTVUxUKFskXSQxKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK0FDX1NVQlNUKCQxKWRubAorXSkKZGlmZiAtLWdpdCBhL3BvLy5jdnNpZ25vcmUgYi9wby8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjliYWIKLS0tIC9kZXYvbnVsbAorKysgYi9wby8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK2VsZnV0aWxzLnBvdApkaWZmIC0tZ2l0IGEvcG8vQ2hhbmdlTG9nIGIvcG8vQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMGMwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9wby9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxOSBAQAorMjAwNS0wNy0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmluLmluOiBBZGQgc3JjL2VsZmNtcC4KKworMjAwNS0wNS0wNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmluLmluIChYR0VUVEVYVF9PUFRJT05TKTogRGVmaW5lLgorCisyMDA1LTAyLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogUE9URklMRVMuaW46IFJlbW92ZSB1bm5lY2Vzc2FyeSBlbnRyaWVzLgorCisyMDA0LTAxLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogUE9URklMRVMuaW46IEFkZCBmaWxlcyBmcm9tIGxpYmR3LCBsaWJlYmwsIGFuZCBsaWJhc20uCisKKzIwMDMtMDgtMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNb3ZlZCB0byBDVlMgYXJjaGl2ZS4KZGlmZiAtLWdpdCBhL3BvL01ha2VmaWxlLmluLmluIGIvcG8vTWFrZWZpbGUuaW4uaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkNzg4NQotLS0gL2Rldi9udWxsCisrKyBiL3BvL01ha2VmaWxlLmluLmluCkBAIC0wLDAgKzEsMzAyIEBACisjIE1ha2VmaWxlIGZvciBQTyBkaXJlY3RvcnkgaW4gYW55IHBhY2thZ2UgdXNpbmcgR05VIGdldHRleHQuCisjIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDIgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+CisjCisjIFRoaXMgZmlsZSBjYW4gYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorIyBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiBHTlUgZ2V0dGV4dCBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgaXMgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKKworU0hFTEwgPSAvYmluL3NoCitAU0VUX01BS0VACisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2xvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCitnZXR0ZXh0c3JjZGlyID0gJChkYXRhZGlyKS9nZXR0ZXh0L3BvCit0b3BfYnVpbGRkaXIgPSAuLgorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpIGBjYXNlICIkKE1LSU5TVEFMTERJUlMpIiBpbiAvKikgZWNobyAiJChNS0lOU1RBTExESVJTKSIgOzsgKikgZWNobyAiJCh0b3BfYnVpbGRkaXIpLyQoTUtJTlNUQUxMRElSUykiIDs7IGVzYWNgCisKK0dNU0dGTVQgPSBAR01TR0ZNVEAKK01TR0ZNVCA9IEBNU0dGTVRACitYR0VUVEVYVCA9IEBYR0VUVEVYVEAKK1hHRVRURVhUX09QVElPTlMgPSAtLWZsYWc9ZXJyb3I6MzpjLWZvcm1hdAorTVNHTUVSR0UgPSBtc2dtZXJnZQorTVNHTUVSR0VfVVBEQVRFID0gQE1TR01FUkdFQCAtLXVwZGF0ZQorTVNHSU5JVCA9IG1zZ2luaXQKK01TR0NPTlYgPSBtc2djb252CitNU0dGSUxURVIgPSBtc2dmaWx0ZXIKKworUE9GSUxFUyA9IEBQT0ZJTEVTQAorR01PRklMRVMgPSBAR01PRklMRVNACitVUERBVEVQT0ZJTEVTID0gQFVQREFURVBPRklMRVNACitEVU1NWVBPRklMRVMgPSBARFVNTVlQT0ZJTEVTQAorRElTVEZJTEVTLmNvbW1vbiA9IE1ha2VmaWxlLmluLmluIE1ha2V2YXJzIFwKKyQoRElTVEZJTEVTLmNvbW1vbi5leHRyYTEpICQoRElTVEZJTEVTLmNvbW1vbi5leHRyYTIpICQoRElTVEZJTEVTLmNvbW1vbi5leHRyYTMpCitESVNURklMRVMgPSAkKERJU1RGSUxFUy5jb21tb24pIFBPVEZJTEVTLmluICQoRE9NQUlOKS5wb3QgXAorJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSBcCiskKERJU1RGSUxFUy5leHRyYTEpICQoRElTVEZJTEVTLmV4dHJhMikgJChESVNURklMRVMuZXh0cmEzKQorCitQT1RGSUxFUyA9IFwKKworQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACisKKyMgTWFrZXZhcnMgZ2V0cyBpbnNlcnRlZCBoZXJlLiAoRG9uJ3QgcmVtb3ZlIHRoaXMgbGluZSEpCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLnBvIC5nbW8gLm1vIC5ub3AgLnBvLXVwZGF0ZQorCisucG8ubW86CisJJChNU0dGTVQpIC1jIC1vICRAICQ8CisKKy5wby5nbW86CisJQGxhbmc9YGVjaG8gJCogfCBzZWQgLWUgJ3MsLiovLCwnYDsgXAorCXRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAorCWVjaG8gIiQke2NkY21kfXJtIC1mICQke2xhbmd9LmdtbyAmJiAkKEdNU0dGTVQpIC1jIC0tc3RhdGlzdGljcyAtbyAkJHtsYW5nfS5nbW8gJCR7bGFuZ30ucG8iOyBcCisJY2QgJChzcmNkaXIpICYmIHJtIC1mICQke2xhbmd9LmdtbyAmJiAkKEdNU0dGTVQpIC1jIC0tc3RhdGlzdGljcyAtbyAkJHtsYW5nfS5nbW8gJCR7bGFuZ30ucG8KKworCithbGw6IGFsbC1AVVNFX05MU0AKKworYWxsLXllczogJChDQVRBTE9HUykKK2FsbC1ubzoKKworIyBOb3RlOiBUYXJnZXQgJ2FsbCcgbXVzdCBub3QgZGVwZW5kIG9uIHRhcmdldCAnJChET01BSU4pLnBvdC11cGRhdGUnLAorIyBvdGhlcndpc2UgcGFja2FnZXMgbGlrZSBHQ0MgY2FuIG5vdCBiZSBidWlsdCBpZiBvbmx5IHBhcnRzIG9mIHRoZSBzb3VyY2UKKyMgaGF2ZSBiZWVuIGRvd25sb2FkZWQuCisKKyQoRE9NQUlOKS5wb3QtdXBkYXRlOiAkKFBPVEZJTEVTKSAkKHNyY2RpcikvUE9URklMRVMuaW4KKwkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoRE9NQUlOKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKKwkgIC0tYWRkLWNvbW1lbnRzPVRSQU5TTEFUT1JTOiAkKFhHRVRURVhUX09QVElPTlMpIFwKKwkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4gXAorCSAgLS1jb3B5cmlnaHQtaG9sZGVyPSckKENPUFlSSUdIVF9IT0xERVIpJyBcCisJJiYgdGVzdCAhIC1mICQoRE9NQUlOKS5wbyBcCisJICAgfHwgKCBybSAtZiAkKHNyY2RpcikvJChET01BSU4pLnBvdCBcCisJCSYmIG12ICQoRE9NQUlOKS5wbyAkKHNyY2RpcikvJChET01BSU4pLnBvdCApCisKKyQoc3JjZGlyKS8kKERPTUFJTikucG90OgorCSQoTUFLRSkgJChET01BSU4pLnBvdC11cGRhdGUKKworJChQT0ZJTEVTKTogJChzcmNkaXIpLyQoRE9NQUlOKS5wb3QKKwlAbGFuZz1gZWNobyAkQCB8IHNlZCAtZSAncywuKi8sLCcgLWUgJ3MvXC5wbyQkLy8nYDsgXAorCXRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAorCWVjaG8gIiQke2NkY21kfSQoTVNHTUVSR0VfVVBEQVRFKSAkJHtsYW5nfS5wbyAkKERPTUFJTikucG90IjsgXAorCWNkICQoc3JjZGlyKSAmJiAkKE1TR01FUkdFX1VQREFURSkgJCR7bGFuZ30ucG8gJChET01BSU4pLnBvdAorCisKK2luc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKK2luc3RhbGwtZXhlYzoKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKKwkgIGZvciBmaWxlIGluICQoRElTVEZJTEVTLmNvbW1vbik7IGRvIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGZpbGUgXAorCQkJICAgICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQoraW5zdGFsbC1kYXRhLW5vOiBhbGwKK2luc3RhbGwtZGF0YS15ZXM6IGFsbAorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGF0YWRpcikKKwlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgLWUgJ3MvXC5nbW8kJC8vJ2A7IFwKKwkgIGRpcj0kKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTOyBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkJGRpcjsgXAorCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiByZWFsY2F0PSQkY2F0OyBlbHNlIHJlYWxjYXQ9JChzcmNkaXIpLyQkY2F0OyBmaTsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkcmVhbGNhdCAkKERFU1RESVIpJCRkaXIvJChET01BSU4pLm1vOyBcCisJICBlY2hvICJpbnN0YWxsaW5nICQkcmVhbGNhdCBhcyAkKERFU1RESVIpJCRkaXIvJChET01BSU4pLm1vIjsgXAorCSAgZm9yIGxjIGluICcnICQoRVhUUkFfTE9DQUxFX0NBVEVHT1JJRVMpOyBkbyBcCisJICAgIGlmIHRlc3QgLW4gIiQkbGMiOyB0aGVuIFwKKwkgICAgICBpZiAoY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcgJiYgTENfQUxMPUMgbHMgLWwgLWQgJCRsYyAyPi9kZXYvbnVsbCkgfCBncmVwICcgLT4gJyA+L2Rldi9udWxsOyB0aGVuIFwKKwkgICAgICAgIGxpbms9YGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nICYmIExDX0FMTD1DIGxzIC1sIC1kICQkbGMgfCBzZWQgLWUgJ3MvXi4qIC0+IC8vJ2A7IFwKKwkgICAgICAgIG12ICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQ7IFwKKwkgICAgICAgIG1rZGlyICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKKwkgICAgICAgIChjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZCAmJiBcCisJICAgICAgICAgZm9yIGZpbGUgaW4gKjsgZG8gXAorCSAgICAgICAgICAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gXAorCSAgICAgICAgICAgICBsbiAtcyAuLi8kJGxpbmsvJCRmaWxlICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJCRmaWxlOyBcCisJICAgICAgICAgICBmaTsgXAorCSAgICAgICAgIGRvbmUpOyBcCisJICAgICAgICBybSAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZDsgXAorCSAgICAgIGVsc2UgXAorCSAgICAgICAgaWYgdGVzdCAtZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyB0aGVuIFwKKwkgICAgICAgICAgOjsgXAorCSAgICAgICAgZWxzZSBcCisJICAgICAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKKwkgICAgICAgICAgbWtkaXIgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgXAorCSAgICAgICAgZmk7IFwKKwkgICAgICBmaTsgXAorCSAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vOyBcCisJICAgICAgbG4gLXMgLi4vTENfTUVTU0FHRVMvJChET01BSU4pLm1vICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgICBsbiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKERPTUFJTikubW8gJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW8gMj4vZGV2L251bGwgfHwgXAorCSAgICAgIGNwIC1wICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoRE9NQUlOKS5tbyAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQoRE9NQUlOKS5tbzsgXAorCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJCRyZWFsY2F0IGxpbmsgYXMgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW8iOyBcCisJICAgIGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCitpbnN0YWxsLXN0cmlwOiBpbnN0YWxsCisKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1leGVjIGluc3RhbGxkaXJzLWRhdGEKK2luc3RhbGxkaXJzLWV4ZWM6CitpbnN0YWxsZGlycy1kYXRhOiBpbnN0YWxsZGlycy1kYXRhLUBVU0VfTkxTQAorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKK2luc3RhbGxkaXJzLWRhdGEtbm86CitpbnN0YWxsZGlycy1kYXRhLXllczoKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGRhdGFkaXIpCisJQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkIC1lICdzL1wuZ21vJCQvLydgOyBcCisJICBkaXI9JChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJCRkaXI7IFwKKwkgIGZvciBsYyBpbiAnJyAkKEVYVFJBX0xPQ0FMRV9DQVRFR09SSUVTKTsgZG8gXAorCSAgICBpZiB0ZXN0IC1uICIkJGxjIjsgdGhlbiBcCisJICAgICAgaWYgKGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nICYmIExDX0FMTD1DIGxzIC1sIC1kICQkbGMgMj4vZGV2L251bGwpIHwgZ3JlcCAnIC0+ICcgPi9kZXYvbnVsbDsgdGhlbiBcCisJICAgICAgICBsaW5rPWBjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZyAmJiBMQ19BTEw9QyBscyAtbCAtZCAkJGxjIHwgc2VkIC1lICdzL14uKiAtPiAvLydgOyBcCisJICAgICAgICBtdiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMub2xkOyBcCisJICAgICAgICBta2RpciAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCisJICAgICAgICAoY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQgJiYgXAorCSAgICAgICAgIGZvciBmaWxlIGluICo7IGRvIFwKKwkgICAgICAgICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIFwKKwkgICAgICAgICAgICAgbG4gLXMgLi4vJCRsaW5rLyQkZmlsZSAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQkZmlsZTsgXAorCSAgICAgICAgICAgZmk7IFwKKwkgICAgICAgICBkb25lKTsgXAorCSAgICAgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy5vbGQ7IFwKKwkgICAgICBlbHNlIFwKKwkgICAgICAgIGlmIHRlc3QgLWQgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgdGhlbiBcCisJICAgICAgICAgIDo7IFwKKwkgICAgICAgIGVsc2UgXAorCSAgICAgICAgICBybSAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCisJICAgICAgICAgIG1rZGlyICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IFwKKwkgICAgICAgIGZpOyBcCisJICAgICAgZmk7IFwKKwkgICAgZmk7IFwKKwkgIGRvbmU7IFwKKwlkb25lCisKKyMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KK2luc3RhbGxjaGVjazoKKwordW5pbnN0YWxsOiB1bmluc3RhbGwtZXhlYyB1bmluc3RhbGwtZGF0YQordW5pbnN0YWxsLWV4ZWM6Cit1bmluc3RhbGwtZGF0YTogdW5pbnN0YWxsLWRhdGEtQFVTRV9OTFNACisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAorCSAgZm9yIGZpbGUgaW4gJChESVNURklMRVMuY29tbW9uKTsgZG8gXAorCSAgICBybSAtZiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKK3VuaW5zdGFsbC1kYXRhLW5vOgordW5pbnN0YWxsLWRhdGEteWVzOgorCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkIC1lICdzL1wuZ21vJCQvLydgOyBcCisJICBmb3IgbGMgaW4gTENfTUVTU0FHRVMgJChFWFRSQV9MT0NBTEVfQ0FURUdPUklFUyk7IGRvIFwKKwkgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW87IFwKKwkgIGRvbmU7IFwKKwlkb25lCisKK2NoZWNrOiBhbGwKKworZHZpIGluZm8gdGFncyBUQUdTIElEOgorCittb3N0bHljbGVhbjoKKwlybSAtZiBjb3JlIGNvcmUuKiAkKERPTUFJTikucG8gKi5uZXcucG8KKwlybSAtZnIgKi5vCisKK2NsZWFuOiBtb3N0bHljbGVhbgorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbworCittYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwlybSAtZiAkKEdNT0ZJTEVTKQorCitkaXN0ZGlyID0gJCh0b3BfYnVpbGRkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKK2Rpc3QgZGlzdGRpcjoKKwkkKE1BS0UpIHVwZGF0ZS1wbworCUAkKE1BS0UpIGRpc3QyCisjIFRoaXMgaXMgYSBzZXBhcmF0ZSB0YXJnZXQgYmVjYXVzZSAndXBkYXRlLXBvJyBtdXN0IGJlIGV4ZWN1dGVkIGJlZm9yZS4KK2Rpc3QyOiAkKERJU1RGSUxFUykKKwlkaXN0cz0iJChESVNURklMRVMpIjsgXAorCWlmIHRlc3QgLWYgJChzcmNkaXIpL0NoYW5nZUxvZzsgdGhlbiBkaXN0cz0iJCRkaXN0cyBDaGFuZ2VMb2ciOyBmaTsgXAorCWlmIHRlc3QgLWYgJChzcmNkaXIpL0xJTkdVQVM7IHRoZW4gZGlzdHM9IiQkZGlzdHMgTElOR1VBUyI7IGZpOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gXAorCSAgICBjcCAtcCAkJGZpbGUgJChkaXN0ZGlyKTsgXAorCSAgZWxzZSBcCisJICAgIGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAorCSAgZmk7IFwKKwlkb25lCisKK3VwZGF0ZS1wbzogTWFrZWZpbGUKKwkkKE1BS0UpICQoRE9NQUlOKS5wb3QtdXBkYXRlCisJJChNQUtFKSAkKFVQREFURVBPRklMRVMpCisJJChNQUtFKSB1cGRhdGUtZ21vCisKKyMgR2VuZXJhbCBydWxlIGZvciB1cGRhdGluZyBQTyBmaWxlcy4KKworLm5vcC5wby11cGRhdGU6CisJQGxhbmc9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXC5wby11cGRhdGUkJC8vJ2A7IFwKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IGZpOyBcCisJdG1wZGlyPWBwd2RgOyBcCisJZWNobyAiJCRsYW5nOiI7IFwKKwl0ZXN0ICIkKHNyY2RpcikiID0gLiAmJiBjZGNtZD0iIiB8fCBjZGNtZD0iY2QgJChzcmNkaXIpICYmICI7IFwKKwllY2hvICIkJHtjZGNtZH0kKE1TR01FUkdFKSAkJGxhbmcucG8gJChET01BSU4pLnBvdCAtbyAkJGxhbmcubmV3LnBvIjsgXAorCWNkICQoc3JjZGlyKTsgXAorCWlmICQoTVNHTUVSR0UpICQkbGFuZy5wbyAkKERPTUFJTikucG90IC1vICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IHRoZW4gXAorCSAgaWYgY21wICQkbGFuZy5wbyAkJHRtcGRpci8kJGxhbmcubmV3LnBvID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICAgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKwkgIGVsc2UgXAorCSAgICBpZiBtdiAtZiAkJHRtcGRpci8kJGxhbmcubmV3LnBvICQkbGFuZy5wbzsgdGhlbiBcCisJICAgICAgOjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRsYW5nLnBvIGZhaWxlZDogY2Fubm90IG1vdmUgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbyB0byAkJGxhbmcucG8iIDE+JjI7IFwKKwkgICAgICBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJZWxzZSBcCisJICBlY2hvICJtc2dtZXJnZSBmb3IgJCRsYW5nLnBvIGZhaWxlZCEiIDE+JjI7IFwKKwkgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKwlmaQorCiskKERVTU1ZUE9GSUxFUyk6CisKK3VwZGF0ZS1nbW86IE1ha2VmaWxlICQoR01PRklMRVMpCisJQDoKKworTWFrZWZpbGU6IE1ha2VmaWxlLmluLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzIFBPVEZJTEVTLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAuaW4gQ09ORklHX0hFQURFUlM9IFwKKwkgICAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKK2ZvcmNlOgorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9wby9NYWtldmFycyBiL3BvL01ha2V2YXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhY2NiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wby9NYWtldmFycwpAQCAtMCwwICsxLDI1IEBACisjIE1ha2VmaWxlIHZhcmlhYmxlcyBmb3IgUE8gZGlyZWN0b3J5IGluIGFueSBwYWNrYWdlIHVzaW5nIEdOVSBnZXR0ZXh0LgorCisjIFVzdWFsbHkgdGhlIG1lc3NhZ2UgZG9tYWluIGlzIHRoZSBzYW1lIGFzIHRoZSBwYWNrYWdlIG5hbWUuCitET01BSU4gPSAkKFBBQ0tBR0UpCisKKyMgVGhlc2UgdHdvIHZhcmlhYmxlcyBkZXBlbmQgb24gdGhlIGxvY2F0aW9uIG9mIHRoaXMgZGlyZWN0b3J5Lgorc3ViZGlyID0gcG8KK3RvcF9idWlsZGRpciA9IC4uCisKKyMgVGhlc2Ugb3B0aW9ucyBnZXQgcGFzc2VkIHRvIHhnZXR0ZXh0LgorWEdFVFRFWFRfT1BUSU9OUyA9IC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXworCisjIFRoaXMgaXMgdGhlIGNvcHlyaWdodCBob2xkZXIgdGhhdCBnZXRzIGluc2VydGVkIGludG8gdGhlIGhlYWRlciBvZiB0aGUKKyMgJChET01BSU4pLnBvdCBmaWxlLiAgU2V0IHRoaXMgdG8gdGhlIGNvcHlyaWdodCBob2xkZXIgb2YgdGhlIHN1cnJvdW5kaW5nCisjIHBhY2thZ2UuICAoTm90ZSB0aGF0IHRoZSBtc2dzdHIgc3RyaW5ncywgZXh0cmFjdGVkIGZyb20gdGhlIHBhY2thZ2UncworIyBzb3VyY2VzLCBiZWxvbmcgdG8gdGhlIGNvcHlyaWdodCBob2xkZXIgb2YgdGhlIHBhY2thZ2UuKSAgVHJhbnNsYXRvcnMgYXJlCisjIGV4cGVjdGVkIHRvIHRyYW5zZmVyIHRoZSBjb3B5cmlnaHQgZm9yIHRoZWlyIHRyYW5zbGF0aW9ucyB0byB0aGlzIHBlcnNvbgorIyBvciBlbnRpdHksIG9yIHRvIGRpc2NsYWltIHRoZWlyIGNvcHlyaWdodC4gIFRoZSBlbXB0eSBzdHJpbmcgc3RhbmRzIGZvcgorIyB0aGUgcHVibGljIGRvbWFpbjsgaW4gdGhpcyBjYXNlIHRoZSB0cmFuc2xhdG9ycyBhcmUgZXhwZWN0ZWQgdG8gZGlzY2xhaW0KKyMgdGhlaXIgY29weXJpZ2h0LgorQ09QWVJJR0hUX0hPTERFUiA9IFJlZCBIYXQsIEluYy4KKworIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGxvY2FsZSBjYXRlZ29yaWVzLCBiZXlvbmQgTENfTUVTU0FHRVMsIGZvciB3aGljaCB0aGUKKyMgbWVzc2FnZSBjYXRhbG9ncyBzaGFsbCBiZSB1c2VkLiAgSXQgaXMgdXN1YWxseSBlbXB0eS4KK0VYVFJBX0xPQ0FMRV9DQVRFR09SSUVTID0KZGlmZiAtLWdpdCBhL3BvL1BPVEZJTEVTLmluIGIvcG8vUE9URklMRVMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyZTg4MwotLS0gL2Rldi9udWxsCisrKyBiL3BvL1BPVEZJTEVTLmluCkBAIC0wLDAgKzEsMjQgQEAKKyMgTGlzdCBvZiBmaWxlcyB3aGljaCBjb250YWluaW5nIHRyYW5zbGF0YWJsZSBzdHJpbmdzLgorIyBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDUgUmVkIEhhdCwgSW5jLgorCisjIEZpbGVzIGZyb20gdGhlIGNvbXBhdGliaWxpdHkgbGlicmFyeQorbGliL3htYWxsb2MuYworbGliL3hzdHJkdXAuYworbGliL3hzdHJuZHVwLmMKKworIyBMaWJyYXJ5IHNvdXJjZXMKK2xpYmFzbS9hc21fZXJyb3IuYworbGliZHcvZHdhcmZfZXJyb3IuYworCisjIFByb2dyYW0gc291cmNlcworc3JjL25tLmMKK3NyYy9yZWFkZWxmLmMKK3NyYy9zaXplLmMKK3NyYy9zdHJpcC5jCitzcmMvbGQuYworc3JjL2xkZ2VuZXJpYy5jCitzcmMvbGRzY3JpcHQueQorc3JjL2VsZmxpbnQuYworc3JjL2FkZHIybGluZS5jCitzcmMvZmluZHRleHRyZWwuYworc3JjL2VsZmNtcC5jCmRpZmYgLS1naXQgYS9wby9SdWxlcy1xdW90IGIvcG8vUnVsZXMtcXVvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ2ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvcG8vUnVsZXMtcXVvdApAQCAtMCwwICsxLDQyIEBACisjIFNwZWNpYWwgTWFrZWZpbGUgcnVsZXMgZm9yIEVuZ2xpc2ggbWVzc2FnZSBjYXRhbG9ncyB3aXRoIHF1b3RhdGlvbiBtYXJrcy4KKworRElTVEZJTEVTLmNvbW1vbi5leHRyYTEgPSBxdW90LnNlZCBib2xkcXVvdC5zZWQgZW5AcXVvdC5oZWFkZXIgZW5AYm9sZHF1b3QuaGVhZGVyIGluc2VydC1oZWFkZXIuc2luIFJ1bGVzLXF1b3QKKworLlNVRkZJWEVTOiAuaW5zZXJ0LWhlYWRlciAucG8tdXBkYXRlLWVuCisKK2VuQHF1b3QucG8tdXBkYXRlOiBlbkBxdW90LnBvLXVwZGF0ZS1lbgorZW5AYm9sZHF1b3QucG8tdXBkYXRlOiBlbkBib2xkcXVvdC5wby11cGRhdGUtZW4KKworLmluc2VydC1oZWFkZXIucG8tdXBkYXRlLWVuOgorCUBsYW5nPWBlY2hvICRAIHwgc2VkIC1lICdzL1wucG8tdXBkYXRlLWVuJCQvLydgOyBcCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBHRVRURVhUTElCRElSPWBjZCAkKHRvcF9zcmNkaXIpL3NyYyAmJiBwd2RgOyBleHBvcnQgR0VUVEVYVExJQkRJUjsgZmk7IFwKKwl0bXBkaXI9YHB3ZGA7IFwKKwllY2hvICIkJGxhbmc6IjsgXAorCWxsPWBlY2hvICQkbGFuZyB8IHNlZCAtZSAncy9ALiovLydgOyBcCisJTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IFwKKwljZCAkKHNyY2Rpcik7IFwKKwlpZiAkKE1TR0lOSVQpIC1pICQoRE9NQUlOKS5wb3QgLS1uby10cmFuc2xhdG9yIC1sICQkbGwgLW8gLSAyPi9kZXYvbnVsbCB8IHNlZCAtZiAkJHRtcGRpci8kJGxhbmcuaW5zZXJ0LWhlYWRlciB8ICQoTVNHQ09OVikgLXQgVVRGLTggfCAkKE1TR0ZJTFRFUikgc2VkIC1mIGBlY2hvICQkbGFuZyB8IHNlZCAtZSAncy8uKkAvLydgLnNlZCAyPi9kZXYvbnVsbCA+ICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IHRoZW4gXAorCSAgaWYgY21wICQkbGFuZy5wbyAkJHRtcGRpci8kJGxhbmcubmV3LnBvID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICAgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKwkgIGVsc2UgXAorCSAgICBpZiBtdiAtZiAkJHRtcGRpci8kJGxhbmcubmV3LnBvICQkbGFuZy5wbzsgdGhlbiBcCisJICAgICAgOjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBlY2hvICJjcmVhdGlvbiBvZiAkJGxhbmcucG8gZmFpbGVkOiBjYW5ub3QgbW92ZSAkJHRtcGRpci8kJGxhbmcubmV3LnBvIHRvICQkbGFuZy5wbyIgMT4mMjsgXAorCSAgICAgIGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwllbHNlIFwKKwkgIGVjaG8gImNyZWF0aW9uIG9mICQkbGFuZy5wbyBmYWlsZWQhIiAxPiYyOyBcCisJICBybSAtZiAkJHRtcGRpci8kJGxhbmcubmV3LnBvOyBcCisJZmkKKworZW5AcXVvdC5pbnNlcnQtaGVhZGVyOiBpbnNlcnQtaGVhZGVyLnNpbgorCXNlZCAtZSAnL14jL2QnIC1lICdzL0hFQURFUi9lbkBxdW90LmhlYWRlci9nJyAkKHNyY2RpcikvaW5zZXJ0LWhlYWRlci5zaW4gPiBlbkBxdW90Lmluc2VydC1oZWFkZXIKKworZW5AYm9sZHF1b3QuaW5zZXJ0LWhlYWRlcjogaW5zZXJ0LWhlYWRlci5zaW4KKwlzZWQgLWUgJy9eIy9kJyAtZSAncy9IRUFERVIvZW5AYm9sZHF1b3QuaGVhZGVyL2cnICQoc3JjZGlyKS9pbnNlcnQtaGVhZGVyLnNpbiA+IGVuQGJvbGRxdW90Lmluc2VydC1oZWFkZXIKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXF1b3QKK21vc3RseWNsZWFuLXF1b3Q6CisJcm0gLWYgKi5pbnNlcnQtaGVhZGVyCmRpZmYgLS1naXQgYS9wby9ib2xkcXVvdC5zZWQgYi9wby9ib2xkcXVvdC5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5MzdhYQotLS0gL2Rldi9udWxsCisrKyBiL3BvL2JvbGRxdW90LnNlZApAQCAtMCwwICsxLDEwIEBACitzLyJcKFteIl0qXCkiL+KAnFwx4oCdL2cKK3MvYFwoW15gJ10qXCknL+KAmFwx4oCZL2cKK3MvICdcKFteYCddKlwpJyAvIOKAmFwx4oCZIC9nCitzLyAnXChbXmAnXSpcKSckLyDigJhcMeKAmS9nCitzL14nXChbXmAnXSpcKScgL+KAmFwx4oCZIC9nCitzL+KAnOKAnS8iIi9nCitzL+KAnC/igJwbWzFtL2cKK3Mv4oCdLxtbMG3igJ0vZworcy/igJgv4oCYG1sxbS9nCitzL+KAmS8bWzBt4oCZL2cKZGlmZiAtLWdpdCBhL3BvL2VuQGJvbGRxdW90LmhlYWRlciBiL3BvL2VuQGJvbGRxdW90LmhlYWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWRiNmEwCi0tLSAvZGV2L251bGwKKysrIGIvcG8vZW5AYm9sZHF1b3QuaGVhZGVyCkBAIC0wLDAgKzEsMjUgQEAKKyMgQWxsIHRoaXMgY2F0YWxvZyAidHJhbnNsYXRlcyIgYXJlIHF1b3RhdGlvbiBjaGFyYWN0ZXJzLgorIyBUaGUgbXNnaWRzIG11c3QgYmUgQVNDSUkgYW5kIHRoZXJlZm9yZSBjYW5ub3QgY29udGFpbiByZWFsIHF1b3RhdGlvbgorIyBjaGFyYWN0ZXJzLCBvbmx5IHN1YnN0aXR1dGVzIGxpa2UgZ3JhdmUgYWNjZW50ICgweDYwKSwgYXBvc3Ryb3BoZSAoMHgyNykKKyMgYW5kIGRvdWJsZSBxdW90ZSAoMHgyMikuIFRoZXNlIHN1YnN0aXR1dGVzIGxvb2sgc3RyYW5nZTsgc2VlCisjIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3MvcXVvdGVzLmh0bWwKKyMKKyMgVGhpcyBjYXRhbG9nIHRyYW5zbGF0ZXMgZ3JhdmUgYWNjZW50ICgweDYwKSBhbmQgYXBvc3Ryb3BoZSAoMHgyNykgdG8KKyMgbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOCkgYW5kIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE5KS4KKyMgSXQgYWxzbyB0cmFuc2xhdGVzIHBhaXJzIG9mIGFwb3N0cm9waGUgKDB4MjcpIHRvCisjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTgpIGFuZCByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOSkKKyMgYW5kIHBhaXJzIG9mIHF1b3RhdGlvbiBtYXJrICgweDIyKSB0bworIyBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyayAoVSsyMDFDKSBhbmQgcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIChVKzIwMUQpLgorIworIyBXaGVuIG91dHB1dCB0byBhbiBVVEYtOCB0ZXJtaW5hbCwgdGhlIHF1b3RhdGlvbiBjaGFyYWN0ZXJzIGFwcGVhciBwZXJmZWN0bHkuCisjIFdoZW4gb3V0cHV0IHRvIGFuIElTTy04ODU5LTEgdGVybWluYWwsIHRoZSBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byBhcG9zdHJvcGhlcyAoYnkgaWNvbnYgaW4gZ2xpYmMgMi4yIG9yIG5ld2VyKSBvciB0bworIyBncmF2ZS9hY3V0ZSBhY2NlbnQgKGJ5IGxpYmljb252KSwgYW5kIHRoZSBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byAweDIyLgorIyBXaGVuIG91dHB1dCB0byBhbiBBU0NJSSB0ZXJtaW5hbCwgdGhlIHNpbmdsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIGFwb3N0cm9waGVzLCBhbmQgdGhlIGRvdWJsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIDB4MjIuCisjCisjIFRoaXMgY2F0YWxvZyBmdXJ0aGVybW9yZSBkaXNwbGF5cyB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBxdW90YXRpb24gbWFya3MgaW4KKyMgYm9sZCBmYWNlLCBhc3N1bWluZyB0aGUgVlQxMDAvWFRlcm0gZXNjYXBlIHNlcXVlbmNlcy4KKyMKZGlmZiAtLWdpdCBhL3BvL2VuQHF1b3QuaGVhZGVyIGIvcG8vZW5AcXVvdC5oZWFkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2NDdmYwotLS0gL2Rldi9udWxsCisrKyBiL3BvL2VuQHF1b3QuaGVhZGVyCkBAIC0wLDAgKzEsMjIgQEAKKyMgQWxsIHRoaXMgY2F0YWxvZyAidHJhbnNsYXRlcyIgYXJlIHF1b3RhdGlvbiBjaGFyYWN0ZXJzLgorIyBUaGUgbXNnaWRzIG11c3QgYmUgQVNDSUkgYW5kIHRoZXJlZm9yZSBjYW5ub3QgY29udGFpbiByZWFsIHF1b3RhdGlvbgorIyBjaGFyYWN0ZXJzLCBvbmx5IHN1YnN0aXR1dGVzIGxpa2UgZ3JhdmUgYWNjZW50ICgweDYwKSwgYXBvc3Ryb3BoZSAoMHgyNykKKyMgYW5kIGRvdWJsZSBxdW90ZSAoMHgyMikuIFRoZXNlIHN1YnN0aXR1dGVzIGxvb2sgc3RyYW5nZTsgc2VlCisjIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3MvcXVvdGVzLmh0bWwKKyMKKyMgVGhpcyBjYXRhbG9nIHRyYW5zbGF0ZXMgZ3JhdmUgYWNjZW50ICgweDYwKSBhbmQgYXBvc3Ryb3BoZSAoMHgyNykgdG8KKyMgbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOCkgYW5kIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE5KS4KKyMgSXQgYWxzbyB0cmFuc2xhdGVzIHBhaXJzIG9mIGFwb3N0cm9waGUgKDB4MjcpIHRvCisjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTgpIGFuZCByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOSkKKyMgYW5kIHBhaXJzIG9mIHF1b3RhdGlvbiBtYXJrICgweDIyKSB0bworIyBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyayAoVSsyMDFDKSBhbmQgcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIChVKzIwMUQpLgorIworIyBXaGVuIG91dHB1dCB0byBhbiBVVEYtOCB0ZXJtaW5hbCwgdGhlIHF1b3RhdGlvbiBjaGFyYWN0ZXJzIGFwcGVhciBwZXJmZWN0bHkuCisjIFdoZW4gb3V0cHV0IHRvIGFuIElTTy04ODU5LTEgdGVybWluYWwsIHRoZSBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byBhcG9zdHJvcGhlcyAoYnkgaWNvbnYgaW4gZ2xpYmMgMi4yIG9yIG5ld2VyKSBvciB0bworIyBncmF2ZS9hY3V0ZSBhY2NlbnQgKGJ5IGxpYmljb252KSwgYW5kIHRoZSBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byAweDIyLgorIyBXaGVuIG91dHB1dCB0byBhbiBBU0NJSSB0ZXJtaW5hbCwgdGhlIHNpbmdsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIGFwb3N0cm9waGVzLCBhbmQgdGhlIGRvdWJsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIDB4MjIuCisjCmRpZmYgLS1naXQgYS9wby9pbnNlcnQtaGVhZGVyLnNpbiBiL3BvL2luc2VydC1oZWFkZXIuc2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmRlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9wby9pbnNlcnQtaGVhZGVyLnNpbgpAQCAtMCwwICsxLDIzIEBACisjIFNlZCBzY3JpcHQgdGhhdCBpbnNlcnRzIHRoZSBmaWxlIGNhbGxlZCBIRUFERVIgYmVmb3JlIHRoZSBoZWFkZXIgZW50cnkuCisjCisjIEF0IGVhY2ggb2NjdXJyZW5jZSBvZiBhIGxpbmUgc3RhcnRpbmcgd2l0aCAibXNnaWQgIiwgd2UgZXhlY3V0ZSB0aGUgZm9sbG93aW5nCisjIGNvbW1hbmRzLiBBdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSwgaW5zZXJ0IHRoZSBmaWxlLiBBdCB0aGUgZm9sbG93aW5nCisjIG9jY3VycmVuY2VzLCBkbyBub3RoaW5nLiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoZSBmb2xsb3dpbmcKKyMgb2NjdXJyZW5jZXMgaXMgYWNoaWV2ZWQgYnkgbG9va2luZyBhdCB0aGUgaG9sZCBzcGFjZS4KKy9ebXNnaWQgL3sKK3gKKyMgVGVzdCBpZiB0aGUgaG9sZCBzcGFjZSBpcyBlbXB0eS4KK3MvbS9tLwordGEKKyMgWWVzIGl0IHdhcyBlbXB0eS4gRmlyc3Qgb2NjdXJyZW5jZS4gUmVhZCB0aGUgZmlsZS4KK3IgSEVBREVSCisjIE91dHB1dCB0aGUgZmlsZSdzIGNvbnRlbnRzIGJ5IHJlYWRpbmcgdGhlIG5leHQgbGluZS4gQnV0IGRvbid0IGxvc2UgdGhlCisjIGN1cnJlbnQgbGluZSB3aGlsZSBkb2luZyB0aGlzLgorZworTgorYmIKKzphCisjIFRoZSBob2xkIHNwYWNlIHdhcyBub25lbXB0eS4gRm9sbG93aW5nIG9jY3VycmVuY2VzLiBEbyBub3RoaW5nLgoreAorOmIKK30KZGlmZiAtLWdpdCBhL3BvL3F1b3Quc2VkIGIvcG8vcXVvdC5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyMmM0NgotLS0gL2Rldi9udWxsCisrKyBiL3BvL3F1b3Quc2VkCkBAIC0wLDAgKzEsNiBAQAorcy8iXChbXiJdKlwpIi/igJxcMeKAnS9nCitzL2BcKFteYCddKlwpJy/igJhcMeKAmS9nCitzLyAnXChbXmAnXSpcKScgLyDigJhcMeKAmSAvZworcy8gJ1woW15gJ10qXCknJC8g4oCYXDHigJkvZworcy9eJ1woW15gJ10qXCknIC/igJhcMeKAmSAvZworcy/igJzigJ0vIiIvZwpkaWZmIC0tZ2l0IGEvc3JjLy5jdnNpZ25vcmUgYi9zcmMvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg0NWUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL3NyYy9DaGFuZ2VMb2cgYi9zcmMvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYmRjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNDEzIEBACisyMDA1LTA3LTI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmY21wLmM6IEltcGxlbWVudCBjb21wYXJpbmcgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zLgorCisyMDA1LTA3LTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmbGludC5jOiBJbmNsdWRlIGxpYmVibFAuaCBpbnN0ZWFkIG9mIGxpYmVibC5oLgorCSogbm0uYzogTGlrZXdpc2UuCisJKiByZWFkZWxmLmM6IExpa2V3aXNlLgorCSogZWxmY21wLmM6IExpa2V3aXNlLgorCisJKiBlbGZjbXAuYyAobWFpbik6IENvbXBhcmUgaW5kaXZpZHVhbCBFTEYgaGVhZGVyIGZpZWxkcywgZXhjbHVkaW5nCisJZV9zaG9mZiBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBzdHJ1Y3QgYXQgb25jZS4KKwlVc2UgZWJsX3NlY3Rpb25fc3RyaXBfcCBpbnN0ZWFkIG9mIFNFQ1RJT05fU1RSSVBfUC4KKwkqIHN0cmlwLmM6IFVzZSBlYmxfc2VjdGlvbl9zdHJpcF9wIGluc3RlYWQgb2YgU0VDVElPTl9TVFJJUF9QLgorCisyMDA1LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmY21wLmMgKG1haW4pOiBUYWtlIGVtcHR5IHNlY3Rpb24gaW50byBhY2NvdW50IHdoZW4gY29tcGFyaW5nCisJc2VjdGlvbiBjb250ZW50LgorCisJKiBlbGZsaW50LmMgKGNoZWNrX2R5bmFtaWMpOiBDaGVjayB0aGF0IGRfdGFnIHZhbHVlIGlzID49IDAgYmVmb3JlCisJdXNpbmcgaXQuCisKKzIwMDUtMDctMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBlbGZjbXAuYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIGVsZmNtcC4KKwkoZWxmY21wX0xEQUREKTogRGVmaW5lLgorCisJKiBlbGZsaW50LmMgKGNoZWNrX3JlbGEpOiBDaGVjayB0aGF0IGNvcHkgcmVsb2NhdGlvbnMgb25seSByZWZlcmVuY2UKKwlvYmplY3Qgc3ltYm9scyBvciBzeW1ib2xzIHdpdGggdW5rbm93biB0eXBlLgorCShjaGVja19yZWwpOiBMaWtld2lzZS4KKworMjAwNS0wNi0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogcmVhZGVsZi5jIChwcmludF9vcHMpOiBBZGQgY29uc3RzLgorCisyMDA1LTA1LTMxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgorCisJKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2FiYnJldl9zZWN0aW9uKTogRG9uJ3QgYmFpbCBhZnRlciBmaXJzdCBDVSdzCisJYWJicmV2aWF0aW9ucy4gIFByaW50IGEgaGVhZGVyIGxpbmUgYmVmb3JlIGVhY2ggQ1Ugc2VjdGlvbi4KKworCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19sb2Nfc2VjdGlvbik6IEZpeCBpbmRlbnRhdGlvbiBmb3IgbGFyZ2VyCisJYWRkcmVzcyBzaXplLgorCisyMDA1LTA1LTMwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgorCisJKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2xpbmVfc2VjdGlvbik6IFByaW50IHNlY3Rpb24gb2Zmc2V0IG9mIGVhY2gKKwlDVSdzIHRhYmxlLCBzbyB0aGV5IGFyZSBlYXN5IHRvIGZpbmQgZnJvbSBzZWVpbmcgdGhlIHN0bXRfbGlzdCB2YWx1ZS4KKworCSogcmVhZGVsZi5jIChkd2FyZl9hdHRyX3N0cmluZyk6IEFkZCBhbGwgYXR0cmlidXRlcyBpbiA8ZHdhcmYuaD4uCisJKGF0dHJfY2FsbGJhY2spOiBHcm9rIERXX0FUX3JhbmdlcyBhbmQgcHJpbnQgb2Zmc2V0IGluIGhleC4KKworCSogcmVhZGVsZi5jIChhdHRyX2NhbGxiYWNrKTogQWRkIDIgdG8gYWRkcnNpemUgKiAyIGZvciAlIzAqIGZvcm1hdC4KKwkocHJpbnRfZGVidWdfcmFuZ2VzX3NlY3Rpb24sIHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogTGlrZXdpc2UuCisKKwkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogVGFrZSBkaWZmZXJlbnQgYXJncyBmb3IgaW5kZW50YXRpb24gY29udHJvbC4KKwkoYXR0cl9jYWxsYmFjayk6IENhbGxlciB1cGRhdGVkLgorCUdyb2sgc2V2ZXJhbCBtb3JlIGJsb2NrLWZvcm0gYXR0cmlidXRlcyBhcyBiZWluZyBsb2NhdGlvbiBleHByZXNzaW9ucy4KKwlGb3IgdGhvc2Ugc2FtZSBhdHRyaWJ1dGVzIHdpdGggdWRhdGEgZm9ybXMsIGZvcm1hdCBvdXRwdXQgZGlmZmVyZW50bHkKKwlmb3IgbG9jYXRpb24gbGlzdCBvZmZzZXQuCisJKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogSW1wbGVtZW50IGl0IGZvciByZWFsLgorCisJKiByZWFkZWxmLmMgKG9wdGlvbnMpOiBNZW50aW9uIHJhbmdlcyBmb3IgLS1kZWJ1Zy1kdW1wLgorCShlbnVtIHNlY3Rpb25fZSk6IEFkZCBzZWN0aW9uX3Jhbmdlcy4KKwkocGFyc2Vfb3B0KTogR3JvayAicmFuZ2VzIiBmb3IgLXcvLS1kZWJ1Zy1kdW1wLgorCShwcmludF9kZWJ1Z19yYW5nZXNfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkocHJpbnRfZGVidWcpOiBIYW5kbGUgLmRlYnVnX3JhbmdlcyBzZWN0aW9uLgorCisyMDA1LTA1LTMwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogcmVhZGVsZi5jIChoYW5kbGVfbm90ZXMpOiBBdCBsZWFzdCB4ODYtNjQgbmVlZCBub3QgaGF2ZSB0aGUgbm90ZQorCXNlY3Rpb24gdmFsdWVzIGFsaWduZWQgdG8gOCBieXRlcy4KKworMjAwNS0wNS0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIHJlYWRlbGYuYyAoZHdhcmZfdGFnX3N0cmluZyk6IEFkZCBuZXcgdGFncy4KKworMjAwNS0wNS0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IERvbid0IHRyYW5zbGF0ZSBoYXNoIGFuZCB2ZXJzeW0gZGF0YSBmb3JtYXRzLAorCWVsZl9nZXRkYXRhIGFscmVhZHkgZGlkIGl0IGZvciB1cy4KKworMjAwNS0wNS0wNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChmaW5kdGV4dHJlbF9MREFERCk6IEFkZCAkKGxpYm11ZGZsYXApLgorCShhZGRyMmxpbmVfTERBREQpOiBMaWtld2lzZS4KKworMjAwNS0wNS0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IEFwcGx5IHN5bWJvbCB0YWJsZSBmaXh1cHMgdG8gZGlzY2FyZGVkCisJcmVsb2NhdGlvbiBzZWN0aW9ucyB3aGVuIHRoZXkgYXJlIGJlaW5nIHNhdmVkIGluIHRoZSBkZWJ1ZyBmaWxlLgorCisJKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogUGFzcyBFSERSLT5lX2lkZW50W0VJX0RBVEFdIHRvIGdlbGZfeGxhdGV0b20KKwlhbmQgZ2VsZl94bGF0ZXRvZiwgbm90IHRoZSBuYXRpdmUgYnl0ZSBvcmRlci4KKworCSogc3RyaXAuYyAocGFyc2Vfb3B0KTogR2l2ZSBlcnJvciBpZiAtZiBvciAtbyBpcyByZXBlYXRlZC4KKwkobWFpbik6IEV4aXQgaWYgYXJncF9wYXJzZSByZXR1cm5zIG5vbnplcm8uCisKKwkqIHN0cmlwLmMgKGRlYnVnX2ZuYW1lX2VtYmVkKTogTmV3IHZhcmlhYmxlLgorCShvcHRpb25zLCBwYXJzZV9vcHQpOiBOZXcgb3B0aW9uIC1GIHRvIHNldCBpdC4KKworMjAwNS0wNS0wNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIHJlYWRlbGYuYyAocGFyc2Vfb3B0KTogTWFrZSBhbnlfY29udHJvbF9vcHRpb24gdmFyaWFibGUKKwlsb2NhbC4gIFNpbXBsaWZ5IHNvbWUgdGVzdHMuCisKKzIwMDUtMDUtMDMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+CisKKwkqIHN0cmlwLmMgKGNyYzMyX2ZpbGUpOiBGdW5jdGlvbiByZW1vdmVkIChub3cgaW4gLi4vbGliKS4KKworMjAwNS0wNS0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KKworCSogZWxmbGludC5jIChpc19kZWJ1Z2luZm8pOiBOZXcgdmFyaWFibGUuCisJKG9wdGlvbnMsIHBhcnNlX29wdCk6IE5ldyBvcHRpb24gLS1kZWJ1Z2luZm8vLWQgdG8gc2V0IGl0LgorCShjaGVja19zZWN0aW9ucyk6IElmIGlzX2RlYnVnaW5mbywgZG9uJ3QgY29tcGxhaW4gYWJvdXQgU0hUX05PQklUUy4KKwkoY2hlY2tfbm90ZSk6IElmIGlzX2RlYnVnaW5mbywgZG9uJ3QgdHJ5IHRvIGdldCBub3RlIGNvbnRlbnRzLgorCisyMDA1LTA0LTI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19hYmJyZXZfc2VjdGlvbik6IERvbid0IHByaW50IGVycm9yIHdoZW4gZW5kIG9mCisJc2VjdGlvbiByZWFjaGVkLgorCisyMDA1LTA0LTE0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogcmVhZGVsZi5jIChkd2FyZl9lbmNvZGluZ19zdHJpbmcpOiBOZXcgZnVuY3Rpb24uCisJKGR3YXJmX2lubGluZV9zdHJpbmcpOiBOZXcgZnVuY3Rpb24uCisJKGR3YXJmX2FjY2Vzc19zdHJpbmcpOiBOZXcgZnVuY3Rpb24uCisJKGR3YXJmX3Zpc2liaWxpdHlfc3RyaW5nKTogTmV3IGZ1bmN0aW9uLgorCShkd2FyZl92aXJ0dWFsaXR5X3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KKwkoZHdhcmZfaWRlbnRpZmllcl9jYXNlX3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KKwkoZHdhcmZfY2FsbGluZ19jb252ZW50aW9uX3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KKwkoZHdhcmZfb3JkZXJpbmdfc3RyaW5nKTogTmV3IGZ1bmN0aW9uLgorCShkd2FyZl9kaXNjcl9saXN0X3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KKwkoYXR0cl9jYWxsYmFjayk6IERlY29kZSBtYW4gbW9yZSBhdHRyaWJ1dGUgdmFsdWVzLgorCisyMDA1LTA0LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogYWRkcjJsaW5lLmM6IEZpbmlzaCBpbXBsZW1lbnRhdGlvbiBvZiAtZiBvcHRpb24uCisKKzIwMDUtMDMtMjkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBhZGRyMmxpbmUuYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIGFkZHIybGluZS4KKwlEZWZpbmUgYWRkcjJsaW5lX0xEQURELgorCisJKiBmaW5kdGV4dHJlbC5jOiBVc2UgbmV3IGR3YXJmX2FkZHJkaWUgZnVuY3Rpb24uCisKKwkqIGZpbmR0ZXh0cmVsLmM6IEZpeCB1c2FnZSBtZXNzYWdlIGFuZCByZS1hZGQgYWNjaWRlbnRhbGx5IHJlbW92ZWQKKwlsaW5lLgorCisyMDA1LTAzLTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZmluZHRleHRyZWwuYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZTogQWRkIHJ1bGVzIHRvIGJ1aWxkIGZpbmR0ZXh0cmVsLgorCisyMDA1LTAyLTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbGRsZXgubDogUHJvdmlkZSBFQ0hPIGRlZmluaXRpb24gdG8gYXZvaWQgd2FybmluZy4KKworCSogZWxmbGludC5jIChjaGVja19wcm9ncmFtX2hlYWRlcik6IEZpeCB0eXBvIGluIFJFTFJPIHRlc3QuCisKKwkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGQgbW9yZSB3YXJuaW5nIG9wdGlvbnMuCisJKiBlbGZsaW50LmM6IEZpeCB3YXJuaW5ncyBpbnRyb2R1Y2VkIGJ5IHRoZSBuZXcgd2FybmluZyBvcHRpb25zLgorCSogaTM4Nl9sZC5jOiBMaWtld2lzZS4KKwkqIGxkLmM6IExpa2V3aXNlLgorCSogbGQuaDogTGlrZXdpc2UuCisJKiBsZGdlbmVyaWMuYzogTGlrZXdpc2UuCisJKiBubS5jOiBMaWtld2lzZS4KKwkqIHJlYWRlbGYuYzogTGlrZXdpc2UuCisJKiBzZWN0aW9uaGFzaC5jOiBMaWtld2lzZS4KKwkqIHNpemUuYzogTGlrZXdpc2UuCisJKiBzdHJpbmcuYzogTGlrZXdpc2UuCisKKzIwMDUtMDItMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQ2hlY2sgZm9yIHRleHQgcmVsb2NhdGlvbnMgaW4gY29uc3RydWN0ZWQgRFNPcy4KKworCSogTWFrZWZpbGUuYW0gW01VREZMQVBdIChBTV9DRkxBR1MpOiBBZGQgLWZtdWRmbGFwLiAgTGluayBhbGwgYXBwcworCXdpdGggLWxtdWRmbGFwLgorCisJKiBsZHNjcmlwdC55OiBBZGQgYXNfbmVlZGVkIGhhbmRsaW5nLgorCSogbGRsZXgubDogUmVjb2duaXplIEFTX05FRURFRCB0b2tlbi4KKwkqIGxkLmggKHN0cnVjdCBmaWxlbmFtZV9saXN0KTogQWRkIGFzX25lZWRlZCBmbGFnLgorCisyMDA1LTAyLTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBDb3JyZWN0bHkgZGV0ZXJtaW5lIHNpemUgb2YgR09UIHNlY3Rpb24uCisKKzIwMDUtMDEtMTkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBsZC5jOiBSZW1vdmUgdW5uZWNlc3NhcnkgbW9yZV9oZWxwIGZ1bmN0aW9uLiAgUHJpbnQgYnVnIHJlcG9ydAorCWFkZHJlc3MgdXNpbmcgYXJncC4KKwkqIHN0cmlwLmM6IExpa2V3aXNlLgorCSogc2l6ZS5jOiBMaWtld2lzZS4KKwkqIG5tLmM6IExpa2V3aXNlLgorCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KKwkqIGVsZmxpbnQuYzogTGlrZXdpc2UuCisKKwkqIGVsZmxpbnQuYyAobWFpbik6IERvbid0IGNoZWNrIGZvciBwYXJhbWV0ZXIgcHJvYmxlbXMgaGVyZS4KKwkocGFyc2Vfb3B0KTogRG8gaXQgaGVyZSwgd2hlcmUgd2UgZ2V0IGluZm9ybWVkIGFib3V0IHNvbWUgb2YgdGhlbQorCWFueXdheS4KKworCSogcmVhZGVsZi5jIChtYWluKTogRG9uJ3QgY2hlY2sgZm9yIHBhcmFtZXRlciBwcm9ibGVtcyBoZXJlLgorCShwYXJzZV9vcHQpOiBEbyBpdCBoZXJlLCB3aGVyZSB3ZSBnZXQgaW5mb3JtZWQgYWJvdXQgc29tZSBvZiB0aGVtCisJYW55d2F5LgorCisyMDA1LTAxLTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogc3RyaXAuYzogVXBkYXRlIGNvcHlyaWdodCB5ZWFyLgorCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KKwkqIHNpemUuYzogTGlrZXdpc2UuCisJKiBubS5jOiBMaWtld2lzZS4KKwkqIGxkLmM6IExpa2V3aXNlLgorCSogZWxmbGludC5jOiBMaWtld2lzZS4KKworCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBEb24ndCB3YXJuIGFib3V0IHdyb25nIHNpemUgZm9yCisJX0RZTkFNSUMgYW5kIF9fR0xPQkFMX09GRlNFVF9UQUJMRV9fIGZvciAtLWdudS1sZC4KKworMjAwNC0xMC0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIHJlYWRlbGYuYyAocHJpbnRfcGhkcik6IEluIHNlY3Rpb24gbWFwcGluZywgYWxzbyBpbmRpY2F0ZQorCXNlY3Rpb25zIGluIHJlYWQtb25seSBzZWdtZW50cy4KKworMjAwNC0wOS0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIHJlYWRlbGYuYzogTWFrZSBjb21waWxlIHdpdGggZ2NjIDQuMC4KKwkqIHN0cmlwLmM6IExpa2V3aXNlLgorCisyMDA0LTA4LTE2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IFJld3JpdGUgZHluYW1pYyBtZW1vcnkgaGFuZGxpbmcgdG8gdXNlIG9mCisJYWxsb2NhdGUgdG8gd29yayBhcm91bmQgZ2NjIDMuNCBidWcuCisKKzIwMDQtMDEtMjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBsZGxleC5sIChpbnZhbGlkX2NoYXIpOiBCZXR0ZXIgZXJyb3IgbWVzc2FnZS4KKworMjAwNC0wMS0yMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIHJlYWRlbGYuYzogUHJpbnQgU0hUX0dOVV9MSUJMSVNUIHNlY3Rpb25zLgorCisJKiBub25lX2xkLmM6IE5ldyBmaWxlLgorCisyMDA0LTAxLTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IEVuYWJsZSBidWlsZGluZyBvZiBtYWNoaW5lIHNwZWNpZmljIGxpbmtlci4KKworMjAwNC0wMS0yMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggbXVkZmxhcC4KKworCSogaTM4Nl9sZC5jOiBGaXggd2FybmluZ3MgZ2NjIDMuNCBzcGl0cyBvdXQuCisJKiBsZGdlbmVyaWMuYzogTGlrZXdpc2UuCisJKiBsZHNjcmlwdC55OiBMaWtld2lzZS4KKwkqIHJlYWRlbGYuYzogTGlrZXdpc2UuCisJKiBzdHJpcC5jOiBMaWtld2lzZS4KKworCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19saW5lX3NlY3Rpb24pOiBEZXRlcm1pbmUgYWRkcmVzcyBzaXplCisJY29ycmVjdGx5LgorCisyMDA0LTAxLTE5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogcmVhZGVsZi5jIChwcmludF9waGRyKTogU2hvdyB3aGljaCBzZWN0aW9ucyBhcmUgY292ZXJlZCBieSB0aGUKKwlQVF9HTlVfUkVMUk8gZW50cnkuCisKKwkqIGVsZmxpbnQuYyAoY2hlY2tfcHJvZ3JhbV9oZWFkZXIpOiBDaGVjayBQVF9HTlVfUkVMUk8gZW50cnkuCisKKwkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbWFjaW5mb19zZWN0aW9uKTogSW1wbGVtZW50LgorCisyMDA0LTAxLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19saW5lX3NlY3Rpb24pOiBJbXBsZW1lbnQuCisKKzIwMDQtMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBzcmMvZWxmbGludC5jOiBVc2UgUEFDS0FHRV9OQU1FIGluc3RlYWQgb2YgUEFDS0FHRS4KKwkqIHNyYy9sZC5jOiBMaWtld2lzZS4KKwkqIHNyYy9ubS5jOiBMaWtld2lzZS4KKwkqIHNyYy9yZWFkZWxmLmM6IExpa2V3aXNlLgorCSogc3JjL3NpemUuYzogTGlrZXdpc2UuCisJKiBzcmMvc3RyaXAuYzogTGlrZXdpc2UuCisKKwkqIHN0cmlwLmM6IEFkZCBhIGZldyBtb3JlIHVubGlrZWx5LiAgUmVkdWNlIHNjb3BlIG9mIHNvbWUgdmFyaWFibGVzLgorCisJKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBidWlsZGluZyB3aXRoIG11ZGZsYXAuCisKKzIwMDQtMDEtMTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2luZm9fc2VjdGlvbik6IEZyZWUgZGllcyBtZW1vcnkuCisKKwkqIHJlYWRlbGYuYzogUHJpbnQgLmRlYnVnX2luZm8gc2VjdGlvbiBjb250ZW50LgorCisyMDA0LTAxLTEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogcmVhZGVsZi5jIChwcmludF9zaGRyKTogQWRkIHN1cHBvcnQgZm9yIFNIRl9PUkRFUkVEIGFuZCBTSEZfRVhDTFVERS4KKworMjAwNC0wMS0xMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfYXJhbmdlcyk6IEltcGxlbWVudCB1c2luZyBsaWJkdy4KKworMjAwNC0wMS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIG5tLmM6IEFkanVzdCBmb3IgRHdhcmZfRmlsZXMgdHlwZSBhbmQgZHdhcmZfbGluZW5vIGludGVyZmFjZSBjaGFuZ2UuCisKKwkqIHJlYWRlbGYuYzogVXNlIGxpYmR3IGluc3RlYWQgb2YgbGliZHdhcmYuICBOb3QgYWxsIG9mIHRoZSBvbGQKKwliZWhhdmlvciBpcyBhdmFpbGFibGUgeWV0LgorCSogTWFrZWZpbGUuYW06IExpbmsgcmVhZGVsZiB3aXRoIGxpYmR3LiAgUmVtb3ZlIGxpYmR3YXJmIGluY2x1ZGUgcGF0aC4KKworMjAwNC0wMS0wOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIG5tLmMgKGdldF9sb2NhbF9uYW1lcyk6IEFkanVzdCBjYWxsIHRvIGR3YXJmX25leHRjdS4KKworCSogbm0uYzogSW1wbGVtZW50IGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgbG9jYWwgdmFyaWFibGVzLgorCisyMDA0LTAxLTA3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbm0uYzogUmVhZCBhbHNvIGRlYnVnIGluZm9ybWF0aW9uIGZvciBsb2NhbCBzeW1ib2xzLgorCisyMDA0LTAxLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbm0uYzogU2h1ZmZsZSBkd2FyZiBoYW5kbGluZyBjb2RlIGFyb3VuZCBzbyB0aGUgbWF4aW11bSBjb2x1bW4KKwl3aWR0aCBjYW4gYmUgY29tcHV0ZWQgYWhlYWQgb2YgcHJpbnRpbmcuICBBdm9pZCBjb2xsZWN0aW9uIHN5bWJvbHMKKwl3aGljaCBhcmUgbm90IHByaW50ZWQgYW55d2F5LgorCisJKiBubS5jOiBSZXdyaXRlIGR3YXJmIGhhbmRsaW5nIHRvIHVzZSBsaWJkdy4KKwkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGQgLXN0ZCBwYXJhbWV0ZXIuCisJKElOQ0xVREVTKTogRmluZCBoZWFkZXIgaW4gbGliZHcgc3ViZGlyLgorCShubV9MREFERCk6IFJlcGxhY2UgbGliZHdhcmYgd2l0aCBsaWJkdy4KKworCSogZWxmbGludC5jOiBVcGRhdGUgY29weXJpZ2h0IHllYXIuCisJKiByZWFkZWxmLmM6IExpa2V3aXNlLgorCSogc2l6ZS5jOiBMaWtld2lzZS4KKwkqIHN0cmlwLmM6IExpa2V3aXNlLgorCSogbm0uYzogTGlrZXdpc2UuCisKKzIwMDMtMTItMzEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBzdHJpcC5jIChwcm9jZXNzX2ZpbGUpOiBDbG9zZSBmaWxlIGJlZm9yZSByZXR1cm5pbmcuCisKKzIwMDMtMTEtMTkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiByZWFkZWxmLmMgKGhhbmRsZV9keW5hbWljKTogTWFrZSBjb2x1bW4gZm9yIHRhZyBuYW1lIHdpZGVyLgorCisyMDAzLTA5LTI5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogcmVhZGVsZi5jIChoYW5kbGVfZHluYW1pYyk6IEFsd2F5cyB0ZXJtaW5hdGUgdGFnIG5hbWUgd2l0aCBhIHNwYWNlLgorCisyMDAzLTA5LTI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogc3RyaXAuYyAocHJvY2Vzc19maWxlKTogRG9uJ3QgbW1hcCB0aGUgaW5wdXQgZmlsZSwgd2UgbW9kaWZ5IHRoZQorCWRhdGEgc3RydWN0dXJlcyBhbmQgZG9uJ3Qgd2FudCB0aGUgY2hhbmdlIGVuZCB1cCBvbiBkaXNrLgorCisyMDAzLTA5LTIzICBKYWt1YiBKZWxpbmVrICA8amFrdWJAcmVkaGF0LmNvbT4KKworCSogdW5hbGlnbmVkLmggKHVuaW9uIHVfMnVieXRlX3VuYWxpZ25lZCwKKwl1bmlvbiB1XzR1Ynl0ZV91bmFsaWduZWQsIHVuaW9uIHVfOHVieXRlX3VuYWxpZ25lZCk6IEFkZAorCXBhY2tlZCBhdHRyaWJ1dGUuCisJKGFkZF8ydWJ5dGVfdW5hbGlnbmVkLCBhZGRfNHVieXRlX3VuYWxpZ25lZCwKKwlhZGRfOHVieXRlX3VuYWxpZ25lZCk6IEF2b2lkIG5lc3RpbmcgYnN3YXBfTk4gbWFjcm9zLgorCVJlYWQvc3RvcmUgdmFsdWUgdGhyb3VnaCBfcHRyLT51IGluc3RlYWQgb2YgKl9wdHIuCisKKzIwMDMtMDktMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBzaXplLmMgKHNob3dfc3lzdik6IENoYW5nZSB0eXBlIG9mIG1heGxlbiB0byBpbnQuCisKKwkqIHN0cmlwLmMgKGhhbmRsZV9lbGYpOiBIYW5kbGUgdGhlIDY0LWJpdCBhcmNocyB3aGljaCBpcyA2NC1iaXQKKwlidWNrZXRzLgorCisJKiBpMzg2X2xkLmM6IE1hbnkgbWFueSBmaXhlcyBhbmQgZXh0ZW5zaW9ucy4KKwkqIGxkLmM6IExpa2V3aXNlLgorCSogbGRnZW5lcmljLmM6IExpa2V3aXNlLgorCisyMDAzLTA4LTE2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbGRnZW5lcmljLmMgKGNoZWNrX2RlZmluaXRpb24pOiBEb24ndCBhZGQgc3ltYm9sIG9uIGRzb19saXN0IGlmCisJdGhlIHJlZmVyZW5jZSBpcyBmcm9tIGFub3RoZXIgRFNPLgorCisyMDAzLTA4LTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogbGRnZW5lcmljLmMgKGZpbmRfZW50cnlfcG9pbnQpOiBJdCBpcyBubyBmYXRhbCBlcnJvciBpZiBubyBlbnRyeQorCXBvaW50IGlzIGZvdW5kIHdoZW4gY3JlYXRpbmcgYSBEU08uCisKKzIwMDMtMDgtMTQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBsZC5jIChtYWluKTogQWx3YXlzIGNhbGwgRkxBR19VTlJFU09MVkVELgorCSogbGRnZW5lcmljLmMgKGxkX2dlbmVyaWNfZmxhZ191bnJlc29sdmVkKTogT25seSBjb21wbGFpbiBhYm91dAorCXVuZGVmaW5lZCBzeW1ib2xzIGlmIG5vdCBjcmVhdGluZyBEU08gb3IgbGRfc3RhdGUubm9kZWZzIGlzIG5vdCBzZXQuCisKKzIwMDMtMDgtMTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5pbjogRGVwZW5kIG9uIGxpYmVibC5hLCBub3QgbGliZWJsLnNvLgorCisJKiBsZC5jIChtYWluKTogTWFyayBzdHJlYW0gZm9yIGxpbmtlciBzY3JpcHQgYXMgbG9ja2VkIGJ5IGNhbGxlci4KKwkocmVhZF92ZXJzaW9uX3NjcmlwdCk6IExpa2V3aXNlLgorCSogbGRsZXguYzogRGVmaW5lIGZyZWFkIGFuZCBmd3JpdGUgdG8gX3VubG9ja2VkIHZhcmlhbnQuCisKKwkqIGkzODZfbGQuYyAoZWxmX2kzODZfZmluYWxpemVfcGx0KTogUmVwbGFjZSAjaWZkZWZzIHdpdGggdXNlcyBvZgorCXRhcmdldF9ic3dhcF8zMi4KKwkqIHVuYWxpZ25lZC5oOiBEZWZpbmUgdGFyZ2V0X2Jzd2FwXzE2LCB0YXJnZXRfYnN3YXBfMzIsIGFuZAorCXRhcmdldF9ic3dhcF82NC4KKwkoc3RvcmVfMnVieXRlX3VuYWxpZ25lZCwgc3RvcmVfNHVieXRlX3VuYWxpZ25lZCwKKwlzdG9yZV84dWJ5dGVfdW5hbGlnbmVkKTogRGVmaW5lIHVzaW5nIG5ldyBtYWNyb3MuCisKKzIwMDMtMDgtMTIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBpMzg2X2xkLmMgKGVsZl9pMzg2X2ZpbmFsaXplX3BsdCk6IFVzZSBwYWNrZWQgc3RydWN0cyB0byBhY2Nlc3MKKwlwb3NzaWJseSB1bmFsaWduZWQgbWVtb3J5LiAgU3VwcG9ydCB1c2Ugb2YgYmlnIGVuZGlhbiBtYWNoaW5lcy4KKworMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvc3JjL01ha2VmaWxlLmFtIGIvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYjZmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNDQgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCisjIworIyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMjCisjIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyMgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorIyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorIyMKK0RFRlMgPSAtRF9HTlVfU09VUkNFIC1ESEFWRV9DT05GSUdfSCAkKFlZREVCVUcpIFwKKyAgICAgICAtRFNSQ0RJUj1cIiQoc2hlbGwgY2QgJChzcmNkaXIpO3B3ZClcIiAtRE9CSkRJUj1cIiQoc2hlbGwgcHdkKVwiCitpZiBNVURGTEFQCitBTV9DRkxBR1MgPSAtV2FsbCAtV3NoYWRvdyAtV3VudXNlZCAtV2V4dHJhIC1zdGQ9Z251OTkgLWZtdWRmbGFwIFwKKwkgICAgJChuYXRpdmVfbGRfY2ZsYWdzKSAkKGlmICQoJCgqRilfbm9fV3VudXNlZCksLC1XdW51c2VkKSBcCisJICAgICQoaWYgJCgkKCpGKV9ub19XZm9ybWF0KSwsLVdmb3JtYXQ9MikKK2Vsc2UKK0FNX0NGTEFHUyA9IC1XYWxsIC1Xc2hhZG93IC1zdGQ9Z251OTkgJChuYXRpdmVfbGRfY2ZsYWdzKSBcCisJICAgICQoaWYgJCgkKCpGKV9ub19XZXJyb3IpLCwtV2Vycm9yKSBcCisJICAgICQoaWYgJCgkKCpGKV9ub19XdW51c2VkKSwsLVd1bnVzZWQgLVdleHRyYSkgXAorCSAgICAkKGlmICQoJCgqRilfbm9fV2Zvcm1hdCksLC1XZm9ybWF0PTIpCitlbmRpZgoraWYgTVVERkxBUAorbGlibXVkZmxhcCA9IC1sbXVkZmxhcAorZW5kaWYKK0lOQ0xVREVTID0gLUkkKHNyY2RpcikgLUkkKHNyY2RpcikvLi4vbGliZWxmIC1JJChzcmNkaXIpLy4uL2xpYmVibCAtSSQoc3JjZGlyKS8uLi9saWIgLUkkKHNyY2RpcikvLi4vbGliZHcgIC1JLi4KKworWUFDQyA9IEBZQUNDQCAtZAorQU1fWUZMQUdTID0gLXBsZAorQU1fTEZMQUdTID0gLVBsZCAtb2xleC55eS5jCisjIyBVbmNvbW1lbnQgdG8gZW5hYmxlIGRlYnVnZ2luZyBvZiBsaW5rZXIgc2NyaXB0IHBhcnNlcgorIyNZWURFQlVHID0gLURZWURFQlVHPTEKKworbmF0aXZlX2xkID0gQG5hdGl2ZV9sZEAKK2Jhc2VfY3B1ID0gQGJhc2VfY3B1QAorCitiaW5fUFJPR1JBTVMgPSByZWFkZWxmIG5tIHNpemUgc3RyaXAgbGQgZWxmbGludCBmaW5kdGV4dHJlbCBhZGRyMmxpbmUgXAorCSAgICAgICBlbGZjbXAKKworCitsZF9kc29zID0gbGlibGRfZWxmX2kzODZfcGljLmEKK2lmIE5BVElWRV9MRAorbm9pbnN0X0xJQlJBUklFUyA9IGxpYmxkX2VsZi5hCituYXRpdmVfbGRfY2ZsYWdzID0gLURCQVNFX0VMRl9OQU1FPWVsZl8kKGJhc2VfY3B1KQorZWxzZQorbm9pbnN0X0xJQlJBUklFUyA9IGxpYmxkX2VsZi5hICQobGRfZHNvcykKK25vaW5zdF9QUk9HUkFNUyA9ICQobGRfZHNvczpfcGljLmE9LnNvKQorZW5kaWYKKwordGV4dHJlbF9jaGVjayA9IGlmIHJlYWRlbGYgLWQgJEAgfCBmZ3JlcCAtcSBURVhUUkVMOyB0aGVuIGV4aXQgMTsgZmkKKworCitsZF9TT1VSQ0VTID0gbGQuYyBsZGdlbmVyaWMuYyBsZGxleC5sIGxkc2NyaXB0Lnkgc3ltYm9saGFzaC5jIHNlY3Rpb25oYXNoLmMgXAorCSAgICAgdmVyc2lvbmhhc2guYworCitub2luc3RfSEVBREVSUyA9IGxkLmggc3ltYm9saGFzaC5oIHNlY3Rpb25oYXNoLmggdmVyc2lvbmhhc2guaCBcCisJCSBsZHNjcmlwdC5oIHhlbGYuaCB1bmFsaWduZWQuaAorCitFWFRSQV9ESVNUID0gZWxmMzItaTM4Ni5zY3JpcHQgbGlibGRfZWxmX2kzODYubWFwICQobGRfbW9kdWxlcykKK2xkX21vZHVsZXMgPSBpMzg2X2xkLmMKKworaWYgTVVERkxBUAorbGliZHcgPSAuLi9saWJkdy9saWJkdy5hCitsaWJlbGYgPSAuLi9saWJlbGYvbGliZWxmLmEKK2Vsc2UKK2xpYmR3ID0gLi4vbGliZHcvbGliZHcuc28KK2xpYmVsZiA9IC4uL2xpYmVsZi9saWJlbGYuc28KK2VuZGlmCitsaWJlYmwgPSAuLi9saWJlYmwvbGliZWJsLmEKK2xpYmV1ID0gLi4vbGliL2xpYmV1LmEKKworbm1fbm9fV2Zvcm1hdCA9IHllcworc2l6ZV9ub19XZm9ybWF0ID0geWVzCisjIFhYWCBXaGlsZSB0aGUgZmlsZSBpcyBub3QgZmluaXNoZWQsIGRvbid0IHdhcm4gYWJvdXQgdGhpcworbGRnZW5lcmljX25vX1d1bnVzZWQgPSB5ZXMKKworcmVhZGVsZl9MREFERCA9ICQobGliZHcpICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJldSkgJChsaWJtdWRmbGFwKSAtbGRsCitubV9MREFERCA9ICQobGliZHcpICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJldSkgJChsaWJtdWRmbGFwKSAtbGRsCitzaXplX0xEQUREID0gJChsaWJlbGYpICQobGliZXUpICQobGlibXVkZmxhcCkKK3N0cmlwX0xEQUREID0gJChsaWJlYmwpICQobGliZWxmKSAkKGxpYmV1KSAkKGxpYm11ZGZsYXApIC1sZGwKK2xkX0xEQUREID0gJChsaWJlYmwpICQobGliZWxmKSAkKGxpYmV1KSAkKGxpYm11ZGZsYXApIC1sZGwKK2lmIE5BVElWRV9MRAorbGRfTERBREQgKz0gbGlibGRfZWxmLmEKK2VuZGlmCitsZF9MREZMQUdTID0gLXJkeW5hbWljCitlbGZsaW50X0xEQUREICA9ICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJldSkgJChsaWJtdWRmbGFwKSAtbGRsCitmaW5kdGV4dHJlbF9MREFERCA9ICQobGliZHcpICQobGliZWxmKSAkKGxpYm11ZGZsYXApCithZGRyMmxpbmVfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorZWxmY21wX0xEQUREID0gJChsaWJlYmwpICQobGliZWxmKSAkKGxpYm11ZGZsYXApIC1sZGwKKworbGRsZXgubzogbGRzY3JpcHQuYworbGRsZXhfbm9fV2Vycm9yID0geWVzCitsZHNjcmlwdC5oOiBsZHNjcmlwdC5jCisKKyMgTWFjaGluZS1zcGVjaWZpYyBsaW5rZXIgY29kZS4KK2xpYmxkX2VsZl9hX1NPVVJDRVMgPSAkKGJhc2VfY3B1KV9sZC5jCisKK2xpYmxkX2VsZl9pMzg2X3BpY19hX1NPVVJDRVMgPQorYW1fbGlibGRfZWxmX2kzODZfcGljX2FfT0JKRUNUUyA9IGkzODZfbGQub3MKKworbGlibGRfZWxmX2kzODZfc29fU09VUkNFUyA9CitsaWJsZF9lbGZfaTM4Ni5zbzogbGlibGRfZWxmX2kzODZfcGljLmEgbGlibGRfZWxmX2kzODYubWFwCisJJChDQykgLXNoYXJlZCAtbyAkQCAtV2wsLS13aG9sZS1hcmNoaXZlLCQ8LC0tbm8td2hvbGUtYXJjaGl2ZSBcCisJICAgICAgJChsaWJlbGYpICQobGliZXUpIFwKKwkgICAgICAtV2wsLS12ZXJzaW9uLXNjcmlwdCwkKHNyY2RpcikvbGlibGRfZWxmX2kzODYubWFwCisJJCh0ZXh0cmVsX2NoZWNrKQorCisKKyUub3M6ICUuYyAlLm8KKwlpZiAkKGZpbHRlci1vdXQgLWZtdWRmbGFwLCQoQ09NUElMRSkpIC1jIC1vICRAIC1mcGljIC1EUElDIC1EU0hBUkVEIFwKKwkgIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgXAorCSAgYHRlc3QgLWYgJyQ8JyB8fCBlY2hvICckKHNyY2RpcikvJ2AkPDsgXAorCXRoZW4gY2F0ICIkKERFUERJUikvJCouVHBvIiA+PiAiJChERVBESVIpLyQqLlBvIjsgXAorCSAgICAgcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBcCisJZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgXAorCWZpCisKKyMgU3BlY2lhbCBydWxlIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gZGVmaW5lIGxpYmxkX2VsZl9hX1NPVVJDRVMgYXMgd2UgZG8uCisjIE90aGVyd2lzZSBtYWtlIHdvdWxkIGNvbXBsYWluLgorLmRlcHMvbm9uZV9sZC5Qbzogbm9uZV9sZC5vcworCS06CisKKworaW5zdGFsbGNoZWNrLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKKwliYWQ9MDsgcGlkPSQkJCQ7IGxpc3Q9IiQoYmluX1BST0dSQU1TKSI7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAnICQoQU1fSU5TVEFMTENIRUNLX1NURF9PUFRJT05TX0VYRU1QVCkgJyBpbiBcCisJICAgKiIgJCRwICIqIHwgKiIgJChzcmNkaXIpLyQkcCAiKikgY29udGludWU7OyBcCisJICBlc2FjOyBcCisJICBmPWBlY2hvICIkJHAiIHwgXAorCSAgICAgc2VkICdzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBmb3Igb3B0IGluIC0taGVscCAtLXZlcnNpb247IGRvIFwKKwkgICAgaWYgTERfTElCUkFSWV9QQVRIPSQoREVTVERJUikkKGxpYmRpcikgXAorCSAgICAgICAkKERFU1RESVIpJChiaW5kaXIpLyQkZiAkJG9wdCA+IGMkJHtwaWR9Xy5vdXQgMj4gYyQke3BpZH1fLmVyciBcCisJICAgICAgICAgJiYgdGVzdCAtbiAiYGNhdCBjJCR7cGlkfV8ub3V0YCIgXAorCSAgICAgICAgICYmIHRlc3QgLXogImBjYXQgYyQke3BpZH1fLmVycmAiOyB0aGVuIDo7IFwKKwkgICAgZWxzZSBlY2hvICIkJGYgZG9lcyBub3Qgc3VwcG9ydCAkJG9wdCIgMT4mMjsgYmFkPTE7IGZpOyBcCisJICBkb25lOyBcCisJZG9uZTsgcm0gLWYgYyQke3BpZH1fLj8/PzsgZXhpdCAkJGJhZAorCitDTEVBTkZJTEVTID0gbm9uZV9sZC5vcyAkKGxkX21vZHVsZXM6LmM9Lm9zKQpkaWZmIC0tZ2l0IGEvc3JjL2FkZHIybGluZS5jIGIvc3JjL2FkZHIybGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmNkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYWRkcjJsaW5lLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qIExvY2F0ZSBzb3VyY2UgZmlsZXMgYW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIGdpdmVuIGFkZHJlc3NlcworICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXJncC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmR3Lmg+CisjaW5jbHVkZSA8bGliaW50bC5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPG1jaGVjay5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKKy8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCitzdGF0aWMgdm9pZCBwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7Cit2b2lkICgqYXJncF9wcm9ncmFtX3ZlcnNpb25faG9vaykgKEZJTEUgKiwgc3RydWN0IGFyZ3Bfc3RhdGUgKikgPSBwcmludF92ZXJzaW9uOworCisvKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLworY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzID0gUEFDS0FHRV9CVUdSRVBPUlQ7CisKKworLyogVmFsdWVzIGZvciB0aGUgcGFyYW1ldGVycyB3aGljaCBoYXZlIG5vIHNob3J0IGZvcm0uICAqLworI2RlZmluZSBPUFRfREVNQU5HTEVSIDB4MTAwCisKKy8qIERlZmluaXRpb25zIG9mIGFyZ3VtZW50cyBmb3IgYXJncCBmdW5jdGlvbnMuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQoreworICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJJbnB1dCBTZWxlY3Rpb246IiksIDAgfSwKKyAgeyAiZXhlIiwgJ2UnLCAiRklMRSIsIDAsIE5fKCJGaW5kIGFkZHJlc3NlcyBpbiBGSUxFIiksIDAgfSwKKworICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgU2VsZWN0aW9uOiIpLCAwIH0sCisgIHsgImJhc2VuYW1lcyIsICdzJywgTlVMTCwgMCwgTl8oIlNob3cgb25seSBiYXNlIG5hbWVzIG9mIHNvdXJjZSBmaWxlcyIpLCAwIH0sCisgIHsgImZ1bmN0aW9ucyIsICdmJywgTlVMTCwgMCwgTl8oIkFkZGl0aW9uYWwgc2hvdyBmdW5jdGlvbiBuYW1lcyIpLCAwIH0sCisKKyAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiTWlzY2VsbGFuZW91czoiKSwgMCB9LAorICAvKiBVbnN1cHBvcnRlZCBvcHRpb25zLiAgKi8KKyAgeyAidGFyZ2V0IiwgJ2InLCAiQVJHIiwgT1BUSU9OX0hJRERFTiwgTlVMTCwgMCB9LAorICB7ICJkZW1hbmdsZSIsICdDJywgIkFSRyIsIE9QVElPTl9ISURERU4gfCBPUFRJT05fQVJHX09QVElPTkFMLCBOVUxMLCAwIH0sCisgIHsgImRlbWFuZ2xlciIsIE9QVF9ERU1BTkdMRVIsICJBUkciLCBPUFRJT05fSElEREVOLCBOVUxMLCAwIH0sCisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Cit9OworCisvKiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRvY1tdID0gTl8oIlwKK0xvY2F0ZSBzb3VyY2UgZmlsZXMgYW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIEFERFJzIChpbiBhLm91dCBieSBkZWZhdWx0KS4iKTsKKworLyogU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgYXJnc19kb2NbXSA9IE5fKCJbQUREUi4uLl0iKTsKKworLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCitzdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Cit7CisgIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworCisvKiBIYW5kbGUgQUREUi4gICovCitzdGF0aWMgdm9pZCBoYW5kbGVfYWRkcmVzcyAoR0VsZl9BZGRyIGFkZHIsIEVsZiAqZWxmLCBEd2FyZiAqZHcpOworCisKKy8qIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKmV4ZWN1dGFibGUgPSAiYS5vdXQiOworCisvKiBUcnVlIGlmIG9ubHkgYmFzZSBuYW1lcyBvZiBmaWxlcyBzaG91bGQgYmUgc2hvd24uICAqLworc3RhdGljIGJvb2wgb25seV9iYXNlbmFtZXM7CisKKy8qIFRydWUgaWYgZnVuY3Rpb24gbmFtZXMgc2hvdWxkIGJlIHNob3duLiAgKi8KK3N0YXRpYyBib29sIHNob3dfZnVuY3Rpb25zOworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJlbWFpbmluZzsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgLyogTWFrZSBtZW1vcnkgbGVhayBkZXRlY3Rpb24gcG9zc2libGUuICAqLworICBtdHJhY2UgKCk7CisKKyAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLworICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3Rkb3V0LCBGU0VUTE9DS0lOR19CWUNBTExFUik7CisKKyAgLyogU2V0IGxvY2FsZS4gICovCisgICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBjYXRhbG9nIGNhbiBiZSBmb3VuZC4gICovCisgICh2b2lkKSBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIGNhdGFsb2cuICAqLworICAodm9pZCkgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgLyogUGFyc2UgYW5kIHByb2Nlc3MgYXJndW1lbnRzLiAgKi8KKyAgKHZvaWQpIGFyZ3BfcGFyc2UgKCZhcmdwLCBhcmdjLCBhcmd2LCAwLCAmcmVtYWluaW5nLCBOVUxMKTsKKworICAvKiBUZWxsIHRoZSBsaWJyYXJ5IHdoaWNoIHZlcnNpb24gd2UgYXJlIGV4cGVjdGluZy4gICovCisgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKKworICAvKiBPcGVuIHRoZSBmaWxlLiAgKi8KKyAgaW50IGZkID0gb3BlbjY0IChleGVjdXRhYmxlLCBPX1JET05MWSk7CisgIGlmIChmZCA9PSAtMSkKKyAgICBlcnJvciAoMSwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgb3BlbiAnJXMnIiksIGV4ZWN1dGFibGUpOworCisgIC8qIENyZWF0ZSB0aGUgRUxGIGRlc2NyaXB0b3IuICAqLworICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQURfTU1BUCwgTlVMTCk7CisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICBjbG9zZSAoZmQpOworICAgICAgZXJyb3IgKDEsIDAsIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlcyIpLAorCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICB9CisKKyAgLyogVHJ5IHRvIGdldCBhIERXQVJGIGRlc2NyaXB0b3IuICBJZiBpdCBmYWlscywgd2UgdHJ5IHRvIGxvY2F0ZSB0aGUKKyAgICAgZGVidWdpbmZvIGZpbGUuICAqLworICBEd2FyZiAqZHcgPSBkd2FyZl9iZWdpbl9lbGYgKGVsZiwgRFdBUkZfQ19SRUFELCBOVUxMKTsKKyAgaW50IGZkMiA9IC0xOworICBFbGYgKmVsZjIgPSBOVUxMOworICBpZiAoZHcgPT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpjYW5vbiA9IGNhbm9uaWNhbGl6ZV9maWxlX25hbWUgKGV4ZWN1dGFibGUpOworICAgICAgR0VsZl9FaGRyIGVoZHJfbWVtOworICAgICAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7CisKKyAgICAgIGlmIChjYW5vbiAhPSBOVUxMICYmIGVoZHIgIT0gTlVMTCkKKwl7CisJICBjb25zdCBjaGFyICpkZWJ1Z2luZm9fZGlyOworCSAgaWYgKGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIKKwkgICAgICB8fCBlaGRyLT5lX21hY2hpbmUgPT0gRU1fSUFfNjQgfHwgZWhkci0+ZV9tYWNoaW5lID09IEVNX0FMUEhBKQorCSAgICBkZWJ1Z2luZm9fZGlyID0gIi91c3IvbGliL2RlYnVnIjsKKwkgIGVsc2UKKwkgICAgZGVidWdpbmZvX2RpciA9ICIvdXNyL2xpYjY0L2RlYnVnIjsKKworCSAgY2hhciAqZGlmbmFtZSA9IGFsbG9jYSAoc3RybGVuIChkZWJ1Z2luZm9fZGlyKSArIHN0cmxlbiAoY2Fub24pICsgMSk7CisJICBzdHJjcHkgKHN0cGNweSAoZGlmbmFtZSwgZGVidWdpbmZvX2RpciksIGNhbm9uKTsKKwkgIGZkMiA9IG9wZW42NCAoZGlmbmFtZSwgT19SRE9OTFkpOworCSAgaWYgKGZkMiAhPSAtMSkKKwkgICAgZHcgPSBkd2FyZl9iZWdpbl9lbGYgKGVsZjIsIERXQVJGX0NfUkVBRCwgTlVMTCk7CisJfQorCisgICAgICBmcmVlIChjYW5vbik7CisgICAgfQorCisgIC8qIE5vdyBoYW5kbGUgdGhlIGFkZHJlc3Nlcy4gIEluIGNhc2Ugbm9uZSBhcmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKKyAgICAgbGluZSwgcmVhZCBmcm9tIHN0ZGluLiAgKi8KKyAgaWYgKHJlbWFpbmluZyA9PSBhcmdjKQorICAgIHsKKyAgICAgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KKyAgICAgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworCisgICAgICBjaGFyICpidWYgPSBOVUxMOworICAgICAgc2l6ZV90IGxlbiA9IDA7CisgICAgICB3aGlsZSAoIWZlb2ZfdW5sb2NrZWQgKHN0ZGluKSkKKwl7CisJICBpZiAoZ2V0bGluZSAoJmJ1ZiwgJmxlbiwgc3RkaW4pIDwgMCkKKwkgICAgYnJlYWs7CisKKwkgIGNoYXIgKmVuZHA7CisJICB1aW50bWF4X3QgYWRkciA9IHN0cnRvdW1heCAoYnVmLCAmZW5kcCwgMCk7CisJICBpZiAoZW5kcCAhPSBidWYpCisJICAgIGhhbmRsZV9hZGRyZXNzIChhZGRyLCBlbGYyID86IGVsZiwgZHcpOworCSAgZWxzZQorCSAgICByZXN1bHQgPSAxOworCX0KKworICAgICAgZnJlZSAoYnVmKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkbworCXsKKwkgIGNoYXIgKmVuZHA7CisJICB1aW50bWF4X3QgYWRkciA9IHN0cnRvdW1heCAoYXJndltyZW1haW5pbmddLCAmZW5kcCwgMCk7CisJICBpZiAoZW5kcCAhPSBhcmd2W3JlbWFpbmluZ10pCisJICAgIGhhbmRsZV9hZGRyZXNzIChhZGRyLCBlbGYyID86IGVsZiwgZHcpOworCSAgZWxzZQorCSAgICByZXN1bHQgPSAxOworCX0KKyAgICAgIHdoaWxlICgrK3JlbWFpbmluZyA8IGFyZ2MpOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGZwcmludGYgKHN0cmVhbSwgImFkZHIybGluZSAoJXMpICVzXG4iLCBQQUNLQUdFX05BTUUsIFZFUlNJT04pOworICBmcHJpbnRmIChzdHJlYW0sIGdldHRleHQgKCJcCitDb3B5cmlnaHQgKEMpICVzIFJlZCBIYXQsIEluYy5cblwKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PXG5cCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cblwKKyIpLCAiMjAwNSIpOworICBmcHJpbnRmIChzdHJlYW0sIGdldHRleHQgKCJXcml0dGVuIGJ5ICVzLlxuIiksICJVbHJpY2ggRHJlcHBlciIpOworfQorCisKKy8qIEhhbmRsZSBwcm9ncmFtIGFyZ3VtZW50cy4gICovCitzdGF0aWMgZXJyb3JfdAorcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsCisJICAgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgc3dpdGNoIChrZXkpCisgICAgeworICAgIGNhc2UgJ2InOgorICAgIGNhc2UgJ0MnOgorICAgIGNhc2UgT1BUX0RFTUFOR0xFUjoKKyAgICAgIC8qIElnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkuICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdlJzoKKyAgICAgIGV4ZWN1dGFibGUgPSBhcmc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3MnOgorICAgICAgb25seV9iYXNlbmFtZXMgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdmJzoKKyAgICAgIHNob3dfZnVuY3Rpb25zID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworc3RydWN0IGZ1bmNfYXJnCit7CisgIEdFbGZfQWRkciBhZGRyOworICBjb25zdCBjaGFyICpuYW1lOworfTsKKworCitzdGF0aWMgaW50CittYXRjaF9mdW5jIChEd2FyZl9GdW5jICpmdW5jLCB2b2lkICphcmcpCit7CisgIHN0cnVjdCBmdW5jX2FyZyAqZnVuY19hcmcgPSAoc3RydWN0IGZ1bmNfYXJnICopIGFyZzsKKyAgRHdhcmZfQWRkciBhZGRyOworCisgIGlmIChkd2FyZl9mdW5jX2xvd3BjIChmdW5jLCAmYWRkcikgPT0gMCAmJiBhZGRyIDw9IGZ1bmNfYXJnLT5hZGRyCisgICAgICAmJiBkd2FyZl9mdW5jX2hpZ2hwYyAoZnVuYywgJmFkZHIpID09IDAgJiYgZnVuY19hcmctPmFkZHIgPCBhZGRyKQorICAgIHsKKyAgICAgIGZ1bmNfYXJnLT5uYW1lID0gZHdhcmZfZnVuY19uYW1lIChmdW5jKTsKKyAgICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKKyAgICB9CisKKyAgcmV0dXJuIERXQVJGX0NCX09LOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2VsZl9nZXRuYW1lIChHRWxmX0FkZHIgYWRkciwgRWxmICplbGYpCit7CisgIC8qIFRoZSBEV0FSRiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgVXNlIHRoZSBFTEYKKyAgICAgc3ltYm9sIHRhYmxlLiAgKi8KKyAgRWxmX1NjbiAqc2NuID0gTlVMTDsKKyAgRWxmX1NjbiAqZHluc2NuID0gTlVMTDsKKworICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisgICAgICBpZiAoc2hkciAhPSBOVUxMKQorCXsKKwkgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUIpCisJICAgIGJyZWFrOworCSAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkKKwkgICAgZHluc2NuID0gc2NuOworCX0KKyAgICB9CisgIGlmIChzY24gPT0gTlVMTCkKKyAgICBzY24gPSBkeW5zY247CisKKyAgaWYgKHNjbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGZvciBhIG1hdGNoaW5nIHN5bWJvbC4gICovCisgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKyAgICAgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworICAgICAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKyAgICAgIGlmIChkYXRhICE9IE5VTEwpCisJZm9yIChpbnQgY250ID0gMTsgY250IDwgKGludCkgKHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplKTsKKwkgICAgICsrY250KQorCSAgeworCSAgICBHRWxmX1N5bSBzeW1fbWVtOworCSAgICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW0gKGRhdGEsIGNudCwgJnN5bV9tZW0pOworCSAgICBpZiAoc3ltICE9IE5VTEwKKwkJJiYgc3ltLT5zdF92YWx1ZSA8PSBhZGRyCisJCSYmIGFkZHIgPCBzeW0tPnN0X3ZhbHVlICsgc3ltLT5zdF9zaXplKQorCSAgICAgIHJldHVybiBlbGZfc3RycHRyIChlbGYsIHNoZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7CisJICB9CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfYWRkcmVzcyAoR0VsZl9BZGRyIGFkZHIsIEVsZiAqZWxmLCBEd2FyZiAqZHcpCit7CisgIER3YXJmX0RpZSBkaWVfbWVtOworICBEd2FyZl9EaWUgKmRpZSA9IGR3YXJmX2FkZHJkaWUgKGR3LCBhZGRyLCAmZGllX21lbSk7CisKKyAgaWYgKHNob3dfZnVuY3Rpb25zKQorICAgIHsKKyAgICAgIC8qIEZpcnN0IGRldGVybWluZSB0aGUgZnVuY3Rpb24gbmFtZS4gIFVzZSB0aGUgRFdBUkYgaW5mb3JtYXRpb24gaWYKKwkgcG9zc2libGUuICAqLworICAgICAgc3RydWN0IGZ1bmNfYXJnIGFyZzsKKyAgICAgIGFyZy5hZGRyID0gYWRkcjsKKyAgICAgIGFyZy5uYW1lID0gTlVMTDsKKworICAgICAgaWYgKGR3YXJmX2dldGZ1bmNzIChkaWUsIG1hdGNoX2Z1bmMsICZhcmcsIDApIDw9IDApCisJYXJnLm5hbWUgPSBlbGZfZ2V0bmFtZSAoYWRkciwgZWxmKTsKKworICAgICAgcHV0cyAoYXJnLm5hbWUgPzogIj8/Iik7CisgICAgfQorCisKKyAgRHdhcmZfTGluZSAqbGluZTsKKyAgY29uc3QgY2hhciAqc3JjOworICBpZiAoKGxpbmUgPSBkd2FyZl9nZXRzcmNfZGllIChkaWUsIGFkZHIpKSAhPSBOVUxMCisgICAgJiYgKHNyYyA9IGR3YXJmX2xpbmVzcmMgKGxpbmUsIE5VTEwsIE5VTEwpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChvbmx5X2Jhc2VuYW1lcykKKwlzcmMgPSBiYXNlbmFtZSAoc3JjKTsKKworICAgICAgaW50IGxpbmVubzsKKyAgICAgIGlmIChkd2FyZl9saW5lbm8gKGxpbmUsICZsaW5lbm8pICE9IC0xKQorCXsKKwkgIGludCBsaW5lY29sOworCSAgaWYgKGR3YXJmX2xpbmVjb2wgKGxpbmUsICZsaW5lY29sKSAhPSAtMSAmJiBsaW5lY29sICE9IDApCisJICAgIHByaW50ZiAoIiVzOiVkOiVkXG4iLCBzcmMsIGxpbmVubywgbGluZWNvbCk7CisJICBlbHNlCisJICAgIHByaW50ZiAoIiVzOiVkXG4iLCBzcmMsIGxpbmVubyk7CisJfQorICAgICAgZWxzZQorCXByaW50ZiAoIiVzOjBcbiIsIHNyYyk7CisgICAgfQorICBlbHNlCisgICAgcHV0cyAoIj8/OjAiKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9lbGYzMi1pMzg2LnNjcmlwdCBiL3NyYy9lbGYzMi1pMzg2LnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjIzMzNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VsZjMyLWkzODYuc2NyaXB0CkBAIC0wLDAgKzEsMjE1IEBACitFTlRSWShfc3RhcnQpOworCitTRUFSQ0hfRElSKC9saWIpOworU0VBUkNIX0RJUigvdXNyL2xpYik7CitTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsKK1NFQVJDSF9ESVIoL3Vzci9pNjg2LXBjLWxpbnV4LWdudS9saWIpOworCitJTlRFUlAoL2xpYi9sZC1saW51eC5zby4yKTsKKworUEFHRVNJWkUoNGspOworCitTRUdNRU5UIFtSWF0KK3sKKyNpZmRlZiBTSEFSRUQKKyAgLiA9IFNJWkVPRl9IRUFERVJTOworI2Vsc2UKKyAgLiA9IDB4MDgwNDgwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyNlbmRpZgorCisgIC5pbnRlcnA7CisgIC5oYXNoOworICAuZHluc3ltOworICAuZHluc3RyOworICAuZ251LnZlcnNpb247CisgIC5nbnUudmVyc2lvbl9kOworICAuZ251LnZlcnNpb25fcjsKKyAgLnJlbC5keW47CisgIC5yZWwucGx0OworICAuaW5pdCB7IEtFRVAgKCooLmluaXQpKSB9CisgIC5wbHQ7CisgIC50ZXh0CisgIHsKKyAgICAqKC50ZXh0KQorICAgICooLnRleHQuKikKKyAgICAqKC5zdHViKQorICAgICooLmdudS53YXJuaW5nKQorICAgICooLmdudS5saW5rb25jZS50LiopCisgIH0KKyAgLmZpbmkgeyBLRUVQICgqKC5maW5pKSkgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhCisgICAgeworICAgICAgKigucm9kYXRhKQorICAgICAgKigucm9kYXRhLiopCisgICAgICAqKC5nbnUubGlua29uY2Uuci4qKQorICAgIH0KKyAgLnJvZGF0YTE7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkKKyAgICB7CisgICAgICAqKC5wcmVpbml0X2FycmF5KQorICAgIH0KKyAgUFJPVklERSAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkKKyAgICB7CisgICAgICAqKC5pbml0X2FycmF5KQorICAgIH0KKyAgUFJPVklERSAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkKKyAgICB7CisgICAgICAqKC5maW5pX2FycmF5KQorICAgIH0KKyAgUFJPVklERSAoX19maW5pX2FycmF5X2VuZCA9IC4pOworfQorCitTRUdNRU5UIFtSV10KK3sKKyAgLnNkYXRhMgorICAgIHsKKyAgICAgICooLnNkYXRhMikKKyAgICAgICooLnNkYXRhMi4qKQorICAgICAgKiguZ251LmxpbmtvbmNlLnMyLiopCisgICAgfQorICAuc2JzczIKKyAgICB7CisgICAgICAqKC5zYnNzMikKKyAgICAgICooLnNic3MyLiopCisgICAgICAqKC5nbnUubGlua29uY2Uuc2IyLiopCisgICAgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOKFBBR0VTSVpFKSArICguICYgKFBBR0VTSVpFIC0gMSkpOworICAuZGF0YQorICAgIHsKKyAgICAgICooLmRhdGEpCisgICAgICAqKC5kYXRhLiopCisgICAgICAqKC5nbnUubGlua29uY2UuZC4qKQorICAgIH0KKyAgLmRhdGExOworICAuZWhfZnJhbWUKKyAgICB7CisgICAgICBLRUVQICgqKC5laF9mcmFtZSkpCisgICAgfQorICAuZ2NjX2V4Y2VwdF90YWJsZTsKKyAgLmN0b3JzCisgICAgeworICAgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICAgIGlzIGluLiAgKi8KKyAgICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKSAuY3RvcnMpKQorICAgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgICBLRUVQICgqKC5jdG9ycykpCisgICAgfQorICAuZHRvcnMKKyAgICB7CisgICAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyApIC5kdG9ycykpCisgICAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgICB9CisgIC5qY3I7CisgIC5nb3QKKyAgICB7CisgICAgICAqKC5nb3QucGx0KQorICAgICAgKiguZ290KQorICAgIH0KKyAgLmR5bmFtaWM7CisgIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCisgICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KKyAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KKyAgLnNkYXRhCisgICAgeworICAgICAgKiguc2RhdGEpCisgICAgICAqKC5zZGF0YS4qKQorICAgICAgKiguZ251LmxpbmtvbmNlLnMuKikKKyAgICB9CisgIF9lZGF0YSA9IC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLnNic3MKKyAgICB7CisgICAgICBQUk9WSURFIChfX3Nic3Nfc3RhcnQgPSAuKTsKKyAgICAgIFBST1ZJREUgKF9fX3Nic3Nfc3RhcnQgPSAuKTsKKyAgICAgICooLmR5bnNic3MpCisgICAgICAqKC5zYnNzKQorICAgICAgKiguc2Jzcy4qKQorICAgICAgKiguZ251LmxpbmtvbmNlLnNiLiopCisgICAgICAqKC5zY29tbW9uKQorICAgICAgUFJPVklERSAoX19zYnNzX2VuZCA9IC4pOworICAgICAgUFJPVklERSAoX19fc2Jzc19lbmQgPSAuKTsKKyAgICB9CisgIC5ic3MKKyAgICB7CisgICAgICAqKC5keW5ic3MpCisgICAgICAqKC5ic3MpCisgICAgICAqKC5ic3MuKikKKyAgICAgICooLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKENPTU1PTikKKyAgICAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworCSBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKwkgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgICAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQorCitTRUdNRU5UIFtdCit7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiOworICAuc3RhYnN0cjsKKyAgLnN0YWIuZXhjbDsKKyAgLnN0YWIuZXhjbHN0cjsKKyAgLnN0YWIuaW5kZXg7CisgIC5zdGFiLmluZGV4c3RyOworICAuY29tbWVudDsKKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZzsKKyAgLmxpbmU7CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm87CisgIC5kZWJ1Z19zZm5hbWVzOworICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXM7CisgIC5kZWJ1Z19wdWJuYW1lczsKKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbworICAgIHsKKyAgICAgICAqKC5kZWJ1Z19pbmZvKQorICAgICAgICooLmdudS5saW5rb25jZS53aS4qKQorICAgIH0KKyAgLmRlYnVnX2FiYnJldjsKKyAgLmRlYnVnX2xpbmU7CisgIC5kZWJ1Z19mcmFtZTsKKyAgLmRlYnVnX3N0cjsKKyAgLmRlYnVnX2xvYzsKKyAgLmRlYnVnX21hY2luZm87CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzOworICAuZGVidWdfZnVuY25hbWVzOworICAuZGVidWdfdHlwZW5hbWVzOworICAuZGVidWdfdmFybmFtZXM7CisgIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovCit9CmRpZmYgLS1naXQgYS9zcmMvZWxmY21wLmMgYi9zcmMvZWxmY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmN2U3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbGZjbXAuYwpAQCAtMCwwICsxLDYxMSBAQAorLyogQ29tcGFyZSByZWxldmFudCBjb250ZW50IG9mIHR3byBFTEYgZmlsZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhcmdwLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxlcnJvci5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGliaW50bC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiLi4vbGliZWxmL2VsZi1rbm93bGVkZ2UuaCIKKyNpbmNsdWRlICIuLi9saWJlYmwvbGliZWJsUC5oIgorCisKKy8qIFByb3RvdHlwZXMgb2YgbG9jYWwgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBFbGYgKm9wZW5fZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGludCAqZmRwLCBFYmwgKiplYmxwKTsKK3N0YXRpYyBib29sIHNlYXJjaF9mb3JfY29weV9yZWxvYyAoRWJsICplYmwsIHNpemVfdCBzY25uZHgsIGludCBzeW1uZHgpOworc3RhdGljICBpbnQgcmVnaW9uY29tcGFyZSAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKTsKKworCisvKiBOYW1lIGFuZCB2ZXJzaW9uIG9mIHByb2dyYW0uICAqLworc3RhdGljIHZvaWQgcHJpbnRfdmVyc2lvbiAoRklMRSAqc3RyZWFtLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpOwordm9pZCAoKmFyZ3BfcHJvZ3JhbV92ZXJzaW9uX2hvb2spIChGSUxFICosIHN0cnVjdCBhcmdwX3N0YXRlICopID0gcHJpbnRfdmVyc2lvbjsKKworLyogQnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KK2NvbnN0IGNoYXIgKmFyZ3BfcHJvZ3JhbV9idWdfYWRkcmVzcyA9IFBBQ0tBR0VfQlVHUkVQT1JUOworCisvKiBWYWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGhhdmUgbm8gc2hvcnQgZm9ybS4gICovCisjZGVmaW5lIE9QVF9HQVBTIDB4MTAwCisKKy8qIERlZmluaXRpb25zIG9mIGFyZ3VtZW50cyBmb3IgYXJncCBmdW5jdGlvbnMuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQoreworICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJDb250cm9sIG9wdGlvbnM6IiksIDAgfSwKKyAgeyAiZ2FwcyIsIE9QVF9HQVBTLCAiQUNUSU9OIiwgMCwgTl8oIkNvbnRyb2wgdHJlYXRtZW50IG9mIGdhcHMgaW4gbG9hZGFibGUgc2VnbWVudHMgW2lnbm9yZXxtYXRjaF0gKGRlZmF1bHQ6IGlnbm9yZSkiKSwgMCB9LAorICB7ICJxdWlldCIsICdxJywgTlVMTCwgMCwgTl8oIk91dHB1dCBub3RoaW5nOyB5aWVsZCBleGl0IHN0YXR1cyBvbmx5IiksIDAgfSwKKworICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJNaXNjZWxsYW5lb3VzOiIpLCAwIH0sCisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Cit9OworCisvKiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRvY1tdID0gTl8oIlwKK0NvbXBhcmUgcmVsZXZhbnQgcGFydHMgb2YgdHdvIEVMRiBmaWxlcyBmb3IgZXF1YWxpdHkuIik7CisKKy8qIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGFyZ3NfZG9jW10gPSBOXygiRklMRTEgRklMRTIiKTsKKworLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCitzdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Cit7CisgIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworCisvKiBIb3cgdG8gdHJlYXQgZ2FwcyBpbiBsb2FkYWJsZSBzZWdtZW50cy4gICovCitzdGF0aWMgZW51bQorICB7CisgICAgZ2Fwc19pZ25vcmUgPSAwLAorICAgIGdhcHNfbWF0Y2gKKyAgfQorICBnYXBzOworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCB1c2VkIHJlZ2lvbnMuICAqLworc3RydWN0IHJlZ2lvbgoreworICBHRWxmX0FkZHIgZnJvbTsKKyAgR0VsZl9BZGRyIHRvOworICBzdHJ1Y3QgcmVnaW9uICpuZXh0OworfTsKKworLyogTm9uemVybyBpZiBvbmx5IGV4aXQgc3RhdHVzIGlzIHdhbnRlZC4gICovCitzdGF0aWMgYm9vbCBxdWlldDsKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIC8qIFNldCBsb2NhbGUuICAqLworICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgY2F0YWxvZyBjYW4gYmUgZm91bmQuICAqLworICAodm9pZCkgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjYXRhbG9nLiAgKi8KKyAgKHZvaWQpIHRleHRkb21haW4gKFBBQ0tBR0UpOworCisgIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gICovCisgIGludCByZW1haW5pbmc7CisgICh2b2lkKSBhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCk7CisKKyAgLyogV2UgZXhwZWN0IGV4YWN0bHkgdHdvIG5vbi1vcHRpb24gcGFyYW1ldGVycy4gICovCisgIGlmIChyZW1haW5pbmcgKyAyICE9IGFyZ2MpCisgICAgeworICAgICAgZnB1dHMgKGdldHRleHQgKCJJbnZhbGlkIG51bWJlciBvZiBwYXJhbWV0ZXJzLlxuIiksIHN0ZGVycik7CisgICAgICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBDb21wYXJpbmcgdGhlIGZpbGVzIGlzIGRvbmUgaW4gdHdvIHBoYXNlczoKKyAgICAgMS4gY29tcGFyZSBhbGwgc2VjdGlvbnMuICBTZWN0aW9ucyB3aGljaCBhcmUgaXJyZWxldmFudCAoaS5lLiwgaWYKKyAgICAgICAgc3RyaXAgd291bGQgcmVtb3ZlIHRoZW0pIGFyZSBpZ25vcmVkLiAgU29tZSBzZWN0aW9uIHR5cGVzIGFyZQorCWhhbmRsZWQgc3BlY2lhbC4KKyAgICAgMi4gYWxsIHBhcnRzIG9mIHRoZSBsb2FkYWJsZSBzZWdtZW50cyB3aGljaCBhcmUgbm90IHBhcnRzIG9mIGFueQorICAgICAgICBzZWN0aW9uIGlzIGNvbXBhcmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIC0tZ2FwcyBvcHRpb24uCisgICovCisgIGludCByZXN1bHQgPSAwOworICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7CisKKyAgY29uc3QgY2hhciAqY29uc3QgZm5hbWUxID0gYXJndltyZW1haW5pbmddOworICBpbnQgZmQxOworICBFYmwgKmVibDE7CisgIEVsZiAqZWxmMSA9IG9wZW5fZmlsZSAoZm5hbWUxLCAmZmQxLCAmZWJsMSk7CisKKyAgY29uc3QgY2hhciAqY29uc3QgZm5hbWUyID0gYXJndltyZW1haW5pbmcgKyAxXTsKKyAgaW50IGZkMjsKKyAgRWJsICplYmwyOworICBFbGYgKmVsZjIgPSBvcGVuX2ZpbGUgKGZuYW1lMiwgJmZkMiwgJmVibDIpOworCisgIEdFbGZfRWhkciBlaGRyMV9tZW07CisgIEdFbGZfRWhkciAqZWhkcjEgPSBnZWxmX2dldGVoZHIgKGVsZjEsICZlaGRyMV9tZW0pOworICBpZiAoZWhkcjEgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBFTEYgaGVhZGVyIG9mIFwiJXNcIjogJXMiKSwKKwkgICBmbmFtZTEsIGVsZl9lcnJtc2cgKC0xKSk7CisgIEdFbGZfRWhkciBlaGRyMl9tZW07CisgIEdFbGZfRWhkciAqZWhkcjIgPSBnZWxmX2dldGVoZHIgKGVsZjIsICZlaGRyMl9tZW0pOworICBpZiAoZWhkcjIgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBFTEYgaGVhZGVyIG9mIFwiJXNcIjogJXMiKSwKKwkgICBmbmFtZTIsIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgLyogQ29tcGFyZSB0aGUgRUxGIGhlYWRlcnMuICAqLworICBpZiAobWVtY21wIChlaGRyMS0+ZV9pZGVudCwgZWhkcjItPmVfaWRlbnQsIEVJX05JREVOVCkgIT0gMAorICAgICAgfHwgZWhkcjEtPmVfdHlwZSAhPSBlaGRyMi0+ZV90eXBlCisgICAgICB8fCBlaGRyMS0+ZV9tYWNoaW5lICE9IGVoZHIyLT5lX21hY2hpbmUKKyAgICAgIHx8IGVoZHIxLT5lX3ZlcnNpb24gIT0gZWhkcjItPmVfdmVyc2lvbgorICAgICAgfHwgZWhkcjEtPmVfZW50cnkgIT0gZWhkcjItPmVfZW50cnkKKyAgICAgIHx8IGVoZHIxLT5lX3Bob2ZmICE9IGVoZHIyLT5lX3Bob2ZmCisgICAgICB8fCBlaGRyMS0+ZV9mbGFncyAhPSBlaGRyMi0+ZV9mbGFncworICAgICAgfHwgZWhkcjEtPmVfZWhzaXplICE9IGVoZHIyLT5lX2Voc2l6ZQorICAgICAgfHwgZWhkcjEtPmVfcGhlbnRzaXplICE9IGVoZHIyLT5lX3BoZW50c2l6ZQorICAgICAgfHwgZWhkcjEtPmVfcGhudW0gIT0gZWhkcjItPmVfcGhudW0KKyAgICAgIHx8IGVoZHIxLT5lX3NoZW50c2l6ZSAhPSBlaGRyMi0+ZV9zaGVudHNpemUKKyAgICAgIHx8IGVoZHIxLT5lX3NobnVtICE9IGVoZHIyLT5lX3NobnVtCisgICAgICB8fCBlaGRyMS0+ZV9zaHN0cm5keCAhPSBlaGRyMi0+ZV9zaHN0cm5keCkKKyAgICB7CisgICAgICBpZiAoISBxdWlldCkKKwllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzICVzIGRpZmY6IEVMRiBoZWFkZXIiKSwgZm5hbWUxLCBmbmFtZTIpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBJdGVyYXRlIG92ZXIgYWxsIHNlY3Rpb25zLiAgV2UgZXhwZWN0IHRoZSBzZWN0aW9ucyBpbiB0aGUgdHdvCisgICAgIGZpbGVzIHRvIG1hdGNoIGV4YWN0bHkuICAqLworICBFbGZfU2NuICpzY24xID0gTlVMTDsKKyAgRWxmX1NjbiAqc2NuMiA9IE5VTEw7CisgIHN0cnVjdCByZWdpb24gKnJlZ2lvbnMgPSBOVUxMOworICBzaXplX3QgbnJlZ2lvbnMgPSAwOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBHRWxmX1NoZHIgc2hkcjFfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyMTsKKyAgICAgIGNvbnN0IGNoYXIgKnNuYW1lMSA9IE5VTEw7CisgICAgICBkbworCXsKKwkgIHNjbjEgPSBlbGZfbmV4dHNjbiAoZWxmMSwgc2NuMSk7CisJICBzaGRyMSA9IGdlbGZfZ2V0c2hkciAoc2NuMSwgJnNoZHIxX21lbSk7CisJICBpZiAoc2hkcjEgIT0gTlVMTCkKKwkgICAgc25hbWUxID0gZWxmX3N0cnB0ciAoZWxmMSwgZWhkcjEtPmVfc2hzdHJuZHgsIHNoZHIxLT5zaF9uYW1lKTsKKwl9CisgICAgICB3aGlsZSAoc2NuMSAhPSBOVUxMCisJICAgICAmJiBlYmxfc2VjdGlvbl9zdHJpcF9wIChlYmwxLCBlaGRyMSwgc2hkcjEsIHNuYW1lMSwgdHJ1ZSwgZmFsc2UpKTsKKworICAgICAgR0VsZl9TaGRyIHNoZHIyX21lbTsKKyAgICAgIEdFbGZfU2hkciAqc2hkcjI7CisgICAgICBjb25zdCBjaGFyICpzbmFtZTIgPSBOVUxMOworICAgICAgZG8KKwl7CisJICBzY24yID0gZWxmX25leHRzY24gKGVsZjIsIHNjbjIpOworCSAgc2hkcjIgPSBnZWxmX2dldHNoZHIgKHNjbjIsICZzaGRyMl9tZW0pOworCSAgaWYgKHNoZHIyICE9IE5VTEwpCisJICAgIHNuYW1lMiA9IGVsZl9zdHJwdHIgKGVsZjIsIGVoZHIyLT5lX3Noc3RybmR4LCBzaGRyMi0+c2hfbmFtZSk7CisJfQorICAgICAgd2hpbGUgKHNjbjIgIT0gTlVMTAorCSAgICAgJiYgZWJsX3NlY3Rpb25fc3RyaXBfcCAoZWJsMiwgZWhkcjIsIHNoZHIyLCBzbmFtZTIsIHRydWUsIGZhbHNlKSk7CisKKyAgICAgIGlmIChzY24xID09IE5VTEwgfHwgc2NuMiA9PSBOVUxMKQorCWJyZWFrOworCisgICAgICBpZiAoZ2FwcyAhPSBnYXBzX2lnbm9yZSAmJiAoc2hkcjEtPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQorCXsKKwkgIHN0cnVjdCByZWdpb24gKm5ld3AgPSAoc3RydWN0IHJlZ2lvbiAqKSBhbGxvY2EgKHNpemVvZiAoKm5ld3ApKTsKKwkgIG5ld3AtPmZyb20gPSBzaGRyMS0+c2hfb2Zmc2V0OworCSAgbmV3cC0+dG8gPSBzaGRyMS0+c2hfb2Zmc2V0ICsgc2hkcjEtPnNoX3NpemU7CisJICBuZXdwLT5uZXh0ID0gcmVnaW9uczsKKwkgIHJlZ2lvbnMgPSBuZXdwOworCisJICArK25yZWdpb25zOworCX0KKworICAgICAgLyogQ29tcGFyZSB0aGUgaGVhZGVycy4gIFdlIGFsbG93IHRoZSBuYW1lIHRvIGJlIGF0IGEgZGlmZmVyZW50CisJIGxvY2F0aW9uLiAgKi8KKyAgICAgIGlmIChzdHJjbXAgKHNuYW1lMSwgc25hbWUyKSAhPSAwKQorCXsKKwloZWFkZXJfbWlzbWF0Y2g6CisJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzICVzIGRpZmZlcjogc2VjdGlvbiBoZWFkZXIiKSwKKwkJIGZuYW1lMSwgZm5hbWUyKTsKKwkgIHJlc3VsdCA9IDE7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIC8qIFdlIGlnbm9yZSBjZXJ0YWluIHNlY3Rpb25zLiAgKi8KKyAgICAgIGlmIChzdHJjbXAgKHNuYW1lMSwgIi5nbnVfZGVidWdsaW5rIikgPT0gMAorCSAgfHwgc3RyY21wIChzbmFtZTEsICIuZ251LnByZWxpbmtfdW5kbyIpID09IDApCisJY29udGludWU7CisKKyAgICAgIGlmIChzaGRyMS0+c2hfdHlwZSAhPSBzaGRyMi0+c2hfdHlwZQorCSAgLy8gWFhYIEFueSBmbGFncyB3aGljaCBzaG91bGQgYmUgaWdub3JlZD8KKwkgIHx8IHNoZHIxLT5zaF9mbGFncyAhPSBzaGRyMi0+c2hfZmxhZ3MKKwkgIHx8IHNoZHIxLT5zaF9hZGRyICE9IHNoZHIyLT5zaF9hZGRyCisJICB8fCBzaGRyMS0+c2hfb2Zmc2V0ICE9IHNoZHIyLT5zaF9vZmZzZXQKKwkgIHx8IHNoZHIxLT5zaF9zaXplICE9IHNoZHIyLT5zaF9zaXplCisJICB8fCBzaGRyMS0+c2hfbGluayAhPSBzaGRyMi0+c2hfbGluaworCSAgfHwgc2hkcjEtPnNoX2luZm8gIT0gc2hkcjItPnNoX2luZm8KKwkgIHx8IHNoZHIxLT5zaF9hZGRyYWxpZ24gIT0gc2hkcjItPnNoX2FkZHJhbGlnbgorCSAgfHwgc2hkcjEtPnNoX2VudHNpemUgIT0gc2hkcjItPnNoX2VudHNpemUpCisJZ290byBoZWFkZXJfbWlzbWF0Y2g7CisKKyAgICAgIEVsZl9EYXRhICpkYXRhMSA9IGVsZl9nZXRkYXRhIChzY24xLCBOVUxMKTsKKyAgICAgIGlmIChkYXRhMSA9PSBOVUxMKQorCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgICAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygc2VjdGlvbiAlenUgaW4gXCIlc1wiOiAlcyIpLAorCSAgICAgICBlbGZfbmR4c2NuIChzY24xKSwgZm5hbWUxLCBlbGZfZXJybXNnICgtMSkpOworCisgICAgICBFbGZfRGF0YSAqZGF0YTIgPSBlbGZfZ2V0ZGF0YSAoc2NuMiwgTlVMTCk7CisgICAgICBpZiAoZGF0YTIgPT0gTlVMTCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1IGluIFwiJXNcIjogJXMiKSwKKwkgICAgICAgZWxmX25keHNjbiAoc2NuMiksIGZuYW1lMiwgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgc3dpdGNoIChzaGRyMS0+c2hfdHlwZSkKKwl7CisJY2FzZSBTSFRfRFlOU1lNOgorCWNhc2UgU0hUX1NZTVRBQjoKKwkgIC8qIEl0ZXJhdGUgb3ZlciB0aGUgc3ltYm9sIHRhYmxlLiAgV2UgaWdub3JlIHRoZSBzdF9zaXplCisJICAgICB2YWx1ZSBvZiB1bmRlZmluZWQgc3ltYm9scy4gICovCisJICBmb3IgKGludCBuZHggPSAwOyBuZHggPCAoaW50KSAoc2hkcjEtPnNoX3NpemUgLyBzaGRyMS0+c2hfZW50c2l6ZSk7CisJICAgICAgICsrbmR4KQorCSAgICB7CisJICAgICAgR0VsZl9TeW0gc3ltMV9tZW07CisJICAgICAgR0VsZl9TeW0gKnN5bTEgPSBnZWxmX2dldHN5bSAoZGF0YTEsIG5keCwgJnN5bTFfbWVtKTsKKwkgICAgICBpZiAoc3ltMSA9PSBOVUxMKQorCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc3ltYm9sIGluIFwiJXNcIjogJXMiKSwKKwkJICAgICAgIGZuYW1lMSwgZWxmX2Vycm1zZyAoLTEpKTsKKwkgICAgICBHRWxmX1N5bSBzeW0yX21lbTsKKwkgICAgICBHRWxmX1N5bSAqc3ltMiA9IGdlbGZfZ2V0c3ltIChkYXRhMiwgbmR4LCAmc3ltMl9tZW0pOworCSAgICAgIGlmIChzeW0yID09IE5VTEwpCisJCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzeW1ib2wgaW4gXCIlc1wiOiAlcyIpLAorCQkgICAgICAgZm5hbWUyLCBlbGZfZXJybXNnICgtMSkpOworCisJICAgICAgY29uc3QgY2hhciAqbmFtZTEgPSBlbGZfc3RycHRyIChlbGYxLCBzaGRyMS0+c2hfbGluaywKKwkJCQkJICAgICAgc3ltMS0+c3RfbmFtZSk7CisJICAgICAgY29uc3QgY2hhciAqbmFtZTIgPSBlbGZfc3RycHRyIChlbGYyLCBzaGRyMi0+c2hfbGluaywKKwkJCQkJICAgICAgc3ltMi0+c3RfbmFtZSk7CisJICAgICAgaWYgKHN0cmNtcCAobmFtZTEsIG5hbWUyKSAhPSAwCisJCSAgfHwgc3ltMS0+c3RfdmFsdWUgIT0gc3ltMi0+c3RfdmFsdWUKKwkJICB8fCAoc3ltMS0+c3Rfc2l6ZSAhPSBzeW0yLT5zdF9zaXplCisJCSAgICAgICYmIHN5bTEtPnN0X3NobmR4ICE9IFNITl9VTkRFRikKKwkJICB8fCBzeW0xLT5zdF9pbmZvICE9IHN5bTItPnN0X2luZm8KKwkJICB8fCBzeW0xLT5zdF9vdGhlciAhPSBzeW0yLT5zdF9vdGhlcgorCQkgIHx8IHN5bTEtPnN0X3NobmR4ICE9IHN5bTEtPnN0X3NobmR4KQorCQl7CisJCSAgLy8gWFhYIERvIHdlIHdhbnQgdG8gYWxsb3cgcmVvcmRlcmVkIHN5bWJvbCB0YWJsZXM/CisJCSAgaWYgKCEgcXVpZXQpCisJCSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIiksCisJCQkgICBmbmFtZTEsIGZuYW1lMik7CisJCSAgcmVzdWx0ID0gMTsKKwkJICBnb3RvIG91dDsKKwkJfQorCisJICAgICAgaWYgKHN5bTEtPnN0X3NobmR4ID09IFNITl9VTkRFRgorCQkgICYmIHN5bTEtPnN0X3NpemUgIT0gc3ltMi0+c3Rfc2l6ZSkKKwkJeworCQkgIC8qIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgaW4gdGhlIG9iamVjdCBkZWZpbmluZyBpdAorCQkgICAgIG1pZ2h0IGhhdmUgY2hhbmdlZC4gIFRoYXQgaXMgT0sgdW5sZXNzIHRoZSBzeW1ib2wKKwkJICAgICBpcyB1c2VkIGluIGEgY29weSByZWxvY2F0aW9uLiAgTG9vayBvdmVyIHRoZQorCQkgICAgIHNlY3Rpb25zIGluIGJvdGggZmlsZXMgYW5kIGRldGVybWluZSB3aGljaAorCQkgICAgIHJlbG9jYXRpb24gc2VjdGlvbiB1c2VzIHRoaXMgc3ltYm9sIHRhYmxlCisJCSAgICAgc2VjdGlvbi4gIFRoZW4gbG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucyB0bworCQkgICAgIHNlZSB3aGV0aGVyIGFueSBjb3B5IHJlbG9jYXRpb24gcmVmZXJlbmNlcyB0aGlzCisJCSAgICAgc3ltYm9sLiAgKi8KKwkJICBpZiAoc2VhcmNoX2Zvcl9jb3B5X3JlbG9jIChlYmwxLCBlbGZfbmR4c2NuIChzY24xKSwgbmR4KQorCQkgICAgICB8fCBzZWFyY2hfZm9yX2NvcHlfcmVsb2MgKGVibDIsIGVsZl9uZHhzY24gKHNjbjIpLCBuZHgpKQorCQkgICAgeworCQkgICAgICBpZiAoISBxdWlldCkKKwkJCWVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXMgJXMgZGlmZmVyOiBzeW1ib2wgdGFibGUiKSwKKwkJCSAgICAgICBmbmFtZTEsIGZuYW1lMik7CisJCSAgICAgIHJlc3VsdCA9IDE7CisJCSAgICAgIGdvdG8gb3V0OworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIC8qIENvbXBhcmUgdGhlIHNlY3Rpb24gY29udGVudCBieXRlIGZvciBieXRlLiAgKi8KKwkgIGFzc2VydCAoc2hkcjEtPnNoX3R5cGUgPT0gU0hUX05PQklUUworCQkgIHx8IChkYXRhMS0+ZF9idWYgIT0gTlVMTCB8fCBkYXRhMS0+ZF9zaXplID09IDApKTsKKwkgIGFzc2VydCAoc2hkcjItPnNoX3R5cGUgPT0gU0hUX05PQklUUworCQkgIHx8IChkYXRhMi0+ZF9idWYgIT0gTlVMTCB8fCBkYXRhMS0+ZF9zaXplID09IDApKTsKKworCSAgaWYgKGRhdGExLT5kX3NpemUgIT0gZGF0YTItPmRfc2l6ZQorCSAgICAgIHx8IChzaGRyMS0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTCisJCSAgJiYgbWVtY21wIChkYXRhMS0+ZF9idWYsIGRhdGEyLT5kX2J1ZiwgZGF0YTEtPmRfc2l6ZSkgIT0gMCkpCisJICAgIHsKKwkgICAgICBpZiAoISBxdWlldCkKKwkJZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gY29udGVudCIpLAorCQkgICAgICAgZm5hbWUxLCBmbmFtZTIpOworCSAgICAgIHJlc3VsdCA9IDE7CisJICAgICAgZ290byBvdXQ7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKHNjbjEgIT0gc2NuMikKKyAgICB7CisgICAgICBpZiAoISBxdWlldCkKKwllcnJvciAoMCwgMCwKKwkgICAgICAgZ2V0dGV4dCAoIiVzICVzIGRpZmZlcjogdW5lcXVhbCBhbW91bnQgb2YgaW1wb3J0YW50IHNlY3Rpb25zIiksCisJICAgICAgIGZuYW1lMSwgZm5hbWUyKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogV2Ugd2UgbG9vayBhdCBnYXBzLCBjcmVhdGUgYXJ0aWZpY2lhbCBvbmVzIGZvciB0aGUgcGFydHMgb2YgdGhlCisgICAgIHByb2dyYW0gd2hpY2ggd2UgYXJlIG5vdCBpbiBzZWN0aW9ucy4gICovCisgIHN0cnVjdCByZWdpb24gZWhkcl9yZWdpb247CisgIHN0cnVjdCByZWdpb24gcGhkcl9yZWdpb247CisgIGlmIChnYXBzICE9IGdhcHNfaWdub3JlKQorICAgIHsKKyAgICAgIGVoZHJfcmVnaW9uLmZyb20gPSAwOworICAgICAgZWhkcl9yZWdpb24udG8gPSBlaGRyMS0+ZV9laHNpemU7CisgICAgICBlaGRyX3JlZ2lvbi5uZXh0ID0gJnBoZHJfcmVnaW9uOworCisgICAgICBwaGRyX3JlZ2lvbi5mcm9tID0gZWhkcjEtPmVfcGhvZmY7CisgICAgICBwaGRyX3JlZ2lvbi50byA9IGVoZHIxLT5lX3Bob2ZmICsgZWhkcjEtPmVfcGhudW0gKiBlaGRyMS0+ZV9waGVudHNpemU7CisgICAgICBwaGRyX3JlZ2lvbi5uZXh0ID0gcmVnaW9uczsKKworICAgICAgcmVnaW9ucyA9ICZlaGRyX3JlZ2lvbjsKKyAgICAgIG5yZWdpb25zICs9IDI7CisgICAgfQorCisgIC8qIElmIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUgZ2FwcyB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgZmlsZSBkYXRhLiAgKi8KKyAgY2hhciAqcmF3MSA9IE5VTEw7CisgIHNpemVfdCBzaXplMSA9IDA7CisgIGNoYXIgKnJhdzIgPSBOVUxMOworICBzaXplX3Qgc2l6ZTIgPSAwOworICBzdHJ1Y3QgcmVnaW9uICpyZWdpb25zYXJyID0gYWxsb2NhIChucmVnaW9ucyAqIHNpemVvZiAoc3RydWN0IHJlZ2lvbikpOworICBpZiAoZ2FwcyAhPSBnYXBzX2lnbm9yZSkKKyAgICB7CisgICAgICByYXcxID0gZWxmX3Jhd2ZpbGUgKGVsZjEsICZzaXplMSk7CisgICAgICBpZiAocmF3MSA9PSBOVUxMICkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGxvYWQgZGF0YSBvZiBcIiVzXCI6ICVzIiksCisJICAgICAgIGZuYW1lMSwgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgcmF3MiA9IGVsZl9yYXdmaWxlIChlbGYyLCAmc2l6ZTIpOworICAgICAgaWYgKHJhdzIgPT0gTlVMTCApCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoImNhbm5vdCBsb2FkIGRhdGEgb2YgXCIlc1wiOiAlcyIpLAorCSAgICAgICBmbmFtZTIsIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgICAgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IG5yZWdpb25zOyArK2NudCkKKwl7CisJICByZWdpb25zYXJyW2NudF0gPSAqcmVnaW9uczsKKwkgIHJlZ2lvbnMgPSByZWdpb25zLT5uZXh0OworCX0KKworICAgICAgcXNvcnQgKHJlZ2lvbnNhcnIsIG5yZWdpb25zLCBzaXplb2YgKHJlZ2lvbnNhcnJbMF0pLCByZWdpb25jb21wYXJlKTsKKyAgICB9CisKKyAgLyogQ29tcGFyZSB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGVzLiAgKi8KKyAgZm9yIChpbnQgbmR4ID0gMDsgbmR4IDwgZWhkcjEtPmVfcGhudW07ICsrbmR4KQorICAgIHsKKyAgICAgIEdFbGZfUGhkciBwaGRyMV9tZW07CisgICAgICBHRWxmX1BoZHIgKnBoZHIxID0gZ2VsZl9nZXRwaGRyIChlbGYxLCBuZHgsICZwaGRyMV9tZW0pOworICAgICAgaWYgKGVoZHIxID09IE5VTEwpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQgb2YgXCIlc1wiOiAlcyIpLAorCSAgICAgICBuZHgsIGZuYW1lMSwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIEdFbGZfUGhkciBwaGRyMl9tZW07CisgICAgICBHRWxmX1BoZHIgKnBoZHIyID0gZ2VsZl9nZXRwaGRyIChlbGYyLCBuZHgsICZwaGRyMl9tZW0pOworICAgICAgaWYgKGVoZHIyID09IE5VTEwpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQgb2YgXCIlc1wiOiAlcyIpLAorCSAgICAgICBuZHgsIGZuYW1lMiwgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgaWYgKG1lbWNtcCAocGhkcjEsIHBoZHIyLCBzaXplb2YgKEdFbGZfUGhkcikpICE9IDApCisJeworCSAgaWYgKCEgcXVpZXQpCisJICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXMgJXMgZGlmZmVyOiBwcm9ncmFtIGhlYWRlciAlZCIpLAorCQkgICBmbmFtZTEsIGZuYW1lMiwgbmR4KTsKKwkgIHJlc3VsdCA9IDE7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIGlmIChnYXBzICE9IGdhcHNfaWdub3JlICYmIHBoZHIxLT5wX3R5cGUgPT0gUFRfTE9BRCkKKwl7CisJICBzaXplX3QgY250ID0gMDsKKwkgIHdoaWxlIChjbnQgPCBucmVnaW9ucyAmJiByZWdpb25zYXJyW2NudF0udG8gPCBwaGRyMS0+cF9vZmZzZXQpCisJICAgICsrY250OworCisJICBHRWxmX09mZiBsYXN0ID0gcGhkcjEtPnBfb2Zmc2V0OworCSAgR0VsZl9PZmYgZW5kID0gcGhkcjEtPnBfb2Zmc2V0ICsgcGhkcjEtPnBfZmlsZXN6OworCSAgd2hpbGUgKGNudCA8IG5yZWdpb25zICYmIHJlZ2lvbnNhcnJbY250XS5mcm9tIDwgZW5kKQorCSAgICB7CisJICAgICAgaWYgKGxhc3QgPCByZWdpb25zYXJyW2NudF0uZnJvbSkKKwkJeworCQkgIC8qIENvbXBhcmUgdGhlIFtMQVNULEZST00pIHJlZ2lvbi4gICovCisJCSAgYXNzZXJ0IChnYXBzID09IGdhcHNfbWF0Y2gpOworCQkgIGlmIChtZW1jbXAgKHJhdzEgKyBsYXN0LCByYXcyICsgbGFzdCwKKwkJCSAgICAgIHJlZ2lvbnNhcnJbY250XS5mcm9tIC0gbGFzdCkgIT0gMCkKKwkJICAgIHsKKwkJICAgIGdhcG1pc21hdGNoOgorCQkgICAgICBpZiAoIXF1aWV0KQorCQkJZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlcyAlcyBkaWZmZXI6IGdhcCIpLAorCQkJICAgICAgIGZuYW1lMSwgZm5hbWUyKTsKKwkJICAgICAgcmVzdWx0ID0gMTsKKwkJICAgICAgZ290byBvdXQ7CisJCSAgICB9CisKKwkJfQorCSAgICAgIGxhc3QgPSByZWdpb25zYXJyW2NudF0udG87CisJICAgICAgKytjbnQ7CisJICAgIH0KKworCSAgaWYgKGNudCA9PSBucmVnaW9ucyAmJiBsYXN0IDwgZW5kKQorCSAgICBnb3RvIGdhcG1pc21hdGNoOworCX0KKyAgICB9CisKKyBvdXQ6CisgIGVsZl9lbmQgKGVsZjEpOworICBlbGZfZW5kIChlbGYyKTsKKyAgY2xvc2UgKGZkMSk7CisgIGNsb3NlIChmZDIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogUHJpbnQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworc3RhdGljIHZvaWQKK3ByaW50X3ZlcnNpb24gKEZJTEUgKnN0cmVhbSwgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgZnByaW50ZiAoc3RyZWFtLCAiZWxmY21wICglcykgJXNcbiIsIFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIlwKK0NvcHlyaWdodCAoQykgJXMgUmVkIEhhdCwgSW5jLlxuXAorVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk9cblwKK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuXAorIiksICIyMDA1Iik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIldyaXR0ZW4gYnkgJXMuXG4iKSwgIlVscmljaCBEcmVwcGVyIik7Cit9CisKKworLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KK3N0YXRpYyBlcnJvcl90CitwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywKKwkgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBzd2l0Y2ggKGtleSkKKyAgICB7CisgICAgY2FzZSAncSc6CisgICAgICBxdWlldCA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUX0dBUFM6CisgICAgICBpZiAoc3RyY2FzZWNtcCAoYXJnLCAiaWdub3JlIikgPT0gMCkKKwlnYXBzID0gZ2Fwc19pZ25vcmU7CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChhcmcsICJtYXRjaCIpID09IDApCisJZ2FwcyA9IGdhcHNfbWF0Y2g7CisgICAgICBlbHNlCisJeworCSAgZnByaW50ZiAoc3RkZXJyLAorCQkgICBnZXR0ZXh0ICgiSW52YWxpZCB2YWx1ZSBcIiVzXCIgZm9yIC0tZ2FwcyBwYXJhbWV0ZXIuIiksCisJCSAgIGFyZyk7CisJICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsCisJCSAgICAgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOworCSAgZXhpdCAoMSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEFSR1BfRVJSX1VOS05PV047CisgICAgfQorICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgRWxmICoKK29wZW5fZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGludCAqZmRwLCBFYmwgKiplYmxwKQoreworICBpbnQgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFkpOworICBpZiAodW5saWtlbHkgKGZkID09IC0xKSkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuIFwiJXNcIiIpLCBmbmFtZSk7CisgIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgZm9yIFwiJXNcIjogJXMiKSwKKwkgICBmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgRWJsICplYmwgPSBlYmxfb3BlbmJhY2tlbmQgKGVsZik7CisgIGlmIChlYmwgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIEVCTCBkZXNjcmlwdG9yIGZvciBcIiVzXCIiKSwgZm5hbWUpOworCisgICpmZHAgPSBmZDsKKyAgKmVibHAgPSBlYmw7CisgIHJldHVybiBlbGY7Cit9CisKKworc3RhdGljIGJvb2wKK3NlYXJjaF9mb3JfY29weV9yZWxvYyAoRWJsICplYmwsIHNpemVfdCBzY25uZHgsIGludCBzeW1uZHgpCit7CisgIEVsZl9TY24gKnNjbiA9IE5VTEw7CisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiKSwKKwkgICAgICAgZWxmX25keHNjbiAoc2NuKSwgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgaWYgKChzaGRyLT5zaF90eXBlICE9IFNIVF9SRUwgJiYgc2hkci0+c2hfdHlwZSAhPSBTSFRfUkVMQSkKKwkgIHx8IHNoZHItPnNoX2xpbmsgIT0gc2NubmR4KQorCWNvbnRpbnVlOworCisgICAgICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1OiAlcyIpLAorCSAgICAgICBlbGZfbmR4c2NuIChzY24pLCBlbGZfZXJybXNnICgtMSkpOworCisgICAgICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQorCWZvciAoaW50IG5keCA9IDA7IG5keCA8IChpbnQpIChzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZSk7CisJICAgICArK25keCkKKwkgIHsKKwkgICAgR0VsZl9SZWwgcmVsX21lbTsKKwkgICAgR0VsZl9SZWwgKnJlbCA9IGdlbGZfZ2V0cmVsIChkYXRhLCBuZHgsICZyZWxfbWVtKTsKKwkgICAgaWYgKHJlbCA9PSBOVUxMKQorCSAgICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IHJlbG9jYXRpb246ICVzIiksCisJCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworCSAgICBpZiAoKGludCkgR0VMRl9SX1NZTSAocmVsLT5yX2luZm8pID09IHN5bW5keAorCQkmJiBlYmxfY29weV9yZWxvY19wIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpKQorCSAgICAgIHJldHVybiB0cnVlOworCSAgfQorICAgICAgZWxzZQorCWZvciAoaW50IG5keCA9IDA7IG5keCA8IChpbnQpIChzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZSk7CisJICAgICArK25keCkKKwkgIHsKKwkgICAgR0VsZl9SZWxhIHJlbGFfbWVtOworCSAgICBHRWxmX1JlbGEgKnJlbGEgPSBnZWxmX2dldHJlbGEgKGRhdGEsIG5keCwgJnJlbGFfbWVtKTsKKwkgICAgaWYgKHJlbGEgPT0gTlVMTCkKKwkgICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCByZWxvY2F0aW9uOiAlcyIpLAorCQkgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKwkgICAgaWYgKChpbnQpIEdFTEZfUl9TWU0gKHJlbGEtPnJfaW5mbykgPT0gc3ltbmR4CisJCSYmIGVibF9jb3B5X3JlbG9jX3AgKGVibCwgR0VMRl9SX1RZUEUgKHJlbGEtPnJfaW5mbykpKQorCSAgICAgIHJldHVybiB0cnVlOworCSAgfQorICAgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKworc3RhdGljICBpbnQKK3JlZ2lvbmNvbXBhcmUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKyAgY29uc3Qgc3RydWN0IHJlZ2lvbiAqcjEgPSAoY29uc3Qgc3RydWN0IHJlZ2lvbiAqKSBwMTsKKyAgY29uc3Qgc3RydWN0IHJlZ2lvbiAqcjIgPSAoY29uc3Qgc3RydWN0IHJlZ2lvbiAqKSBwMjsKKworICBpZiAocjEtPmZyb20gPCByMi0+ZnJvbSkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2VsZmxpbnQuYyBiL3NyYy9lbGZsaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1NzIzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbGZsaW50LmMKQEAgLTAsMCArMSwyNjE3IEBACisvKiBQZWRhbnRpYyBjaGVja2luZyBvZiBFTEYgZmlsZXMgY29tcGxpYW5jZSB3aXRoIGdBQkkvcHNBQkkgc3BlYy4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFyZ3AuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisjaW5jbHVkZSA8ZWxmLWtub3dsZWRnZS5oPgorI2luY2x1ZGUgPHN5c3RlbS5oPgorI2luY2x1ZGUgIi4uL2xpYmVibC9saWJlYmxQLmgiCisKKworLyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24gKEZJTEUgKnN0cmVhbSwgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKK3ZvaWQgKCphcmdwX3Byb2dyYW1fdmVyc2lvbl9ob29rKSAoRklMRSAqLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqKSA9IHByaW50X3ZlcnNpb247CisKKy8qIEJ1ZyByZXBvcnQgYWRkcmVzcy4gICovCitjb25zdCBjaGFyICphcmdwX3Byb2dyYW1fYnVnX2FkZHJlc3MgPSBQQUNLQUdFX0JVR1JFUE9SVDsKKworI2RlZmluZSBBUkdQX3N0cmljdAkzMDAKKyNkZWZpbmUgQVJHUF9nbnVsZAkzMDEKKworLyogRGVmaW5pdGlvbnMgb2YgYXJndW1lbnRzIGZvciBhcmdwIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Cit7CisKKyAgeyAic3RyaWN0IiwgQVJHUF9zdHJpY3QsIE5VTEwsIDAsCisgICAgTl8oIkJlIGV4dHJlbWVseSBzdHJpY3QsIGZsYWcgbGV2ZWwgMiBmZWF0dXJlcy4iKSwgMCB9LAorICB7ICJxdWlldCIsICdxJywgTlVMTCwgMCwgTl8oIkRvIG5vdCBwcmludCBhbnl0aGluZyBpZiBzdWNjZXNzZnVsIiksIDAgfSwKKyAgeyAiZGVidWdpbmZvIiwgJ2QnLCBOVUxMLCAwLCBOXygiQmluYXJ5IGlzIGEgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUiKSwgMCB9LAorICB7ICJnbnUtbGQiLCBBUkdQX2dudWxkLCBOVUxMLCAwLAorICAgIE5fKCJCaW5hcnkgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIEdOVSBsZCBhbmQgaXMgdGhlcmVmb3JlIGtub3duIHRvIGJlIFwKK2Jyb2tlbiBpbiBjZXJ0YWluIHdheXMiKSwgMCB9LAorICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQorfTsKKworLyogU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4gICovCitzdGF0aWMgY29uc3QgY2hhciBkb2NbXSA9IE5fKCJcCitQZWRhbnRpYyBjaGVja2luZyBvZiBFTEYgZmlsZXMgY29tcGxpYW5jZSB3aXRoIGdBQkkvcHNBQkkgc3BlYy4iKTsKKworLyogU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgYXJnc19kb2NbXSA9IE5fKCJGSUxFLi4uIik7CisKKy8qIFByb3RvdHlwZSBmb3Igb3B0aW9uIGhhbmRsZXIuICAqLworc3RhdGljIGVycm9yX3QgcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7CisKKy8qIERhdGEgc3RydWN0dXJlIHRvIGNvbW11bmljYXRlIHdpdGggYXJncCBmdW5jdGlvbnMuICAqLworc3RhdGljIHN0cnVjdCBhcmdwIGFyZ3AgPQoreworICBvcHRpb25zLCBwYXJzZV9vcHQsIGFyZ3NfZG9jLCBkb2MsIE5VTEwsIE5VTEwsIE5VTEwKK307CisKKworLyogRGVjbGFyYXRpb25zIG9mIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgKGludCBmZCwgRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCSAgY29uc3QgY2hhciAqc3VmZml4LCBjb25zdCBjaGFyICpmbmFtZSwgc2l6ZV90IHNpemUsCisJCQkgIGJvb2wgb25seV9vbmUpOworc3RhdGljIHZvaWQgcHJvY2Vzc19lbGZfZmlsZSAoRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqc3VmZml4LAorCQkJICAgICAgY29uc3QgY2hhciAqZm5hbWUsIHNpemVfdCBzaXplLCBib29sIG9ubHlfb25lKTsKKworLyogUmVwb3J0IGFuIGVycm9yLiAgKi8KKyNkZWZpbmUgRVJST1Ioc3RyLCBhcmdzLi4uKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgcHJpbnRmIChzdHIsICMjYXJncyk7CQkJCQkJICAgICAgXAorICAgICsrZXJyb3JfY291bnQ7CQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXJyb3JfY291bnQ7CisKKy8qIFRydWUgaWYgd2Ugc2hvdWxkIHBlcmZvcm0gdmVyeSBzdHJpY3QgdGVzdGluZy4gICovCitzdGF0aWMgYm9vbCBiZV9zdHJpY3Q7CisKKy8qIFRydWUgaWYgbm8gbWVzc2FnZSBpcyB0byBiZSBwcmludGVkIGlmIHRoZSBydW4gaXMgc3VjY2VzZnVsLiAgKi8KK3N0YXRpYyBib29sIGJlX3F1aWV0OworCisvKiBUcnVlIGlmIGJpbmFyeSBpcyBmcm9tIHN0cmlwIC1mLCBub3QgYSBub3JtYWwgRUxGIGZpbGUuICAqLworc3RhdGljIGJvb2wgaXNfZGVidWdpbmZvOworCisvKiBUcnVlIGlmIGJpbmFyeSBpcyBhc3N1bWVkIHRvIGJlIGdlbmVyYXRlZCB3aXRoIEdOVSBsZC4gICovCitzdGF0aWMgYm9vbCBnbnVsZDsKKworLyogSW5kZXggb2Ygc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlLiAgKi8KK3N0YXRpYyB1aW50MzJfdCBzaHN0cm5keDsKKworLyogQXJyYXkgdG8gY291bnQgcmVmZXJlbmNlcyBpbiBzZWN0aW9uIGdyb3Vwcy4gICovCitzdGF0aWMgaW50ICpzY25yZWY7CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAvKiBTZXQgbG9jYWxlLiAgKi8KKyAgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIGNhdGFsb2cuICAqLworICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKKworICAvKiBQYXJzZSBhbmQgcHJvY2VzcyBhcmd1bWVudHMuICAqLworICBpbnQgcmVtYWluaW5nOworICBhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCk7CisKKyAgLyogQmVmb3JlIHdlIHN0YXJ0IHRlbGwgdGhlIEVMRiBsaWJyYXJ5IHdoaWNoIHZlcnNpb24gd2UgYXJlIHVzaW5nLiAgKi8KKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIC8qIE5vdyBwcm9jZXNzIGFsbCB0aGUgZmlsZXMgZ2l2ZW4gYXQgdGhlIGNvbW1hbmQgbGluZS4gICovCisgIGJvb2wgb25seV9vbmUgPSByZW1haW5pbmcgKyAxID09IGFyZ2M7CisgIGRvCisgICAgeworICAgICAgLyogT3BlbiB0aGUgZmlsZS4gICovCisgICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W3JlbWFpbmluZ10sIE9fUkRPTkxZKTsKKyAgICAgIGlmIChmZCA9PSAtMSkKKwl7CisJICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlIikpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBDcmVhdGUgYW4gYEVsZicgZGVzY3JpcHRvci4gICovCisgICAgICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQURfTU1BUCwgTlVMTCk7CisgICAgICBpZiAoZWxmID09IE5VTEwpCisJRVJST1IgKGdldHRleHQgKCJjYW5ub3QgZ2VuZXJhdGUgRWxmIGRlc2NyaXB0b3I6ICVzXG4iKSwKKwkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGVsc2UKKwl7CisJICB1bnNpZ25lZCBpbnQgcHJldl9lcnJvcl9jb3VudCA9IGVycm9yX2NvdW50OworCSAgc3RydWN0IHN0YXQ2NCBzdDsKKworCSAgaWYgKGZzdGF0NjQgKGZkLCAmc3QpICE9IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKCJjYW5ub3Qgc3RhdCAnJXMnOiAlbVxuIiwgYXJndltyZW1haW5pbmddKTsKKwkgICAgICBjbG9zZSAoZmQpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIHByb2Nlc3NfZmlsZSAoZmQsIGVsZiwgTlVMTCwgTlVMTCwgYXJndltyZW1haW5pbmddLCBzdC5zdF9zaXplLAorCQkJb25seV9vbmUpOworCisJICAvKiBOb3cgd2UgY2FuIGNsb3NlIHRoZSBkZXNjcmlwdG9yLiAgKi8KKwkgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXNcbiIpLAorCQkgICBlbGZfZXJybXNnICgtMSkpOworCisJICBpZiAocHJldl9lcnJvcl9jb3VudCA9PSBlcnJvcl9jb3VudCAmJiAhYmVfcXVpZXQpCisJICAgIHB1dHMgKGdldHRleHQgKCJObyBlcnJvcnMiKSk7CisJfQorCisgICAgICBjbG9zZSAoZmQpOworICAgIH0KKyAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7CisKKyAgcmV0dXJuIGVycm9yX2NvdW50ICE9IDA7Cit9CisKKworLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KK3N0YXRpYyBlcnJvcl90CitwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJICAgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgc3dpdGNoIChrZXkpCisgICAgeworICAgIGNhc2UgQVJHUF9zdHJpY3Q6CisgICAgICBiZV9zdHJpY3QgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdxJzoKKyAgICAgIGJlX3F1aWV0ID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgICBpc19kZWJ1Z2luZm8gPSB0cnVlOworCisgICAgY2FzZSBBUkdQX2dudWxkOgorICAgICAgZ251bGQgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFSR1BfS0VZX05PX0FSR1M6CisgICAgICBmcHV0cyAoZ2V0dGV4dCAoIk1pc3NpbmcgZmlsZSBuYW1lLlxuIiksIHN0ZGVycik7CisgICAgICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUgfCBBUkdQX0hFTFBfRVhJVF9FUlIsCisJCSBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisgICAgICBleGl0ICgxKTsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKKyAgICB9CisgIHJldHVybiAwOworfQorCisKKy8qIFByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGZwcmludGYgKHN0cmVhbSwgImVsZmxpbnQgKCVzKSAlc1xuIiwgUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBnZXR0ZXh0ICgiXAorQ29weXJpZ2h0IChDKSAlcyBSZWQgSGF0LCBJbmMuXG5cCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOT1xuXAord2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG5cCisiKSwgIjIwMDUiKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBnZXR0ZXh0ICgiV3JpdHRlbiBieSAlcy5cbiIpLCAiVWxyaWNoIERyZXBwZXIiKTsKK30KKworCisvKiBQcm9jZXNzIG9uZSBmaWxlLiAgKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX2ZpbGUgKGludCBmZCwgRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqc3VmZml4LAorCSAgICAgIGNvbnN0IGNoYXIgKmZuYW1lLCBzaXplX3Qgc2l6ZSwgYm9vbCBvbmx5X29uZSkKK3sKKyAgLyogV2UgY2FuIGhhbmRsZSB0d28gdHlwZXMgb2YgZmlsZXM6IEVMRiBmaWxlcyBhbmQgYXJjaGl2ZXMuICAqLworICBFbGZfS2luZCBraW5kID0gZWxmX2tpbmQgKGVsZik7CisKKyAgc3dpdGNoIChraW5kKQorICAgIHsKKyAgICBjYXNlIEVMRl9LX0VMRjoKKyAgICAgIC8qIFllcyEgIEl0J3MgYW4gRUxGIGZpbGUuICAqLworICAgICAgcHJvY2Vzc19lbGZfZmlsZSAoZWxmLCBwcmVmaXgsIHN1ZmZpeCwgZm5hbWUsIHNpemUsIG9ubHlfb25lKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEZfS19BUjoKKyAgICAgIHsKKwlFbGYgKnN1YmVsZjsKKwlFbGZfQ21kIGNtZCA9IEVMRl9DX1JFQURfTU1BUDsKKwlzaXplX3QgcHJlZml4X2xlbiA9IHByZWZpeCA9PSBOVUxMID8gMCA6IHN0cmxlbiAocHJlZml4KTsKKwlzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSkgKyAxOworCWNoYXIgbmV3X3ByZWZpeFtwcmVmaXhfbGVuICsgMSArIGZuYW1lX2xlbl07CisJY2hhciBuZXdfc3VmZml4WyhzdWZmaXggPT0gTlVMTCA/IDAgOiBzdHJsZW4gKHN1ZmZpeCkpICsgMl07CisJY2hhciAqY3AgPSBuZXdfcHJlZml4OworCisJLyogQ3JlYXRlIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGZpbGUuICAqLworCWlmIChwcmVmaXggIT0gTlVMTCkKKwkgIHsKKwkgICAgY3AgPSBtZW1wY3B5IChjcCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKKwkgICAgKmNwKysgPSAnKCc7CisJICAgIHN0cmNweSAoc3RwY3B5IChuZXdfc3VmZml4LCBzdWZmaXgpLCAiKSIpOworCSAgfQorCWVsc2UKKwkgIG5ld19zdWZmaXhbMF0gPSAnXDAnOworCW1lbWNweSAoY3AsIGZuYW1lLCBmbmFtZV9sZW4pOworCisJLyogSXQncyBhbiBhcmNoaXZlLiAgV2UgcHJvY2VzcyBlYWNoIGZpbGUgaW4gaXQuICAqLworCXdoaWxlICgoc3ViZWxmID0gZWxmX2JlZ2luIChmZCwgY21kLCBlbGYpKSAhPSBOVUxMKQorCSAgeworCSAgICBraW5kID0gZWxmX2tpbmQgKHN1YmVsZik7CisKKwkgICAgLyogQ2FsbCB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5LiAgKi8KKwkgICAgaWYgKGtpbmQgPT0gRUxGX0tfRUxGIHx8IGtpbmQgPT0gRUxGX0tfQVIpCisJICAgICAgeworCQlFbGZfQXJoZHIgKmFyaGRyID0gZWxmX2dldGFyaGRyIChzdWJlbGYpOworCQlhc3NlcnQgKGFyaGRyICE9IE5VTEwpOworCisJCXByb2Nlc3NfZmlsZSAoZmQsIHN1YmVsZiwgbmV3X3ByZWZpeCwgbmV3X3N1ZmZpeCwKKwkJCSAgICAgIGFyaGRyLT5hcl9uYW1lLCBhcmhkci0+YXJfc2l6ZSwgZmFsc2UpOworCSAgICAgIH0KKworCSAgICAvKiBHZXQgbmV4dCBhcmNoaXZlIGVsZW1lbnQuICAqLworCSAgICBjbWQgPSBlbGZfbmV4dCAoc3ViZWxmKTsKKwkgICAgaWYgKGVsZl9lbmQgKHN1YmVsZikgIT0gMCkKKwkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIiBlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXNcbiIpLAorCQkgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBXZSBjYW5ub3QgZG8gYW55dGhpbmcuICAqLworICAgICAgRVJST1IgKGdldHRleHQgKCJcCitOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydCIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCitzZWN0aW9uX25hbWUgKEVibCAqZWJsLCBpbnQgaWR4KQoreworICBHRWxmX1NoZHIgc2hkcl9tZW07CisgIEdFbGZfU2hkciAqc2hkcjsKKworICBzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgaWR4KSwgJnNoZHJfbWVtKTsKKworICByZXR1cm4gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKK30KKworCitzdGF0aWMgY29uc3QgaW50IHZhbGlkX2VfbWFjaGluZVtdID0KKyAgeworICAgIEVNX00zMiwgRU1fU1BBUkMsIEVNXzM4NiwgRU1fNjhLLCBFTV84OEssIEVNXzg2MCwgRU1fTUlQUywgRU1fUzM3MCwKKyAgICBFTV9NSVBTX1JTM19MRSwgRU1fUEFSSVNDLCBFTV9WUFA1MDAsIEVNX1NQQVJDMzJQTFVTLCBFTV85NjAsIEVNX1BQQywKKyAgICBFTV9QUEM2NCwgRU1fUzM5MCwgRU1fVjgwMCwgRU1fRlIyMCwgRU1fUkgzMiwgRU1fUkNFLCBFTV9BUk0sCisgICAgRU1fRkFLRV9BTFBIQSwgRU1fU0gsIEVNX1NQQVJDVjksIEVNX1RSSUNPUkUsIEVNX0FSQywgRU1fSDhfMzAwLAorICAgIEVNX0g4XzMwMEgsIEVNX0g4UywgRU1fSDhfNTAwLCBFTV9JQV82NCwgRU1fTUlQU19YLCBFTV9DT0xERklSRSwKKyAgICBFTV82OEhDMTIsIEVNX01NQSwgRU1fUENQLCBFTV9OQ1BVLCBFTV9ORFIxLCBFTV9TVEFSQ09SRSwgRU1fTUUxNiwKKyAgICBFTV9TVDEwMCwgRU1fVElOWUosIEVNX1g4Nl82NCwgRU1fUERTUCwgRU1fRlg2NiwgRU1fU1Q5UExVUywgRU1fU1Q3LAorICAgIEVNXzY4SEMxNiwgRU1fNjhIQzExLCBFTV82OEhDMDgsIEVNXzY4SEMwNSwgRU1fU1ZYLCBFTV9TVDE5LCBFTV9WQVgsCisgICAgRU1fQ1JJUywgRU1fSkFWRUxJTiwgRU1fRklSRVBBVEgsIEVNX1pTUCwgRU1fTU1JWCwgRU1fSFVBTlksIEVNX1BSSVNNLAorICAgIEVNX0FWUiwgRU1fRlIzMCwgRU1fRDEwViwgRU1fRDMwViwgRU1fVjg1MCwgRU1fTTMyUiwgRU1fTU4xMDMwMCwKKyAgICBFTV9NTjEwMjAwLCBFTV9QSiwgRU1fT1BFTlJJU0MsIEVNX0FSQ19BNSwgRU1fWFRFTlNBCisgIH07CisjZGVmaW5lIG52YWxpZF9lX21hY2hpbmUgXAorICAoc2l6ZW9mICh2YWxpZF9lX21hY2hpbmUpIC8gc2l6ZW9mICh2YWxpZF9lX21hY2hpbmVbMF0pKQorCisKKy8qIE51bWJlciBvZiBzZWN0aW9ucy4gICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNobnVtOworCisKK3N0YXRpYyB2b2lkCitjaGVja19lbGZfaGVhZGVyIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgY2hhciBidWZbNTEyXTsKKyAgc2l6ZV90IGNudDsKKworICAvKiBDaGVjayBlX2lkZW50IGZpZWxkLiAgKi8KKyAgaWYgKGVoZHItPmVfaWRlbnRbRUlfTUFHMF0gIT0gRUxGTUFHMCkKKyAgICBFUlJPUiAoImVfaWRlbnRbJWRdICE9ICclYydcbiIsIEVJX01BRzAsIEVMRk1BRzApOworICBpZiAoZWhkci0+ZV9pZGVudFtFSV9NQUcxXSAhPSBFTEZNQUcxKQorICAgIEVSUk9SICgiZV9pZGVudFslZF0gIT0gJyVjJ1xuIiwgRUlfTUFHMSwgRUxGTUFHMSk7CisgIGlmIChlaGRyLT5lX2lkZW50W0VJX01BRzJdICE9IEVMRk1BRzIpCisgICAgRVJST1IgKCJlX2lkZW50WyVkXSAhPSAnJWMnXG4iLCBFSV9NQUcyLCBFTEZNQUcyKTsKKyAgaWYgKGVoZHItPmVfaWRlbnRbRUlfTUFHM10gIT0gRUxGTUFHMykKKyAgICBFUlJPUiAoImVfaWRlbnRbJWRdICE9ICclYydcbiIsIEVJX01BRzMsIEVMRk1BRzMpOworCisgIGlmIChlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzMyCisgICAgICAmJiBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzY0KQorICAgIEVSUk9SIChnZXR0ZXh0ICgiZV9pZGVudFslZF0gPT0gJWQgaXMgbm8ga25vd24gY2xhc3NcbiIpLAorCSAgIEVJX0NMQVNTLCBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSk7CisKKyAgaWYgKGVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gRUxGREFUQTJMU0IKKyAgICAgICYmIGVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gRUxGREFUQTJNU0IpCisgICAgRVJST1IgKGdldHRleHQgKCJlX2lkZW50WyVkXSA9PSAlZCBpcyBubyBrbm93biBkYXRhIGVuY29kaW5nXG4iKSwKKwkgICBFSV9EQVRBLCBlaGRyLT5lX2lkZW50W0VJX0RBVEFdKTsKKworICBpZiAoZWhkci0+ZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UKQorICAgIEVSUk9SIChnZXR0ZXh0ICgidW5rbm93biBFTEYgaGVhZGVyIHZlcnNpb24gbnVtYmVyIGVfaWRlbnRbJWRdID09ICVkXG4iKSwKKwkgICBFSV9WRVJTSU9OLCBlaGRyLT5lX2lkZW50W0VJX1ZFUlNJT05dKTsKKworICAvKiBXZSBjdXJyZW50bHkgZG9uJ3QgaGFuZGxlIGFueSBPUyBBQklzLiAgKi8KKyAgaWYgKGVoZHItPmVfaWRlbnRbRUlfT1NBQkldICE9IEVMRk9TQUJJX05PTkUpCisgICAgRVJST1IgKGdldHRleHQgKCJ1bnN1cHBvcnRlZCBPUyBBQkkgZV9pZGVudFslZF0gPT0gXCIlc1wiXG4iKSwKKwkgICBFSV9PU0FCSSwKKwkgICBlYmxfb3NhYmlfbmFtZSAoZWJsLCBlaGRyLT5lX2lkZW50W0VJX09TQUJJXSwgYnVmLCBzaXplb2YgKGJ1ZikpKTsKKworICAvKiBObyBBQkkgdmVyc2lvbnMgb3RoZXIgdGhhbiB6ZXJvIHN1cHBvcnRlZCBlaXRoZXIuICAqLworICBpZiAoZWhkci0+ZV9pZGVudFtFSV9BQklWRVJTSU9OXSAhPSAwKQorICAgIEVSUk9SIChnZXR0ZXh0ICgidW5zdXBwb3J0IEFCSSB2ZXJzaW9uIGVfaWRlbnRbJWRdID09ICVkXG4iKSwKKwkgICBFSV9BQklWRVJTSU9OLCBlaGRyLT5lX2lkZW50W0VJX0FCSVZFUlNJT05dKTsKKworICBmb3IgKGNudCA9IEVJX1BBRDsgY250IDwgRUlfTklERU5UOyArK2NudCkKKyAgICBpZiAoZWhkci0+ZV9pZGVudFtjbnRdICE9IDApCisgICAgICBFUlJPUiAoZ2V0dGV4dCAoImVfaWRlbnRbJXp1XSBpcyBub3QgemVyb1xuIiksIGNudCk7CisKKyAgLyogQ2hlY2sgdGhlIGVfdHlwZSBmaWVsZC4gICovCisgIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMICYmIGVoZHItPmVfdHlwZSAhPSBFVF9FWEVDCisgICAgICAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOICYmIGVoZHItPmVfdHlwZSAhPSBFVF9DT1JFKQorICAgIEVSUk9SIChnZXR0ZXh0ICgidW5rbm93biBvYmplY3QgZmlsZSB0eXBlICVkXG4iKSwgZWhkci0+ZV90eXBlKTsKKworICAvKiBDaGVjayB0aGUgZV9tYWNoaW5lIGZpZWxkLiAgKi8KKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBudmFsaWRfZV9tYWNoaW5lOyArK2NudCkKKyAgICBpZiAodmFsaWRfZV9tYWNoaW5lW2NudF0gPT0gZWhkci0+ZV9tYWNoaW5lKQorICAgICAgYnJlYWs7CisgIGlmIChjbnQgPT0gbnZhbGlkX2VfbWFjaGluZSkKKyAgICBFUlJPUiAoZ2V0dGV4dCAoInVua25vd24gbWFjaGluZSB0eXBlICVkXG4iKSwgZWhkci0+ZV9tYWNoaW5lKTsKKworICAvKiBDaGVjayB0aGUgZV92ZXJzaW9uIGZpZWxkLiAgKi8KKyAgaWYgKGVoZHItPmVfdmVyc2lvbiAhPSBFVl9DVVJSRU5UKQorICAgIEVSUk9SIChnZXR0ZXh0ICgidW5rbm93biBvYmplY3QgZmlsZSB2ZXJzaW9uXG4iKSk7CisKKyAgLyogQ2hlY2sgdGhlIGVfcGhvZmYgYW5kIGVfcGhudW0gZmllbGRzLiAgKi8KKyAgaWYgKGVoZHItPmVfcGhvZmYgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZWhkci0+ZV9waG51bSAhPSAwKQorCUVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBvZmZzZXRcbiIpKTsKKyAgICAgIGVsc2UgaWYgKGVoZHItPmVfdHlwZSA9PSBFVF9FWEVDIHx8IGVoZHItPmVfdHlwZSA9PSBFVF9EWU4pCisJRVJST1IgKGdldHRleHQgKCJcCitleGVjdXRhYmxlcyBhbmQgRFNPcyBjYW5ub3QgaGF2ZSB6ZXJvIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIikpOworICAgIH0KKyAgZWxzZSBpZiAoZWhkci0+ZV9waG51bSA9PSAwKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllc1xuIikpOworCisgIC8qIENoZWNrIHRoZSBlX3Nob2ZmIGZpZWxkLiAgKi8KKyAgc2hudW0gPSBlaGRyLT5lX3NobnVtOworICBzaHN0cm5keCA9IGVoZHItPmVfc2hzdHJuZHg7CisgIGlmIChlaGRyLT5lX3Nob2ZmID09IDApCisgICAgeworICAgICAgaWYgKGVoZHItPmVfc2hudW0gIT0gMCkKKwlFUlJPUiAoZ2V0dGV4dCAoImludmFsaWQgc2VjdGlvbiBoZWFkZXIgdGFibGUgb2Zmc2V0XG4iKSk7CisgICAgICBlbHNlIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOCisJICAgICAgICYmIGVoZHItPmVfdHlwZSAhPSBFVF9DT1JFKQorCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBoZWFkZXIgdGFibGUgbXVzdCBiZSBwcmVzZW50XG4iKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGVoZHItPmVfc2hudW0gPT0gMCkKKwl7CisJICAvKiBHZXQgdGhlIGhlYWRlciBvZiB0aGUgemVyb3RoIHNlY3Rpb24uICBUaGUgc2hfc2l6ZSBmaWVsZAorCSAgICAgbWlnaHQgY29udGFpbiB0aGUgc2VjdGlvbiBudW1iZXIuICAqLworCSAgR0VsZl9TaGRyIHNoZHJfbWVtOworCSAgR0VsZl9TaGRyICpzaGRyOworCisJICBzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgMCksICZzaGRyX21lbSk7CisJICBpZiAoc2hkciAhPSBOVUxMKQorCSAgICB7CisJICAgICAgLyogVGhlIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgbGF0ZXIuICAqLworCSAgICAgIGlmIChzaGRyLT5zaF9zaXplID09IDApCisJCUVSUk9SIChnZXR0ZXh0ICgiXAoraW52YWxpZCBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cmllc1xuIikpOworCSAgICAgIGVsc2UKKwkJc2hudW0gPSBzaGRyLT5zaF9zaXplOworCSAgICB9CisJfQorCisgICAgICBpZiAoZWhkci0+ZV9zaHN0cm5keCA9PSBTSE5fWElOREVYKQorCXsKKwkgIC8qIEdldCB0aGUgaGVhZGVyIG9mIHRoZSB6ZXJvdGggc2VjdGlvbi4gIFRoZSBzaF9zaXplIGZpZWxkCisJICAgICBtaWdodCBjb250YWluIHRoZSBzZWN0aW9uIG51bWJlci4gICovCisJICBHRWxmX1NoZHIgc2hkcl9tZW07CisJICBHRWxmX1NoZHIgKnNoZHI7CisKKwkgIHNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCAwKSwgJnNoZHJfbWVtKTsKKwkgIGlmIChzaGRyICE9IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBUaGUgZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBsYXRlci4gICovCisJICAgICAgaWYgKHNoZHItPnNoX2xpbmsgPj0gc2hudW0pCisJCUVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBpbmRleFxuIikpOworCSAgICAgIGVsc2UKKwkJc2hzdHJuZHggPSBzaGRyLT5zaF9saW5rOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc2hzdHJuZHggPj0gc2hudW0pCisJRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIGluZGV4XG4iKSk7CisgICAgfQorCisgIC8qIENoZWNrIHRoZSBlX2ZsYWdzIGZpZWxkLiAgKi8KKyAgaWYgKCFlYmxfbWFjaGluZV9mbGFnX2NoZWNrIChlYmwsIGVoZHItPmVfZmxhZ3MpKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBtYWNoaW5lIGZsYWdzOiAlc1xuIiksCisJICAgZWJsX21hY2hpbmVfZmxhZ19uYW1lIChlYmwsIGVoZHItPmVfZmxhZ3MsIGJ1Ziwgc2l6ZW9mIChidWYpKSk7CisKKyAgLyogQ2hlY2sgZV9laHNpemUsIGVfcGhlbnRzaXplLCBhbmQgZV9zaGVudHNpemUgZmllbGRzLiAgKi8KKyAgaWYgKGdlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKSA9PSBFTEZDTEFTUzMyKQorICAgIHsKKyAgICAgIGlmIChlaGRyLT5lX2Voc2l6ZSAhPSAwICYmIGVoZHItPmVfZWhzaXplICE9IHNpemVvZiAoRWxmMzJfRWhkcikpCisJRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIEVMRiBoZWFkZXIgc2l6ZTogJWhkXG4iKSwgZWhkci0+ZV9laHNpemUpOworCisgICAgICBpZiAoZWhkci0+ZV9waGVudHNpemUgIT0gMCAmJiBlaGRyLT5lX3BoZW50c2l6ZSAhPSBzaXplb2YgKEVsZjMyX1BoZHIpKQorCUVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBzaXplOiAlaGRcbiIpLAorCSAgICAgICBlaGRyLT5lX3BoZW50c2l6ZSk7CisgICAgICBlbHNlIGlmIChlaGRyLT5lX3Bob2ZmICsgZWhkci0+ZV9waG51bSAqIGVoZHItPmVfcGhlbnRzaXplID4gc2l6ZSkKKwlFUlJPUiAoZ2V0dGV4dCAoImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIikpOworCisgICAgICBpZiAoZWhkci0+ZV9zaGVudHNpemUgIT0gMCAmJiBlaGRyLT5lX3NoZW50c2l6ZSAhPSBzaXplb2YgKEVsZjMyX1NoZHIpKQorCUVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBzaXplOiAlaGRcbiIpLAorCSAgICAgICBlaGRyLT5lX3NoZW50c2l6ZSk7CisgICAgICBlbHNlIGlmIChlaGRyLT5lX3Nob2ZmICsgZWhkci0+ZV9zaG51bSAqIGVoZHItPmVfc2hlbnRzaXplID4gc2l6ZSkKKwlFUlJPUiAoZ2V0dGV4dCAoImludmFsaWQgc2VjdGlvbiBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIikpOworICAgIH0KKyAgZWxzZSBpZiAoZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpID09IEVMRkNMQVNTNjQpCisgICAgeworICAgICAgaWYgKGVoZHItPmVfZWhzaXplICE9IDAgJiYgZWhkci0+ZV9laHNpemUgIT0gc2l6ZW9mIChFbGY2NF9FaGRyKSkKKwlFUlJPUiAoZ2V0dGV4dCAoImludmFsaWQgRUxGIGhlYWRlciBzaXplOiAlaGRcbiIpLCBlaGRyLT5lX2Voc2l6ZSk7CisKKyAgICAgIGlmIChlaGRyLT5lX3BoZW50c2l6ZSAhPSAwICYmIGVoZHItPmVfcGhlbnRzaXplICE9IHNpemVvZiAoRWxmNjRfUGhkcikpCisJRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHNpemU6ICVoZFxuIiksCisJICAgICAgIGVoZHItPmVfcGhlbnRzaXplKTsKKyAgICAgIGVsc2UgaWYgKGVoZHItPmVfcGhvZmYgKyBlaGRyLT5lX3BobnVtICogZWhkci0+ZV9waGVudHNpemUgPiBzaXplKQorCUVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBwb3NpdGlvbiBvciBzaXplXG4iKSk7CisKKyAgICAgIGlmIChlaGRyLT5lX3NoZW50c2l6ZSAhPSAwICYmIGVoZHItPmVfc2hlbnRzaXplICE9IHNpemVvZiAoRWxmNjRfU2hkcikpCisJRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHNpemU6ICVoZFxuIiksCisJICAgICAgIGVoZHItPmVfc2hlbnRzaXplKTsKKyAgICAgIGVsc2UgaWYgKGVoZHItPmVfc2hvZmYgKyBlaGRyLT5lX3NobnVtICogZWhkci0+ZV9zaGVudHNpemUgPiBzaXplKQorCUVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBwb3NpdGlvbiBvciBzaXplXG4iKSk7CisgICAgfQorfQorCisKKy8qIENoZWNrIHRoYXQgdGhlcmUgaXMgYSBzZWN0aW9uIGdyb3VwIHNlY3Rpb24gd2l0aCBpbmRleCA8IElEWCB3aGljaAorICAgY29udGFpbnMgc2VjdGlvbiBJRFggYW5kIHRoYXQgdGhlcmUgaXMgZXhhY3RseSBvbmUuICAqLworc3RhdGljIHZvaWQKK2NoZWNrX3Njbl9ncm91cCAoRWJsICplYmwsIGludCBpZHgpCit7CisgIGlmIChzY25yZWZbaWR4XSA9PSAwKQorICAgIHsKKyAgICAgIC8qIE5vIHJlZmVyZW5jZSBzbyBmYXIuICBTZWFyY2ggZm9sbG93aW5nIHNlY3Rpb25zLCBtYXliZSB0aGUKKwkgb3JkZXIgaXMgd3JvbmcuICAqLworICAgICAgc2l6ZV90IGNudDsKKworICAgICAgZm9yIChjbnQgPSBpZHggKyAxOyBjbnQgPCBzaG51bTsgKytjbnQpCisJeworCSAgRWxmX1NjbiAqc2NuOworCSAgR0VsZl9TaGRyIHNoZHJfbWVtOworCSAgR0VsZl9TaGRyICpzaGRyOworCSAgRWxmX0RhdGEgKmRhdGE7CisJICBFbGYzMl9Xb3JkICpncnBkYXRhOworCSAgc2l6ZV90IGlubmVyOworCisJICBzY24gPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgY250KTsKKwkgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKwkgIGlmIChzaGRyID09IE5VTEwpCisJICAgIC8qIFdlIGNhbm5vdCBnZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHNvIHdlIGNhbm5vdCBjaGVjayBpdC4KKwkgICAgICAgVGhlIGVycm9yIHRvIGdldCB0aGUgc2VjdGlvbiBoZWFkZXIgd2lsbCBiZSBzaG93bgorCSAgICAgICBzb21ld2hlcmUgZWxzZS4gICovCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoc2hkci0+c2hfdHlwZSAhPSBTSFRfR1JPVVApCisJICAgIGNvbnRpbnVlOworCisJICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisJICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmRfc2l6ZSA8IHNpemVvZiAoRWxmMzJfV29yZCkpCisJICAgIC8qIENhbm5vdCBjaGVjayB0aGUgc2VjdGlvbi4gICovCisJICAgIGNvbnRpbnVlOworCisJICBncnBkYXRhID0gKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWY7CisJICBmb3IgKGlubmVyID0gMTsgaW5uZXIgPCBkYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpOyArK2lubmVyKQorCSAgICBpZiAoZ3JwZGF0YVtpbm5lcl0gPT0gKEVsZjMyX1dvcmQpIGlkeCkKKwkgICAgICBnb3RvIG91dDsKKwl9CisKKyAgICBvdXQ6CisgICAgICBpZiAoY250ID09IHNobnVtKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHdpdGggU0hGX0dST1VQIGZsYWcgc2V0IG5vdCBwYXJ0IG9mIGEgc2VjdGlvbiBncm91cFxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworICAgICAgZWxzZQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIGRvZXMgbm90IHByZWNlZWQgZ3JvdXAgbWVtYmVyXG4iKSwKKwkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKKwkgICAgICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitjaGVja19zeW10YWIgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsIGludCBpZHgpCit7CisgIGJvb2wgbm9feG5keF93YXJuZWQgPSBmYWxzZTsKKyAgaW50IG5vX3B0X3RscyA9IDA7CisKKyAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIGlkeCk7CisgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisgIEdFbGZfU2hkciBzdHJzaGRyX21lbTsKKyAgR0VsZl9TaGRyICpzdHJzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayksCisJCQkJICAgICAmc3Ryc2hkcl9tZW0pOworICBpZiAoc2hkciA9PSBOVUxMIHx8IHN0cnNoZHIgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgeworICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iKSwKKwkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc3Ryc2hkci0+c2hfdHlwZSAhPSBTSFRfU1RSVEFCKQorICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiByZWZlcmVuY2VkIGFzIHN0cmluZyB0YWJsZSBmb3Igc2VjdGlvbiBbJTJkXSAnJXMnIGJ1dCB0eXBlIGlzIG5vdCBTSFRfU1RSVEFCXG4iKSwKKwkgICBzaGRyLT5zaF9saW5rLCBzZWN0aW9uX25hbWUgKGVibCwgc2hkci0+c2hfbGluayksCisJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisKKyAgLyogU2VhcmNoIGZvciBhbiBleHRlbmRlZCBzZWN0aW9uIGluZGV4IHRhYmxlIHNlY3Rpb24uICAqLworICBzaXplX3QgY250OworICBHRWxmX1NoZHIgeG5keHNoZHJfbWVtOworICBHRWxmX1NoZHIgKnhuZHhzaGRyID0gTlVMTDsKKyAgRWxmX0RhdGEgKnhuZHhkYXRhID0gTlVMTDsKKyAgRWxmMzJfV29yZCB4bmR4c2NuaWR4ID0gMDsKKyAgZm9yIChjbnQgPSAxOyBjbnQgPCBzaG51bTsgKytjbnQpCisgICAgaWYgKGNudCAhPSAoc2l6ZV90KSBpZHgpCisgICAgICB7CisJRWxmX1NjbiAqeG5keHNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBjbnQpOworCXhuZHhzaGRyID0gZ2VsZl9nZXRzaGRyICh4bmR4c2NuLCAmeG5keHNoZHJfbWVtKTsKKwl4bmR4ZGF0YSA9IGVsZl9nZXRkYXRhICh4bmR4c2NuLCBOVUxMKTsKKwl4bmR4c2NuaWR4ID0gZWxmX25keHNjbiAoeG5keHNjbik7CisKKwlpZiAoeG5keHNoZHIgPT0gTlVMTCB8fCB4bmR4ZGF0YSA9PSBOVUxMKQorCSAgY29udGludWU7CisKKwlpZiAoeG5keHNoZHItPnNoX3R5cGUgPT0gU0hUX1NZTVRBQl9TSE5EWAorCSAgICAmJiB4bmR4c2hkci0+c2hfbGluayA9PSAoR0VsZl9Xb3JkKSBpZHgpCisJICBicmVhazsKKyAgICAgIH0KKyAgaWYgKGNudCA9PSBzaG51bSkKKyAgICB7CisgICAgICB4bmR4c2hkciA9IE5VTEw7CisgICAgICB4bmR4ZGF0YSA9IE5VTEw7CisgICAgfQorCisgIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IGdlbGZfZnNpemUgKGVibC0+ZWxmLCBFTEZfVF9TWU0sIDEsIEVWX0NVUlJFTlQpKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJ6dV0gJyVzJzogZW50cnkgc2l6ZSBpcyBkb2VzIG5vdCBtYXRjaCBFbGZYWF9TeW1cbiIpLAorCSAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCkpOworCisgIC8qIFRlc3QgdGhlIHplcm90aCBlbnRyeS4gICovCisgIEdFbGZfU3ltIHN5bV9tZW07CisgIEVsZjMyX1dvcmQgeG5keDsKKyAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKGRhdGEsIHhuZHhkYXRhLCAwLCAmc3ltX21lbSwgJnhuZHgpOworICBpZiAoc3ltID09IE5VTEwpCisgICAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgJWQ6ICVzXG4iKSwKKwkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIDAsIGVsZl9lcnJtc2cgKC0xKSk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc3ltLT5zdF9uYW1lICE9IDApCisJRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6ICclcycgaW4gemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iKSwKKwkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgInN0X25hbWUiKTsKKyAgICAgIGlmIChzeW0tPnN0X3ZhbHVlICE9IDApCisJRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6ICclcycgaW4gemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iKSwKKwkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgInN0X3ZhbHVlIik7CisgICAgICBpZiAoc3ltLT5zdF9zaXplICE9IDApCisJRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6ICclcycgaW4gemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iKSwKKwkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgInN0X3NpemUiKTsKKyAgICAgIGlmIChzeW0tPnN0X2luZm8gIT0gMCkKKwlFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogJyVzJyBpbiB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIpLAorCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCAic3RfaW5mbyIpOworICAgICAgaWYgKHN5bS0+c3Rfb3RoZXIgIT0gMCkKKwlFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogJyVzJyBpbiB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIpLAorCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCAic3Rfb3RoZXIiKTsKKyAgICAgIGlmIChzeW0tPnN0X3NobmR4ICE9IDApCisJRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6ICclcycgaW4gemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iKSwKKwkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgInN0X3NobmR4Iik7CisgICAgICBpZiAoeG5keGRhdGEgIT0gTlVMTCAmJiB4bmR4ICE9IDApCisJRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IFhJTkRFWCBmb3IgemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iKSwKKwkgICAgICAgeG5keHNjbmlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIHhuZHhzY25pZHgpKTsKKyAgICB9CisKKyAgZm9yIChjbnQgPSAxOyBjbnQgPCBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsgKytjbnQpCisgICAgeworICAgICAgc3ltID0gZ2VsZl9nZXRzeW1zaG5keCAoZGF0YSwgeG5keGRhdGEsIGNudCwgJnN5bV9tZW0sICZ4bmR4KTsKKyAgICAgIGlmIChzeW0gPT0gTlVMTCkKKwl7CisJICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgJXp1OiAlc1xuIiksCisJCSBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICAgICAgaWYgKHN5bS0+c3RfbmFtZSA+PSBzdHJzaGRyLT5zaF9zaXplKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIG5hbWUgdmFsdWVcbiIpLAorCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOworICAgICAgZWxzZQorCXsKKwkgIG5hbWUgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKTsKKwkgIGFzc2VydCAobmFtZSAhPSBOVUxMKTsKKwl9CisKKyAgICAgIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgpCisJeworCSAgaWYgKHhuZHhkYXRhID09IE5VTEwpCisJICAgIHsKKwkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdG9vIGxhcmdlIHNlY3Rpb24gaW5kZXggYnV0IG5vIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvblxuIiksCisJCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKKwkgICAgICBub194bmR4X3dhcm5lZCA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UgaWYgKHhuZHggPCBTSE5fTE9SRVNFUlZFKQorCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogWElOREVYIHVzZWQgZm9yIGluZGV4IHdoaWNoIHdvdWxkIGZpdCBpbiBzdF9zaG5keCAoJSIgUFJJdTMyICIpXG4iKSwKKwkJICAgeG5keHNjbmlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIHhuZHhzY25pZHgpLCBjbnQsCisJCSAgIHhuZHgpOworCX0KKyAgICAgIGVsc2UgaWYgKChzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUKKwkJLy8gJiYgc3ltLT5zdF9zaG5keCA8PSBTSE5fSElSRVNFUlZFICAgIGFsd2F5cyB0cnVlCisJCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0FCUworCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pCisJICAgICAgIHx8IChzeW0tPnN0X3NobmR4ID49IHNobnVtCisJCSAgICYmIChzeW0tPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRQorCQkgICAgICAgLyogfHwgc3ltLT5zdF9zaG5keCA+IFNITl9ISVJFU0VSVkUgIGFsd2F5cyBmYWxzZSAqLykpKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIHNlY3Rpb24gaW5kZXhcbiIpLAorCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOworICAgICAgZWxzZQorCXhuZHggPSBzeW0tPnN0X3NobmR4OworCisgICAgICBpZiAoR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID49IFNUVF9OVU0pCisJRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gdHlwZVxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisKKyAgICAgIGlmIChHRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPj0gU1RCX05VTSkKKwlFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBzeW1ib2wgYmluZGluZ1xuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisKKyAgICAgIGlmICh4bmR4ID09IFNITl9DT01NT04pCisJeworCSAgLyogQ29tbW9uIHN5bWJvbHMgY2FuIG9ubHkgYXBwZWFyIGluIHJlbG9jYXRhYmxlIGZpbGVzLiAgKi8KKwkgIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMKQorCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogQ09NTU9OIG9ubHkgYWxsb3dlZCBpbiByZWxvY2F0YWJsZSBmaWxlc1xuIiksCisJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisJICBpZiAoY250IDwgc2hkci0+c2hfaW5mbykKKwkgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGxvY2FsIENPTU1PTiBzeW1ib2xzIGFyZSBub25zZW5zZVxuIiksCisJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisJICBpZiAoR0VMRl9SX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX0ZVTkMpCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBmdW5jdGlvbiBpbiBDT01NT04gc2VjdGlvbiBpcyBub25zZW5zZVxuIiksCisJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisJfQorICAgICAgZWxzZSBpZiAoeG5keCA+IDAgJiYgeG5keCA8IHNobnVtKQorCXsKKwkgIEdFbGZfU2hkciBkZXN0c2hkcl9tZW07CisJICBHRWxmX1NoZHIgKmRlc3RzaGRyOworCisJICBkZXN0c2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHhuZHgpLCAmZGVzdHNoZHJfbWVtKTsKKwkgIGlmIChkZXN0c2hkciAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfVExTKQorCQl7CisJCSAgaWYgKChzeW0tPnN0X3ZhbHVlIC0gZGVzdHNoZHItPnNoX2FkZHIpID4gZGVzdHNoZHItPnNoX3NpemUpCisJCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgb3V0IG9mIGJvdW5kc1xuIiksCisJCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOworCQkgIGVsc2UgaWYgKChzeW0tPnN0X3ZhbHVlIC0gZGVzdHNoZHItPnNoX2FkZHIgKyBzeW0tPnN0X3NpemUpCisJCQkgICA+IGRlc3RzaGRyLT5zaF9zaXplKQorCQkgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenUgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW4gcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcydcbiIpLAorCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAorCQkJICAgKGludCkgeG5keCwgc2VjdGlvbl9uYW1lIChlYmwsIHhuZHgpKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmICgoZGVzdHNoZHItPnNoX2ZsYWdzICYgU0hGX1RMUykgPT0gMCkKKwkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJyBkb2VzIG5vdCBoYXZlIFNIRl9UTFMgZmxhZyBzZXRcbiIpLAorCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAorCQkJICAgKGludCkgeG5keCwgc2VjdGlvbl9uYW1lIChlYmwsIHhuZHgpKTsKKworCQkgIGlmIChlaGRyLT5lX3R5cGUgPT0gRVRfUkVMKQorCQkgICAgeworCQkgICAgICAvKiBGb3Igb2JqZWN0IGZpbGVzIHRoZSBzeW1ib2wgdmFsdWUgbXVzdCBmYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50byB0aGUgc2VjdGlvbi4gICovCisJCSAgICAgIGlmIChzeW0tPnN0X3ZhbHVlID4gZGVzdHNoZHItPnNoX3NpemUpCisJCQlFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgb3V0IG9mIGJvdW5kcyBvZiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJ1xuIiksCisJCQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAorCQkJICAgICAgIChpbnQpIHhuZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCB4bmR4KSk7CisJCSAgICAgIGVsc2UgaWYgKHN5bS0+c3RfdmFsdWUgKyBzeW0tPnN0X3NpemUKKwkJCSAgICAgICA+IGRlc3RzaGRyLT5zaF9zaXplKQorCQkJRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenUgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW4gcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcydcbiIpLAorCQkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwKKwkJCSAgICAgICAoaW50KSB4bmR4LCBzZWN0aW9uX25hbWUgKGVibCwgeG5keCkpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOworCQkgICAgICBHRWxmX1BoZHIgKnBoZHIgPSBOVUxMOworCQkgICAgICBpbnQgcGNudDsKKworCQkgICAgICBmb3IgKHBjbnQgPSAwOyBwY250IDwgZWhkci0+ZV9waG51bTsgKytwY250KQorCQkJeworCQkJICBwaGRyID0gZ2VsZl9nZXRwaGRyIChlYmwtPmVsZiwgcGNudCwgJnBoZHJfbWVtKTsKKwkJCSAgaWYgKHBoZHIgIT0gTlVMTCAmJiBwaGRyLT5wX3R5cGUgPT0gUFRfVExTKQorCQkJICAgIGJyZWFrOworCQkJfQorCisJCSAgICAgIGlmIChwY250ID09IGVoZHItPmVfcGhudW0pCisJCQl7CisJCQkgIGlmIChub19wdF90bHMrKyA9PSAwKQorCQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBUTFMgc3ltYm9sIGJ1dCBubyBUTFMgcHJvZ3JhbSBoZWFkZXIgZW50cnlcbiIpLAorCQkJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgaWYgKHN5bS0+c3RfdmFsdWUKKwkJCSAgICAgIDwgZGVzdHNoZHItPnNoX29mZnNldCAtIHBoZHItPnBfb2Zmc2V0KQorCQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBzaG9ydCBvZiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJ1xuIiksCisJCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAorCQkJCSAgIChpbnQpIHhuZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCB4bmR4KSk7CisJCQkgIGVsc2UgaWYgKHN5bS0+c3RfdmFsdWUKKwkJCQkgICA+IChkZXN0c2hkci0+c2hfb2Zmc2V0IC0gcGhkci0+cF9vZmZzZXQKKwkJCQkgICAgICArIGRlc3RzaGRyLT5zaF9zaXplKSkKKwkJCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgb3V0IG9mIGJvdW5kcyBvZiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJ1xuIiksCisJCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAorCQkJCSAgIChpbnQpIHhuZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCB4bmR4KSk7CisJCQkgIGVsc2UgaWYgKHN5bS0+c3RfdmFsdWUgKyBzeW0tPnN0X3NpemUKKwkJCQkgICA+IChkZXN0c2hkci0+c2hfb2Zmc2V0IC0gcGhkci0+cF9vZmZzZXQKKwkJCQkgICAgICArIGRlc3RzaGRyLT5zaF9zaXplKSkKKwkJCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dSBkb2VzIG5vdCBmaXQgY29tcGxldGVseSBpbiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJ1xuIiksCisJCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAorCQkJCSAgIChpbnQpIHhuZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCB4bmR4KSk7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKworICAgICAgaWYgKEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpCisJeworCSAgaWYgKGNudCA+PSBzaGRyLT5zaF9pbmZvKQorCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluIHNoX2luZm9cbiIpLAorCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoY250IDwgc2hkci0+c2hfaW5mbykKKwkgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IG5vbi1sb2NhbCBzeW1ib2wgb3V0c2lkZSByYW5nZSBkZXNjcmliZWQgaW4gc2hfaW5mb1xuIiksCisJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisJfQorCisgICAgICBpZiAoR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OCisJICAmJiBHRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBub24tbG9jYWwgc2VjdGlvbiBzeW1ib2xcbiIpLAorCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOworCisgICAgICBpZiAobmFtZSAhPSBOVUxMKQorCXsKKwkgIGlmIChzdHJjbXAgKG5hbWUsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQorCSAgICB7CisJICAgICAgLyogQ2hlY2sgdGhhdCBhZGRyZXNzIGFuZCBzaXplIG1hdGNoIHRoZSBnbG9iYWwgb2Zmc2V0CisJCSB0YWJsZS4gIFdlIGhhdmUgdG8gbG9jYXRlIHRoZSBHT1QgYnkgc2VhcmNoaW5nIGZvciBhCisJCSBzZWN0aW9uIG5hbWVkICIuZ290Ii4gICovCisJICAgICAgRWxmX1NjbiAqZ3NjbiA9IE5VTEw7CisJICAgICAgR0VsZl9BZGRyIGFkZHIgPSAwOworCSAgICAgIEdFbGZfWHdvcmQgc2l6ZSA9IDA7CisJICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisJICAgICAgd2hpbGUgKChnc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBnc2NuKSkgIT0gTlVMTCkKKwkJeworCQkgIEdFbGZfU2hkciBnc2hkcl9tZW07CisJCSAgR0VsZl9TaGRyICpnc2hkciA9IGdlbGZfZ2V0c2hkciAoZ3NjbiwgJmdzaGRyX21lbSk7CisJCSAgYXNzZXJ0IChnc2hkciAhPSBOVUxMKTsKKworCQkgIGNvbnN0IGNoYXIgKnNuYW1lID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIGVoZHItPmVfc2hzdHJuZHgsCisJCQkJCQkgIGdzaGRyLT5zaF9uYW1lKTsKKwkJICBpZiAoc25hbWUgIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgaWYgKHN0cmNtcCAoc25hbWUsICIuZ290LnBsdCIpID09IDApCisJCQl7CisJCQkgIGFkZHIgPSBnc2hkci0+c2hfYWRkcjsKKwkJCSAgc2l6ZSA9IGdzaGRyLT5zaF9zaXplOworCQkJICBmb3VuZCA9IHRydWU7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICBpZiAoc3RyY21wIChzbmFtZSwgIi5nb3QiKSA9PSAwKQorCQkJeworCQkJICBhZGRyID0gZ3NoZHItPnNoX2FkZHI7CisJCQkgIHNpemUgPSBnc2hkci0+c2hfc2l6ZTsKKwkJCSAgZm91bmQgPSB0cnVlOworCQkJICAvKiBEbyBub3Qgc3RvcCBsb29raW5nLiAgVGhlcmUgbWlnaHQgYmUgYQorCQkJICAgICAuZ290LnBsdCBzZWN0aW9uLiAgKi8KKwkJCX0KKwkJICAgIH0KKwkJfQorCisJICAgICAgaWYgKGZvdW5kKQorCQl7CisJCSAgLyogRm91bmQgaXQuICAqLworCQkgIGlmIChzeW0tPnN0X3ZhbHVlICE9IGFkZHIpCisJCSAgICAvKiBUaGlzIHRlc3QgaXMgbW9yZSBzdHJpY3QgdGhhbiB0aGUgcHNBQklzIHdoaWNoCisJCSAgICAgICB1c3VhbGx5IGFsbG93IHRoZSBzeW1ib2wgdG8gYmUgaW4gdGhlIG1pZGRsZSBvZgorCQkgICAgICAgdGhlIC5nb3Qgc2VjdGlvbiwgYWxsb3dpbmcgbmVnYXRpdmUgb2Zmc2V0cy4gICovCisJCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCB2YWx1ZSAlIyIgUFJJeDY0ICIgZG9lcyBub3QgbWF0Y2ggLmdvdCBzZWN0aW9uIGFkZHJlc3MgJSMiIFBSSXg2NCAiXG4iKSwKKwkJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCisJCQkgICAodWludDY0X3QpIHN5bS0+c3RfdmFsdWUsICh1aW50NjRfdCkgYWRkcik7CisKKwkJICBpZiAoIWdudWxkICYmIHN5bS0+c3Rfc2l6ZSAhPSBzaXplKQorCQkgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgc2l6ZSAlIiBQUkl1NjQgIiBkb2VzIG5vdCBtYXRjaCAuZ290IHNlY3Rpb24gc2l6ZSAlIiBQUkl1NjQgIlxuIiksCisJCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAorCQkJICAgKHVpbnQ2NF90KSBzeW0tPnN0X3NpemUsICh1aW50NjRfdCkgc2l6ZSk7CisJCX0KKwkgICAgICBlbHNlCisJCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHByZXNlbnQsIGJ1dCBubyAuZ290IHNlY3Rpb25cbiIpLAorCQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9EWU5BTUlDIikgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIENoZWNrIHRoYXQgYWRkcmVzcyBhbmQgc2l6ZSBtYXRjaCB0aGUgZHluYW1pYworCQkgc2VjdGlvbi4gIFdlIGxvY2F0ZSB0aGUgZHluYW1pYyBzZWN0aW9uIHZpYSB0aGUKKwkJIHByb2dyYW0gaGVhZGVyIGVudHJ5LiAgKi8KKwkgICAgICBpbnQgcGNudDsKKworCSAgICAgIGZvciAocGNudCA9IDA7IHBjbnQgPCBlaGRyLT5lX3BobnVtOyArK3BjbnQpCisJCXsKKwkJICBHRWxmX1BoZHIgcGhkcl9tZW07CisJCSAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlYmwtPmVsZiwgcGNudCwgJnBoZHJfbWVtKTsKKworCQkgIGlmIChwaGRyICE9IE5VTEwgJiYgcGhkci0+cF90eXBlID09IFBUX0RZTkFNSUMpCisJCSAgICB7CisJCSAgICAgIGlmIChzeW0tPnN0X3ZhbHVlICE9IHBoZHItPnBfdmFkZHIpCisJCQlFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogX0RZTkFNSUNfIHN5bWJvbCB2YWx1ZSAlIyIgUFJJeDY0ICIgZG9lcyBub3QgbWF0Y2ggZHluYW1pYyBzZWdtZW50IGFkZHJlc3MgJSMiIFBSSXg2NCAiXG4iKSwKKwkJCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAorCQkJICAgICAgICh1aW50NjRfdCkgc3ltLT5zdF92YWx1ZSwKKwkJCSAgICAgICAodWludDY0X3QpIHBoZHItPnBfdmFkZHIpOworCisJCSAgICAgIGlmICghZ251bGQgJiYgc3ltLT5zdF9zaXplICE9IHBoZHItPnBfbWVtc3opCisJCQlFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogX0RZTkFNSUMgc3ltYm9sIHNpemUgJSIgUFJJdTY0ICIgZG9lcyBub3QgbWF0Y2ggZHluYW1pYyBzZWdtZW50IHNpemUgJSIgUFJJdTY0ICJcbiIpLAorCQkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCisJCQkgICAgICAgKHVpbnQ2NF90KSBzeW0tPnN0X3NpemUsCisJCQkgICAgICAgKHVpbnQ2NF90KSBwaGRyLT5wX21lbXN6KTsKKworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKworCitzdGF0aWMgYm9vbAoraXNfcmVsX2R5biAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwgaW50IGlkeCwgR0VsZl9TaGRyICpzaGRyLCBib29sIHJlbGEpCit7CisgIC8qIElmIHRoaXMgaXMgbm8gZXhlY3V0YWJsZSBvciBEU08gaXQgY2Fubm90IGJlIGEgLnJlbC5keW4gc2VjdGlvbi4gICovCisgIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBDaGVjayB0aGUgc2VjdGlvbiBuYW1lLiAgVW5mb3J0dW5hdGVseSBuZWNlc3NhcnkuICAqLworICBpZiAoc3RyY21wIChzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgcmVsYSA/ICIucmVsYS5keW4iIDogIi5yZWwuZHluIikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFdoZW4gYSAucmVsLmR5biBzZWN0aW9uIGlzIHVzZWQgYSBEVF9SRUxDT1VOVCBkeW5hbWljIHNlY3Rpb24KKyAgICAgZW50cnkgY2FuIGJlIHByZXNlbnQgYXMgd2VsbC4gICovCisgIEVsZl9TY24gKnNjbiA9IE5VTEw7CisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIEdFbGZfU2hkciByY3NoZHJfbWVtOworICAgICAgY29uc3QgR0VsZl9TaGRyICpyY3NoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnJjc2hkcl9tZW0pOworICAgICAgYXNzZXJ0IChyY3NoZHIgIT0gTlVMTCk7CisKKyAgICAgIGlmIChyY3NoZHItPnNoX3R5cGUgPT0gU0hUX0RZTkFNSUMpCisJeworCSAgLyogRm91bmQgdGhlIGR5bmFtaWMgc2VjdGlvbi4gIExvb2sgdGhyb3VnaCBpdC4gICovCisJICBFbGZfRGF0YSAqZCA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworCSAgc2l6ZV90IGNudDsKKworCSAgZm9yIChjbnQgPSAxOyBjbnQgPCByY3NoZHItPnNoX3NpemUgLyByY3NoZHItPnNoX2VudHNpemU7ICsrY250KQorCSAgICB7CisJICAgICAgR0VsZl9EeW4gZHluX21lbTsKKwkgICAgICBHRWxmX0R5biAqZHluID0gZ2VsZl9nZXRkeW4gKGQsIGNudCwgJmR5bl9tZW0pOworCSAgICAgIGFzc2VydCAoZHluICE9IE5VTEwpOworCisJICAgICAgaWYgKGR5bi0+ZF90YWcgPT0gRFRfUkVMQ09VTlQpCisJCXsKKwkJICAvKiBGb3VuZCBpdC4gIE9uZSBsYXN0IGNoZWNrOiBkb2VzIHRoZSBudW1iZXIKKwkJICAgICBzcGVjaWZpZWQgbnVtYmVyIG9mIHJlbGF0aXZlIHJlbG9jYXRpb25zIGV4Y2VlZAorCQkgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVsb2NhdGlvbnM/ICAqLworCQkgIGlmIChkeW4tPmRfdW4uZF92YWwgPiBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZSkKKwkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxDT1VOVCB2YWx1ZSAlZCB0b28gaGlnaCBmb3IgdGhpcyBzZWN0aW9uXG4iKSwKKwkJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCisJCQkgICAoaW50KSBkeW4tPmRfdW4uZF92YWwpOworCQl9CisJICAgIH0KKworCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgdm9pZAorY2hlY2tfcmVsYSAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwgaW50IGlkeCkKK3sKKyAgRWxmX1NjbiAqc2NuOworICBHRWxmX1NoZHIgc2hkcl9tZW07CisgIEdFbGZfU2hkciAqc2hkcjsKKyAgRWxmX0RhdGEgKmRhdGE7CisgIEdFbGZfU2hkciBkZXN0c2hkcl9tZW07CisgIEdFbGZfU2hkciAqZGVzdHNoZHIgPSBOVUxMOworICBzaXplX3QgY250OworICBib29sIHJlbGR5biA9IGZhbHNlOworICBib29sIGtub3duX2Jyb2tlbiA9IGdudWxkOworCisgIHNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpZHgpOworICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisgIGlmIChzaGRyID09IE5VTEwpCisgICAgcmV0dXJuOworICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgeworICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iKSwKKwkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBDaGVjayB3aGV0aGVyIHRoZSBsaW5rIHRvIHRoZSBzZWN0aW9uIHdlIHJlbG9jYXRlIGlzIHJlYXNvbmFibGUuICAqLworICBpZiAoc2hkci0+c2hfaW5mbyA+PSBzaG51bSkKKyAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBkZXN0aW5hdGlvbiBzZWN0aW9uIGluZGV4XG4iKSwKKwkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRlc3RzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfaW5mbyksCisJCQkgICAgICAgJmRlc3RzaGRyX21lbSk7CisgICAgICBpZiAoZGVzdHNoZHIgIT0gTlVMTCkKKwl7CisJICBpZihkZXN0c2hkci0+c2hfdHlwZSAhPSBTSFRfUFJPR0JJVFMKKwkgICAgICYmIGRlc3RzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCisJICAgIHsKKwkgICAgICByZWxkeW4gPSBpc19yZWxfZHluIChlYmwsIGVoZHIsIGlkeCwgc2hkciwgdHJ1ZSk7CisJICAgICAgaWYgKCFyZWxkeW4pCisJCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gdHlwZVxuIiksCisJCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBUaGVyZSBpcyBubyBzdGFuZGFyZCwgYnV0IHdlIHJlcXVpcmUgdGhhdCAucmVsYS5keW4KKwkJICAgICBzZWN0aW9ucyBoYXZlIGEgc2hfaW5mbyB2YWx1ZSBvZiB6ZXJvLiAgKi8KKwkJICBpZiAoc2hkci0+c2hfaW5mbyAhPSAwKQorCQkgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gc2hvdWxkIGJlIHplcm9cbiIpLAorCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisJCX0KKwkgICAgfQorCisJICBpZiAoKGRlc3RzaGRyLT5zaF9mbGFncyAmIChTSEZfTUVSR0UgfCBTSEZfU1RSSU5HUykpICE9IDApCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBubyByZWxvY2F0aW9ucyBmb3IgbWVyZ2UtYWJsZSBzZWN0aW9ucyBwb3NzaWJsZVxuIiksCisJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCX0KKyAgICB9CisKKyAgaWYgKHNoZHItPnNoX2VudHNpemUgIT0gZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX1JFTEEsIDEsIEVWX0NVUlJFTlQpKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmWFhfUmVsYVxuIiksCisJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisKKyAgRWxmX1NjbiAqc3ltc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspOworICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07CisgIEdFbGZfU2hkciAqc3ltc2hkciA9IGdlbGZfZ2V0c2hkciAoc3ltc2NuLCAmc3ltc2hkcl9tZW0pOworICBFbGZfRGF0YSAqc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOworCisgIGZvciAoY250ID0gMDsgY250IDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7ICsrY250KQorICAgIHsKKyAgICAgIEdFbGZfUmVsYSByZWxhX21lbTsKKyAgICAgIEdFbGZfUmVsYSAqcmVsYTsKKworICAgICAgcmVsYSA9IGdlbGZfZ2V0cmVsYSAoZGF0YSwgY250LCAmcmVsYV9tZW0pOworICAgICAgaWYgKHJlbGEgPT0gTlVMTCkKKwl7CisJICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCByZWxvY2F0aW9uICV6dTogJXNcbiIpLAorCQkgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LCBlbGZfZXJybXNnICgtMSkpOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoIWVibF9yZWxvY190eXBlX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyZWxhLT5yX2luZm8pKSkKKwlFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgdHlwZVxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisgICAgICBlbHNlIGlmICghZWJsX3JlbG9jX3ZhbGlkX3VzZSAoZWJsLCBHRUxGX1JfVFlQRSAocmVsYS0+cl9pbmZvKSkpCisJRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiByZWxvY2F0aW9uIHR5cGUgaW52YWxpZCBmb3IgdGhlIGZpbGUgdHlwZVxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisKKyAgICAgIGlmIChzeW1zaGRyICE9IE5VTEwKKwkgICYmICgoR0VMRl9SX1NZTSAocmVsYS0+cl9pbmZvKSArIDEpCisJICAgICAgKiBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfU1lNLCAxLCBFVl9DVVJSRU5UKQorCSAgICAgID4gc3ltc2hkci0+c2hfc2l6ZSkpCisJRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBpbnZhbGlkIHN5bWJvbCBpbmRleFxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisKKyAgICAgIGlmIChlYmxfZ290cGNfcmVsb2NfY2hlY2sgKGVibCwgR0VMRl9SX1RZUEUgKHJlbGEtPnJfaW5mbykpKQorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBjaGFyIGJ1Zls2NF07CisJICBHRWxmX1N5bSBzeW1fbWVtOworCSAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kYXRhLCBHRUxGX1JfU1lNIChyZWxhLT5yX2luZm8pLAorCQkJCSAgICAgICAmc3ltX21lbSk7CisJICBpZiAoc3ltICE9IE5VTEwKKwkgICAgICAvKiBHZXQgdGhlIG5hbWUgZm9yIHRoZSBzeW1ib2wuICAqLworCSAgICAgICYmIChuYW1lID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHN5bXNoZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpCisJICAgICAgJiYgc3RyY21wIChuYW1lLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgIT0wICkKKwkgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBvbmx5IHN5bWJvbCAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJyBjYW4gYmUgdXNlZCB3aXRoICVzXG4iKSwKKwkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAorCQkgICBlYmxfcmVsb2NfdHlwZV9uYW1lIChlYmwsIEdFTEZfUl9TWU0gKHJlbGEtPnJfaW5mbyksCisJCQkJCWJ1Ziwgc2l6ZW9mIChidWYpKSk7CisJfQorCisgICAgICBpZiAocmVsZHluKQorCXsKKwkgIC8vIFhYWCBUT0RPIENoZWNrIC5yZWwuZHluIHNlY3Rpb24gYWRkcmVzc2VzLgorCX0KKyAgICAgIGVsc2UgaWYgKCFrbm93bl9icm9rZW4pCisJeworCSAgaWYgKGRlc3RzaGRyICE9IE5VTEwKKwkgICAgICAmJiAocmVsYS0+cl9vZmZzZXQgLSBkZXN0c2hkci0+c2hfYWRkcikgPj0gZGVzdHNoZHItPnNoX3NpemUpCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogb2Zmc2V0IG91dCBvZiBib3VuZHNcbiIpLAorCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOworCX0KKworICAgICAgaWYgKHN5bWRhdGEgIT0gTlVMTAorCSAgJiYgZWJsX2NvcHlfcmVsb2NfcCAoZWJsLCBHRUxGX1JfVFlQRSAocmVsYS0+cl9pbmZvKSkpCisJeworCSAgLyogTWFrZSBzdXJlIHRoZSByZWZlcmVuY2VkIHN5bWJvbCBpcyBhbiBvYmplY3Qgb3IgdW5zcGVjaWZpZWQuICAqLworCSAgR0VsZl9TeW0gc3ltX21lbTsKKwkgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bSAoc3ltZGF0YSwgR0VMRl9SX1NZTSAocmVsYS0+cl9pbmZvKSwKKwkJCQkgICAgICAgJnN5bV9tZW0pOworCSAgaWYgKHN5bSAhPSBOVUxMCisJICAgICAgJiYgR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9OT1RZUEUKKwkgICAgICAmJiBHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX09CSkVDVCkKKwkgICAgeworCSAgICAgIGNoYXIgYnVmWzY0XTsKKwkgICAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGNvcHkgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBvZiB0eXBlICVzXG4iKSwKKwkJICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsCisJCSAgICAgZWJsX3N5bWJvbF90eXBlX25hbWUgKGVibCwgR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pLAorCQkJCQkgICBidWYsIHNpemVvZiAoYnVmKSkpOworCSAgICB9CisJfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorY2hlY2tfcmVsIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBpbnQgaWR4KQoreworICBFbGZfU2NuICpzY247CisgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgR0VsZl9TaGRyICpzaGRyOworICBFbGZfRGF0YSAqZGF0YTsKKyAgR0VsZl9TaGRyIGRlc3RzaGRyX21lbTsKKyAgR0VsZl9TaGRyICpkZXN0c2hkciA9IE5VTEw7CisgIHNpemVfdCBjbnQ7CisgIGJvb2wgcmVsZHluID0gZmFsc2U7CisgIGJvb2wga25vd25fYnJva2VuID0gZ251bGQ7CisKKyAgc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIGlkeCk7CisgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKyAgaWYgKHNoZHIgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGFcbiIpLAorCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGxpbmsgdG8gdGhlIHNlY3Rpb24gd2UgcmVsb2NhdGUgaXMgcmVhc29uYWJsZS4gICovCisgIGlmIChzaGRyLT5zaF9pbmZvID49IHNobnVtKQorICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gaW5kZXhcbiIpLAorCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworICBlbHNlCisgICAgeworICAgICAgZGVzdHNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9pbmZvKSwKKwkJCSAgICAgICAmZGVzdHNoZHJfbWVtKTsKKyAgICAgIGlmIChkZXN0c2hkciAhPSBOVUxMKQorCXsKKwkgIGlmIChkZXN0c2hkci0+c2hfdHlwZSAhPSBTSFRfUFJPR0JJVFMKKwkgICAgICAmJiBkZXN0c2hkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQorCSAgICB7CisJICAgICAgcmVsZHluID0gaXNfcmVsX2R5biAoZWJsLCBlaGRyLCBpZHgsIHNoZHIsIGZhbHNlKTsKKwkgICAgICBpZiAoIXJlbGR5bikKKwkJRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiB0eXBlXG4iKSwKKwkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFRoZXJlIGlzIG5vIHN0YW5kYXJkLCBidXQgd2UgcmVxdWlyZSB0aGF0IC5yZWxhLmR5bgorCQkgICAgIHNlY3Rpb25zIGhhdmUgYSBzaF9pbmZvIHZhbHVlIG9mIHplcm8uICAqLworCQkgIGlmIChzaGRyLT5zaF9pbmZvICE9IDApCisJCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc2hfaW5mbyBzaG91bGQgYmUgemVyb1xuIiksCisJCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKKwkJfQorCSAgICB9CisKKwkgIGlmICgoZGVzdHNoZHItPnNoX2ZsYWdzICYgKFNIRl9NRVJHRSB8IFNIRl9TVFJJTkdTKSkgIT0gMCkKKwkgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IG5vIHJlbG9jYXRpb25zIGZvciBtZXJnZS1hYmxlIHNlY3Rpb25zIHBvc3NpYmxlXG4iKSwKKwkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisJfQorICAgIH0KKworICBpZiAoc2hkci0+c2hfZW50c2l6ZSAhPSBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfUkVMLCAxLCBFVl9DVVJSRU5UKSkKKyAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZlhYX1JlbFxuIiksCisJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisKKyAgRWxmX1NjbiAqc3ltc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspOworICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07CisgIEdFbGZfU2hkciAqc3ltc2hkciA9IGdlbGZfZ2V0c2hkciAoc3ltc2NuLCAmc3ltc2hkcl9tZW0pOworICBFbGZfRGF0YSAqc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOworCisgIGZvciAoY250ID0gMDsgY250IDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7ICsrY250KQorICAgIHsKKyAgICAgIEdFbGZfUmVsIHJlbF9tZW07CisgICAgICBHRWxmX1JlbCAqcmVsOworCisgICAgICByZWwgPSBnZWxmX2dldHJlbCAoZGF0YSwgY250LCAmcmVsX21lbSk7CisgICAgICBpZiAocmVsID09IE5VTEwpCisJeworCSAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgcmVsb2NhdGlvbiAlenU6ICVzXG4iKSwKKwkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKCFlYmxfcmVsb2NfdHlwZV9jaGVjayAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pKSkKKwlFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgdHlwZVxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisgICAgICBlbHNlIGlmICghZWJsX3JlbG9jX3ZhbGlkX3VzZSAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pKSkKKwlFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IHJlbG9jYXRpb24gdHlwZSBpbnZhbGlkIGZvciB0aGUgZmlsZSB0eXBlXG4iKSwKKwkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKKworICAgICAgaWYgKHN5bXNoZHIgIT0gTlVMTAorCSAgJiYgKChHRUxGX1JfU1lNIChyZWwtPnJfaW5mbykgKyAxKQorCSAgICAgICogZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCkKKwkgICAgICA+IHN5bXNoZHItPnNoX3NpemUpKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCBzeW1ib2wgaW5kZXhcbiIpLAorCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOworCisgICAgICBpZiAoZWJsX2dvdHBjX3JlbG9jX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpKQorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBjaGFyIGJ1Zls2NF07CisJICBHRWxmX1N5bSBzeW1fbWVtOworCSAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kYXRhLCBHRUxGX1JfU1lNIChyZWwtPnJfaW5mbyksCisJCQkJICAgICAgICZzeW1fbWVtKTsKKwkgIGlmIChzeW0gIT0gTlVMTAorCSAgICAgIC8qIEdldCB0aGUgbmFtZSBmb3IgdGhlIHN5bWJvbC4gICovCisJICAgICAgJiYgKG5hbWUgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc3ltc2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSkKKwkgICAgICAmJiBzdHJjbXAgKG5hbWUsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSAhPTAgKQorCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IG9ubHkgc3ltYm9sICdfR0xPQkFMX09GRlNFVF9UQUJMRV8nIGNhbiBiZSB1c2VkIHdpdGggJXNcbiIpLAorCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsCisJCSAgIGVibF9yZWxvY190eXBlX25hbWUgKGVibCwgR0VMRl9SX1NZTSAocmVsLT5yX2luZm8pLAorCQkJCQlidWYsIHNpemVvZiAoYnVmKSkpOworCX0KKworICAgICAgaWYgKHJlbGR5bikKKwl7CisJICAvLyBYWFggVE9ETyBDaGVjayAucmVsLmR5biBzZWN0aW9uIGFkZHJlc3Nlcy4KKwl9CisgICAgICBlbHNlIGlmICgha25vd25fYnJva2VuKQorCXsKKwkgIGlmIChkZXN0c2hkciAhPSBOVUxMCisJICAgICAgJiYgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSAhPSAwCisJICAgICAgJiYgKHJlbC0+cl9vZmZzZXQgLSBkZXN0c2hkci0+c2hfYWRkcikgPj0gZGVzdHNoZHItPnNoX3NpemUpCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogb2Zmc2V0IG91dCBvZiBib3VuZHNcbiIpLAorCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOworCX0KKworICAgICAgaWYgKHN5bWRhdGEgIT0gTlVMTAorCSAgJiYgZWJsX2NvcHlfcmVsb2NfcCAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pKSkKKwl7CisJICAvKiBNYWtlIHN1cmUgdGhlIHJlZmVyZW5jZWQgc3ltYm9sIGlzIGFuIG9iamVjdCBvciB1bnNwZWNpZmllZC4gICovCisJICBHRWxmX1N5bSBzeW1fbWVtOworCSAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kYXRhLCBHRUxGX1JfU1lNIChyZWwtPnJfaW5mbyksCisJCQkJICAgICAgICZzeW1fbWVtKTsKKwkgIGlmIChzeW0gIT0gTlVMTAorCSAgICAgICYmIEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfTk9UWVBFCisJICAgICAgJiYgR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9PQkpFQ1QpCisJICAgIHsKKwkgICAgICBjaGFyIGJ1Zls2NF07CisJICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBjb3B5IHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgb2YgdHlwZSAlc1xuIiksCisJCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAorCQkgICAgIGVibF9zeW1ib2xfdHlwZV9uYW1lIChlYmwsIEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSwKKwkJCQkJICAgYnVmLCBzaXplb2YgKGJ1ZikpKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworLyogTnVtYmVyIG9mIGR5bmFtaWMgc2VjdGlvbnMuICAqLworc3RhdGljIGludCBuZHluYW1pYzsKKworCitzdGF0aWMgdm9pZAorY2hlY2tfZHluYW1pYyAoRWJsICplYmwsIGludCBpZHgpCit7CisgIEVsZl9TY24gKnNjbjsKKyAgR0VsZl9TaGRyIHNoZHJfbWVtOworICBHRWxmX1NoZHIgKnNoZHI7CisgIEVsZl9EYXRhICpkYXRhOworICBHRWxmX1NoZHIgc3Ryc2hkcl9tZW07CisgIEdFbGZfU2hkciAqc3Ryc2hkcjsKKyAgc2l6ZV90IGNudDsKKyAgc3RhdGljIGNvbnN0IGJvb2wgZGVwZW5kZW5jaWVzW0RUX05VTV1bRFRfTlVNXSA9CisgICAgeworICAgICAgW0RUX05FRURFRF0gPSB7IFtEVF9TVFJUQUJdID0gdHJ1ZSB9LAorICAgICAgW0RUX1BMVFJFTFNaXSA9IHsgW0RUX0pNUFJFTF0gPSB0cnVlIH0sCisgICAgICBbRFRfSEFTSF0gPSB7IFtEVF9TWU1UQUJdID0gdHJ1ZSB9LAorICAgICAgW0RUX1NUUlRBQl0gPSB7IFtEVF9TVFJTWl0gPSB0cnVlIH0sCisgICAgICBbRFRfU1lNVEFCXSA9IHsgW0RUX1NUUlRBQl0gPSB0cnVlLCBbRFRfSEFTSF0gPSB0cnVlLAorCQkgICAgICBbRFRfU1lNRU5UXSA9IHRydWUgfSwKKyAgICAgIFtEVF9SRUxBXSA9IHsgW0RUX1JFTEFTWl0gPSB0cnVlLCBbRFRfUkVMQUVOVF0gPSB0cnVlIH0sCisgICAgICBbRFRfUkVMQVNaXSA9IHsgW0RUX1JFTEFdID0gdHJ1ZSB9LAorICAgICAgW0RUX1JFTEFFTlRdID0geyBbRFRfUkVMQV0gPSB0cnVlIH0sCisgICAgICBbRFRfU1RSU1pdID0geyBbRFRfU1RSVEFCXSA9IHRydWUgfSwKKyAgICAgIFtEVF9TWU1FTlRdID0geyBbRFRfU1lNVEFCXSA9IHRydWUgfSwKKyAgICAgIFtEVF9TT05BTUVdID0geyBbRFRfU1RSVEFCXSA9IHRydWUgfSwKKyAgICAgIFtEVF9SUEFUSF0gPSB7IFtEVF9TVFJUQUJdID0gdHJ1ZSB9LAorICAgICAgW0RUX1JFTF0gPSB7IFtEVF9SRUxTWl0gPSB0cnVlLCBbRFRfUkVMRU5UXSA9IHRydWUgfSwKKyAgICAgIFtEVF9SRUxTWl0gPSB7IFtEVF9SRUxdID0gdHJ1ZSB9LAorICAgICAgW0RUX1JFTEVOVF0gPSB7IFtEVF9SRUxdID0gdHJ1ZSB9LAorICAgICAgW0RUX0pNUFJFTF0gPSB7IFtEVF9QTFRSRUxTWl0gPSB0cnVlLCBbRFRfUExUUkVMXSA9IHRydWUgfSwKKyAgICAgIFtEVF9SVU5QQVRIXSA9IHsgW0RUX1NUUlRBQl0gPSB0cnVlIH0sCisgICAgICBbRFRfUExUUkVMXSA9IHsgW0RUX0pNUFJFTF0gPSB0cnVlIH0sCisgICAgICBbRFRfUExUUkVMU1pdID0geyBbRFRfSk1QUkVMXSA9IHRydWUgfQorICAgIH07CisgIGJvb2wgaGFzX2R0W0RUX05VTV07CisgIHN0YXRpYyBjb25zdCBib29sIGxldmVsMltEVF9OVU1dID0KKyAgICB7CisgICAgICBbRFRfUlBBVEhdID0gdHJ1ZSwKKyAgICAgIFtEVF9TWU1CT0xJQ10gPSB0cnVlLAorICAgICAgW0RUX1RFWFRSRUxdID0gdHJ1ZSwKKyAgICAgIFtEVF9CSU5EX05PV10gPSB0cnVlCisgICAgfTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgbWFuZGF0b3J5W0RUX05VTV0gPQorICAgIHsKKyAgICAgIFtEVF9OVUxMXSA9IHRydWUsCisgICAgICBbRFRfSEFTSF0gPSB0cnVlLAorICAgICAgW0RUX1NUUlRBQl0gPSB0cnVlLAorICAgICAgW0RUX1NZTVRBQl0gPSB0cnVlLAorICAgICAgW0RUX1NUUlNaXSA9IHRydWUsCisgICAgICBbRFRfU1lNRU5UXSA9IHRydWUKKyAgICB9OworICBHRWxmX0FkZHIgcmVsYWRkciA9IDA7CisgIEdFbGZfV29yZCByZWxzeiA9IDA7CisgIEdFbGZfQWRkciBwbHRyZWxhZGRyID0gMDsKKyAgR0VsZl9Xb3JkIHBsdHJlbHN6ID0gMDsKKworICBtZW1zZXQgKGhhc19kdCwgJ1wwJywgc2l6ZW9mIChoYXNfZHQpKTsKKworICBpZiAoKytuZHluYW1pYyA9PSAyKQorICAgIEVSUk9SIChnZXR0ZXh0ICgibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlY3Rpb24gcHJlc2VudFxuIikpOworCisgIHNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpZHgpOworICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisgIGlmIChzaGRyID09IE5VTEwpCisgICAgcmV0dXJuOworICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgeworICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iKSwKKwkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzdHJzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayksICZzdHJzaGRyX21lbSk7CisgIGlmIChzdHJzaGRyICE9IE5VTEwgJiYgc3Ryc2hkci0+c2hfdHlwZSAhPSBTSFRfU1RSVEFCKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiByZWZlcmVuY2VkIGFzIHN0cmluZyB0YWJsZSBmb3Igc2VjdGlvbiBbJTJkXSAnJXMnIGJ1dCB0eXBlIGlzIG5vdCBTSFRfU1RSVEFCXG4iKSwKKwkgICBzaGRyLT5zaF9saW5rLCBzZWN0aW9uX25hbWUgKGVibCwgc2hkci0+c2hfbGluayksCisJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisKKyAgaWYgKHNoZHItPnNoX2VudHNpemUgIT0gZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX0RZTiwgMSwgRVZfQ1VSUkVOVCkpCisgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGZYWF9EeW5cbiIpLAorCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCisgIGlmIChzaGRyLT5zaF9pbmZvICE9IDApCisgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gbm90IHplcm9cbiIpLAorCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCisgIGJvb2wgbm9uX251bGxfd2FybmVkID0gZmFsc2U7CisgIGZvciAoY250ID0gMDsgY250IDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7ICsrY250KQorICAgIHsKKyAgICAgIEdFbGZfRHluIGR5bl9tZW07CisgICAgICBHRWxmX0R5biAqZHluOworCisgICAgICBkeW4gPSBnZWxmX2dldGR5biAoZGF0YSwgY250LCAmZHluX21lbSk7CisgICAgICBpZiAoZHluID09IE5VTEwpCisJeworCSAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgZHluYW1pYyBzZWN0aW9uIGVudHJ5ICV6dTogJXNcbiIpLAorCQkgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LCBlbGZfZXJybXNnICgtMSkpOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoaGFzX2R0W0RUX05VTExdICYmIGR5bi0+ZF90YWcgIT0gRFRfTlVMTCAmJiAhIG5vbl9udWxsX3dhcm5lZCkKKwl7CisJICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURUX05VTEwgZW50cmllcyBmb2xsb3cgRFRfTlVMTCBlbnRyeVxuIiksCisJCSBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKKwkgIG5vbl9udWxsX3dhcm5lZCA9IHRydWU7CisJfQorCisgICAgICBpZiAoIWVibF9keW5hbWljX3RhZ19jaGVjayAoZWJsLCBkeW4tPmRfdGFnKSkKKwlFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiB1bmtub3duIHRhZ1xuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7CisKKyAgICAgIGlmIChkeW4tPmRfdGFnID49IDAgJiYgZHluLT5kX3RhZyA8IERUX05VTSkKKwl7CisJICBpZiAoaGFzX2R0W2R5bi0+ZF90YWddCisJICAgICAgJiYgZHluLT5kX3RhZyAhPSBEVF9ORUVERUQKKwkgICAgICAmJiBkeW4tPmRfdGFnICE9IERUX05VTEwKKwkgICAgICAmJiBkeW4tPmRfdGFnICE9IERUX1BPU0ZMQUdfMSkKKwkgICAgeworCSAgICAgIGNoYXIgYnVmWzUwXTsKKwkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBtb3JlIHRoYW4gb25lIGVudHJ5IHdpdGggdGFnICVzXG4iKSwKKwkJICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsCisJCSAgICAgZWJsX2R5bmFtaWNfdGFnX25hbWUgKGVibCwgZHluLT5kX3RhZywKKwkJCQkJICAgYnVmLCBzaXplb2YgKGJ1ZikpKTsKKwkgICAgfQorCisJICBpZiAoYmVfc3RyaWN0ICYmIGxldmVsMltkeW4tPmRfdGFnXSkKKwkgICAgeworCSAgICAgIGNoYXIgYnVmWzUwXTsKKwkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBsZXZlbCAyIHRhZyAlcyB1c2VkXG4iKSwKKwkJICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsCisJCSAgICAgZWJsX2R5bmFtaWNfdGFnX25hbWUgKGVibCwgZHluLT5kX3RhZywKKwkJCQkJICAgYnVmLCBzaXplb2YgKGJ1ZikpKTsKKwkgICAgfQorCisJICBoYXNfZHRbZHluLT5kX3RhZ10gPSB0cnVlOworCX0KKworICAgICAgaWYgKGR5bi0+ZF90YWcgPT0gRFRfUExUUkVMICYmIGR5bi0+ZF91bi5kX3ZhbCAhPSBEVF9SRUwKKwkgICYmIGR5bi0+ZF91bi5kX3ZhbCAhPSBEVF9SRUxBKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IERUX1BMVFJFTCB2YWx1ZSBtdXN0IGJlIERUX1JFTCBvciBEVF9SRUxBXG4iKSwKKwkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKKworICAgICAgaWYgKGR5bi0+ZF90YWcgPT0gRFRfUkVMKQorCXJlbGFkZHIgPSBkeW4tPmRfdW4uZF9wdHI7CisgICAgICBpZiAoZHluLT5kX3RhZyA9PSBEVF9SRUxTWikKKwlyZWxzeiA9IGR5bi0+ZF91bi5kX3ZhbDsKKyAgICAgIGlmIChkeW4tPmRfdGFnID09IERUX0pNUFJFTCkKKwlwbHRyZWxhZGRyID0gZHluLT5kX3VuLmRfcHRyOworICAgICAgaWYgKGR5bi0+ZF90YWcgPT0gRFRfUExUUkVMU1opCisJcGx0cmVsc3ogPSBkeW4tPmRfdW4uZF92YWw7CisgICAgfQorCisgIGZvciAoY250ID0gMTsgY250IDwgRFRfTlVNOyArK2NudCkKKyAgICBpZiAoaGFzX2R0W2NudF0pCisgICAgICB7CisJaW50IGlubmVyOworCisJZm9yIChpbm5lciA9IDA7IGlubmVyIDwgRFRfTlVNOyArK2lubmVyKQorCSAgaWYgKGRlcGVuZGVuY2llc1tjbnRdW2lubmVyXSAmJiAhIGhhc19kdFtpbm5lcl0pCisJICAgIHsKKwkgICAgICBjaGFyIGJ1ZjFbNTBdOworCSAgICAgIGNoYXIgYnVmMls1MF07CisKKwkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogY29udGFpbnMgJXMgZW50cnkgYnV0IG5vdCAlc1xuIiksCisJCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKKwkJICAgICBlYmxfZHluYW1pY190YWdfbmFtZSAoZWJsLCBjbnQsIGJ1ZjEsIHNpemVvZiAoYnVmMSkpLAorCQkgICAgIGVibF9keW5hbWljX3RhZ19uYW1lIChlYmwsIGlubmVyLCBidWYyLCBzaXplb2YgKGJ1ZjIpKSk7CisJICAgIH0KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaWYgKG1hbmRhdG9yeVtjbnRdKQorCSAgeworCSAgICBjaGFyIGJ1Zls1MF07CisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBtYW5kYXRvcnkgdGFnICVzIG5vdCBwcmVzZW50XG4iKSwKKwkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKKwkJICAgZWJsX2R5bmFtaWNfdGFnX25hbWUgKGVibCwgY250LCBidWYsIHNpemVvZiAoYnVmKSkpOworCSAgfQorICAgICAgfQorCisgIC8qIENoZWNrIHRoZSByZWwvcmVsYSB0YWdzLiAgQXQgbGVhc3Qgb25lIGdyb3VwIG11c3QgYmUgYXZhaWxhYmxlLiAgKi8KKyAgaWYgKChoYXNfZHRbRFRfUkVMQV0gfHwgaGFzX2R0W0RUX1JFTEFTWl0gfHwgaGFzX2R0W0RUX1JFTEFFTlRdKQorICAgICAgJiYgKCFoYXNfZHRbRFRfUkVMQV0gfHwgIWhhc19kdFtEVF9SRUxBU1pdIHx8ICFoYXNfZHRbRFRfUkVMQUVOVF0pKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgYWxsIG9mICVzLCAlcywgYW5kICVzIGFyZSBwcmVzZW50XG4iKSwKKwkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAorCSAgICJEVF9SRUxBIiwgIkRUX1JFTEFTWiIsICJEVF9SRUxBRU5UIik7CisKKyAgaWYgKChoYXNfZHRbRFRfUkVMXSB8fCBoYXNfZHRbRFRfUkVMU1pdIHx8IGhhc19kdFtEVF9SRUxFTlRdKQorICAgICAgJiYgKCFoYXNfZHRbRFRfUkVMXSB8fCAhaGFzX2R0W0RUX1JFTFNaXSB8fCAhaGFzX2R0W0RUX1JFTEVOVF0pKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgYWxsIG9mICVzLCAlcywgYW5kICVzIGFyZSBwcmVzZW50XG4iKSwKKwkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAorCSAgICJEVF9SRUwiLCAiRFRfUkVMU1oiLCAiRFRfUkVMRU5UIik7Cit9CisKKworc3RhdGljIHZvaWQKK2NoZWNrX3N5bXRhYl9zaG5keCAoRWJsICplYmwsIGludCBpZHgpCit7CisgIEVsZl9TY24gKnNjbjsKKyAgR0VsZl9TaGRyIHNoZHJfbWVtOworICBHRWxmX1NoZHIgKnNoZHI7CisgIEdFbGZfU2hkciBzeW1zaGRyX21lbTsKKyAgR0VsZl9TaGRyICpzeW1zaGRyOworICBFbGZfU2NuICpzeW1zY247CisgIHNpemVfdCBjbnQ7CisgIEVsZl9EYXRhICpkYXRhOworICBFbGZfRGF0YSAqc3ltZGF0YTsKKworICBzY24gPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgaWR4KTsKKyAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworICBpZiAoc2hkciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBzeW1zY24gPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayk7CisgIHN5bXNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnN5bXNoZHJfbWVtKTsKKyAgaWYgKHN5bXNoZHIgIT0gTlVMTCAmJiBzeW1zaGRyLT5zaF90eXBlICE9IFNIVF9TWU1UQUIpCisgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvbiBub3QgZm9yIHN5bWJvbCB0YWJsZVxuIiksCisJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisgIHN5bWRhdGEgPSBlbGZfZ2V0ZGF0YSAoc3ltc2NuLCBOVUxMKTsKKyAgaWYgKHN5bWRhdGEgPT0gTlVMTCkKKyAgICBFUlJPUiAoZ2V0dGV4dCAoImNhbm5vdCBnZXQgZGF0YSBmb3Igc3ltYm9sIHNlY3Rpb25cbiIpKTsKKworICBpZiAoc2hkci0+c2hfZW50c2l6ZSAhPSBzaXplb2YgKEVsZjMyX1dvcmQpKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZjMyX1dvcmRcbiIpLAorCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCisgIGlmIChzeW1zaGRyICE9IE5VTEwKKyAgICAgICYmIChzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZQorCSAgPCBzeW1zaGRyLT5zaF9zaXplIC8gc3ltc2hkci0+c2hfZW50c2l6ZSkpCisgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIGluZGV4IHRhYmxlIHRvbyBzbWFsbCBmb3Igc3ltYm9sIHRhYmxlXG4iKSwKKwkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKKworICBpZiAoc2hkci0+c2hfaW5mbyAhPSAwKQorICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9pbmZvIG5vdCB6ZXJvXG4iKSwKKwkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKKworICBmb3IgKGNudCA9IGlkeCArIDE7IGNudCA8IHNobnVtOyArK2NudCkKKyAgICB7CisgICAgICBHRWxmX1NoZHIgcnNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpyc2hkcjsKKworICAgICAgcnNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBjbnQpLCAmcnNoZHJfbWVtKTsKKyAgICAgIGlmIChyc2hkciAhPSBOVUxMICYmIHJzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgKKwkgICYmIHJzaGRyLT5zaF9saW5rID09IHNoZHItPnNoX2xpbmspCisJeworCSAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggaW4gc2VjdGlvbiBbJTJ6dV0gJyVzJyByZWZlcnMgdG8gc2FtZSBzeW1ib2wgdGFibGVcbiIpLAorCQkgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKKwkJIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCkpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisKKyAgaWYgKCooKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpICE9IDApCisgICAgRVJST1IgKGdldHRleHQgKCJzeW1ib2wgMCBzaG91bGQgaGF2ZSB6ZXJvIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXhcbiIpKTsKKworICBmb3IgKGNudCA9IDE7IGNudCA8IGRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoRWxmMzJfV29yZCk7ICsrY250KQorICAgIHsKKyAgICAgIEVsZjMyX1dvcmQgeG5keCA9ICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbY250XTsKKworICAgICAgaWYgKHhuZHggIT0gMCkKKwl7CisJICBHRWxmX1N5bSBzeW1fZGF0YTsKKwkgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bSAoc3ltZGF0YSwgY250LCAmc3ltX2RhdGEpOworCSAgaWYgKHN5bSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgRVJST1IgKGdldHRleHQgKCJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCAlenVcbiIpLCBjbnQpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9YSU5ERVgpCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBpcyAlIiBQUkl1MzIgIiBidXQgc3ltYm9sIGluZGV4IGlzIG5vdCBYSU5ERVhcbiIpLAorCQkgICAodWludDMyX3QpIHhuZHgpOworCX0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2NoZWNrX2hhc2ggKEVibCAqZWJsLCBpbnQgaWR4KQoreworICBFbGZfU2NuICpzY247CisgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgR0VsZl9TaGRyICpzaGRyOworICBFbGZfRGF0YSAqZGF0YTsKKyAgRWxmMzJfV29yZCBuYnVja2V0OworICBFbGYzMl9Xb3JkIG5jaGFpbjsKKyAgR0VsZl9TaGRyIHN5bXNoZHJfbWVtOworICBHRWxmX1NoZHIgKnN5bXNoZHI7CisKKyAgc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIGlkeCk7CisgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKyAgaWYgKHNoZHIgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGFcbiIpLAorCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN5bXNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKSwgJnN5bXNoZHJfbWVtKTsKKyAgaWYgKHN5bXNoZHIgIT0gTlVMTCAmJiBzeW1zaGRyLT5zaF90eXBlICE9IFNIVF9EWU5TWU0pCisgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgbm90IGZvciBkeW5hbWljIHN5bWJvbCB0YWJsZVxuIiksCisJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisKKyAgaWYgKHNoZHItPnNoX2VudHNpemUgIT0gc2l6ZW9mIChFbGYzMl9Xb3JkKSkKKyAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGYzMl9Xb3JkXG4iKSwKKwkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKKworICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSA9PSAwKQorICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgbWFya2VkIHRvIGJlIGFsbG9jYXRlZFxuIiksCisJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisKKyAgaWYgKHNoZHItPnNoX3NpemUgPCAyICogc2hkci0+c2hfZW50c2l6ZSkKKyAgICB7CisgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBoYXMgbm90IGV2ZW4gcm9vbSBmb3IgbmJ1Y2tldCBhbmQgbmNoYWluXG4iKSwKKwkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBuYnVja2V0ID0gKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVswXTsKKyAgbmNoYWluID0gKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVsxXTsKKworICBpZiAoc2hkci0+c2hfc2l6ZSA8ICgyICsgbmJ1Y2tldCArIG5jaGFpbikgKiBzaGRyLT5zaF9lbnRzaXplKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIHNlY3Rpb24gaXMgdG9vIHNtYWxsIChpcyAlbGQsIGV4cGVjdGVkICVsZClcbiIpLAorCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIChsb25nIGludCkgc2hkci0+c2hfc2l6ZSwKKwkgICAobG9uZyBpbnQpICgoMiArIG5idWNrZXQgKyBuY2hhaW4pICogc2hkci0+c2hfZW50c2l6ZSkpOworCisgIGlmIChzeW1zaGRyICE9IE5VTEwpCisgICAgeworICAgICAgc2l6ZV90IHN5bXNpemUgPSBzeW1zaGRyLT5zaF9zaXplIC8gc3ltc2hkci0+c2hfZW50c2l6ZTsKKyAgICAgIHNpemVfdCBjbnQ7CisKKyAgICAgIGlmIChuY2hhaW4gPCBzeW1zaGRyLT5zaF9zaXplIC8gc3ltc2hkci0+c2hfZW50c2l6ZSkKKwlFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogY2hhaW4gYXJyYXkgbm90IGxhcmdlIGVub3VnaFxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCisgICAgICBmb3IgKGNudCA9IDI7IGNudCA8IDIgKyBuYnVja2V0OyArK2NudCkKKwlpZiAoKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVtjbnRdID49IHN5bXNpemUpCisJICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBidWNrZXQgcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iKSwKKwkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCAtIDIpOworCisgICAgICBmb3IgKDsgY250IDwgMiArIG5idWNrZXQgKyBuY2hhaW47ICsrY250KQorCWlmICgoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpW2NudF0gPj0gc3ltc2l6ZSkKKwkgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIHJlZmVyZW5jZSAlenUgb3V0IG9mIGJvdW5kc1xuIiksCisJCSBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQgLSAyIC0gbmJ1Y2tldCk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitjaGVja19udWxsIChFYmwgKmVibCwgR0VsZl9TaGRyICpzaGRyLCBpbnQgaWR4KQoreworI2RlZmluZSBURVNUKG5hbWUsIGV4dHJhKSBcCisgIGlmIChleHRyYSAmJiBzaGRyLT5zaF8jI25hbWUgIT0gMCkJCQkJCSAgICAgIFwKKyAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uemVybyBzaF8lcyBmb3IgTlVMTCBzZWN0aW9uXG4iKSwgIFwKKwkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCAjbmFtZSkKKworICBURVNUIChuYW1lLCAxKTsKKyAgVEVTVCAoZmxhZ3MsIDEpOworICBURVNUIChhZGRyLCAxKTsKKyAgVEVTVCAob2Zmc2V0LCAxKTsKKyAgVEVTVCAoc2l6ZSwgaWR4ICE9IDApOworICBURVNUIChsaW5rLCBpZHggIT0gMCk7CisgIFRFU1QgKGluZm8sIDEpOworICBURVNUIChhZGRyYWxpZ24sIDEpOworICBURVNUIChlbnRzaXplLCAxKTsKK30KKworCitzdGF0aWMgdm9pZAorY2hlY2tfZ3JvdXAgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsIEdFbGZfU2hkciAqc2hkciwgaW50IGlkeCkKK3sKKyAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwpCisgICAgeworICAgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXBzIG9ubHkgYWxsb3dlZCBpbiByZWxvY2F0YWJsZSBvYmplY3QgZmlsZXNcbiIpLAorCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgc2hfbGluayBpcyBhbiBpbmRleCBvZiBhIHN5bWJvbCB0YWJsZS4gICovCisgIEdFbGZfU2hkciBzeW1zaGRyX21lbTsKKyAgR0VsZl9TaGRyICpzeW1zaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayksCisJCQkJICAgICAmc3ltc2hkcl9tZW0pOworICBpZiAoc3ltc2hkciA9PSBOVUxMKQorICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZTogJXNcbiIpLAorCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGVsZl9lcnJtc2cgKC0xKSk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc3ltc2hkci0+c2hfdHlwZSAhPSBTSFRfU1lNVEFCKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHJlZmVyZW5jZSBpbiBzaF9saW5rIGlzIG5vIHN5bWJvbCB0YWJsZVxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCisgICAgICBpZiAoc2hkci0+c2hfaW5mbyA+PSBzeW1zaGRyLT5zaF9zaXplIC8gZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX1NZTSwKKwkJCQkJCQkgIDEsIEVWX0NVUlJFTlQpKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIHN5bWJvbCBpbmRleCBpbiBzaF9pbmZvXG4iKSwKKwkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7CisKKyAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAhPSAwKQorCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9mbGFncyBub3QgemVyb1xuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCisgICAgICBpZiAoYmVfc3RyaWN0CisJICAmJiBzaGRyLT5zaF9lbnRzaXplICE9IGVsZjMyX2ZzaXplIChFTEZfVF9XT1JELCAxLCBFVl9DVVJSRU5UKSkKKwlFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm90IHNldCBjb3JyZWN0bHlcbiIpLAorCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKKyAgICB9CisKKyAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIGlkeCksIE5VTEwpOworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGRhdGE6ICVzXG4iKSwKKwkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBlbGZfZXJybXNnICgtMSkpOworICBlbHNlCisgICAgeworICAgICAgc2l6ZV90IGVsc2l6ZSA9IGVsZjMyX2ZzaXplIChFTEZfVF9XT1JELCAxLCBFVl9DVVJSRU5UKTsKKyAgICAgIHNpemVfdCBjbnQ7CisgICAgICBFbGYzMl9Xb3JkIHZhbDsKKworICAgICAgaWYgKGRhdGEtPmRfc2l6ZSAlIGVsc2l6ZSAhPSAwKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHNpemUgbm90IG11bHRpcGxlIG9mIHNpemVvZihFbGYzMl9Xb3JkKVxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCisgICAgICBpZiAoZGF0YS0+ZF9zaXplIDwgZWxzaXplKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgZmxhZ3Mgd29yZFxuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworICAgICAgZWxzZSBpZiAoYmVfc3RyaWN0KQorCXsKKwkgIGlmIChkYXRhLT5kX3NpemUgPCAyICogZWxzaXplKQorCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRob3V0IG1lbWJlclxuIiksCisJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCSAgZWxzZSBpZiAoZGF0YS0+ZF9zaXplIDwgMyAqIGVsc2l6ZSkKKwkgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgd2l0aCBvbmx5IG9uZSBtZW1iZXJcbiIpLAorCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKKwl9CisKKyNpZiBBTExPV19VTkFMSUdORUQKKyAgICAgIHZhbCA9ICooKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpOworI2Vsc2UKKyAgICAgIG1lbWNweSAoJnZhbCwgZGF0YS0+ZF9idWYsIGVsc2l6ZSk7CisjZW5kaWYKKyAgICAgIGlmICgodmFsICYgfkdSUF9DT01EQVQpICE9IDApCisJRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gc2VjdGlvbiBncm91cCBmbGFnc1xuIiksCisJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOworCisgICAgICBmb3IgKGNudCA9IGVsc2l6ZTsgY250IDwgZGF0YS0+ZF9zaXplOyBjbnQgKz0gZWxzaXplKQorCXsKKyNpZiBBTExPV19VTkFMSUdORUQKKwkgIHZhbCA9ICooKEVsZjMyX1dvcmQgKikgKChjaGFyICopIGRhdGEtPmRfYnVmICsgY250KSk7CisjZWxzZQorCSAgbWVtY3B5ICgmdmFsLCAoY2hhciAqKSBkYXRhLT5kX2J1ZiArIGNudCwgZWxzaXplKTsKKyNlbmRpZgorCisJICBpZiAodmFsID4gc2hudW0pCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGluZGV4ICVadSBvdXQgb2YgcmFuZ2VcbiIpLAorCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQgLyBlbHNpemUpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgR0VsZl9TaGRyIHJlZnNoZHJfbWVtOworCSAgICAgIEdFbGZfU2hkciAqcmVmc2hkcjsKKworCSAgICAgIHJlZnNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCB2YWwpLAorCQkJCSAgICAgICZyZWZzaGRyX21lbSk7CisJICAgICAgaWYgKHJlZnNoZHIgPT0gTlVMTCkKKwkJRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIGVsZW1lbnQgJXp1OiAlc1xuIiksCisJCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQgLyBlbHNpemUsCisJCSAgICAgICBlbGZfZXJybXNnICgtMSkpOworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChyZWZzaGRyLT5zaF90eXBlID09IFNIVF9HUk9VUCkKKwkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIGNvbnRhaW5zIGFub3RoZXIgZ3JvdXAgWyUyZF0gJyVzJ1xuIiksCisJCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAorCQkJICAgdmFsLCBzZWN0aW9uX25hbWUgKGVibCwgdmFsKSk7CisKKwkJICBpZiAoKHJlZnNoZHItPnNoX2ZsYWdzICYgU0hGX0dST1VQKSA9PSAwKQorCQkgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMmRdICclcyc6IGVsZW1lbnQgJVp1IHJlZmVyZW5jZXMgc2VjdGlvbiBbJTJkXSAnJXMnIHdpdGhvdXQgU0hGX0dST1VQIGZsYWcgc2V0XG4iKSwKKwkJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCAvIGVsc2l6ZSwKKwkJCSAgIHZhbCwgc2VjdGlvbl9uYW1lIChlYmwsIHZhbCkpOworCQl9CisKKwkgICAgICBpZiAoKytzY25yZWZbdmFsXSA9PSAyKQorCQlFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJyBpcyBjb250YWluZWQgaW4gbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGdyb3VwXG4iKSwKKwkJICAgICAgIHZhbCwgc2VjdGlvbl9uYW1lIChlYmwsIHZhbCkpOworCSAgICB9CisJfQorICAgIH0KK30KKworCitzdGF0aWMgYm9vbCBoYXNfbG9hZGFibGVfc2VnbWVudDsKK3N0YXRpYyBib29sIGhhc19pbnRlcnBfc2VnbWVudDsKKworc3RhdGljIGNvbnN0IHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBzaXplX3QgbmFtZWxlbjsKKyAgR0VsZl9Xb3JkIHR5cGU7CisgIGVudW0geyB1bnVzZWQsIGV4YWN0LCBhdGxlYXN0IH0gYXR0cmZsYWc7CisgIEdFbGZfV29yZCBhdHRyOworICBHRWxmX1dvcmQgYXR0cjI7Cit9IHNwZWNpYWxfc2VjdGlvbnNbXSA9CisgIHsKKyAgICAvKiBTZWUgZmlndXJlIDQtMTQgaW4gdGhlIGdBQkkuICAqLworICAgIHsgIi5ic3MiLCA1LCBTSFRfTk9CSVRTLCBleGFjdCwgU0hGX0FMTE9DIHwgU0hGX1dSSVRFLCAwIH0sCisgICAgeyAiLmNvbW1lbnQiLCA4LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCAwLCAwIH0sCisgICAgeyAiLmRhdGEiLCA2LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCBTSEZfQUxMT0MgfCBTSEZfV1JJVEUsIDAgfSwKKyAgICB7ICIuZGF0YTEiLCA3LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCBTSEZfQUxMT0MgfCBTSEZfV1JJVEUsIDAgfSwKKyAgICB7ICIuZGVidWciLCA3LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCAwLCAwIH0sCisgICAgeyAiLmR5bmFtaWMiLCA5LCBTSFRfRFlOQU1JQywgYXRsZWFzdCwgU0hGX0FMTE9DLCBTSEZfV1JJVEUgfSwKKyAgICB7ICIuZHluc3RyIiwgOCwgU0hUX1NUUlRBQiwgZXhhY3QsIFNIRl9BTExPQywgMCB9LAorICAgIHsgIi5keW5zeW0iLCA4LCBTSFRfRFlOU1lNLCBleGFjdCwgU0hGX0FMTE9DLCAwIH0sCisgICAgeyAiLmZpbmkiLCA2LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCBTSEZfQUxMT0MgfCBTSEZfRVhFQ0lOU1RSLCAwIH0sCisgICAgeyAiLmZpbmlfYXJyYXkiLCAxMiwgU0hUX0ZJTklfQVJSQVksIGV4YWN0LCBTSEZfQUxMT0MgfCBTSEZfV1JJVEUsIDAgfSwKKyAgICB7ICIuZ290IiwgNSwgU0hUX1BST0dCSVRTLCB1bnVzZWQsIDAsIDAgfSwgLy8gWFhYIG1vcmUgaW5mbz8KKyAgICB7ICIuaGFzaCIsIDYsIFNIVF9IQVNILCBleGFjdCwgU0hGX0FMTE9DLCAwIH0sCisgICAgeyAiLmluaXQiLCA2LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCBTSEZfQUxMT0MgfCBTSEZfRVhFQ0lOU1RSLCAwIH0sCisgICAgeyAiLmluaXRfYXJyYXkiLCAxMiwgU0hUX0lOSVRfQVJSQVksIGV4YWN0LCBTSEZfQUxMT0MgfCBTSEZfV1JJVEUsIDAgfSwKKyAgICB7ICIuaW50ZXJwIiwgOCwgU0hUX1BST0dCSVRTLCBhdGxlYXN0LCAwLCBTSEZfQUxMT0MgfSwgLy8gWFhYIG1vcmUgdGVzdHM/CisgICAgeyAiLmxpbmUiLCA2LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCAwLCAwIH0sCisgICAgeyAiLm5vdGUiLCA2LCBTSFRfTk9URSwgZXhhY3QsIDAsIDAgfSwKKyAgICB7ICIucGx0IiwgNSwgU0hUX1BST0dCSVRTLCB1bnVzZWQsIDAsIDAgfSwgLy8gWFhYIG1vcmUgdGVzdHMKKyAgICB7ICIucHJlaW5pdF9hcnJheSIsIDE1LCBTSFRfUFJFSU5JVF9BUlJBWSwgZXhhY3QsIFNIRl9BTExPQyB8IFNIRl9XUklURSwgMCB9LAorICAgIHsgIi5yZWxhIiwgNSwgU0hUX1JFTEEsIGF0bGVhc3QsIDAsIFNIRl9BTExPQyB9LCAvLyBYWFggbW9yZSB0ZXN0cworICAgIHsgIi5yZWwiLCA0LCBTSFRfUkVMLCBhdGxlYXN0LCAwLCBTSEZfQUxMT0MgfSwgLy8gWFhYIG1vcmUgdGVzdHMKKyAgICB7ICIucm9kYXRhIiwgOCwgU0hUX1BST0dCSVRTLCBleGFjdCwgU0hGX0FMTE9DLCAwIH0sCisgICAgeyAiLnJvZGF0YTEiLCA5LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCBTSEZfQUxMT0MsIDAgfSwKKyAgICB7ICIuc2hzdHJ0YWIiLCAxMCwgU0hUX1NUUlRBQiwgZXhhY3QsIDAsIDAgfSwKKyAgICB7ICIuc3RydGFiIiwgOCwgU0hUX1NUUlRBQiwgYXRsZWFzdCwgMCwgU0hGX0FMTE9DIH0sIC8vIFhYWCBtb3JlIHRlc3RzCisgICAgeyAiLnN5bXRhYiIsIDgsIFNIVF9TWU1UQUIsIGF0bGVhc3QsIDAsIFNIRl9BTExPQyB9LCAvLyBYWFggbW9yZSB0ZXN0cworICAgIHsgIi5zeW10YWJfc2huZHgiLCAxNCwgU0hUX1NZTVRBQl9TSE5EWCwgYXRsZWFzdCwgMCwgU0hGX0FMTE9DIH0sIC8vIFhYWCBtb3JlIHRlc3RzCisgICAgeyAiLnRic3MiLCA2LCBTSFRfTk9CSVRTLCBleGFjdCwgU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX1RMUywgMCB9LAorICAgIHsgIi50ZGF0YSIsIDcsIFNIVF9QUk9HQklUUywgZXhhY3QsIFNIRl9BTExPQyB8IFNIRl9XUklURSB8IFNIRl9UTFMsIDAgfSwKKyAgICB7ICIudGRhdGExIiwgOCwgU0hUX1BST0dCSVRTLCBleGFjdCwgU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX1RMUywgMCB9LAorICAgIHsgIi50ZXh0IiwgNiwgU0hUX1BST0dCSVRTLCBleGFjdCwgU0hGX0FMTE9DIHwgU0hGX0VYRUNJTlNUUiwgMCB9CisgIH07CisjZGVmaW5lIG5zcGVjaWFsX3NlY3Rpb25zIFwKKyAgKHNpemVvZiAoc3BlY2lhbF9zZWN0aW9ucykgLyBzaXplb2YgKHNwZWNpYWxfc2VjdGlvbnNbMF0pKQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NlY3Rpb25fZmxhZ3Nfc3RyaW5nIChHRWxmX1dvcmQgZmxhZ3MsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdAorICB7CisgICAgR0VsZl9Xb3JkIGZsYWc7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgfSBrbm93bl9mbGFnc1tdID0KKyAgICB7CisjZGVmaW5lIE5FV0ZMQUcobmFtZSkgeyBTSEZfIyNuYW1lLCAjbmFtZSB9CisgICAgICBORVdGTEFHIChXUklURSksCisgICAgICBORVdGTEFHIChBTExPQyksCisgICAgICBORVdGTEFHIChFWEVDSU5TVFIpLAorICAgICAgTkVXRkxBRyAoTUVSR0UpLAorICAgICAgTkVXRkxBRyAoU1RSSU5HUyksCisgICAgICBORVdGTEFHIChJTkZPX0xJTkspLAorICAgICAgTkVXRkxBRyAoTElOS19PUkRFUiksCisgICAgICBORVdGTEFHIChPU19OT05DT05GT1JNSU5HKSwKKyAgICAgIE5FV0ZMQUcgKEdST1VQKSwKKyAgICAgIE5FV0ZMQUcgKFRMUykKKyAgICB9OworI3VuZGVmIE5FV0ZMQUcKKyAgY29uc3Qgc2l6ZV90IG5rbm93bl9mbGFncyA9IHNpemVvZiAoa25vd25fZmxhZ3MpIC8gc2l6ZW9mIChrbm93bl9mbGFnc1swXSk7CisKKyAgY2hhciAqY3AgPSBidWY7CisgIHNpemVfdCBjbnQ7CisKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBua25vd25fZmxhZ3M7ICsrY250KQorICAgIGlmIChmbGFncyAmIGtub3duX2ZsYWdzW2NudF0uZmxhZykKKyAgICAgIHsKKwlpZiAoY3AgIT0gYnVmICYmIGxlbiA+IDEpCisJICB7CisJICAgICpjcCsrID0gJ3wnOworCSAgICAtLWxlbjsKKwkgIH0KKworCXNpemVfdCBuY29weSA9IE1JTiAobGVuIC0gMSwgc3RybGVuIChrbm93bl9mbGFnc1tjbnRdLm5hbWUpKTsKKwljcCA9IG1lbXBjcHkgKGNwLCBrbm93bl9mbGFnc1tjbnRdLm5hbWUsIG5jb3B5KTsKKwlsZW4gLT0gbmNvcHk7CisKKwlmbGFncyBePSBrbm93bl9mbGFnc1tjbnRdLmZsYWc7CisgICAgICB9CisKKyAgaWYgKGZsYWdzICE9IDAgfHwgY3AgPT0gYnVmKQorICAgIHNucHJpbnRmIChjcCwgbGVuIC0gMSwgIiUiIFBSSXg2NCwgKHVpbnQ2NF90KSBmbGFncyk7CisKKyAgKmNwID0gJ1wwJzsKKworICByZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyB2b2lkCitjaGVja192ZXJzeW0gKEVibCAqZWJsLCBHRWxmX1NoZHIgKnNoZHIsIGludCBpZHgpCit7CisgIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlcnNpb24gc3ltYm9sIHRhYmxlIG11c3QgYmUgdGhlCisgICAgIHNhbWUgYXMgdGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KKyAgR0VsZl9TaGRyIHN5bXNoZHJfbWVtOworICBHRWxmX1NoZHIgKnN5bXNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKSwKKwkJCQkgICAgICZzeW1zaGRyX21lbSk7CisgIGlmIChzeW1zaGRyID09IE5VTEwpCisgICAgLyogVGhlIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuICAqLworICAgIHJldHVybjsKKworICBpZiAoc3ltc2hkci0+c2hfdHlwZSAhPSBTSFRfRFlOU1lNKQorICAgIHsKKyAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJkXSAnJXMnIHJlZmVycyBpbiBzaF9saW5rIHRvIHNlY3Rpb24gWyUyZF0gJyVzJyB3aGljaCBpcyBubyBkeW5hbWljIHN5bWJvbCB0YWJsZVxuIiksCisJICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAorCSAgICAgc2hkci0+c2hfbGluaywgc2VjdGlvbl9uYW1lIChlYmwsIHNoZHItPnNoX2xpbmspKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplCisgICAgICAhPSBzeW1zaGRyLT5zaF9zaXplIC8gc3ltc2hkci0+c2hfZW50c2l6ZSkKKyAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJyBoYXMgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIHRoYW4gc3ltYm9sIHRhYmxlIFslMmRdICclcydcbiIpLAorCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCisJICAgc2hkci0+c2hfbGluaywgc2VjdGlvbl9uYW1lIChlYmwsIHNoZHItPnNoX2xpbmspKTsKKworICAvLyBYWFggVE9ETyBBIGxvdCBtb3JlIHRlc3RzCisgIC8vIGNoZWNrIHZhbHVlIG9mIHRoZSBmaWVsZHMuICBsb2NhbCBzeW1ib2xzIG11c3QgaGF2ZSB6ZXJvIGVudHJpZXMuCisgIC8vIG5vbmxvY2FsIHN5bWJvbHMgcmVmZXIgdG8gdmFsaWQgdmVyc2lvbi4gIENoZWNrIHRoYXQgdmVyc2lvbiBpbmRleAorICAvLyBpbiBib3VuZC4KK30KKworCitzdGF0aWMgdm9pZAorY2hlY2tfc2VjdGlvbnMgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpCit7CisgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgR0VsZl9TaGRyICpzaGRyOworICBzaXplX3QgY250OworICBib29sIGRvdF9pbnRlcnBfc2VjdGlvbiA9IGZhbHNlOworCisgIGlmIChlaGRyLT5lX3Nob2ZmID09IDApCisgICAgLyogTm8gc2VjdGlvbiBoZWFkZXIuICAqLworICAgIHJldHVybjsKKworICAvKiBBbGxvY2F0ZSBhcnJheSB0byBjb3VudCByZWZlcmVuY2VzIGluIHNlY3Rpb24gZ3JvdXBzLiAgKi8KKyAgc2NucmVmID0gKGludCAqKSB4Y2FsbG9jIChzaG51bSwgc2l6ZW9mIChpbnQpKTsKKworICAvKiBDaGVjayB0aGUgemVyb3RoIHNlY3Rpb24gZmlyc3QuICBJdCBtdXN0IG5vdCBoYXZlIGFueSBjb250ZW50cworICAgICBhbmQgdGhlIHNlY3Rpb24gaGVhZGVyIG11c3QgY29udGFpbiBub256ZXJvIHZhbHVlIGF0IG1vc3QgaW4gdGhlCisgICAgIHNoX3NpemUgYW5kIHNoX2xpbmsgZmllbGRzLiAgKi8KKyAgc2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIDApLCAmc2hkcl9tZW0pOworICBpZiAoc2hkciA9PSBOVUxMKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiB6ZXJvdGggc2VjdGlvblxuIikpOworICBlbHNlCisgICAgeworICAgICAgaWYgKHNoZHItPnNoX25hbWUgIT0gMCkKKwlFUlJPUiAoZ2V0dGV4dCAoInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIG5hbWVcbiIpKTsKKyAgICAgIGlmIChzaGRyLT5zaF90eXBlICE9IDApCisJRVJST1IgKGdldHRleHQgKCJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyB0eXBlXG4iKSk7CisgICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgIT0gMCkKKwlFUlJPUiAoZ2V0dGV4dCAoInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGZsYWdzXG4iKSk7CisgICAgICBpZiAoc2hkci0+c2hfYWRkciAhPSAwKQorCUVSUk9SIChnZXR0ZXh0ICgiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWRkcmVzc1xuIikpOworICAgICAgaWYgKHNoZHItPnNoX29mZnNldCAhPSAwKQorCUVSUk9SIChnZXR0ZXh0ICgiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gb2Zmc2V0XG4iKSk7CisgICAgICBpZiAoc2hkci0+c2hfaW5mbyAhPSAwKQorCUVSUk9SIChnZXR0ZXh0ICgiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gaW5mbyBmaWVsZFxuIikpOworICAgICAgaWYgKHNoZHItPnNoX2FkZHJhbGlnbiAhPSAwKQorCUVSUk9SIChnZXR0ZXh0ICgiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWxpZ24gdmFsdWVcbiIpKTsKKyAgICAgIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IDApCisJRVJST1IgKGdldHRleHQgKCJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBlbnRyeSBzaXplIHZhbHVlXG4iKSk7CisKKyAgICAgIGlmIChzaGRyLT5zaF9zaXplICE9IDAgJiYgZWhkci0+ZV9zaG51bSAhPSAwKQorCUVSUk9SIChnZXR0ZXh0ICgiXAoremVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gc2l6ZSB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGhhcyBub256ZXJvIHNobnVtIHZhbHVlXG4iKSk7CisKKyAgICAgIGlmIChzaGRyLT5zaF9saW5rICE9IDAgJiYgZWhkci0+ZV9zaHN0cm5keCAhPSBTSE5fWElOREVYKQorCUVSUk9SIChnZXR0ZXh0ICgiXAoremVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbGluayB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGRvZXMgbm90IHNpZ25hbCBvdmVyZmxvdyBpbiBzaHN0cm5keFxuIikpOworICAgIH0KKworICBmb3IgKGNudCA9IDE7IGNudCA8IHNobnVtOyArK2NudCkKKyAgICB7CisgICAgICBFbGZfU2NuICpzY247CisKKyAgICAgIHNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBjbnQpOworICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwl7CisJICBFUlJPUiAoZ2V0dGV4dCAoIlwKK2Nhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gWyUyenVdICclcyc6ICVzXG4iKSwKKwkJIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCksIGVsZl9lcnJtc2cgKC0xKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGNvbnN0IGNoYXIgKnNjbm5hbWUgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpOworCisgICAgICBpZiAoc2NubmFtZSA9PSBOVUxMKQorCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJ6dV06IGludmFsaWQgbmFtZVxuIiksIGNudCk7CisgICAgICBlbHNlCisJeworCSAgLyogQ2hlY2sgd2hldGhlciBpdCBpcyBvbmUgb2YgdGhlIHNwZWNpYWwgc2VjdGlvbnMgZGVmaW5lZCBpbgorCSAgICAgdGhlIGdBQkkuICAqLworCSAgc2l6ZV90IHM7CisJICBmb3IgKHMgPSAwOyBzIDwgbnNwZWNpYWxfc2VjdGlvbnM7ICsrcykKKwkgICAgaWYgKHN0cm5jbXAgKHNjbm5hbWUsIHNwZWNpYWxfc2VjdGlvbnNbc10ubmFtZSwKKwkJCSBzcGVjaWFsX3NlY3Rpb25zW3NdLm5hbWVsZW4pID09IDApCisJICAgICAgeworCQljaGFyIHN0YnVmMVsxMDBdOworCQljaGFyIHN0YnVmMlsxMDBdOworCQljaGFyIHN0YnVmM1sxMDBdOworCisJCWlmIChzaGRyLT5zaF90eXBlICE9IHNwZWNpYWxfc2VjdGlvbnNbc10udHlwZQorCQkgICAgJiYgIShpc19kZWJ1Z2luZm8gJiYgc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTKSkKKwkJICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyZF0gJyVzJyBoYXMgd3JvbmcgdHlwZTogZXhwZWN0ZWQgJXMsIGlzICVzXG4iKSwKKwkJCSAoaW50KSBjbnQsIHNjbm5hbWUsCisJCQkgZWJsX3NlY3Rpb25fdHlwZV9uYW1lIChlYmwsIHNwZWNpYWxfc2VjdGlvbnNbc10udHlwZSwKKwkJCQkJCXN0YnVmMSwgc2l6ZW9mIChzdGJ1ZjEpKSwKKwkJCSBlYmxfc2VjdGlvbl90eXBlX25hbWUgKGVibCwgc2hkci0+c2hfdHlwZSwKKwkJCQkJCXN0YnVmMiwgc2l6ZW9mIChzdGJ1ZjIpKSk7CisKKwkJaWYgKHNwZWNpYWxfc2VjdGlvbnNbc10uYXR0cmZsYWcgPT0gZXhhY3QpCisJCSAgeworCQkgICAgLyogRXhjZXB0IGZvciB0aGUgbGluayBvcmRlciBhbmQgZ3JvdXAgYml0IGFsbCB0aGUKKwkJICAgICAgIG90aGVyIGJpdHMgc2hvdWxkIG1hdGNoIGV4YWN0bHkuICAqLworCQkgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIH4oU0hGX0xJTktfT1JERVIgfCBTSEZfR1JPVVApKQorCQkJIT0gc3BlY2lhbF9zZWN0aW9uc1tzXS5hdHRyKQorCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcycgaGFzIHdyb25nIGZsYWdzOiBleHBlY3RlZCAlcywgaXMgJXNcbiIpLAorCQkJICAgICBjbnQsIHNjbm5hbWUsCisJCQkgICAgIHNlY3Rpb25fZmxhZ3Nfc3RyaW5nIChzcGVjaWFsX3NlY3Rpb25zW3NdLmF0dHIsCisJCQkJCQkgICBzdGJ1ZjEsIHNpemVvZiAoc3RidWYxKSksCisJCQkgICAgIHNlY3Rpb25fZmxhZ3Nfc3RyaW5nIChzaGRyLT5zaF9mbGFncworCQkJCQkJICAgJiB+U0hGX0xJTktfT1JERVIsCisJCQkJCQkgICBzdGJ1ZjIsIHNpemVvZiAoc3RidWYyKSkpOworCQkgIH0KKwkJZWxzZSBpZiAoc3BlY2lhbF9zZWN0aW9uc1tzXS5hdHRyZmxhZyA9PSBhdGxlYXN0KQorCQkgIHsKKwkJICAgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBzcGVjaWFsX3NlY3Rpb25zW3NdLmF0dHIpCisJCQkhPSBzcGVjaWFsX3NlY3Rpb25zW3NdLmF0dHIKKwkJCXx8ICgoc2hkci0+c2hfZmxhZ3MgJiB+KFNIRl9MSU5LX09SREVSIHwgU0hGX0dST1VQCisJCQkJCQl8IHNwZWNpYWxfc2VjdGlvbnNbc10uYXR0cgorCQkJCQkJfCBzcGVjaWFsX3NlY3Rpb25zW3NdLmF0dHIyKSkKKwkJCSAgICAhPSAwKSkKKwkJICAgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB3cm9uZyBmbGFnczogZXhwZWN0ZWQgJXMgYW5kIHBvc3NpYmx5ICVzLCBpcyAlc1xuIiksCisJCQkgICAgIGNudCwgc2NubmFtZSwKKwkJCSAgICAgc2VjdGlvbl9mbGFnc19zdHJpbmcgKHNwZWNpYWxfc2VjdGlvbnNbc10uYXR0ciwKKwkJCQkJCSAgIHN0YnVmMSwgc2l6ZW9mIChzdGJ1ZjEpKSwKKwkJCSAgICAgc2VjdGlvbl9mbGFnc19zdHJpbmcgKHNwZWNpYWxfc2VjdGlvbnNbc10uYXR0cjIsCisJCQkJCQkgICBzdGJ1ZjIsIHNpemVvZiAoc3RidWYyKSksCisJCQkgICAgIHNlY3Rpb25fZmxhZ3Nfc3RyaW5nIChzaGRyLT5zaF9mbGFncworCQkJCQkJICAgJiB+KFNIRl9MSU5LX09SREVSCisJCQkJCQkgICAgICAgfCBTSEZfR1JPVVApLAorCQkJCQkJICAgc3RidWYzLCBzaXplb2YgKHN0YnVmMykpKTsKKwkJICB9CisKKwkJaWYgKHN0cmNtcCAoc2NubmFtZSwgIi5pbnRlcnAiKSA9PSAwKQorCQkgIHsKKwkJICAgIGRvdF9pbnRlcnBfc2VjdGlvbiA9IHRydWU7CisKKwkJICAgIGlmIChlaGRyLT5lX3R5cGUgPT0gRVRfUkVMKQorCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcycgcHJlc2VudCBpbiBvYmplY3QgZmlsZVxuIiksCisJCQkgICAgIGNudCwgc2NubmFtZSk7CisKKwkJICAgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDAKKwkJCSYmICFoYXNfbG9hZGFibGVfc2VnbWVudCkKKwkJICAgICAgRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBTSEZfQUxMT0MgZmxhZyBzZXQgYnV0IHRoZXJlIGlzIG5vIGxvYWRhYmxlIHNlZ21lbnRcbiIpLAorCQkJICAgICBjbnQsIHNjbm5hbWUpOworCQkgICAgZWxzZSBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSA9PSAwCisJCQkgICAgICYmIGhhc19sb2FkYWJsZV9zZWdtZW50KQorCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcycgaGFzIFNIRl9BTExPQyBmbGFnIG5vdCBzZXQgYnV0IHRoZXJlIGFyZSBsb2FkYWJsZSBzZWdtZW50c1xuIiksCisJCQkgICAgIGNudCwgc2NubmFtZSk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgaWYgKHN0cmNtcCAoc2NubmFtZSwgIi5zeW10YWJfc2huZHgiKSA9PSAwCisJCQkmJiBlaGRyLT5lX3R5cGUgIT0gRVRfUkVMKQorCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcycgaXMgZXh0ZW5zaW9uIHNlY3Rpb24gaW5kZXggdGFibGUgaW4gbm9uLW9iamVjdCBmaWxlXG4iKSwKKwkJCSAgICAgY250LCBzY25uYW1lKTsKKworCQkgICAgLyogVGhlc2Ugc2VjdGlvbnMgbXVzdCBoYXZlIHRoZSBTSEZfQUxMT0MgZmxhZyBzZXQgaWZmCisJCSAgICAgICBhIGxvYWRhYmxlIHNlZ21lbnQgaXMgYXZhaWxhYmxlLgorCisJCSAgICAgICAucmVseHh4CisJCSAgICAgICAuc3RydGFiCisJCSAgICAgICAuc3ltdGFiCisJCSAgICAgICAuc3ltdGFiX3NobmR4CisKKwkJICAgICAgIENoZWNrIHRoYXQgaWYgdGhlcmUgaXMgYSByZWZlcmVuY2UgZnJvbSB0aGUKKwkJICAgICAgIGxvYWRlZCBzZWN0aW9uIHRoZXNlIHNlY3Rpb25zIGFsc28gaGF2ZSB0aGUKKwkJICAgICAgIEFMTE9DIGZsYWcgc2V0LiAgKi8KKyNpZiAwCisJCSAgICAvLyBYWFggVE9ETworCQkgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMAorCQkJJiYgIWhhc19sb2FkYWJsZV9zZWdtZW50KQorCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcycgaGFzIFNIRl9BTExPQyBmbGFnIHNldCBidXQgdGhlcmUgaXMgbm8gbG9hZGFibGUgc2VnbWVudFxuIiksCisJCQkgICAgIGNudCwgc2NubmFtZSk7CisJCSAgICBlbHNlIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpID09IDAKKwkJCSAgICAgJiYgaGFzX2xvYWRhYmxlX3NlZ21lbnQpCisJCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgbm90IHNldCBidXQgdGhlcmUgYXJlIGxvYWRhYmxlIHNlZ21lbnRzXG4iKSwKKwkJCSAgICAgY250LCBzY25uYW1lKTsKKyNlbmRpZgorCQkgIH0KKworCQlicmVhazsKKwkgICAgICB9CisJfQorCisgICAgICBpZiAoc2hkci0+c2hfZW50c2l6ZSAhPSAwICYmIHNoZHItPnNoX3NpemUgJSBzaGRyLT5zaF9lbnRzaXplKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJ6dV0gJyVzJzogc2l6ZSBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZVxuIiksCisJICAgICAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCkpOworCisgICAgICBpZiAoZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSA9PSBOVUxMKQorCUVSUk9SIChnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlclxuIikpOworCisgICAgICBpZiAoc2hkci0+c2hfdHlwZSA+PSBTSFRfTlVNCisJICAmJiBzaGRyLT5zaF90eXBlICE9IFNIVF9HTlVfTElCTElTVAorCSAgJiYgc2hkci0+c2hfdHlwZSAhPSBTSFRfQ0hFQ0tTVU0KKwkgICYmIHNoZHItPnNoX3R5cGUgIT0gU0hUX0dOVV92ZXJkZWYKKwkgICYmIHNoZHItPnNoX3R5cGUgIT0gU0hUX0dOVV92ZXJuZWVkCisJICAmJiBzaGRyLT5zaF90eXBlICE9IFNIVF9HTlVfdmVyc3ltKQorCUVSUk9SIChnZXR0ZXh0ICgidW5zdXBwb3J0ZWQgc2VjdGlvbiB0eXBlICVkXG4iKSwgKGludCkgc2hkci0+c2hfdHlwZSk7CisKKyNkZWZpbmUgQUxMX1NIX0ZMQUdTIChTSEZfV1JJVEUgfCBTSEZfQUxMT0MgfCBTSEZfRVhFQ0lOU1RSIHwgU0hGX01FUkdFIFwKKwkJICAgICAgfCBTSEZfU1RSSU5HUyB8IFNIRl9JTkZPX0xJTksgfCBTSEZfTElOS19PUkRFUiBcCisJCSAgICAgIHwgU0hGX09TX05PTkNPTkZPUk1JTkcgfCBTSEZfR1JPVVAgfCBTSEZfVExTKQorICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgfkFMTF9TSF9GTEFHUykKKwlFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbiB1bmtub3duIGZsYWcocykgJWRcbiIpLAorCSAgICAgICBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpLAorCSAgICAgICAoaW50KSBzaGRyLT5zaF9mbGFncyAmIH5BTExfU0hfRkxBR1MpOworICAgICAgZWxzZSBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfVExTKQorCXsKKwkgIC8vIFhYWCBDb3JyZWN0PworCSAgaWYgKHNoZHItPnNoX2FkZHIgIT0gMCAmJiAhZ251bGQpCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJ6dV0gJyVzJzogdGhyZWFkLWxvY2FsIGRhdGEgc2VjdGlvbnMgYWRkcmVzcyBub3QgemVyb1xuIiksCisJCSAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCkpOworCisJICAvLyBYWFggVE9ETyBtb3JlIHRlc3RzIT8KKwl9CisKKyAgICAgIGlmIChzaGRyLT5zaF9saW5rID49IHNobnVtKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJ6dV0gJyVzJzogaW52YWxpZCBzZWN0aW9uIHJlZmVyZW5jZSBpbiBsaW5rIHZhbHVlXG4iKSwKKwkgICAgICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7CisKKyAgICAgIGlmIChTSF9JTkZPX0xJTktfUCAoc2hkcikgJiYgc2hkci0+c2hfaW5mbyA+PSBzaG51bSkKKwlFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcyc6IGludmFsaWQgc2VjdGlvbiByZWZlcmVuY2UgaW4gaW5mbyB2YWx1ZVxuIiksCisJICAgICAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCkpOworCisgICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX01FUkdFKSA9PSAwCisJICAmJiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfU1RSSU5HUykgIT0gMAorCSAgJiYgYmVfc3RyaWN0KQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJ6dV0gJyVzJzogc3RyaW5ncyBmbGFnIHNldCB3aXRob3V0IG1lcmdlIGZsYWdcbiIpLAorCSAgICAgICBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpKTsKKworICAgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9NRVJHRSkgIT0gMCAmJiBzaGRyLT5zaF9lbnRzaXplID09IDApCisJRVJST1IgKGdldHRleHQgKCJcCitzZWN0aW9uIFslMnp1XSAnJXMnOiBtZXJnZSBmbGFnIHNldCBidXQgZW50cnkgc2l6ZSBpcyB6ZXJvXG4iKSwKKwkgICAgICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7CisKKyAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9HUk9VUCkKKwljaGVja19zY25fZ3JvdXAgKGVibCwgY250KTsKKworICAgICAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwgJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQorCXsKKwkgIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiBpcyBjb250YWluZWQgaW4gYSBsb2FkZWQgc2VnbWVudAorCSAgICAgYW5kIHRoYXQgdGhlIGluaXRpYWxpemF0aW9uIHBhcnQgbWF0Y2hlcyBOT0JJVFMgc2VjdGlvbnMuICAqLworCSAgaW50IHBjbnQ7CisJICBHRWxmX1BoZHIgcGhkcl9tZW07CisJICBHRWxmX1BoZHIgKnBoZHI7CisKKwkgIGZvciAocGNudCA9IDA7IHBjbnQgPCBlaGRyLT5lX3BobnVtOyArK3BjbnQpCisJICAgIGlmICgocGhkciA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIHBjbnQsICZwaGRyX21lbSkpICE9IE5VTEwKKwkJJiYgKChwaGRyLT5wX3R5cGUgPT0gUFRfTE9BRAorCQkgICAgICYmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9UTFMpID09IDApCisJCSAgICB8fCAocGhkci0+cF90eXBlID09IFBUX1RMUworCQkJJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX1RMUykgIT0gMCkpCisJCSYmIHBoZHItPnBfb2Zmc2V0IDw9IHNoZHItPnNoX29mZnNldAorCQkmJiBwaGRyLT5wX29mZnNldCArIHBoZHItPnBfbWVtc3ogPiBzaGRyLT5zaF9vZmZzZXQpCisJICAgICAgeworCQkvKiBGb3VuZCB0aGUgc2VnbWVudC4gICovCisJCWlmIChwaGRyLT5wX29mZnNldCArIHBoZHItPnBfbWVtc3oKKwkJICAgIDwgc2hkci0+c2hfb2Zmc2V0ICsgc2hkci0+c2hfc2l6ZSkKKwkJICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcycgbm90IGZ1bGx5IGNvbnRhaW5lZCBpbiBzZWdtZW50IG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICVkXG4iKSwKKwkJCSBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpLCBwY250KTsKKworCQlpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTKQorCQkgIHsKKwkJICAgIGlmIChzaGRyLT5zaF9vZmZzZXQgPCBwaGRyLT5wX29mZnNldCArIHBoZHItPnBfZmlsZXN6CisJCQkmJiAhaXNfZGVidWdpbmZvKQorCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIiksCisJCQkgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSwgcGNudCk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgaWYgKHNoZHItPnNoX29mZnNldCA+PSBwaGRyLT5wX29mZnNldCArIHBoZHItPnBfZmlsZXN6KQorCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcycgaGFzIG5vdCB0eXBlIE5PQklUUyBidXQgaXMgbm90IHJlYWQgZnJvbSB0aGUgZmlsZSBpbiBzZWdtZW50IG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICVkXG4iKSwKKwkJCSBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpLCBwY250KTsKKwkJICB9CisKKwkJYnJlYWs7CisJICAgICAgfQorCisJICBpZiAocGNudCA9PSBlaGRyLT5lX3BobnVtKQorCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3NlY3Rpb24gWyUyenVdICclcyc6IGFsbG9jIGZsYWcgc2V0IGJ1dCBzZWN0aW9uIG5vdCBpbiBhbnkgbG9hZGVkIHNlZ21lbnRcbiIpLAorCQkgICBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpKTsKKwl9CisKKyAgICAgIGlmIChjbnQgPT0gc2hzdHJuZHggJiYgc2hkci0+c2hfdHlwZSAhPSBTSFRfU1RSVEFCKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorc2VjdGlvbiBbJTJ6dV0gJyVzJzogRUxGIGhlYWRlciBzYXlzIHRoaXMgaXMgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBidXQgdHlwZSBpcyBub3QgU0hUX1RZUEVcbiIpLAorCSAgICAgICBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpKTsKKworICAgICAgc3dpdGNoIChzaGRyLT5zaF90eXBlKQorCXsKKwljYXNlIFNIVF9TWU1UQUI6CisJY2FzZSBTSFRfRFlOU1lNOgorCSAgY2hlY2tfc3ltdGFiIChlYmwsIGVoZHIsIGNudCk7CisJICBicmVhazsKKworCWNhc2UgU0hUX1JFTEE6CisJICBjaGVja19yZWxhIChlYmwsIGVoZHIsIGNudCk7CisJICBicmVhazsKKworCWNhc2UgU0hUX1JFTDoKKwkgIGNoZWNrX3JlbCAoZWJsLCBlaGRyLCBjbnQpOworCSAgYnJlYWs7CisKKwljYXNlIFNIVF9EWU5BTUlDOgorCSAgY2hlY2tfZHluYW1pYyAoZWJsLCBjbnQpOworCSAgYnJlYWs7CisKKwljYXNlIFNIVF9TWU1UQUJfU0hORFg6CisJICBjaGVja19zeW10YWJfc2huZHggKGVibCwgY250KTsKKwkgIGJyZWFrOworCisJY2FzZSBTSFRfSEFTSDoKKwkgIGNoZWNrX2hhc2ggKGVibCwgY250KTsKKwkgIGJyZWFrOworCisJY2FzZSBTSFRfTlVMTDoKKwkgIGNoZWNrX251bGwgKGVibCwgc2hkciwgY250KTsKKwkgIGJyZWFrOworCisJY2FzZSBTSFRfR1JPVVA6CisJICBjaGVja19ncm91cCAoZWJsLCBlaGRyLCBzaGRyLCBjbnQpOworCSAgYnJlYWs7CisKKwljYXNlIFNIVF9HTlVfdmVyc3ltOgorCSAgY2hlY2tfdmVyc3ltIChlYmwsIHNoZHIsIGNudCk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICAvKiBOb3RoaW5nLiAgKi8KKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGhhc19pbnRlcnBfc2VnbWVudCAmJiAhZG90X2ludGVycF9zZWN0aW9uKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiSU5URVJQIHByb2dyYW0gaGVhZGVyIGVudHJ5IGJ1dCBubyAuaW50ZXJwIHNlY3Rpb25cbiIpKTsKKworICBmcmVlIChzY25yZWYpOworfQorCisKK3N0YXRpYyB2b2lkCitjaGVja19ub3RlIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBHRWxmX1BoZHIgKnBoZHIsIGludCBjbnQpCit7CisgIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfQ09SRSAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfUkVMCisgICAgICAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOKQorICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorcGhkclslZF06IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iKSwKKwkgICBjbnQpOworCisgIGlmIChpc19kZWJ1Z2luZm8pCisgICAgLyogVGhlIHBfb2Zmc2V0IHZhbHVlcyBpbiBhIHNlcGFyYXRlIGRlYnVnIGZpbGUgYXJlIGJvZ3VzLiAgKi8KKyAgICByZXR1cm47CisKKyAgY2hhciAqbm90ZW1lbSA9IGdlbGZfcmF3Y2h1bmsgKGVibC0+ZWxmLCBwaGRyLT5wX29mZnNldCwgcGhkci0+cF9maWxlc3opOworCisgIC8qIEVMRjY0IGZpbGVzIG9mdGVuIHVzZSBub3RlIHNlY3Rpb24gZW50cmllcyBpbiB0aGUgMzItYml0IGZvcm1hdC4KKyAgICAgVGhlIHBfYWxpZ24gZmllbGQgaXMgc2V0IHRvIDggaW4gY2FzZSB0aGUgNjQtYml0IGZvcm1hdCBpcyB1c2VkLgorICAgICBJbiBjYXNlIHRoZSBwX2FsaWduIHZhbHVlIGlzIDAgb3IgNCB0aGUgMzItYml0IGZvcm1hdCBpcworICAgICB1c2VkLiAgKi8KKyAgR0VsZl9Yd29yZCBhbGlnbiA9IHBoZHItPnBfYWxpZ24gPT0gMCB8fCBwaGRyLT5wX2FsaWduID09IDQgPyA0IDogODsKKyNkZWZpbmUgQUxJR05FRF9MRU4obGVuKSAoKChsZW4pICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKSkKKworICBHRWxmX1h3b3JkIGlkeCA9IDA7CisgIHdoaWxlIChpZHggPCBwaGRyLT5wX2ZpbGVzeikKKyAgICB7CisgICAgICB1aW50NjRfdCBuYW1lc3o7CisgICAgICB1aW50NjRfdCBkZXNjc3o7CisgICAgICB1aW50NjRfdCB0eXBlOworICAgICAgdWludDMyX3QgbmFtZXN6MzI7CisgICAgICB1aW50MzJfdCBkZXNjc3ozMjsKKworICAgICAgaWYgKGFsaWduID09IDQpCisJeworCSAgdWludDMyX3QgKnB0ciA9ICh1aW50MzJfdCAqKSAobm90ZW1lbSArIGlkeCk7CisKKwkgIGlmICgoX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCSAgICAgICAmJiBlaGRyLT5lX2lkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTVNCKQorCSAgICAgIHx8IChfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJCSAgJiYgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQikpCisJICAgIHsKKwkgICAgICBuYW1lc3ozMiA9IG5hbWVzeiA9IGJzd2FwXzMyICgqcHRyKTsKKwkgICAgICArK3B0cjsKKwkgICAgICBkZXNjc3ozMiA9IGRlc2NzeiA9IGJzd2FwXzMyICgqcHRyKTsKKwkgICAgICArK3B0cjsKKwkgICAgICB0eXBlID0gYnN3YXBfMzIgKCpwdHIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBuYW1lc3ozMiA9IG5hbWVzeiA9ICpwdHIrKzsKKwkgICAgICBkZXNjc3ozMiA9IGRlc2NzeiA9ICpwdHIrKzsKKwkgICAgICB0eXBlID0gKnB0cjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICB1aW50NjRfdCAqcHRyID0gKHVpbnQ2NF90ICopIChub3RlbWVtICsgaWR4KTsKKwkgIHVpbnQzMl90ICpwdHIzMiA9ICh1aW50MzJfdCAqKSAobm90ZW1lbSArIGlkeCk7CisKKwkgIGlmICgoX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCSAgICAgICAmJiBlaGRyLT5lX2lkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTVNCKQorCSAgICAgIHx8IChfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJCSAgJiYgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQikpCisJICAgIHsKKwkgICAgICBuYW1lc3ogPSBic3dhcF82NCAoKnB0cik7CisJICAgICAgKytwdHI7CisJICAgICAgZGVzY3N6ID0gYnN3YXBfNjQgKCpwdHIpOworCSAgICAgICsrcHRyOworCSAgICAgIHR5cGUgPSBic3dhcF82NCAoKnB0cik7CisKKwkgICAgICBuYW1lc3ozMiA9IGJzd2FwXzMyICgqcHRyMzIpOworCSAgICAgICsrcHRyMzI7CisJICAgICAgZGVzY3N6MzIgPSBic3dhcF8zMiAoKnB0cjMyKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbmFtZXN6ID0gKnB0cisrOworCSAgICAgIGRlc2NzeiA9ICpwdHIrKzsKKwkgICAgICB0eXBlID0gKnB0cjsKKworCSAgICAgIG5hbWVzejMyID0gKnB0cjMyKys7CisJICAgICAgZGVzY3N6MzIgPSAqcHRyMzI7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChpZHggKyAzICogYWxpZ24gPiBwaGRyLT5wX2ZpbGVzegorCSAgfHwgKGlkeCArIDMgKiBhbGlnbiArIEFMSUdORURfTEVOIChuYW1lc3opICsgQUxJR05FRF9MRU4gKGRlc2NzeikKKwkgICAgICA+IHBoZHItPnBfZmlsZXN6KSkKKwl7CisJICBpZiAoZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NAorCSAgICAgICYmIGlkeCArIDMgKiA0IDw9IHBoZHItPnBfZmlsZXN6CisJICAgICAgJiYgKGlkeCArIDMgKiA0ICsgQUxJR05FRF9MRU4gKG5hbWVzejMyKSArIEFMSUdORURfTEVOIChkZXNjc3ozMikKKwkJICA8PSBwaGRyLT5wX2ZpbGVzeikpCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorcGhkclslZF06IG5vdGUgZW50cmllcyBwcm9iYWJseSBpbiBmb3JtIG9mIGEgMzItYml0IEVMRiBmaWxlXG4iKSwgY250KTsKKwkgIGVsc2UKKwkgICAgRVJST1IgKGdldHRleHQgKCJwaGRyWyVkXTogZXh0cmEgJXp1IGJ5dGVzIGFmdGVyIGxhc3Qgbm90ZVxuIiksCisJCSAgIGNudCwgKHNpemVfdCkgKHBoZHItPnBfZmlsZXN6IC0gaWR4KSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIE1ha2Ugc3VyZSBpdCBpcyBvbmUgb2YgdGhlIG5vdGUgdHlwZXMgd2Uga25vdyBhYm91dC4gICovCisgICAgICBpZiAoZWhkci0+ZV90eXBlID09IEVUX0NPUkUpCisJeworCSAgc3dpdGNoICh0eXBlKQorCSAgICB7CisJICAgIGNhc2UgTlRfUFJTVEFUVVM6CisJICAgIGNhc2UgTlRfRlBSRUdTRVQ6CisJICAgIGNhc2UgTlRfUFJQU0lORk86CisJICAgIGNhc2UgTlRfVEFTS1NUUlVDVDoJCS8qIE5UX1BSWFJFRyBvbiBTb2xhcmlzLiAgKi8KKwkgICAgY2FzZSBOVF9QTEFURk9STToKKwkgICAgY2FzZSBOVF9BVVhWOgorCSAgICBjYXNlIE5UX0dXSU5ET1dTOgorCSAgICBjYXNlIE5UX0FTUlM6CisJICAgIGNhc2UgTlRfUFNUQVRVUzoKKwkgICAgY2FzZSBOVF9QU0lORk86CisJICAgIGNhc2UgTlRfUFJDUkVEOgorCSAgICBjYXNlIE5UX1VUU05BTUU6CisJICAgIGNhc2UgTlRfTFdQU1RBVFVTOgorCSAgICBjYXNlIE5UX0xXUFNJTkZPOgorCSAgICBjYXNlIE5UX1BSRlBYUkVHOgorCSAgICAgIC8qIEtub3duIHR5cGUuICAqLworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgRVJST1IgKGdldHRleHQgKCJcCitwaGRyWyVkXTogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICUiIFBSSXU2NCAiIGF0IG9mZnNldCAlIiBQUkl1NjQgIlxuIiksCisJCSAgICAgY250LCB0eXBlLCBpZHgpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICh0eXBlICE9IE5UX1ZFUlNJT04pCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorcGhkclslZF06IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICUiIFBSSXU2NCAiIGF0IG9mZnNldCAlIiBQUkl1NjQgIlxuIiksCisJCSAgIGNudCwgdHlwZSwgaWR4KTsKKwl9CisKKyAgICAgIC8qIE1vdmUgdG8gdGhlIG5leHQgZW50cnkuICAqLworICAgICAgaWR4ICs9IDMgKiBhbGlnbiArIEFMSUdORURfTEVOIChuYW1lc3opICsgQUxJR05FRF9MRU4gKGRlc2Nzeik7CisKKyAgICB9CisKKyAgZ2VsZl9mcmVlY2h1bmsgKGVibC0+ZWxmLCBub3RlbWVtKTsKK30KKworCitzdGF0aWMgdm9pZAorY2hlY2tfcHJvZ3JhbV9oZWFkZXIgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpCit7CisgIGlmIChlaGRyLT5lX3Bob2ZmID09IDApCisgICAgcmV0dXJuOworCisgIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOCisgICAgICAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfQ09SRSkKKyAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK29ubHkgZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyBjYW4gaGF2ZSBwcm9ncmFtIGhlYWRlcnNcbiIpKTsKKworICBpbnQgbnVtX3B0X2ludGVycCA9IDA7CisgIGludCBudW1fcHRfdGxzID0gMDsKKyAgaW50IG51bV9wdF9yZWxybyA9IDA7CisKKyAgZm9yIChpbnQgY250ID0gMDsgY250IDwgZWhkci0+ZV9waG51bTsgKytjbnQpCisgICAgeworICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOworICAgICAgR0VsZl9QaGRyICpwaGRyOworCisgICAgICBwaGRyID0gZ2VsZl9nZXRwaGRyIChlYmwtPmVsZiwgY250LCAmcGhkcl9tZW0pOworICAgICAgaWYgKHBoZHIgPT0gTlVMTCkKKwl7CisJICBFUlJPUiAoZ2V0dGV4dCAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6ICVzXG4iKSwKKwkJIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHBoZHItPnBfdHlwZSA+PSBQVF9OVU0gJiYgcGhkci0+cF90eXBlICE9IFBUX0dOVV9FSF9GUkFNRQorCSAgJiYgcGhkci0+cF90eXBlICE9IFBUX0dOVV9TVEFDSyAmJiBwaGRyLT5wX3R5cGUgIT0gUFRfR05VX1JFTFJPKQorCUVSUk9SIChnZXR0ZXh0ICgiXAorcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IHVua25vd24gcHJvZ3JhbSBoZWFkZXIgZW50cnkgdHlwZVxuIiksCisJICAgICAgIGNudCk7CisKKyAgICAgIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfTE9BRCkKKwloYXNfbG9hZGFibGVfc2VnbWVudCA9IHRydWU7CisgICAgICBlbHNlIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfSU5URVJQKQorCXsKKwkgIGlmICgrK251bV9wdF9pbnRlcnAgIT0gMSkKKwkgICAgeworCSAgICAgIGlmIChudW1fcHRfaW50ZXJwID09IDIpCisJCUVSUk9SIChnZXR0ZXh0ICgiXAorbW9yZSB0aGFuIG9uZSBJTlRFUlAgZW50cnkgaW4gcHJvZ3JhbSBoZWFkZXJcbiIpKTsKKwkgICAgfQorCSAgaGFzX2ludGVycF9zZWdtZW50ID0gdHJ1ZTsKKwl9CisgICAgICBlbHNlIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfVExTKQorCXsKKwkgIGlmICgrK251bV9wdF90bHMgPT0gMikKKwkgICAgRVJST1IgKGdldHRleHQgKCJtb3JlIHRoYW4gb25lIFRMUyBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIikpOworCX0KKyAgICAgIGVsc2UgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9OT1RFKQorCWNoZWNrX25vdGUgKGVibCwgZWhkciwgcGhkciwgY250KTsKKyAgICAgIGVsc2UgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9EWU5BTUlDCisJICAgICAgICYmIGVoZHItPmVfdHlwZSA9PSBFVF9FWEVDICYmICEgaGFzX2ludGVycF9zZWdtZW50KQorCUVSUk9SIChnZXR0ZXh0ICgic3RhdGljIGV4ZWN1dGFibGUgY2Fubm90IGhhdmUgZHluYW1pYyBzZWN0aW9uc1xuIikpOworICAgICAgZWxzZSBpZiAocGhkci0+cF90eXBlID09IFBUX0dOVV9SRUxSTykKKwl7CisJICBpZiAoKytudW1fcHRfcmVscm8gPT0gMikKKwkgICAgRVJST1IgKGdldHRleHQgKCJcCittb3JlIHRoYW4gb25lIEdOVV9SRUxSTyBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIikpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgcmVnaW9uIGlzIGluIGEgd3JpdGFibGUgc2VnbWVudC4gICovCisJICAgICAgaW50IGlubmVyOworCSAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IGVoZHItPmVfcGhudW07ICsraW5uZXIpCisJCXsKKwkJICBHRWxmX1BoZHIgcGhkcjJfbWVtOworCQkgIEdFbGZfUGhkciAqcGhkcjI7CisKKwkJICBwaGRyMiA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIGlubmVyLCAmcGhkcjJfbWVtKTsKKwkJICBpZiAocGhkcjIgPT0gTlVMTCkKKwkJICAgIGNvbnRpbnVlOworCisJCSAgaWYgKHBoZHIyLT5wX3R5cGUgPT0gUFRfTE9BRAorCQkgICAgICAmJiBwaGRyLT5wX3ZhZGRyID49IHBoZHIyLT5wX3ZhZGRyCisJCSAgICAgICYmIChwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zegorCQkJICA8PSBwaGRyMi0+cF92YWRkciArIHBoZHIyLT5wX21lbXN6KSkKKwkJICAgIHsKKwkJICAgICAgaWYgKChwaGRyMi0+cF9mbGFncyAmIFBGX1cpID09IDApCisJCQlFUlJPUiAoZ2V0dGV4dCAoIlwKK2xvYWRhYmxlIHNlZ21lbnQgR05VX1JFTFJPIGFwcGxpZXMgdG8gaXMgbm90IHdyaXRhYmxlXG4iKSk7CisJCSAgICAgIGlmICgocGhkcjItPnBfZmxhZ3MgJiBQRl9YKSAhPSAwKQorCQkJRVJST1IgKGdldHRleHQgKCJcCitsb2FkYWJsZSBzZWdtZW50IEdOVV9SRUxSTyBhcHBsaWVzIHRvIGlzIGV4ZWN1dGFibGVcbiIpKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKworCSAgICAgIGlmIChpbm5lciA+PSBlaGRyLT5lX3BobnVtKQorCQlFUlJPUiAoZ2V0dGV4dCAoIlwKK0dOVV9SRUxSTyBzZWdtZW50IG5vdCBjb250YWluZWQgaW4gYSBsb2FkZWQgc2VnbWVudFxuIikpOworCSAgICB9CisJfQorCisgICAgICBpZiAocGhkci0+cF9maWxlc3ogPiBwaGRyLT5wX21lbXN6KQorCUVSUk9SIChnZXR0ZXh0ICgiXAorcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IGZpbGUgc2l6ZSBncmVhdGVyIHRoYW4gbWVtb3J5IHNpemVcbiIpLAorCSAgICAgICBjbnQpOworCisgICAgICBpZiAocGhkci0+cF9hbGlnbiA+IDEpCisJeworCSAgaWYgKCFwb3dlcm9mMiAocGhkci0+cF9hbGlnbikpCisJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAorcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyXG4iKSwgY250KTsKKwkgIGVsc2UgaWYgKChwaGRyLT5wX3ZhZGRyIC0gcGhkci0+cF9vZmZzZXQpICUgcGhkci0+cF9hbGlnbiAhPSAwKQorCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKK3Byb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIG9mZnNldCBhbmQgdmlydHVhbCBhZGRyZXNzIG5vdCBtb2R1bGUgb2YgYWxpZ25tZW50XG4iKSwgY250KTsKKwl9CisgICAgfQorfQorCisKKy8qIFByb2Nlc3Mgb25lIGZpbGUuICAqLworc3RhdGljIHZvaWQKK3Byb2Nlc3NfZWxmX2ZpbGUgKEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCwKKwkJICBjb25zdCBjaGFyICpmbmFtZSwgc2l6ZV90IHNpemUsIGJvb2wgb25seV9vbmUpCit7CisgIC8qIFJlc2V0IHZhcmlhYmxlcy4gICovCisgIG5keW5hbWljID0gMDsKKworICBHRWxmX0VoZHIgZWhkcl9tZW07CisgIEdFbGZfRWhkciAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOworICBFYmwgKmVibDsKKworICAvKiBQcmludCB0aGUgZmlsZSBuYW1lLiAgKi8KKyAgaWYgKCFvbmx5X29uZSkKKyAgICB7CisgICAgICBpZiAocHJlZml4ICE9IE5VTEwpCisJcHJpbnRmICgiXG4lcyglcyklczpcbiIsIHByZWZpeCwgZm5hbWUsIHN1ZmZpeCk7CisgICAgICBlbHNlCisJcHJpbnRmICgiXG4lczpcbiIsIGZuYW1lKTsKKyAgICB9CisKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBFUlJPUiAoZ2V0dGV4dCAoImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzXG4iKSwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZWJsID0gZWJsX29wZW5iYWNrZW5kIChlbGYpOworICAvKiBJZiB0aGVyZSBpcyBubyBhcHByb3ByaWF0ZSBiYWNrZW5kIGxpYnJhcnkgd2UgY2Fubm90IHRlc3QKKyAgICAgYXJjaGl0ZWN0dXJlIGFuZCBPUyBzcGVjaWZpYyBmZWF0dXJlcy4gIEFueSBlbmNvdW50ZXJlZCBleHRlbnNpb24KKyAgICAgaXMgYW4gZXJyb3IuICAqLworCisgIC8qIEdvIHN0cmFpZ2h0IGJ5IHRoZSBnQUJJLCBjaGVjayBhbGwgdGhlIHBhcnRzIGluIHR1cm4uICAqLworICBjaGVja19lbGZfaGVhZGVyIChlYmwsIGVoZHIsIHNpemUpOworCisgIC8qIENoZWNrIHRoZSBwcm9ncmFtIGhlYWRlci4gICovCisgIGNoZWNrX3Byb2dyYW1faGVhZGVyIChlYmwsIGVoZHIpOworCisgIC8qIE5leHQgdGhlIHNlY3Rpb24gaGVhZGVycy4gIEl0IGlzIE9LIGlmIHRoZXJlIGFyZSBubyBzZWN0aW9uCisgICAgIGhlYWRlcnMgYXQgYWxsLiAgKi8KKyAgY2hlY2tfc2VjdGlvbnMgKGVibCwgZWhkcik7CisKKyAgLyogRnJlZSB0aGUgcmVzb3VyY2VzLiAgKi8KKyAgZWJsX2Nsb3NlYmFja2VuZCAoZWJsKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9maW5kdGV4dHJlbC5jIGIvc3JjL2ZpbmR0ZXh0cmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyZmU5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9maW5kdGV4dHJlbC5jCkBAIC0wLDAgKzEsNTk2IEBACisvKiBMb2NhdGUgc291cmNlIGZpbGVzIG9yIGZ1bmN0aW9ucyB3aGljaCBjYXVzZWQgdGV4dCByZWxvY2F0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFyZ3AuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8bGliZHcuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c2VhcmNoLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworc3RydWN0IHNlZ21lbnRzCit7CisgIEdFbGZfQWRkciBmcm9tOworICBHRWxmX0FkZHIgdG87Cit9OworCisKKy8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCitzdGF0aWMgdm9pZCBwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7Cit2b2lkICgqYXJncF9wcm9ncmFtX3ZlcnNpb25faG9vaykgKEZJTEUgKiwgc3RydWN0IGFyZ3Bfc3RhdGUgKikgPSBwcmludF92ZXJzaW9uOworCisvKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLworY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzID0gUEFDS0FHRV9CVUdSRVBPUlQ7CisKKy8qIFZhbHVlcyBmb3IgdGhlIHBhcmFtZXRlcnMgd2hpY2ggaGF2ZSBubyBzaG9ydCBmb3JtLiAgKi8KKyNkZWZpbmUgT1BUX0RFQlVHSU5GTyAweDEwMAorCisvKiBEZWZpbml0aW9ucyBvZiBhcmd1bWVudHMgZm9yIGFyZ3AgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KK3sKKyAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiSW5wdXQgU2VsZWN0aW9uOiIpLCAwIH0sCisgIHsgInJvb3QiLCAncicsICJQQVRIIiwgMCwgTl8oIlByZXBlbmQgUEFUSCB0byBhbGwgZmlsZSBuYW1lcyIpLCAwIH0sCisgIHsgImRlYnVnaW5mbyIsIE9QVF9ERUJVR0lORk8sICJQQVRIIiwgMCwKKyAgICBOXygiVXNlIFBBVEggYXMgcm9vdCBvZiBkZWJ1Z2luZm8gaGllcmFyY2h5IiksIDAgfSwKKworICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJNaXNjZWxsYW5lb3VzOiIpLCAwIH0sCisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Cit9OworCisvKiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRvY1tdID0gTl8oIlwKK0xvY2F0ZSBzb3VyY2Ugb2YgdGV4dCByZWxvY2F0aW9ucyBpbiBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIik7CisKKy8qIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGFyZ3NfZG9jW10gPSBOXygiW0ZJTEUuLi5dIik7CisKKy8qIFByb3RvdHlwZSBmb3Igb3B0aW9uIGhhbmRsZXIuICAqLworc3RhdGljIGVycm9yX3QgcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7CisKKy8qIERhdGEgc3RydWN0dXJlIHRvIGNvbW11bmljYXRlIHdpdGggYXJncCBmdW5jdGlvbnMuICAqLworc3RhdGljIHN0cnVjdCBhcmdwIGFyZ3AgPQoreworICBvcHRpb25zLCBwYXJzZV9vcHQsIGFyZ3NfZG9jLCBkb2MsIE5VTEwsIE5VTEwsIE5VTEwKK307CisKKworLyogUHJpbnQgc3ltYm9scyBpbiBmaWxlIG5hbWVkIEZOQU1FLiAgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgYm9vbCBtb3JlX3RoYW5fb25lKTsKKworLyogQ2hlY2sgZm9yIHRleHQgcmVsb2NhdGlvbnMgaW4gdGhlIGdpdmVuIGZpbGUuICBUaGUgc2VnbWVudAorICAgaW5mb3JtYXRpb24gaXMga25vd24uICAqLworc3RhdGljIHZvaWQgY2hlY2tfcmVsIChzaXplX3QgbnNlZ21lbnRzLCBzdHJ1Y3Qgc2VnbWVudHMgc2VnbWVudHNbbnNlZ21lbnRzXSwKKwkJICAgICAgIEdFbGZfQWRkciBhZGRyLCBFbGYgKmVsZiwgRWxmX1NjbiAqc3ltc2NuLCBEd2FyZiAqZHcsCisJCSAgICAgICBjb25zdCBjaGFyICpmbmFtZSwgYm9vbCBtb3JlX3RoYW5fb25lLAorCQkgICAgICAgdm9pZCAqKmtub3duc3Jjcyk7CisKKworCisvKiBVc2VyLXByb3ZpZGVkIHJvb3QgZGlyZWN0b3J5LiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpyb290ZGlyID0gIi8iOworCisvKiBSb290IG9mIGRlYnVnaW5mbyBkaXJlY3RvcnkgaGllcmFyY2h5LiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpkZWJ1Z2luZm9fcm9vdDsKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByZW1haW5pbmc7CisgIGludCByZXN1bHQgPSAwOworCisgIC8qIFNldCBsb2NhbGUuICAqLworICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgY2F0YWxvZyBjYW4gYmUgZm91bmQuICAqLworICAodm9pZCkgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjYXRhbG9nLiAgKi8KKyAgKHZvaWQpIHRleHRkb21haW4gKFBBQ0tBR0UpOworCisgIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gICovCisgICh2b2lkKSBhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCk7CisKKyAgLyogVGVsbCB0aGUgbGlicmFyeSB3aGljaCB2ZXJzaW9uIHdlIGFyZSBleHBlY3RpbmcuICAqLworICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7CisKKyAgLyogSWYgdGhlIHVzZXIgaGFzIG5vdCBzcGVjaWZpZWQgdGhlIHJvb3QgZGlyZWN0b3J5IGZvciB0aGUKKyAgICAgZGVidWdpbmZvIGhpZXJhcmNoeSwgd2UgaGF2ZSB0byBkZXRlcm1pbmUgaXQgb3Vyc2VsdmVzLiAgKi8KKyAgaWYgKGRlYnVnaW5mb19yb290ID09IE5VTEwpCisgICAgeworICAgICAgLy8gWFhYIFRoZSBydW50aW1lIHNob3VsZCBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24uCisjaWYgZGVmaW5lZCBfX2lhNjRfXyB8fCBkZWZpbmVkIF9fYWxwaGFfXworICAgICAgZGVidWdpbmZvX3Jvb3QgPSAiL3Vzci9saWIvZGVidWciOworI2Vsc2UKKyAgICAgIGRlYnVnaW5mb19yb290ID0gKHNpemVvZiAobG9uZyBpbnQpID09IDQKKwkJCT8gIi91c3IvbGliL2RlYnVnIiA6ICIvdXNyL2xpYjY0L2RlYnVnIik7CisjZW5kaWYKKyAgICB9CisKKyAgaWYgKHJlbWFpbmluZyA9PSBhcmdjKQorICAgIHJlc3VsdCA9IHByb2Nlc3NfZmlsZSAoImEub3V0IiwgZmFsc2UpOworICBlbHNlCisgICAgeworICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIHJlbWFpbmluZyBmaWxlcy4gICovCisgICAgICBjb25zdCBib29sIG1vcmVfdGhhbl9vbmUgPSByZW1haW5pbmcgKyAxIDwgYXJnYzsKKworICAgICAgZG8KKwlyZXN1bHQgfD0gcHJvY2Vzc19maWxlIChhcmd2W3JlbWFpbmluZ10sIG1vcmVfdGhhbl9vbmUpOworICAgICAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogUHJpbnQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworc3RhdGljIHZvaWQKK3ByaW50X3ZlcnNpb24gKEZJTEUgKnN0cmVhbSwgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgZnByaW50ZiAoc3RyZWFtLCAiZmluZHRleHRyZWwgKCVzKSAlc1xuIiwgUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBnZXR0ZXh0ICgiXAorQ29weXJpZ2h0IChDKSAlcyBSZWQgSGF0LCBJbmMuXG5cCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOT1xuXAord2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG5cCisiKSwgIjIwMDUiKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBnZXR0ZXh0ICgiV3JpdHRlbiBieSAlcy5cbiIpLCAiVWxyaWNoIERyZXBwZXIiKTsKK30KKworCisvKiBIYW5kbGUgcHJvZ3JhbSBhcmd1bWVudHMuICAqLworc3RhdGljIGVycm9yX3QKK3BhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLAorCSAgIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHN3aXRjaCAoa2V5KQorICAgIHsKKyAgICBjYXNlICdyJzoKKyAgICAgIHJvb3RkaXIgPSBhcmc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUX0RFQlVHSU5GTzoKKyAgICAgIGRlYnVnaW5mb19yb290ID0gYXJnOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEFSR1BfRVJSX1VOS05PV047CisgICAgfQorICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorbm9vcCAodm9pZCAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKK30KKworCitzdGF0aWMgaW50Citwcm9jZXNzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBib29sIG1vcmVfdGhhbl9vbmUpCit7CisgIGludCByZXN1bHQgPSAwOworICB2b2lkICprbm93bnNyY3MgPSBOVUxMOworCisgIHNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKTsKKyAgc2l6ZV90IHJvb3RkaXJfbGVuID0gc3RybGVuIChyb290ZGlyKTsKKyAgY29uc3QgY2hhciAqcmVhbF9mbmFtZSA9IGZuYW1lOworICBpZiAoZm5hbWVbMF0gPT0gJy8nICYmIChyb290ZGlyWzBdICE9ICcvJyB8fCByb290ZGlyWzFdICE9ICdcMCcpKQorICAgIHsKKyAgICAgIC8qIFByZXBlbmQgdGhlIHVzZXItcHJvdmlkZWQgcm9vdCBkaXJlY3RvcnkuICAqLworICAgICAgY2hhciAqbmV3X2ZuYW1lID0gYWxsb2NhIChyb290ZGlyX2xlbiArIGZuYW1lX2xlbiArIDIpOworICAgICAgKigoY2hhciAqKSBtZW1wY3B5IChzdHBjcHkgKG1lbXBjcHkgKG5ld19mbmFtZSwgcm9vdGRpciwgcm9vdGRpcl9sZW4pLAorCQkJCSAgIi8iKSwKKwkJCSAgZm5hbWUsIGZuYW1lX2xlbikpID0gJ1wwJzsKKyAgICAgIHJlYWxfZm5hbWUgPSBuZXdfZm5hbWU7CisgICAgfQorCisgIGludCBmZCA9IG9wZW42NCAocmVhbF9mbmFtZSwgT19SRE9OTFkpOworICBpZiAoZmQgPT0gLTEpCisgICAgeworICAgICAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IG9wZW4gJyVzJyIpLCBmbmFtZSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOworICBpZiAoZWxmID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIGZvciAnJXMnOiAlcyIpLAorCSAgICAgZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBnb3RvIGVycl9jbG9zZTsKKyAgICB9CisKKyAgLyogTWFrZSBzdXJlIHRoZSBmaWxlIGlzIGEgRFNPLiAgKi8KKyAgR0VsZl9FaGRyIGVoZHJfbWVtOworICBHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgRUxGIGhlYWRlciAnJXMnOiAlcyIpLAorCSAgICAgZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgZXJyX2VsZl9jbG9zZToKKyAgICAgIGVsZl9lbmQgKGVsZik7CisgICAgZXJyX2Nsb3NlOgorICAgICAgY2xvc2UgKGZkKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiAoZWhkci0+ZV90eXBlICE9IEVUX0RZTikKKyAgICB7CisgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiclcycgaXMgbm90IGEgRFNPIG9yIFBJRSIpLCBmbmFtZSk7CisgICAgICBnb3RvIGVycl9lbGZfY2xvc2U7CisgICAgfQorCisgIC8qIERldGVybWluZSB3aGV0aGVyIHRoZSBEU08gaGFzIHRleHQgcmVsb2NhdGlvbnMgYXQgYWxsIGFuZCBsb2NhdGUKKyAgICAgdGhlIHN5bWJvbCB0YWJsZS4gICovCisgIEVsZl9TY24gKnN5bXNjbiA9IE5VTEw7CisgIEVsZl9TY24gKnNjbiA9IE5VTEw7CisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgdGhlIHNlY3Rpb24gaWYgaXQgaXMgYSBzeW1ib2wgdGFibGUuICAqLworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIGlmIChzaGRyID09IE5VTEwpCisJeworCSAgZXJyb3IgKDAsIDAsCisJCSBnZXR0ZXh0ICgiZ2V0dGluZyBnZXQgc2VjdGlvbiBoZWFkZXIgb2Ygc2VjdGlvbiAlenU6ICVzIiksCisJCSBlbGZfbmR4c2NuIChzY24pLCBlbGZfZXJybXNnICgtMSkpOworCSAgZ290byBlcnJfZWxmX2Nsb3NlOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX0RZTkFNSUMpCisJeworCSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKworCSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7CisJICAgICAgICsrY250KQorCSAgICB7CisJICAgICAgR0VsZl9EeW4gZHlubWVtOworCSAgICAgIEdFbGZfRHluICpkeW47CisKKwkgICAgICBkeW4gPSBnZWxmX2dldGR5biAoZGF0YSwgY250LCAmZHlubWVtKTsKKwkgICAgICBpZiAoZHluID09IE5VTEwpCisJCXsKKwkJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCByZWFkIGR5bmFtaWMgc2VjdGlvbjogJXMiKSwKKwkJCSBlbGZfZXJybXNnICgtMSkpOworCQkgIGdvdG8gZXJyX2VsZl9jbG9zZTsKKwkJfQorCisJICAgICAgaWYgKGR5bi0+ZF90YWcgPT0gRFRfVEVYVFJFTAorCQkgIHx8IChkeW4tPmRfdGFnID09IERUX0ZMQUdTCisJCSAgICAgICYmIChkeW4tPmRfdW4uZF92YWwgJiBERl9URVhUUkVMKSAhPSAwKSkKKwkJZ290byBoYXZlX3RleHRyZWw7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUIpCisJc3ltc2NuID0gc2NuOworICAgIH0KKworICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIm5vIHRleHQgcmVsb2NhdGlvbnMgcmVwb3J0ZWQgaW4gJyVzJyIpLCBmbmFtZSk7CisgIHJldHVybiAxOworCisgaGF2ZV90ZXh0cmVsOjsKKyAgaW50IGZkMiA9IC0xOworICBFbGYgKmVsZjIgPSBOVUxMOworICAvKiBHZXQgdGhlIGFkZHJlc3MgcmFuZ2VzIGZvciB0aGUgbG9hZGVkIHNlZ21lbnRzLiAgKi8KKyAgc2l6ZV90IG5zZWdtZW50c19tYXggPSAxMDsKKyAgc2l6ZV90IG5zZWdtZW50cyA9IDA7CisgIHN0cnVjdCBzZWdtZW50cyAqc2VnbWVudHMKKyAgICA9IChzdHJ1Y3Qgc2VnbWVudHMgKikgbWFsbG9jIChuc2VnbWVudHNfbWF4ICogc2l6ZW9mIChzZWdtZW50c1swXSkpOworICBpZiAoc2VnbWVudHMgPT0gTlVMTCkKKyAgICBlcnJvciAoMSwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSByZWFkaW5nIEVMRiBmaWxlIikpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZWhkci0+ZV9waG51bTsgKytpKQorICAgIHsKKyAgICAgIEdFbGZfUGhkciBwaGRyX21lbTsKKyAgICAgIEdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoZWxmLCBpLCAmcGhkcl9tZW0pOworICAgICAgaWYgKHBoZHIgPT0gTlVMTCkKKwl7CisJICBlcnJvciAoMCwgMCwKKwkJIGdldHRleHQgKCJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGluZGV4IGF0IG9mZnNldCAlZDogJXMiKSwKKwkJIGksIGVsZl9lcnJtc2cgKC0xKSk7CisJICByZXN1bHQgPSAxOworCSAgZ290byBuZXh0OworCX0KKworICAgICAgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9MT0FEICYmIChwaGRyLT5wX2ZsYWdzICYgUEZfVykgPT0gMCkKKwl7CisJICBpZiAobnNlZ21lbnRzID09IG5zZWdtZW50c19tYXgpCisJICAgIHsKKwkgICAgICBuc2VnbWVudHNfbWF4ICo9IDI7CisJICAgICAgc2VnbWVudHMKKwkJPSAoc3RydWN0IHNlZ21lbnRzICopIHJlYWxsb2MgKHNlZ21lbnRzLAorCQkJCQkgICAgICAgbnNlZ21lbnRzX21heAorCQkJCQkgICAgICAgKiBzaXplb2YgKHNlZ21lbnRzWzBdKSk7CisJICAgICAgaWYgKHNlZ21lbnRzID09IE5VTEwpCisJCXsKKwkJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKK2Nhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgaW5kZXggYXQgb2Zmc2V0ICVkOiAlcyIpLAorCQkJIGksIGVsZl9lcnJtc2cgKC0xKSk7CisJCSAgcmVzdWx0ID0gMTsKKwkJICBnb3RvIG5leHQ7CisJCX0KKwkgICAgfQorCisJICBzZWdtZW50c1tuc2VnbWVudHNdLmZyb20gPSBwaGRyLT5wX3ZhZGRyOworCSAgc2VnbWVudHNbbnNlZ21lbnRzXS50byA9IHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6OworCSAgKytuc2VnbWVudHM7CisJfQorICAgIH0KKworICBpZiAobnNlZ21lbnRzID4gMCkKKyAgICB7CisKKyAgICAgIER3YXJmICpkdyA9IGR3YXJmX2JlZ2luX2VsZiAoZWxmLCBEV0FSRl9DX1JFQUQsIE5VTEwpOworICAgICAgLyogTG9vayBmb3IgZGVidWdpbmZvIGZpbGVzIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgdGhlIGluCisJIG9wZW5lZCBmaWxlIGl0c2VsZi4gIFRoaXMgbWFrZXMgb25seSBzZW5zZSBpZiB0aGUgaW5wdXQgZmlsZQorCSBpcyBzcGVjaWZpZWQgd2l0aCBhbiBhYnNvbHV0ZSBwYXRoLiAgKi8KKyAgICAgIGlmIChkdyA9PSBOVUxMICYmIGZuYW1lWzBdID09ICcvJykKKwl7CisJICBzaXplX3QgZGVidWdpbmZvX3Jvb3RsZW4gPSBzdHJsZW4gKGRlYnVnaW5mb19yb290KTsKKwkgIGNoYXIgKmRpZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHJvb3RkaXJfbGVuICsgZGVidWdpbmZvX3Jvb3RsZW4KKwkJCQkJICAgKyBmbmFtZV9sZW4gKyA4KTsKKwkgIHN0cmNweSAobWVtcGNweSAoc3RwY3B5IChtZW1wY3B5IChtZW1wY3B5IChkaWZuYW1lLCByb290ZGlyLAorCQkJCQkJICAgICByb290ZGlyX2xlbiksCisJCQkJCSAgICBkZWJ1Z2luZm9fcm9vdCwKKwkJCQkJICAgIGRlYnVnaW5mb19yb290bGVuKSwKKwkJCQkgICAiLyIpLAorCQkJICAgZm5hbWUsIGZuYW1lX2xlbiksCisJCSAgIi5kZWJ1ZyIpOworCisJICBmZDIgPSBvcGVuNjQgKGRpZm5hbWUsIE9fUkRPTkxZKTsKKwkgIGlmIChmZDIgIT0gLTEKKwkgICAgICAmJiAoZWxmMiA9IGVsZl9iZWdpbiAoZmQyLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpKSAhPSBOVUxMKQorCSAgICBkdyA9IGR3YXJmX2JlZ2luX2VsZiAoZWxmMiwgRFdBUkZfQ19SRUFELCBOVUxMKTsKKwl9CisKKyAgICAgIC8qIExvb2sgYXQgYWxsIHJlbG9jYXRpb25zIGFuZCBkZXRlcm1pbmUgd2hpY2ggbW9kaWZ5CisJIHdyaXRlLXByb3RlY3RlZCBzZWdtZW50cy4gICovCisgICAgICBzY24gPSBOVUxMOworICAgICAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWxmLCBzY24pKSAhPSBOVUxMKQorCXsKKwkgIC8qIEhhbmRsZSB0aGUgc2VjdGlvbiBpZiBpdCBpcyBhIHN5bWJvbCB0YWJsZS4gICovCisJICBHRWxmX1NoZHIgc2hkcl9tZW07CisJICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKworCSAgaWYgKHNoZHIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGVycm9yICgwLCAwLAorCQkgICAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gJVp1OiAlcyIpLAorCQkgICAgIGVsZl9uZHhzY24gKHNjbiksIGVsZl9lcnJtc2cgKC0xKSk7CisJICAgICAgcmVzdWx0ID0gMTsKKwkgICAgICBnb3RvIG5leHQ7CisJICAgIH0KKworCSAgaWYgKChzaGRyLT5zaF90eXBlID09IFNIVF9SRUwgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKKwkgICAgICAmJiBzeW1zY24gPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHN5bXNjbiA9IGVsZl9nZXRzY24gKGVsZiwgc2hkci0+c2hfbGluayk7CisJICAgICAgaWYgKHN5bXNjbiA9PSBOVUxMKQorCQl7CisJCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJcCitjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIpLAorCQkJIChzaXplX3QpIHNoZHItPnNoX2xpbmssIGZuYW1lLCBlbGZfZXJybXNnICgtMSkpOworCQkgIHJlc3VsdCA9IDE7CisJCSAgZ290byBuZXh0OworCQl9CisJICAgIH0KKworCSAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKKwkgICAgeworCSAgICAgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisKKwkgICAgICBmb3IgKGludCBjbnQgPSAwOworCQkgICAoc2l6ZV90KSBjbnQgPCBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKKwkJICAgKytjbnQpCisJCXsKKwkJICBHRWxmX1JlbCByZWxfbWVtOworCQkgIEdFbGZfUmVsICpyZWwgPSBnZWxmX2dldHJlbCAoZGF0YSwgY250LCAmcmVsX21lbSk7CisJCSAgaWYgKHJlbCA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKK2Nhbm5vdCBnZXQgcmVsb2NhdGlvbiBhdCBpbmRleCAlZCBpbiBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIpLAorCQkJICAgICBjbnQsIGVsZl9uZHhzY24gKHNjbiksIGZuYW1lLCBlbGZfZXJybXNnICgtMSkpOworCQkgICAgICByZXN1bHQgPSAxOworCQkgICAgICBnb3RvIG5leHQ7CisJCSAgICB9CisKKwkJICBjaGVja19yZWwgKG5zZWdtZW50cywgc2VnbWVudHMsIHJlbC0+cl9vZmZzZXQsIGVsZiwKKwkJCSAgICAgc3ltc2NuLCBkdywgZm5hbWUsIG1vcmVfdGhhbl9vbmUsICZrbm93bnNyY3MpOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpCisJICAgIHsKKwkgICAgICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworCisJICAgICAgZm9yIChpbnQgY250ID0gMDsKKwkJICAgKHNpemVfdCkgY250IDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7CisJCSAgICsrY250KQorCQl7CisJCSAgR0VsZl9SZWxhIHJlbGFfbWVtOworCQkgIEdFbGZfUmVsYSAqcmVsYSA9IGdlbGZfZ2V0cmVsYSAoZGF0YSwgY250LCAmcmVsYV9tZW0pOworCQkgIGlmIChyZWxhID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiXAorY2Fubm90IGdldCByZWxvY2F0aW9uIGF0IGluZGV4ICVkIGluIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIiksCisJCQkgICAgIGNudCwgZWxmX25keHNjbiAoc2NuKSwgZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7CisJCSAgICAgIHJlc3VsdCA9IDE7CisJCSAgICAgIGdvdG8gbmV4dDsKKwkJICAgIH0KKworCQkgIGNoZWNrX3JlbCAobnNlZ21lbnRzLCBzZWdtZW50cywgcmVsYS0+cl9vZmZzZXQsIGVsZiwKKwkJCSAgICAgc3ltc2NuLCBkdywgZm5hbWUsIG1vcmVfdGhhbl9vbmUsICZrbm93bnNyY3MpOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGR3YXJmX2VuZCAoZHcpOworICAgIH0KKworIG5leHQ6CisgIGVsZl9lbmQgKGVsZik7CisgIGVsZl9lbmQgKGVsZjIpOworICBjbG9zZSAoZmQpOworICBpZiAoZmQyICE9IC0xKQorICAgIGNsb3NlIChmZDIpOworCisgIHRkZXN0cm95IChrbm93bnNyY3MsIG5vb3ApOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludAorcHRyY29tcGFyZSAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQoreworICBpZiAoKHVpbnRwdHJfdCkgcDEgPCAodWludHB0cl90KSBwMikKKyAgICByZXR1cm4gLTE7CisgIGlmICgodWludHB0cl90KSBwMSA+ICh1aW50cHRyX3QpIHAyKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorY2hlY2tfcmVsIChzaXplX3QgbnNlZ21lbnRzLCBzdHJ1Y3Qgc2VnbWVudHMgc2VnbWVudHNbbnNlZ21lbnRzXSwKKwkgICBHRWxmX0FkZHIgYWRkciwgRWxmICplbGYsIEVsZl9TY24gKnN5bXNjbiwgRHdhcmYgKmR3LAorCSAgIGNvbnN0IGNoYXIgKmZuYW1lLCBib29sIG1vcmVfdGhhbl9vbmUsIHZvaWQgKiprbm93bnNyY3MpCit7CisgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IG5zZWdtZW50czsgKytjbnQpCisgICAgaWYgKHNlZ21lbnRzW2NudF0uZnJvbSA8PSBhZGRyICYmIHNlZ21lbnRzW2NudF0udG8gPiBhZGRyKQorICAgICAgeworCUR3YXJmX0RpZSBkaWVfbWVtOworCUR3YXJmX0RpZSAqZGllOworCUR3YXJmX0xpbmUgKmxpbmU7CisJY29uc3QgY2hhciAqc3JjOworCisJaWYgKG1vcmVfdGhhbl9vbmUpCisJICBwcmludGYgKCIlczogIiwgZm5hbWUpOworCisJaWYgKChkaWUgPSBkd2FyZl9hZGRyZGllIChkdywgYWRkciwgJmRpZV9tZW0pKSAhPSBOVUxMCisJICAgICYmIChsaW5lID0gZHdhcmZfZ2V0c3JjX2RpZSAoZGllLCBhZGRyKSkgIT0gTlVMTAorCSAgICAmJiAoc3JjID0gZHdhcmZfbGluZXNyYyAobGluZSwgTlVMTCwgTlVMTCkpICE9IE5VTEwpCisJICB7CisJICAgIC8qIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIHJlbG9jYXRpb24gYWdhaW5zdCBvbmUgZmlsZS4KKwkgICAgICAgVHJ5IHRvIGF2b2lkIG11bHRpcGxlIG1lc3NhZ2VzLiAgQW5kIHllcywgdGhlIGNvZGUgdXNlcworCSAgICAgICBwb2ludGVyIGNvbXBhcmlzb24uICAqLworCSAgICBpZiAodGZpbmQgKHNyYywga25vd25zcmNzLCBwdHJjb21wYXJlKSA9PSBOVUxMKQorCSAgICAgIHsKKwkJcHJpbnRmIChnZXR0ZXh0ICgiJXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIpLCBzcmMpOworCQl0c2VhcmNoIChzcmMsIGtub3duc3JjcywgcHRyY29tcGFyZSk7CisJICAgICAgfQorCSAgICByZXR1cm47CisJICB9CisJZWxzZQorCSAgeworCSAgICAvKiBBdCBsZWFzdCBsb29rIGF0IHRoZSBzeW1ib2wgdGFibGUgdG8gc2VlIHdoaWNoIGZ1bmN0aW9uCisJICAgICAgIHRoZSBtb2RpZmllZCBhZGRyZXNzIGlzIGluLiAgKi8KKwkgICAgRWxmX0RhdGEgKnN5bWRhdGEgPSBlbGZfZ2V0ZGF0YSAoc3ltc2NuLCBOVUxMKTsKKwkgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworCSAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnNoZHJfbWVtKTsKKwkgICAgaWYgKHNoZHIgIT0gTlVMTCkKKwkgICAgICB7CisJCUdFbGZfQWRkciBsb3dhZGRyID0gMDsKKwkJaW50IGxvd2lkeCA9IC0xOworCQlHRWxmX0FkZHIgaGlnaGFkZHIgPSB+MHVsOworCQlpbnQgaGlnaGlkeCA9IC0xOworCQlHRWxmX1N5bSBzeW1fbWVtOworCQlHRWxmX1N5bSAqc3ltOworCisJCWZvciAoaW50IGkgPSAwOyAoc2l6ZV90KSBpIDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7CisJCSAgICAgKytpKQorCQkgIHsKKwkJICAgIHN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kYXRhLCBpLCAmc3ltX21lbSk7CisJCSAgICBpZiAoc3ltID09IE5VTEwpCisJCSAgICAgIGNvbnRpbnVlOworCisJCSAgICBpZiAoc3ltLT5zdF92YWx1ZSA8IGFkZHIgJiYgc3ltLT5zdF92YWx1ZSA+IGxvd2FkZHIpCisJCSAgICAgIHsKKwkJCWxvd2FkZHIgPSBzeW0tPnN0X3ZhbHVlOworCQkJbG93aWR4ID0gaTsKKwkJICAgICAgfQorCQkgICAgaWYgKHN5bS0+c3RfdmFsdWUgPiBhZGRyICYmIHN5bS0+c3RfdmFsdWUgPCBoaWdoYWRkcikKKwkJICAgICAgeworCQkJaGlnaGFkZHIgPSBzeW0tPnN0X3ZhbHVlOworCQkJaGlnaGlkeCA9IGk7CisJCSAgICAgIH0KKwkJICB9CisKKwkJaWYgKGxvd2lkeCAhPSAtMSkKKwkJICB7CisJCSAgICBzeW0gPSBnZWxmX2dldHN5bSAoc3ltZGF0YSwgbG93aWR4LCAmc3ltX21lbSk7CisJCSAgICBhc3NlcnQgKHN5bSAhPSBOVUxMKTsKKworCQkgICAgY29uc3QgY2hhciAqbG93c3RyID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyLT5zaF9saW5rLAorCQkJCQkJICAgICBzeW0tPnN0X25hbWUpOworCisJCSAgICBpZiAoc3ltLT5zdF92YWx1ZSArIHN5bS0+c3Rfc2l6ZSA+IGFkZHIpCisJCSAgICAgIHsKKwkJCS8qIEl0IGlzIHRoaXMgZnVuY3Rpb24uICAqLworCQkJaWYgKHRmaW5kIChsb3dzdHIsIGtub3duc3JjcywgcHRyY29tcGFyZSkgPT0gTlVMTCkKKwkJCSAgeworCQkJICAgIHByaW50ZiAoZ2V0dGV4dCAoIlwKK3RoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIpLAorCQkJCSAgICBsb3dzdHIpOworCQkJICAgIHRzZWFyY2ggKGxvd3N0ciwga25vd25zcmNzLCBwdHJjb21wYXJlKTsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgICBlbHNlIGlmIChoaWdoaWR4ID09IC0xKQorCQkgICAgICBwcmludGYgKGdldHRleHQgKCJcCit0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIG1pZ2h0IG5vdCBiZSBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iKSwKKwkJCSAgICAgIGxvd3N0cik7CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCXN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kYXRhLCBoaWdoaWR4LCAmc3ltX21lbSk7CisJCQlhc3NlcnQgKHN5bSAhPSBOVUxMKTsKKworCQkJcHJpbnRmIChnZXR0ZXh0ICgiXAorZWl0aGVyIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBpcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIiksCisJCQkJbG93c3RyLCBlbGZfc3RycHRyIChlbGYsIHNoZHItPnNoX2xpbmssCisJCQkJCQkgICAgc3ltLT5zdF9uYW1lKSk7CisJCSAgICAgIH0KKwkJICAgIHJldHVybjsKKwkJICB9CisJCWVsc2UgaWYgKGhpZ2hpZHggIT0gLTEpCisJCSAgeworCQkgICAgc3ltID0gZ2VsZl9nZXRzeW0gKHN5bWRhdGEsIGhpZ2hpZHgsICZzeW1fbWVtKTsKKwkJICAgIGFzc2VydCAoc3ltICE9IE5VTEwpOworCisJCSAgICBwcmludGYgKGdldHRleHQgKCJcCit0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIG1pZ2h0IG5vdCBiZSBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iKSwKKwkJCSAgICBlbGZfc3RycHRyIChlbGYsIHNoZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOworCQkgICAgcmV0dXJuOworCQkgIH0KKwkgICAgICB9CisJICB9CisKKwlwcmludGYgKGdldHRleHQgKCJcCithIHJlbG9jYXRpb24gbW9kaWZpZXMgbWVtb3J5IGF0IG9mZnNldCAlbGx1IGluIGEgd3JpdGUtcHJvdGVjdGVkIHNlZ21lbnRcbiIpLAorCQkodW5zaWduZWQgbG9uZyBsb25nIGludCkgYWRkcik7CisJYnJlYWs7CisgICAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvaTM4Nl9sZC5jIGIvc3JjL2kzODZfbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTFjYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2kzODZfbGQuYwpAQCAtMCwwICsxLDg5NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIFhYWCBGb3IgZGVidWdnaW5nCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHN5c3RlbS5oPgorI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGlzdC5oIgorLyogeDg2IGlzIGxpdHRsZSBlbmRpYW4uICAqLworI2RlZmluZSBVTkFMSUdORURfQUNDRVNTX0NMQVNTIExJVFRMRV9FTkRJQU4KKyNpbmNsdWRlICJ1bmFsaWduZWQuaCIKKyNpbmNsdWRlICJ4ZWxmLmgiCisKKworLyogVGhlIG9sZCBjYWxsYmFja3MuICAqLworc3RhdGljIGludCAoKm9sZF9vcGVuX291dGZpbGUpIChzdHJ1Y3QgbGRfc3RhdGUgKiwgaW50LCBpbnQsIGludCk7CisKKworc3RhdGljIGludAorZWxmX2kzODZfb3Blbl9vdXRmaWxlIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCwKKwkJICAgICAgIGludCBtYWNoaW5lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJICAgICAgIGludCBrbGFzcyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCSAgICAgICBpbnQgZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIC8qIFRoaXMgYmFja2VuZCBvbmx5IGhhbmRsZXMgMzItYml0IG9iamVjdCBmaWxlcy4gICovCisgIC8qIFhYWCBGb3Igbm93IGp1c3QgdXNlIHRoZSBnZW5lcmljIGJhY2tlbmQuICAqLworICByZXR1cm4gb2xkX29wZW5fb3V0ZmlsZSAoc3RhdGVwLCBFTV8zODYsIEVMRkNMQVNTMzIsIEVMRkRBVEEyTFNCKTsKK30KKworCisvKiBQcm9jZXNzIHJlbG9jYXRpb25zIGZvciB0aGUgb3V0cHV0IGluIGEgcmVsb2NhdGFibGUgZmlsZS4gIFRoaXMKKyAgIG9ubHkgbWVhbnMgYWRqdXN0aW5nIG9mZnNldCBhbmQgc3ltYm9sIGluZGljZXMuICAqLworc3RhdGljIHZvaWQKK2VsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24gKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgIEVsZl9TY24gKm91dHNjbiwgc3RydWN0IHNjbmluZm8gKmZpcnN0cCwKKwkJCSAgIGNvbnN0IEVsZjMyX1dvcmQgKmRibGluZGlyZWN0KQoreworICBzdHJ1Y3Qgc2NuaW5mbyAqcnVucDsKKyAgRWxmX0RhdGEgKmRhdGE7CisKKyAgLyogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgaW5wdXQgc2VjdGlvbnMuICBBcHByb3ByaWF0ZSBkYXRhIGJ1ZmZlcnMgaW4gdGhlCisgICAgIG91dHB1dCBzZWN0aW9ucyB3ZXJlIGFscmVhZHkgY3JlYXRlZC4gIEkgZ2V0IHRoZW0gaXRlcmF0aXZlbHksIHRvby4gICovCisgIHJ1bnAgPSBmaXJzdHA7CisgIGRhdGEgPSBOVUxMOworICBkbworICAgIHsKKyAgICAgIEVsZl9EYXRhICpyZWx0Z3RkYXRhOworICAgICAgRWxmX0RhdGEgKmluc3ltZGF0YTsKKyAgICAgIEVsZl9EYXRhICppbnhuZHhkYXRhID0gTlVMTDsKKyAgICAgIHNpemVfdCBtYXhjbnQ7CisgICAgICBzaXplX3QgY250OworICAgICAgY29uc3QgRWxmMzJfV29yZCAqc3ltaW5kaXJlY3Q7CisgICAgICBzdHJ1Y3Qgc3ltYm9sICoqc3ltcmVmOworICAgICAgc3RydWN0IHVzZWRmaWxlcyAqZmlsZSA9IHJ1bnAtPmZpbGVpbmZvOworICAgICAgWEVsZl9TaGRyICpzaGRyID0gJlNDTklORk9fU0hEUiAocnVucC0+c2hkcik7CisKKyAgICAgIC8qIEdldCB0aGUgb3V0cHV0IHNlY3Rpb24gZGF0YSBidWZmZXIgZm9yIHRoaXMgaW5wdXQgc2VjdGlvbi4gICovCisgICAgICBkYXRhID0gZWxmX2dldGRhdGEgKG91dHNjbiwgZGF0YSk7CisgICAgICBhc3NlcnQgKGRhdGEgIT0gTlVMTCk7CisKKyAgICAgIC8qIEdldCB0aGUgZGF0YSBmb3Igc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZSB0aGlzIHJlbG9jYXRpb24KKwkgc2VjdGlvbiBpcyByZWxvY2F0aW5nLiAgU2luY2UgdGhlc2UgYnVmZmVycyBhcmUgcmV1c2VkIGluIHRoZQorCSBvdXRwdXQgbW9kaWZ5aW5nIHRoZXNlIGJ1ZmZlcnMgaGFzIHRoZSBjb3JyZWN0IHJlc3VsdC4gICovCisgICAgICByZWx0Z3RkYXRhID0gZWxmX2dldGRhdGEgKGZpbGUtPnNjbmluZm9bc2hkci0+c2hfaW5mb10uc2NuLCBOVUxMKTsKKworICAgICAgLyogR2V0IHRoZSBkYXRhIGZvciB0aGUgaW5wdXQgc2VjdGlvbiBzeW1ib2wgdGFibGUgZm9yIHRoaXMKKwkgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KKyAgICAgIGluc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChmaWxlLT5zY25pbmZvW3NoZHItPnNoX2xpbmtdLnNjbiwgTlVMTCk7CisgICAgICBhc3NlcnQgKGluc3ltZGF0YSAhPSBOVUxMKTsKKworICAgICAgLyogQW5kIHRoZSBleHRlbmRlZCBzZWN0aW9uIGluZGV4IHRhYmxlLiAgKi8KKyAgICAgIGlueG5keGRhdGEgPSBydW5wLT5maWxlaW5mby0+eG5keGRhdGE7CisKKyAgICAgIC8qIE51bWJlciBvZiByZWxvY2F0aW9ucy4gICovCisgICAgICBtYXhjbnQgPSBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKKworICAgICAgLyogQXJyYXkgZGlyZWN0aW5nIGxvY2FsIHN5bWJvbCB0YWJsZSBvZmZzZXRzIHRvIG91dHB1dCBzeW1ib2wKKwkgdGFibGUgb2Zmc2V0cy4gICovCisgICAgICBzeW1pbmRpcmVjdCA9IGZpbGUtPnN5bWluZGlyZWN0OworCisgICAgICAvKiBSZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgcmVjb3Jkcy4gICovCisgICAgICBzeW1yZWYgPSBmaWxlLT5zeW1yZWY7CisKKyAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlbG9jYXRpb25zIGluIHRoZSBzZWN0aW9uLiAgKi8KKyAgICAgIGZvciAoY250ID0gMDsgY250IDwgbWF4Y250OyArK2NudCkKKwl7CisJICBYRWxmX1JlbF92YXJkZWYgKHJlbCk7CisJICBFbGYzMl9Xb3JkIHNpOworCSAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCSAgRWxmMzJfV29yZCB4bmR4OworCisJICAvKiBHZXQgdGhlIHJlbG9jYXRpb24gZGF0YSBpdHNlbGYuICB4ODYgdXNlcyBSZWwKKwkgICAgIHJlbG9jYXRpb25zLiAgSW4gY2FzZSB3ZSBoYXZlIHRvIGhhbmRsZSBSZWxhIGFzIHdlbGwgdGhlCisJICAgICB3aG9sZSBsb29wIHByb2JhYmx5IHNob3VsZCBiZSBkdXBsaWNhdGVkLiAgKi8KKwkgIHhlbGZfZ2V0cmVsIChkYXRhLCBjbnQsIHJlbCk7CisJICBhc3NlcnQgKHJlbCAhPSBOVUxMKTsKKworCSAgLyogQ29tcHV0ZSB0aGUgc3ltYm9sIGluZGV4IGluIHRoZSBvdXRwdXQgZmlsZS4gICovCisJICBzaSA9IHN5bWluZGlyZWN0W1hFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKV07CisJICBpZiAoc2kgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaGFwcGVucyBpZiB0aGUgc3ltYm9sIGlzIGxvY2FsbHkgdW5kZWZpbmVkIG9yCisJCSBzdXBlcmNlZGVkIGJ5IHNvbWUgb3RoZXIgZGVmaW5pdGlvbi4gICovCisJICAgICAgYXNzZXJ0IChzeW1yZWZbWEVMRl9SX1NZTSAocmVsLT5yX2luZm8pXSAhPSBOVUxMKTsKKwkgICAgICBzaSA9IHN5bXJlZltYRUxGX1JfU1lNIChyZWwtPnJfaW5mbyldLT5vdXRzeW1pZHg7CisJICAgIH0KKwkgIC8qIFRha2UgcmVvcmRlcmluZyBwZXJmb3JtZWQgdG8gc29ydCB0aGUgc3ltYm9sIHRhYmxlIGludG8KKwkgICAgIGFjY291bnQuICAqLworCSAgc2kgPSBkYmxpbmRpcmVjdFtzaV07CisKKwkgIC8qIEdldCB0aGUgc3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KKwkgIHhlbGZfZ2V0c3ltc2huZHggKGluc3ltZGF0YSwgaW54bmR4ZGF0YSwgWEVMRl9SX1NZTSAocmVsLT5yX2luZm8pLAorCQkJICAgIHN5bSwgeG5keCk7CisJICBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKQorCSAgICB4bmR4ID0gc3ltLT5zdF9zaG5keDsKKwkgIGFzc2VydCAoeG5keCA8IFNITl9MT1JFU0VSVkUgfHwgeG5keCA+IFNITl9ISVJFU0VSVkUpOworCisJICAvKiBXZSBmb3J0dW5hdGVseSBkb24ndCBoYXZlIHRvIGRvIG11Y2guICBUaGUgcmVsb2NhdGlvbnMKKwkgICAgIG1vc3RseSBnZXQgb25seSB1cGRhdGVzIG9mIHRoZSBvZmZzZXQuICBPbmx5IGlzIGEKKwkgICAgIHJlbG9jYXRpb24gcmVmZXJyZWQgdG8gYSBzZWN0aW9uIGRvIHdlIGhhdmUgdG8gZG8KKwkgICAgIHNvbWV0aGluZy4gIEluIHRoaXMgY2FzZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzZWN0aW9ucworCSAgICAgaGFzIG5vIGRpcmVjdCBlcXVpdmFsZW50IHNpbmNlIHRoZSBwYXJ0IHRoZSBpbnB1dCBzZWN0aW9uCisJICAgICBjb250cmlidXRlcyBuZWVkIG5vdCBzdGFydCBhdCB0aGUgc2FtZSBvZmZzZXQgYXMgaW4gdGhlCisJICAgICBpbnB1dCBmaWxlLiAgVGhlcmVmb3JlIHdlIGhhdmUgdG8gYWRqdXN0IHRoZSBhZGRlbmQgd2hpY2gKKwkgICAgIGluIHRoZSBjYXNlIG9mIFJlbCByZWxvY2F0aW9ucyBpcyBpbiB0aGUgdGFyZ2V0IHNlY3Rpb24KKwkgICAgIGl0c2VsZi4gICovCisJICBpZiAoWEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQorCSAgICB7CisJICAgICAgRWxmMzJfV29yZCB0b2FkZDsKKworCSAgICAgIC8qIFdlIGV4cGVjdCBoZXJlIG9uIFJfMzg2XzMyIHJlbG9jYXRpb25zLiAgKi8KKwkgICAgICBhc3NlcnQgKFhFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl8zODZfMzIpOworCisJICAgICAgLyogQXZvaWQgd3JpdGluZyB0byB0aGUgc2VjdGlvbiBtZW1vcnkgaWYgdGhpcyBpcworCQkgZWZmZWN0aXZlbHkgYSBuby1vcCBzaW5jZSBpdCBtaWdodCBzYXZlIGEKKwkJIGNvcHktb24td3JpdGUgb3BlcmF0aW9uLiAgKi8KKwkgICAgICB0b2FkZCA9IGZpbGUtPnNjbmluZm9beG5keF0ub2Zmc2V0OworCSAgICAgIGlmICh0b2FkZCAhPSAwKQorCQlhZGRfNHVieXRlX3VuYWxpZ25lZCAocmVsdGd0ZGF0YS0+ZF9idWYgKyByZWwtPnJfb2Zmc2V0LAorCQkJCSAgICAgIHRvYWRkKTsKKwkgICAgfQorCisJICAvKiBBZGp1c3QgdGhlIG9mZnNldCBmb3IgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbnB1dCBzZWN0aW9uCisJICAgICBjb250ZW50IGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICByZWwtPnJfb2Zmc2V0ICs9IGZpbGUtPnNjbmluZm9bc2hkci0+c2hfaW5mb10ub2Zmc2V0OworCisJICAvKiBBbmQgZmluYWxseSBhZGp1c3QgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wgaW4gdGhlIG91dHB1dAorCSAgICAgc3ltYm9sIHRhYmxlLiAgKi8KKwkgIHJlbC0+cl9pbmZvID0gWEVMRl9SX0lORk8gKHNpLCBYRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pKTsKKworCSAgLyogU3RvcmUgdGhlIHJlc3VsdC4gICovCisJICAodm9pZCkgeGVsZl91cGRhdGVfcmVsIChkYXRhLCBjbnQsIHJlbCk7CisJfQorCisgICAgICBydW5wID0gcnVucC0+bmV4dDsKKyAgICB9CisgIHdoaWxlIChydW5wICE9IGZpcnN0cCk7Cit9CisKKworLyogRWFjaCBQTFQgZW50cnkgaGFzIDE2IGJ5dGVzLiAgV2UgbmVlZCBvbmUgZW50cnkgYXMgb3ZlcmhlYWQgZm9yCisgICB0aGUgY29kZSB0byBzZXQgdXAgdGhlIGNhbGwgaW50byB0aGUgcnVudGltZSByZWxvY2F0aW9uLiAgKi8KKyNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTYKKworc3RhdGljIHZvaWQKK2VsZl9pMzg2X2luaXRpYWxpemVfcGx0IChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCwgRWxmX1NjbiAqc2NuKQoreworICBFbGZfRGF0YSAqZGF0YTsKKyAgWEVsZl9TaGRyX3ZhcmRlZiAoc2hkcik7CisKKyAgLyogQ2hhbmdlIHRoZSBlbnRyeSBzaXplIGluIHRoZSBzZWN0aW9uIGhlYWRlci4gICovCisgIHhlbGZfZ2V0c2hkciAoc2NuLCBzaGRyKTsKKyAgYXNzZXJ0IChzaGRyICE9IE5VTEwpOworICBzaGRyLT5zaF9lbnRzaXplID0gUExUX0VOVFJZX1NJWkU7CisgICh2b2lkKSB4ZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpOworCisgIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGFsbG9jYXRlIFBMVCBzZWN0aW9uOiAlcyIpLAorCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgLyogV2UgbmVlZCBvbmUgc3BlY2lhbCBQTFQgZW50cnkgKHBlcmZvcm1pbmcgdGhlIGp1bXAgdG8gdGhlIHJ1bnRpbWUKKyAgICAgcmVsb2NhdGlvbiByb3V0aW5lcykgYW5kIG9uZSBmb3IgZWFjaCBmdW5jdGlvbiB3ZSBjYWxsIGluIGEgRFNPLiAgKi8KKyAgZGF0YS0+ZF9zaXplID0gKDEgKyBzdGF0ZXAtPm5wbHQpICogUExUX0VOVFJZX1NJWkU7CisgIGRhdGEtPmRfYnVmID0geGNhbGxvYyAoMSwgZGF0YS0+ZF9zaXplKTsKKyAgZGF0YS0+ZF9hbGlnbiA9IDg7CisgIGRhdGEtPmRfb2ZmID0gMDsKKworICBzdGF0ZXAtPm5wbHRfdXNlZCA9IDE7Cit9CisKKworc3RhdGljIHZvaWQKK2VsZl9pMzg2X2luaXRpYWxpemVfcGx0cmVsIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCwgRWxmX1NjbiAqc2NuKQoreworICBFbGZfRGF0YSAqZGF0YTsKKworICBkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoImNhbm5vdCBhbGxvY2F0ZSBQTFRSRUwgc2VjdGlvbjogJXMiKSwKKwkgICBlbGZfZXJybXNnICgtMSkpOworCisgIC8qIE9uZSByZWxvY2F0aW9uIHBlciBQTFQgZW50cnkuICAqLworICBkYXRhLT5kX3NpemUgPSBzdGF0ZXAtPm5wbHQgKiBzaXplb2YgKEVsZjMyX1JlbCk7CisgIGRhdGEtPmRfYnVmID0geGNhbGxvYyAoMSwgZGF0YS0+ZF9zaXplKTsKKyAgZGF0YS0+ZF90eXBlID0gRUxGX1RfUkVMOworICBkYXRhLT5kX2FsaWduID0gNDsKKyAgZGF0YS0+ZF9vZmYgPSAwOworfQorCisKK3N0YXRpYyB2b2lkCitlbGZfaTM4Nl9pbml0aWFsaXplX2dvdCAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsIEVsZl9TY24gKnNjbikKK3sKKyAgRWxmX0RhdGEgKmRhdGE7CisKKyAgLyogSWYgd2UgaGF2ZSBubyAucGx0IHdlIGRvbid0IG5lZWQgdGhlIHNwZWNpYWwgZW50cmllcyB3ZSBub3JtYWxseQorICAgICBjcmVhdGUgZm9yIGl0LiAgVGhlIG90aGVyIGNvbnRlbnRzIGlzIGNyZWF0ZWQgbGF0ZXIuICAqLworICBpZiAoc3RhdGVwLT5uZ290ICsgc3RhdGVwLT5ucGx0ID09IDApCisgICAgcmV0dXJuOworCisgIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGFsbG9jYXRlIEdPVCBzZWN0aW9uOiAlcyIpLAorCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgLyogV2UgY29uc3RydWN0IHRoZSAuZ290IHNlY3Rpb24gaW4gcGllY2VzLiAgSGVyZSB3ZSBvbmx5IGFkZCB0aGUgZGF0YQorICAgICBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZSBQTFQuICBUaGlzIGluY2x1ZGVzIHRocmVlIHJlc2VydmVkCisgICAgIGVudHJpZXMgYXQgdGhlIGJlZ2lubmluZyAodGhlIGZpcnN0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlCisgICAgIC5keW5hbWljIHNlY3Rpb24pLCBhbmQgb25lIHdvcmQgZm9yIGVhY2ggUExUIGVudHJ5LiAgKi8KKyAgZGF0YS0+ZF9zaXplID0gKDMgKyBzdGF0ZXAtPm5nb3QgKyBzdGF0ZXAtPm5wbHQpICogc2l6ZW9mIChFbGYzMl9BZGRyKTsKKyAgZGF0YS0+ZF9idWYgPSB4Y2FsbG9jICgxLCBkYXRhLT5kX3NpemUpOworICBkYXRhLT5kX2FsaWduID0gc2l6ZW9mIChFbGYzMl9BZGRyKTsKKyAgZGF0YS0+ZF9vZmYgPSAwOworfQorCisKKy8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhbiBhYnNvbHV0ZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rcyBsaWtlCisgICB0aGlzLiAgU2VlIHRoZSBTVlI0IEFCSSBpMzg2IHN1cHBsZW1lbnQgdG8gc2VlIGhvdyB0aGlzIHdvcmtzLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGVsZl9pMzg2X3BsdDBfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KK3sKKyAgMHhmZiwgMHgzNSwJLyogcHVzaGwgY29udGVudHMgb2YgYWRkcmVzcyAqLworICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgLmdvdCArIDQuICAqLworICAweGZmLCAweDI1LAkvKiBqbXAgaW5kaXJlY3QgKi8KKyAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBhZGRyZXNzIG9mIC5nb3QgKyA4LiAgKi8KKyAgMCwgMCwgMCwgMAkvKiBwYWQgb3V0IHRvIDE2IGJ5dGVzLiAgKi8KK307CisKKy8qIFR5cGUgZGVzY3JpYmluZyB0aGUgZmlyc3QgUExUIGVudHJ5IGluIG5vbi1QSUMuICAqLworc3RydWN0IHBsdDBfZW50cnkKK3sKKyAgLyogRmlyc3QgYSAncHVzaCcgb2YgdGhlIHNlY29uZCBHT1QgZW50cnkuICAqLworICB1bnNpZ25lZCBjaGFyIHB1c2hfaW5zdHJbMl07CisgIHVpbnQzMl90IGdvdHA0X2FkZHI7CisgIC8qIFNlY29uZCwgYSAnam1wIGluZGlyZWN0JyB0byB0aGUgdGhpcmQgR09UIGVudHJ5LiAgKi8KKyAgdW5zaWduZWQgY2hhciBqbXBfaW5zdHJbMl07CisgIHVpbnQzMl90IGdvdHA4X2FkZHI7CisgIC8qIFBhZGRpbmcuICAqLworICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbNF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgUElDIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZSB0aGlzLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Cit7CisgIDB4ZmYsIDB4YjMsIDQsIDAsIDAsIDAsCS8qIHB1c2hsIDQoJWVieCkgKi8KKyAgMHhmZiwgMHhhMywgOCwgMCwgMCwgMCwJLyogam1wICo4KCVlYngpICovCisgIDAsIDAsIDAsIDAJCQkvKiBwYWQgb3V0IHRvIDE2IGJ5dGVzLiAgKi8KK307CisKKy8qIENvbnRlbnRzIG9mIGFsbCBidXQgdGhlIGZpcnN0IFBMVCBlbnRyeSBpbiBleGVjdXRhYmxlLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGVsZl9pMzg2X3BsdF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQoreworICAweGZmLCAweDI1LCAgIC8qIGptcCBpbmRpcmVjdCAqLworICAwLCAwLCAwLCAwLCAgIC8qIHJlcGxhY2VkIHdpdGggYWRkcmVzcyBvZiB0aGlzIHN5bWJvbCBpbiAuZ290LiAgKi8KKyAgMHg2OCwgICAgICAgICAvKiBwdXNobCBpbW1lZGlhdGUgKi8KKyAgMCwgMCwgMCwgMCwgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBpbnRvIHJlbG9jYXRpb24gdGFibGUuICAqLworICAweGU5LCAgICAgICAgIC8qIGptcCByZWxhdGl2ZSAqLworICAwLCAwLCAwLCAwICAgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLworfTsKKworLyogQ29udGVudHMgb2YgYWxsIGJ1dCB0aGUgZmlyc3QgUExUIGVudHJ5IGluIERTT3MuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZWxmX2kzODZfcGljX3BsdF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQoreworICAweGZmLCAweGEzLAkvKiBqbXAgKm9mZnNldCglZWJ4KSAqLworICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBvZiB0aGlzIHN5bWJvbCBpbiAuZ290LiAgKi8KKyAgMHg2OCwJCS8qIHB1c2hsIGltbWVkaWF0ZSAqLworICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBpbnRvIHJlbG9jYXRpb24gdGFibGUuICAqLworICAweGU5LAkJLyogam1wIHJlbGF0aXZlICovCisgIDAsIDAsIDAsIDAJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3RhcnQgb2YgLnBsdC4gICovCit9OworCisvKiBUeXBlIGRlc2NyaWJpbmcgYSBQTFQgZW50cnkuICAqLworc3RydWN0IHBsdF9lbnRyeQoreworICAvKiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgJ2ptcCBpbmRpcmVjdCcgb3IgJ2ptcCAqb2Zmc2V0KCVlYnMpJy4gICovCisgIHVuc2lnbmVkIGNoYXIgam1wX2luc3RyWzJdOworICB1aW50MzJfdCBvZmZzZXRfZ290OworICAvKiBUaGUgc2Vjb25kIGluc3RydWN0aW9uIGlzICdwdXNoIGltbWVkaWF0ZScuICAqLworICB1bnNpZ25lZCBjaGFyIHB1c2hfaW5zdHI7CisgIHVpbnQzMl90IHB1c2hfaW1tOworICAvKiBGaW5hbGx5IGEgJ2ptcCByZWxhdGl2ZScuICAqLworICB1bnNpZ25lZCBjaGFyIGptcF9pbnN0cjI7CisgIHVpbnQzMl90IHBsdDBfb2Zmc2V0OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworc3RhdGljIHZvaWQKK2VsZl9pMzg2X2ZpbmFsaXplX3BsdCAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsIHNpemVfdCBuc3ltLAorCQkgICAgICAgc2l6ZV90IG5zeW1fZHluIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgRWxmX1NjbiAqc2NuOworICBYRWxmX1NoZHJfdmFyZGVmIChzaGRyKTsKKyAgRWxmX0RhdGEgKmRhdGE7CisgIEVsZl9EYXRhICpzeW1kYXRhID0gTlVMTDsKKyAgRWxmX0RhdGEgKmR5bnN5bWRhdGE7CisgIHNpemVfdCBjbnQ7CisgIGNvbnN0IGJvb2wgYnVpbGRfZHNvID0gc3RhdGVwLT5maWxlX3R5cGUgPT0gZHNvX2ZpbGVfdHlwZTsKKworICBpZiAodW5saWtlbHkgKHN0YXRlcC0+bnBsdCArIHN0YXRlcC0+bmdvdCA9PSAwKSkKKyAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUuICAqLworICAgIHJldHVybjsKKworICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdvdCBzZWN0aW9uLiAgKi8KKyAgc2NuID0gZWxmX2dldHNjbiAoc3RhdGVwLT5vdXRlbGYsIHN0YXRlcC0+Z290c2NuaWR4KTsKKyAgeGVsZl9nZXRzaGRyIChzY24sIHNoZHIpOworICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisgIGFzc2VydCAoc2hkciAhPSBOVUxMICYmIGRhdGEgIT0gTlVMTCk7CisgIEVsZjMyX0FkZHIgZ290YWRkciA9IHNoZHItPnNoX2FkZHI7CisKKyAgLyogTm93IGNyZWF0ZSB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIHRoZSAuZ290IHNlY3Rpb24uICBUaGUgZmlyc3QKKyAgICAgd29yZCBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gICovCisgIHhlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoc3RhdGVwLT5vdXRlbGYsIHN0YXRlcC0+ZHluYW1pY3NjbmlkeCksIHNoZHIpOworICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisgICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbMF0gPSBzaGRyLT5zaF9hZGRyOworCisgIC8qIFRoZSBzZWNvbmQgYW5kIHRoaXJkIGVudHJ5IGFyZSBsZWZ0IGVtcHR5IGZvciB1c2UgYnkgdGhlIGR5bmFtaWMKKyAgICAgbGlua2VyLiAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIGFyZSBwb2ludGVycyB0byB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgIGZvbGxvd2luZyB0aGUgaW5pdGlhbCBqbXAgaW5zdHJ1Y3Rpb24gaW4gdGhlIGNvcnJlc3BvbmRpbmcgUExUCisgICAgIGVudHJ5LiAgU2luY2UgdGhlIGZpcnN0IFBMVCBlbnRyeSBpcyBzcGVjaWFsIHRoZSBmaXJzdCB1c2VkIG9uZQorICAgICBoYXMgdGhlIGluZGV4IDEuICAqLworICBzY24gPSBlbGZfZ2V0c2NuIChzdGF0ZXAtPm91dGVsZiwgc3RhdGVwLT5wbHRzY25pZHgpOworICB4ZWxmX2dldHNoZHIgKHNjbiwgc2hkcik7CisgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworICBkeW5zeW1kYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKHN0YXRlcC0+b3V0ZWxmLCBzdGF0ZXAtPmR5bnN5bXNjbmlkeCksCisJCQkgICAgTlVMTCk7CisgIGFzc2VydCAoZHluc3ltZGF0YSAhPSBOVUxMKTsKKworICBpZiAoc3RhdGVwLT5zeW1zY25pZHggIT0gMCkKKyAgICB7CisgICAgICBzeW1kYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKHN0YXRlcC0+b3V0ZWxmLCBzdGF0ZXAtPnN5bXNjbmlkeCksCisJCQkgICAgIE5VTEwpOworICAgICAgYXNzZXJ0IChzeW1kYXRhICE9IE5VTEwpOworICAgIH0KKworICBmb3IgKGNudCA9IDA7IGNudCA8IHN0YXRlcC0+bnBsdDsgKytjbnQpCisgICAgeworICAgICAgYXNzZXJ0ICgoNCArIGNudCkgKiBzaXplb2YgKEVsZjMyX1dvcmQpIDw9IGRhdGEtPmRfc2l6ZSk7CisKKyAgICAgIC8qIEFkZHJlc3MgaW4gdGhlIFBMVC4gICovCisgICAgICBFbGYzMl9BZGRyIHBsdGVudHJ5YWRkciA9IHNoZHItPnNoX2FkZHIgKyAoMSArIGNudCkgKiBQTFRfRU5UUllfU0laRTsKKworICAgICAgLyogUG9pbnQgdGhlIEdPVCBlbnRyeSBhdCB0aGUgUExUIGVudHJ5LCBhZnRlciB0aGUgaW5pdGlhbCBqbXAuICAqLworICAgICAgKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVszICsgY250XSA9IHBsdGVudHJ5YWRkciArIDY7CisKKyAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIFBMVAorCSBlbnRyeS4gIFN0b3JlIHRoZSBhZGRyZXNzLCBhbHNvIGZvciB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZSBpZgorCSB0aGlzIGlzIG5lY2Vzc2FyeS4gICovCisgICAgICAoKEVsZjMyX1N5bSAqKSBkeW5zeW1kYXRhLT5kX2J1ZilbMSArIGNudF0uc3RfdmFsdWUgPSBwbHRlbnRyeWFkZHI7CisKKyAgICAgIGlmIChzeW1kYXRhICE9IE5VTEwpCisJKChFbGYzMl9TeW0gKikgc3ltZGF0YS0+ZF9idWYpW25zeW0gLSBzdGF0ZXAtPm5wbHQgKyBjbnRdLnN0X3ZhbHVlCisJICA9IHBsdGVudHJ5YWRkcjsKKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSAucGx0IHNlY3Rpb24uICAqLworICBzY24gPSBlbGZfZ2V0c2NuIChzdGF0ZXAtPm91dGVsZiwgc3RhdGVwLT5wbHRzY25pZHgpOworICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisgIGFzc2VydCAoZGF0YSAhPSBOVUxMKTsKKworICAvKiBDcmVhdGUgdGhlIGZpcnN0IGVudHJ5LiAgKi8KKyAgYXNzZXJ0IChkYXRhLT5kX3NpemUgPj0gUExUX0VOVFJZX1NJWkUpOworICBpZiAoYnVpbGRfZHNvKQorICAgIC8qIENvcHkgdGhlIGVudHJ5LiAgSXQncyBjb21wbGV0ZSwgbm8gcmVsb2NhdGlvbiBuZWVkZWQuICAqLworICAgIG1lbWNweSAoZGF0YS0+ZF9idWYsIGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBDb3B5IHRoZSBza2VsZXRvbi4gICovCisgICAgICBtZW1jcHkgKGRhdGEtPmRfYnVmLCBlbGZfaTM4Nl9wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7CisKKyAgICAgIC8qIEFuZCBmaWxsIGluIHRoZSBhZGRyZXNzZXMuICAqLworICAgICAgc3RydWN0IHBsdDBfZW50cnkgKmFkZHIgPSAoc3RydWN0IHBsdDBfZW50cnkgKikgZGF0YS0+ZF9idWY7CisgICAgICBhZGRyLT5nb3RwNF9hZGRyID0gdGFyZ2V0X2Jzd2FwXzMyIChnb3RhZGRyICsgNCk7CisgICAgICBhZGRyLT5nb3RwOF9hZGRyID0gdGFyZ2V0X2Jzd2FwXzMyIChnb3RhZGRyICsgOCk7CisgICAgfQorCisgIC8qIEZvciBEU09zIHdlIG5lZWQgR09UIG9mZnNldHMsIG90aGVyd2lzZSB0aGUgR09UIGFkZHJlc3MuICAqLworICBFbGYzMl9BZGRyIGdvdGFkZHJfb2ZmID0gYnVpbGRfZHNvID8gMCA6IGdvdGFkZHI7CisKKyAgLyogQ3JlYXRlIHRoZSByZW1haW5pbmcgZW50cmllcy4gICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBsdF90ZW1wbGF0ZQorICAgID0gYnVpbGRfZHNvID8gZWxmX2kzODZfcGljX3BsdF9lbnRyeSA6IGVsZl9pMzg2X3BsdF9lbnRyeTsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IHN0YXRlcC0+bnBsdDsgKytjbnQpCisgICAgeworICAgICAgc3RydWN0IHBsdF9lbnRyeSAqYWRkcjsKKworICAgICAgLyogQ29weSB0aGUgdGVtcGxhdGUuICAqLworICAgICAgYXNzZXJ0IChkYXRhLT5kX3NpemUgPj0gKDIgKyBjbnQpICogUExUX0VOVFJZX1NJWkUpOworICAgICAgYWRkciA9IChzdHJ1Y3QgcGx0X2VudHJ5ICopICgoY2hhciAqKSBkYXRhLT5kX2J1ZgorCQkJCSAgICsgKDEgKyBjbnQpICogUExUX0VOVFJZX1NJWkUpOworICAgICAgbWVtY3B5IChhZGRyLCBwbHRfdGVtcGxhdGUsIFBMVF9FTlRSWV9TSVpFKTsKKworICAgICAgLyogQW5kIG9uY2UgbW9yZSwgZmlsbCBpbiB0aGUgYWRkcmVzc2VzLiAgRmlyc3QgdGhlIGFkZHJlc3Mgb2YKKwkgdGhpcyBzeW1ib2wgaW4gLmdvdC4gICovCisgICAgICBhZGRyLT5vZmZzZXRfZ290ID0gdGFyZ2V0X2Jzd2FwXzMyIChnb3RhZGRyX29mZgorCQkJCQkgICsgKDMgKyBjbnQpICogc2l6ZW9mIChFbGYzMl9BZGRyKSk7CisgICAgICAvKiBPZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KKyAgICAgIGFkZHItPnB1c2hfaW1tID0gdGFyZ2V0X2Jzd2FwXzMyIChjbnQgKiBzaXplb2YgKEVsZjMyX1JlbCkpOworICAgICAgLyogT2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLworICAgICAgYWRkci0+cGx0MF9vZmZzZXQgPSB0YXJnZXRfYnN3YXBfMzIgKC0oMiArIGNudCkgKiBQTFRfRU5UUllfU0laRSk7CisgICAgfQorCisgIC8qIENyZWF0ZSB0aGUgLnJlbC5wbHQgc2VjdGlvbiBkYXRhLiAgSXQgc2ltcGx5IG1lYW5zIHJlbG9jYXRpb25zCisgICAgIGFkZHJlc3NpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIC5nb3Qgc2VjdGlvbi4gIFRoZQorICAgICBzZWN0aW9uIG5hbWUgaXMgbWlzbGVhZGluZy4gICovCisgIHNjbiA9IGVsZl9nZXRzY24gKHN0YXRlcC0+b3V0ZWxmLCBzdGF0ZXAtPnBsdHJlbHNjbmlkeCk7CisgIHhlbGZfZ2V0c2hkciAoc2NuLCBzaGRyKTsKKyAgZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworICBhc3NlcnQgKHNoZHIgIT0gTlVMTCAmJiBkYXRhICE9IE5VTEwpOworCisgIC8qIFVwZGF0ZSB0aGUgc2hfbGluayB0byBwb2ludCB0byB0aGUgc2VjdGlvbiBiZWluZyBtb2RpZmllZC4gIFdlCisgICAgIHBvaW50IGl0IGhlcmUgKGNvcnJlY3RseSkgdG8gdGhlIC5nb3Qgc2VjdGlvbi4gIFNvbWUgbGlua2VycworICAgICAoZS5nLiwgdGhlIEdOVSBiaW51dGlscyBsaW5rZXIpIHBvaW50IHRvIHRoZSAucGx0IHNlY3Rpb24uICBUaGlzCisgICAgIGlzIHdyb25nIHNpbmNlIHRoZSAucGx0IHNlY3Rpb24gaXNuJ3QgbW9kaWZpZWQgZXZlbiB0aG91Z2ggdGhlCisgICAgIG5hbWUgLnJlbC5wbHQgc3VnZ2VzdHMgdGhhdCB0aGlzIGlzIGNvcnJlY3QuICAqLworICBzaGRyLT5zaF9saW5rID0gc3RhdGVwLT5keW5zeW1zY25pZHg7CisgIHNoZHItPnNoX2luZm8gPSBzdGF0ZXAtPmdvdHNjbmlkeDsKKyAgKHZvaWQpIHhlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7CisKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBzdGF0ZXAtPm5wbHQ7ICsrY250KQorICAgIHsKKyAgICAgIFhFbGZfUmVsX3ZhcmRlZiAocmVsKTsKKworICAgICAgYXNzZXJ0ICgoMSArIGNudCkgKiBzaXplb2YgKEVsZjMyX1JlbCkgPD0gZGF0YS0+ZF9zaXplKTsKKyAgICAgIHhlbGZfZ2V0cmVsX3B0ciAoZGF0YSwgY250LCByZWwpOworICAgICAgcmVsLT5yX29mZnNldCA9IGdvdGFkZHIgKyAoMyArIGNudCkgKiBzaXplb2YgKEVsZjMyX0FkZHIpOworICAgICAgLyogVGhlIHN5bWJvbCB0YWJsZSBlbnRyaWVzIGZvciB0aGUgZnVuY3Rpb25zIGZyb20gRFNPcyBhcmUgYXQKKwkgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKyAgICAgIHJlbC0+cl9pbmZvID0gWEVMRl9SX0lORk8gKDEgKyBjbnQsIFJfMzg2X0pNUF9TTE9UKTsKKyAgICAgICh2b2lkKSB4ZWxmX3VwZGF0ZV9yZWwgKGRhdGEsIGNudCwgcmVsKTsKKyAgICB9Cit9CisKKworc3RhdGljIGludAorZWxmX2kzODZfcmVsX3R5cGUgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkpCit7CisgIC8qIEVMRi9pMzg2IHVzZXMgUkVMLiAgKi8KKyAgcmV0dXJuIERUX1JFTDsKK30KKworCitzdGF0aWMgdm9pZAorZWxmX2kzODZfY291bnRfcmVsb2NhdGlvbnMgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwLCBzdHJ1Y3Qgc2NuaW5mbyAqc2NuaW5mbykKK3sKKyAgLyogV2UgZ28gdGhyb3VnaCB0aGUgbGlzdCBvZiBpbnB1dCBzZWN0aW9ucyBhbmQgY291bnQgdGhvc2UgcmVsb2NhdGlvbnMKKyAgICAgd2hpY2ggYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBsaW5rZXIuICBBdCB0aGUgc2FtZSB0aW1lIHdlIGhhdmUgdG8KKyAgICAgc2VlIGhvdyBtYW55IEdPVCBlbnRyaWVzIHdlIG5lZWQgYW5kIGhvdyBtdWNoIC5ic3Mgc3BhY2UgaXMgbmVlZGVkCisgICAgIGZvciBjb3B5IHJlbG9jYXRpb25zLiAgKi8KKyAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuaW5mby0+c2NuLCBOVUxMKTsKKyAgWEVsZl9TaGRyICpzaGRyID0gJlNDTklORk9fU0hEUiAoc2NuaW5mby0+c2hkcik7CisgIHNpemVfdCBtYXhjbnQgPSBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKKyAgc2l6ZV90IHJlbHNpemUgPSAwOworICBzaXplX3QgY250OworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKyAgYXNzZXJ0IChzaGRyLT5zaF90eXBlID09IFNIVF9SRUwpOworCisgIGZvciAoY250ID0gMDsgY250IDwgbWF4Y250OyArK2NudCkKKyAgICB7CisgICAgICBYRWxmX1JlbF92YXJkZWYgKHJlbCk7CisKKyAgICAgIHhlbGZfZ2V0cmVsIChkYXRhLCBjbnQsIHJlbCk7CisgICAgICAvKiBYWFggU2hvdWxkIHdlIGNvbXBsYWluIGFib3V0IGZhaWxpbmcgYWNjZXNzZXM/ICAqLworICAgICAgaWYgKHJlbCAhPSBOVUxMKQorCXsKKwkgIEVsZjMyX1dvcmQgcl9zeW0gPSBYRUxGX1JfU1lNIChyZWwtPnJfaW5mbyk7CisKKwkgIHN3aXRjaCAoWEVMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKwkgICAgeworCSAgICBjYXNlIFJfMzg2X0dPVDMyOgorCSAgICAgIGlmICghIHNjbmluZm8tPmZpbGVpbmZvLT5zeW1yZWZbcl9zeW1dLT5kZWZpbmVkKQorCQlyZWxzaXplICs9IHNpemVvZiAoRWxmMzJfUmVsKTsKKworCSAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBpcyBub3QgZW1pdHRlZCBpbiB0aGUgb3V0cHV0IGZpbGUgYnV0CisJCSByZXF1aXJlcyBhIEdPVCBlbnRyeS4gICovCisJICAgICAgKytzdGF0ZXAtPm5nb3Q7CisJICAgICAgKytzdGF0ZXAtPm5yZWxfZ290OworCisJICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKworCSAgICBjYXNlIFJfMzg2X0dPVE9GRjoKKwkgICAgY2FzZSBSXzM4Nl9HT1RQQzoKKwkgICAgICBzdGF0ZXAtPm5lZWRfZ290ID0gdHJ1ZTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfMzg2XzMyOgorCSAgICBjYXNlIFJfMzg2X1BDMzI6CisJICAgICAgLyogVGhlc2UgcmVsb2NhdGlvbnMgY2F1c2UgdGV4dCByZWxvY2F0aW9ucyBpbiBEU09zLiAgKi8KKwkgICAgICBpZiAobGlua2VkX2Zyb21fZHNvX3AgKHNjbmluZm8sIHJfc3ltKSkKKwkJeworCQkgIGlmIChzdGF0ZXAtPmZpbGVfdHlwZSA9PSBkc29fZmlsZV90eXBlKQorCQkgICAgeworCQkgICAgICByZWxzaXplICs9IHNpemVvZiAoRWxmMzJfUmVsKTsKKwkJICAgICAgc3RhdGVwLT5kdF9mbGFncyB8PSBERl9URVhUUkVMOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgLyogTm9uLWZ1bmN0aW9uIG9iamVjdHMgZnJvbSBhIERTTyBuZWVkIHRvIGdldCBhCisJCQkgY29weSByZWxvY2F0aW9uLiAgKi8KKwkJICAgICAgc3ltID0gc2NuaW5mby0+ZmlsZWluZm8tPnN5bXJlZltyX3N5bV07CisKKwkJICAgICAgLyogT25seSBkbyB0aGlzIGlmIHdlIGhhdmUgbm90IHJlcXVlc3RlZCBhIGNvcHkKKwkJCSByZWxvY2F0aW9uIGFscmVhZHkuICAqLworCQkgICAgICBpZiAodW5saWtlbHkgKHN5bS0+dHlwZSAhPSBTVFRfRlVOQykgJiYgISBzeW0tPm5lZWRfY29weSkKKwkJCXsKKwkJCSAgc3ltLT5uZWVkX2NvcHkgPSAxOworCQkJICArK3N0YXRlcC0+bmNvcHk7CisJCQkgIHJlbHNpemUgKz0gc2l6ZW9mIChFbGYzMl9SZWwpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAoc3RhdGVwLT5maWxlX3R5cGUgPT0gZHNvX2ZpbGVfdHlwZQorCQkgICAgICAgJiYgcl9zeW0gPj0gU0NOSU5GT19TSERSIChzY25pbmZvLT5maWxlaW5mby0+c2NuaW5mb1tzaGRyLT5zaF9saW5rXS5zaGRyKS5zaF9pbmZvCisJCSAgICAgICAmJiBzY25pbmZvLT5maWxlaW5mby0+c3ltcmVmW3Jfc3ltXS0+b3V0ZHluc3ltaWR4ICE9IDAKKwkJICAgICAgICYmIFhFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl8zODZfMzIpCisJCXJlbHNpemUgKz0gc2l6ZW9mIChFbGYzMl9SZWwpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl8zODZfUExUMzI6CisJICAgICAgLyogV2UgbWlnaHQgbmVlZCBhIFBMVCBlbnRyeS4gIEJ1dCB3ZSBjYW5ub3Qgc2F5IGZvciBzdXJlCisJCSBoZXJlIHNpbmNlIG9uZSBvZiB0aGUgc3ltYm9scyBtaWdodCB0dXJuIHVwIGJlaW5nCisJCSBkZWZpbmVkIGluIHRoZSBleGVjdXRhYmxlIChpZiB3ZSBjcmVhdGUgc3VjaCBhIHRoaW5nKS4KKwkJIElmIGEgRFNPIGlzIGNyZWF0ZWQgd2Ugc3RpbGwgbWlnaHQgdXNlIGEgbG9jYWwKKwkJIGRlZmluaXRpb24uCisKKwkJIElmIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQgYW5kIHdlIGFyZSBub3QgY3JlYXRpbmcKKwkJIGEgc3RhdGljYWxseSBsaW5rZWQgYmluYXJ5LCB0aGVuIHdlIG5lZWQgaW4gYW55IGNhc2UKKwkJIGEgUExUIGVudHJ5LiAgKi8KKwkgICAgICBpZiAoISBzY25pbmZvLT5maWxlaW5mby0+c3ltcmVmW3Jfc3ltXS0+ZGVmaW5lZCkKKwkJeworCQkgIGFzc2VydCAoIXN0YXRlcC0+c3RhdGljYWxseSk7CisKKwkJICBzeW0gPSBzY25pbmZvLT5maWxlaW5mby0+c3ltcmVmW3Jfc3ltXTsKKwkJICBzeW0tPnR5cGUgPSBTVFRfRlVOQzsKKwkJICBzeW0tPmluX2RzbyA9IDE7CisJCSAgc3ltLT5kZWZpbmVkID0gMTsKKworCQkgIC8qIFJlbW92ZSBmcm9tIHRoZSBsaXN0IG9mIHVucmVzb2x2ZWQgc3ltYm9scy4gICovCisJCSAgLS1zdGF0ZXAtPm51bnJlc29sdmVkOworCQkgIGlmICghIHN5bS0+d2VhaykKKwkJICAgIC0tc3RhdGVwLT5udW5yZXNvbHZlZF9ub253ZWFrOworCQkgIENEQkxfTElTVF9ERUwgKHN0YXRlcC0+dW5yZXNvbHZlZCwgc3ltKTsKKworCQkgIC8qIEFkZCB0byB0aGUgbGlzdCBvZiBzeW1ib2xzIHdlIGV4cGVjdCBmcm9tIGEgRFNPLiAgKi8KKwkJICArK3N0YXRlcC0+bnBsdDsKKwkJICArK3N0YXRlcC0+bmZyb21fZHNvOworCQkgIENEQkxfTElTVF9BRERfUkVBUiAoc3RhdGVwLT5mcm9tX2Rzbywgc3ltKTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl8zODZfVExTX0dEOgorCSAgICBjYXNlIFJfMzg2X1RMU19MRE06CisJICAgIGNhc2UgUl8zODZfVExTX0dEXzMyOgorCSAgICBjYXNlIFJfMzg2X1RMU19HRF9QVVNIOgorCSAgICBjYXNlIFJfMzg2X1RMU19HRF9DQUxMOgorCSAgICBjYXNlIFJfMzg2X1RMU19HRF9QT1A6CisJICAgIGNhc2UgUl8zODZfVExTX0xETV8zMjoKKwkgICAgY2FzZSBSXzM4Nl9UTFNfTERNX1BVU0g6CisJICAgIGNhc2UgUl8zODZfVExTX0xETV9DQUxMOgorCSAgICBjYXNlIFJfMzg2X1RMU19MRE1fUE9QOgorCSAgICBjYXNlIFJfMzg2X1RMU19MRE9fMzI6CisJICAgIGNhc2UgUl8zODZfVExTX0lFXzMyOgorCSAgICBjYXNlIFJfMzg2X1RMU19MRV8zMjoKKwkgICAgICAvKiBYWFggKi8KKwkgICAgICBhYm9ydCAoKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfMzg2X05PTkU6CisJICAgICAgLyogTm90aGluZyB0byBiZSBkb25lLiAgKi8KKwkgICAgICBicmVhazsKKworCSAgICAgIC8qIFRoZXNlIHJlbG9jYXRpb24gc2hvdWxkIG5ldmVyIGJlIGdlbmVyYXRlZCBieSBhbgorCQkgYXNzZW1ibGVyLiAgKi8KKwkgICAgY2FzZSBSXzM4Nl9DT1BZOgorCSAgICBjYXNlIFJfMzg2X0dMT0JfREFUOgorCSAgICBjYXNlIFJfMzg2X0pNUF9TTE9UOgorCSAgICBjYXNlIFJfMzg2X1JFTEFUSVZFOgorCSAgICBjYXNlIFJfMzg2X1RMU19EVFBNT0QzMjoKKwkgICAgY2FzZSBSXzM4Nl9UTFNfRFRQT0ZGMzI6CisJICAgIGNhc2UgUl8zODZfVExTX1RQT0ZGMzI6CisJICAgICAgLyogVW5rbm93biByZWxvY2F0aW9uLiAgKi8KKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgc2NuaW5mby0+cmVsc2l6ZSA9IHJlbHNpemU7Cit9CisKKworc3RhdGljIHZvaWQKK2VsZl9pMzg2X2NyZWF0ZV9yZWxvY2F0aW9ucyAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsCisJCQkgICAgIGNvbnN0IEVsZjMyX1dvcmQgKmRibGluZGlyZWN0IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBnb3Qgc2VjdGlvbi4gICovCisgIEVsZl9TY24gKnBsdHNjbiA9IGVsZl9nZXRzY24gKHN0YXRlcC0+b3V0ZWxmLCBzdGF0ZXAtPnBsdHNjbmlkeCk7CisgIEVsZjMyX1NoZHIgKnNoZHIgPSBlbGYzMl9nZXRzaGRyIChwbHRzY24pOworICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisgIEVsZjMyX0FkZHIgcGx0YWRkciA9IHNoZHItPnNoX2FkZHI7CisKKyAgRWxmX1NjbiAqZ290c2NuID0gZWxmX2dldHNjbiAoc3RhdGVwLT5vdXRlbGYsIHN0YXRlcC0+Z290c2NuaWR4KTsKKyAgc2hkciA9IGVsZjMyX2dldHNoZHIgKGdvdHNjbik7CisgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKyAgRWxmMzJfQWRkciBnb3RhZGRyID0gc2hkci0+c2hfYWRkcjsKKworICBFbGZfU2NuICpyZWxkeW5zY24gPSBlbGZfZ2V0c2NuIChzdGF0ZXAtPm91dGVsZiwgc3RhdGVwLT5yZWxkeW5zY25pZHgpOworICBFbGZfRGF0YSAqcmVsZHluZGF0YSA9IGVsZl9nZXRkYXRhIChyZWxkeW5zY24sIE5VTEwpOworCisgIHNpemVfdCBucmVsZHluID0gMDsKKyNkZWZpbmUgbmdvdF91c2VkICgzICsgc3RhdGVwLT5ucGx0ICsgbnJlbGR5bikKKworICBzdHJ1Y3Qgc2NuaW5mbyAqZmlyc3QgPSBzdGF0ZXAtPnJlbGxpc3QtPm5leHQ7CisgIHN0cnVjdCBzY25pbmZvICpydW5wID0gZmlyc3Q7CisgIGRvCisgICAgeworICAgICAgWEVsZl9TaGRyICpyc2hkciA9ICZTQ05JTkZPX1NIRFIgKHJ1bnAtPnNoZHIpOworICAgICAgRWxmX0RhdGEgKnJlbGRhdGEgPSBlbGZfZ2V0ZGF0YSAocnVucC0+c2NuLCBOVUxMKTsKKyAgICAgIGludCBucmVscyA9IHJzaGRyLT5zaF9zaXplIC8gcnNoZHItPnNoX2VudHNpemU7CisKKyAgICAgIC8qIFdlIHdpbGwgbmVlZCB0aGUgZm9sbG93aW5nIHZsYXVlcyBhIGNvdXBsZSBvZiB0aW1lcy4gIEhlbHAKKwkgdGhlIGNvbXBpbGVyIGFuZCBpbXByb3ZlIHJlYWRhYmlsaXR5LiAgKi8KKyAgICAgIHN0cnVjdCBzeW1ib2wgKipzeW1yZWYgPSBydW5wLT5maWxlaW5mby0+c3ltcmVmOworICAgICAgc3RydWN0IHNjbmluZm8gKnNjbmluZm8gPSBydW5wLT5maWxlaW5mby0+c2NuaW5mbzsKKworICAgICAgLyogVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBpbnB1dCBzZWN0aW9uIHdlIGFyZSBsb29raW5nIGF0IGluCisJIHRoZSBvdXRwdXQgZmlsZS4gICovCisgICAgICBYRWxmX0FkZHIgaW5zY25vZmZzZXQgPSBzY25pbmZvW3JzaGRyLT5zaF9pbmZvXS5vZmZzZXQ7CisKKyAgICAgIC8qIFRoZSB0YXJnZXQgc2VjdGlvbi4gIFdlIHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBpbnB1dCBmaWxlLiAgKi8KKyAgICAgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbmluZm9bcnNoZHItPnNoX2luZm9dLnNjbiwgTlVMTCk7CisKKyAgICAgIC8qIFdlIGNhbm5vdCBoYW5kbGUgcmVsb2NhdGlvbnMgYWdhaW5zdCBtZXJnZS1hYmxlIHNlY3Rpb25zLiAgKi8KKyAgICAgIGFzc2VydCAoKFNDTklORk9fU0hEUiAoc2NuaW5mb1tyc2hkci0+c2hfbGlua10uc2hkcikuc2hfZmxhZ3MKKwkgICAgICAgJiBTSEZfTUVSR0UpID09IDApOworCisgICAgICAvKiBDYWNoZSB0aGUgYWNjZXNzIHRvIHRoZSBzeW1ib2wgdGFibGUgZGF0YS4gICovCisgICAgICBFbGZfRGF0YSAqc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzY25pbmZvW3JzaGRyLT5zaF9saW5rXS5zY24sIE5VTEwpOworCisgICAgICBpbnQgY250OworICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBucmVsczsgKytjbnQpCisJeworCSAgWEVsZl9SZWxfdmFyZGVmIChyZWwpOworCSAgWEVsZl9SZWwgKnJlbDI7CisJICB4ZWxmX2dldHJlbCAocmVsZGF0YSwgY250LCByZWwpOworCSAgYXNzZXJ0IChyZWwgIT0gTlVMTCk7CisJICBYRWxmX0FkZHIgcmVsYWRkciA9IGluc2Nub2Zmc2V0ICsgcmVsLT5yX29mZnNldDsKKwkgIFhFbGZfQWRkciB2YWx1ZTsKKworCSAgc2l6ZV90IGlkeCA9IFhFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKwkgIGlmIChpZHggPCBydW5wLT5maWxlaW5mby0+bmxvY2Fsc3ltYm9scykKKwkgICAgeworCSAgICAgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKwkgICAgICB4ZWxmX2dldHN5bSAoc3ltZGF0YSwgaWR4LCBzeW0pOworCisJICAgICAgLyogVGhlIHZhbHVlIGp1c3QgZGVwZW5kcyBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIHJlZmVyZW5jZWQKKwkJIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIGFuZCB0aGUgYWRkZW5kLiAgKi8KKwkgICAgICB2YWx1ZSA9IHNjbmluZm9bc3ltLT5zdF9zaG5keF0ub2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3ltcmVmW2lkeF0tPmluX2RzbykKKwkgICAgeworCSAgICAgIC8qIE1FUkdFLlZBTFVFIGNvbnRhaW5zIHRoZSBQTFQgaW5kZXguICBXZSBoYXZlIHRvIGFkZCAxIHNpbmNlCisJCSB0aGVyZSBpcyB0aGlzIG9uZSBzcGVjaWFsIFBMVCBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nLiAgKi8KKwkgICAgICBhc3NlcnQgKHN5bXJlZltpZHhdLT5tZXJnZS52YWx1ZSAhPSAwCisJCSAgICAgIHx8IHN5bXJlZltpZHhdLT50eXBlICE9IFNUVF9GVU5DKTsKKwkgICAgICB2YWx1ZSA9IHBsdGFkZHIgKyBzeW1yZWZbaWR4XS0+bWVyZ2UudmFsdWUgKiBQTFRfRU5UUllfU0laRTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB2YWx1ZSA9IHN5bXJlZltpZHhdLT5tZXJnZS52YWx1ZTsKKworCSAgLyogQWRkcmVzcyBvZiB0aGUgcmVsb2NhdGVkIG1lbW9yeSBpbiB0aGUgZGF0YSBidWZmZXIuICAqLworCSAgdm9pZCAqcmVsbG9jID0gKGNoYXIgKikgZGF0YS0+ZF9idWYgKyByZWwtPnJfb2Zmc2V0OworCisJICBzd2l0Y2ggKFhFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJICAgIHsKKwkgICAgICAvKiBUaGVzZSB0aHJlZSBjYXNlcyBjYW4gYmUgaGFuZGxlZCB0b2dldGhlciBzaW5jZSB0aGUKKwkJIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIFJfMzg2X0dPVFBDIHJlbG9jYXRpb24gaXMKKwkJIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyB3aGljaCBoYXMgYSB2YWx1ZSBjb3JyZXNwb25kaW5nCisJCSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgR09UIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgUExUCisJCSBlbnRyeSByZXF1aXJlZCBmb3IgUl8zODZfUExUMzIgaXMgY29tcHV0ZWQgYWJvdmUuICAqLworCSAgICBjYXNlIFJfMzg2X1BDMzI6CisJICAgIGNhc2UgUl8zODZfR09UUEM6CisJICAgIGNhc2UgUl8zODZfUExUMzI6CisJICAgICAgdmFsdWUgLT0gcmVsYWRkcjsKKwkgICAgICAvKiBGQUxMVEhST1VHSCAqLworCisJICAgIGNhc2UgUl8zODZfMzI6CisJICAgICAgaWYgKGxpbmtlZF9mcm9tX2Rzb19wIChzY25pbmZvLCBpZHgpCisJCSAgJiYgc3RhdGVwLT5maWxlX3R5cGUgIT0gZHNvX2ZpbGVfdHlwZQorCQkgICYmIHN5bXJlZltpZHhdLT50eXBlICE9IFNUVF9GVU5DKQorCQl7CisJCSAgdmFsdWUgPSAobGRfc3RhdGUuY29weV9zZWN0aW9uLT5vZmZzZXQKKwkJCSAgICsgc3ltcmVmW2lkeF0tPm1lcmdlLnZhbHVlKTsKKworCQkgIGlmICh1bmxpa2VseSAoc3ltcmVmW2lkeF0tPm5lZWRfY29weSkpCisJCSAgICB7CisJCSAgICAgIC8qIEFkZCBhIHJlbG9jYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgR09UIGVudHJ5LiAgKi8KKwkJICAgICAgYXNzZXJ0IChzeW1yZWZbaWR4XS0+b3V0ZHluc3ltaWR4ICE9IDApOworI2lmIE5BVElWRV9FTEYgIT0gMAorCQkgICAgICB4ZWxmX2dldHJlbF9wdHIgKHJlbGR5bmRhdGEsIG5yZWxkeW4sIHJlbDIpOworI2Vsc2UKKwkJICAgICAgcmVsMiA9ICZyZWxfbWVtOworI2VuZGlmCisJCSAgICAgIHJlbDItPnJfb2Zmc2V0ID0gdmFsdWU7CisJCSAgICAgIHJlbDItPnJfaW5mbworCQkJPSBYRUxGX1JfSU5GTyAoc3ltcmVmW2lkeF0tPm91dGR5bnN5bWlkeCwgUl8zODZfQ09QWSk7CisJCSAgICAgICh2b2lkKSB4ZWxmX3VwZGF0ZV9yZWwgKHJlbGR5bmRhdGEsIG5yZWxkeW4sIHJlbDIpOworCQkgICAgICArK25yZWxkeW47CisKKwkJICAgICAgLyogVXBkYXRlIHRoZSBzeW1ib2wgdGFibGUgcmVjb3JkIGZvciB0aGUgbmV3CisJCQkgYWRkcmVzcy4gICovCisJCSAgICAgIEVsZjMyX1dvcmQgc3ltaWR4ID0gc3ltcmVmW2lkeF0tPm91dGR5bnN5bWlkeDsKKwkJICAgICAgRWxmX1NjbiAqc3ltc2NuID0gZWxmX2dldHNjbiAoc3RhdGVwLT5vdXRlbGYsCisJCQkJCQkgICAgc3RhdGVwLT5keW5zeW1zY25pZHgpOworCQkgICAgICBFbGZfRGF0YSAqb3V0c3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOworCQkgICAgICBhc3NlcnQgKG91dHN5bWRhdGEgIT0gTlVMTCk7CisJCSAgICAgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKwkJICAgICAgeGVsZl9nZXRzeW0gKG91dHN5bWRhdGEsIHN5bWlkeCwgc3ltKTsKKwkJICAgICAgc3ltLT5zdF92YWx1ZSA9IHZhbHVlOworCQkgICAgICBzeW0tPnN0X3NobmR4ID0gc3RhdGVwLT5jb3B5X3NlY3Rpb24tPm91dHNjbm5keDsKKwkJICAgICAgKHZvaWQpIHhlbGZfdXBkYXRlX3N5bSAob3V0c3ltZGF0YSwgc3ltaWR4LCBzeW0pOworCisJCSAgICAgIHN5bWlkeCA9IHN5bXJlZltpZHhdLT5vdXRzeW1pZHg7CisJCSAgICAgIGlmIChzeW1pZHggIT0gMCkKKwkJCXsKKwkJCSAgc3ltaWR4ID0gc3RhdGVwLT5kYmxpbmRpcmVjdFtzeW1pZHhdOworCQkJICBzeW1zY24gPSBlbGZfZ2V0c2NuIChzdGF0ZXAtPm91dGVsZiwKKwkJCQkJICAgICAgIHN0YXRlcC0+c3ltc2NuaWR4KTsKKwkJCSAgb3V0c3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOworCQkJICBhc3NlcnQgKG91dHN5bWRhdGEgIT0gTlVMTCk7CisJCQkgIHhlbGZfZ2V0c3ltIChvdXRzeW1kYXRhLCBzeW1pZHgsIHN5bSk7CisJCQkgIHN5bS0+c3RfdmFsdWUgPSB2YWx1ZTsKKwkJCSAgc3ltLT5zdF9zaG5keCA9IHN0YXRlcC0+Y29weV9zZWN0aW9uLT5vdXRzY25uZHg7CisJCQkgICh2b2lkKSB4ZWxmX3VwZGF0ZV9zeW0gKG91dHN5bWRhdGEsIHN5bWlkeCwgc3ltKTsKKwkJCX0KKworCQkgICAgICAvKiBSZW1lbWJlciB0aGF0IHdlIHNldCB1cCB0aGUgY29weSByZWxvY2F0aW9uLiAgKi8KKwkJICAgICAgc3ltcmVmW2lkeF0tPm5lZWRfY29weSA9IDA7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChzdGF0ZXAtPmZpbGVfdHlwZSA9PSBkc29fZmlsZV90eXBlCisJCSAgICAgICAmJiBpZHggPj0gU0NOSU5GT19TSERSIChzY25pbmZvW3JzaGRyLT5zaF9saW5rXS5zaGRyKS5zaF9pbmZvCisJCSAgICAgICAmJiBzeW1yZWZbaWR4XS0+b3V0ZHluc3ltaWR4ICE9IDApCisJCXsKKyNpZiBOQVRJVkVfRUxGICE9IDAKKwkJICB4ZWxmX2dldHJlbF9wdHIgKHJlbGR5bmRhdGEsIG5yZWxkeW4sIHJlbDIpOworI2Vsc2UKKwkJICByZWwyID0gJnJlbF9tZW07CisjZW5kaWYKKwkJICByZWwyLT5yX29mZnNldCA9IHZhbHVlOworCQkgIHJlbDItPnJfaW5mbworCQkgICAgPSBYRUxGX1JfSU5GTyAoc3ltcmVmW2lkeF0tPm91dGR5bnN5bWlkeCwgUl8zODZfMzIpOworCQkgICh2b2lkKSB4ZWxmX3VwZGF0ZV9yZWwgKHJlbGR5bmRhdGEsIG5yZWxkeW4sIHJlbDIpOworCQkgICsrbnJlbGR5bjsKKworCQkgIHZhbHVlID0gMDsKKwkJfQorCSAgICAgIGFkZF80dWJ5dGVfdW5hbGlnbmVkIChyZWxsb2MsIHZhbHVlKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfMzg2X0dPVDMyOgorCSAgICAgIHN0b3JlXzR1Ynl0ZV91bmFsaWduZWQgKHJlbGxvYywgbmdvdF91c2VkICogc2l6ZW9mIChFbGYzMl9BZGRyKSk7CisKKwkgICAgICAvKiBBZGQgYSByZWxvY2F0aW9uIHRvIGluaXRpYWxpemUgdGhlIEdPVCBlbnRyeS4gICovCisjaWYgTkFUSVZFX0VMRiAhPSAwCisJICAgICAgeGVsZl9nZXRyZWxfcHRyIChyZWxkeW5kYXRhLCBucmVsZHluLCByZWwyKTsKKyNlbHNlCisJICAgICAgcmVsMiA9ICZyZWxfbWVtOworI2VuZGlmCisJICAgICAgcmVsMi0+cl9vZmZzZXQgPSBnb3RhZGRyICsgbmdvdF91c2VkICogc2l6ZW9mIChFbGYzMl9BZGRyKTsKKwkgICAgICByZWwyLT5yX2luZm8KKwkJPSBYRUxGX1JfSU5GTyAoc3ltcmVmW2lkeF0tPm91dGR5bnN5bWlkeCwgUl8zODZfR0xPQl9EQVQpOworCSAgICAgICh2b2lkKSB4ZWxmX3VwZGF0ZV9yZWwgKHJlbGR5bmRhdGEsIG5yZWxkeW4sIHJlbDIpOworCSAgICAgICsrbnJlbGR5bjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfMzg2X0dPVE9GRjoKKwkgICAgICBhZGRfNHVieXRlX3VuYWxpZ25lZCAocmVsbG9jLCB2YWx1ZSAtIGdvdGFkZHIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl8zODZfMzJQTFQ6CisJICAgIGNhc2UgUl8zODZfVExTX1RQT0ZGOgorCSAgICBjYXNlIFJfMzg2X1RMU19JRToKKwkgICAgY2FzZSBSXzM4Nl9UTFNfR09USUU6CisJICAgIGNhc2UgUl8zODZfVExTX0xFOgorCSAgICBjYXNlIFJfMzg2X1RMU19HRDoKKwkgICAgY2FzZSBSXzM4Nl9UTFNfTERNOgorCSAgICBjYXNlIFJfMzg2XzE2OgorCSAgICBjYXNlIFJfMzg2X1BDMTY6CisJICAgIGNhc2UgUl8zODZfODoKKwkgICAgY2FzZSBSXzM4Nl9QQzg6CisJICAgIGNhc2UgUl8zODZfVExTX0dEXzMyOgorCSAgICBjYXNlIFJfMzg2X1RMU19HRF9QVVNIOgorCSAgICBjYXNlIFJfMzg2X1RMU19HRF9DQUxMOgorCSAgICBjYXNlIFJfMzg2X1RMU19HRF9QT1A6CisJICAgIGNhc2UgUl8zODZfVExTX0xETV8zMjoKKwkgICAgY2FzZSBSXzM4Nl9UTFNfTERNX1BVU0g6CisJICAgIGNhc2UgUl8zODZfVExTX0xETV9DQUxMOgorCSAgICBjYXNlIFJfMzg2X1RMU19MRE1fUE9QOgorCSAgICBjYXNlIFJfMzg2X1RMU19MRE9fMzI6CisJICAgIGNhc2UgUl8zODZfVExTX0lFXzMyOgorCSAgICBjYXNlIFJfMzg2X1RMU19MRV8zMjoKKwkgICAgICAvLyBYWFggRm9yIG5vdyBmYWxsIHRocm91Z2gKKyBwcmludGYoImlnbm9yZWQgcmVsb2NhdGlvbiAlZFxuIiwgKGludCkgWEVMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSXzM4Nl9OT05FOgorCSAgICAgIC8qIE5vdGhpbmcgdG8gZG8uICAqLworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl8zODZfQ09QWToKKwkgICAgY2FzZSBSXzM4Nl9KTVBfU0xPVDoKKwkgICAgY2FzZSBSXzM4Nl9SRUxBVElWRToKKwkgICAgY2FzZSBSXzM4Nl9HTE9CX0RBVDoKKwkgICAgY2FzZSBSXzM4Nl9UTFNfRFRQTU9EMzI6CisJICAgIGNhc2UgUl8zODZfVExTX0RUUE9GRjMyOgorCSAgICBjYXNlIFJfMzg2X1RMU19UUE9GRjMyOgorCSAgICBkZWZhdWx0OgorCSAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuLiAgKi8KKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICB9CisgIHdoaWxlICgocnVucCA9IHJ1bnAtPm5leHQpICE9IGZpcnN0KTsKK30KKworCitpbnQKK2VsZl9pMzg2X2xkX2luaXQgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwKQoreworICAvKiBXZSBoYXZlIGEgZmV3IGNhbGxiYWNrcyBhdmFpbGFibGUuICAqLworICBvbGRfb3Blbl9vdXRmaWxlID0gc3RhdGVwLT5jYWxsYmFja3Mub3Blbl9vdXRmaWxlOworICBzdGF0ZXAtPmNhbGxiYWNrcy5vcGVuX291dGZpbGUgPSBlbGZfaTM4Nl9vcGVuX291dGZpbGU7CisKKyAgc3RhdGVwLT5jYWxsYmFja3MucmVsb2NhdGVfc2VjdGlvbiAgPSBlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uOworCisgIHN0YXRlcC0+Y2FsbGJhY2tzLmluaXRpYWxpemVfcGx0ID0gZWxmX2kzODZfaW5pdGlhbGl6ZV9wbHQ7CisgIHN0YXRlcC0+Y2FsbGJhY2tzLmluaXRpYWxpemVfcGx0cmVsID0gZWxmX2kzODZfaW5pdGlhbGl6ZV9wbHRyZWw7CisKKyAgc3RhdGVwLT5jYWxsYmFja3MuaW5pdGlhbGl6ZV9nb3QgPSBlbGZfaTM4Nl9pbml0aWFsaXplX2dvdDsKKworICBzdGF0ZXAtPmNhbGxiYWNrcy5maW5hbGl6ZV9wbHQgPSBlbGZfaTM4Nl9maW5hbGl6ZV9wbHQ7CisKKyAgc3RhdGVwLT5jYWxsYmFja3MucmVsX3R5cGUgPSBlbGZfaTM4Nl9yZWxfdHlwZTsKKworICBzdGF0ZXAtPmNhbGxiYWNrcy5jb3VudF9yZWxvY2F0aW9ucyA9IGVsZl9pMzg2X2NvdW50X3JlbG9jYXRpb25zOworCisgIHN0YXRlcC0+Y2FsbGJhY2tzLmNyZWF0ZV9yZWxvY2F0aW9ucyA9IGVsZl9pMzg2X2NyZWF0ZV9yZWxvY2F0aW9uczsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9sZC5jIGIvc3JjL2xkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlY2UwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sZC5jCkBAIC0wLDAgKzEsMTUwNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXJncC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8bWNoZWNrLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpb19leHQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN5c3RlbS5oPgorI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGlzdC5oIgorCisKKy8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCitzdGF0aWMgdm9pZCBwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7Cit2b2lkICgqYXJncF9wcm9ncmFtX3ZlcnNpb25faG9vaykgKEZJTEUgKiwgc3RydWN0IGFyZ3Bfc3RhdGUgKikgPSBwcmludF92ZXJzaW9uOworCisvKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLworY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzID0gUEFDS0FHRV9CVUdSRVBPUlQ7CisKKworLyogVmFsdWVzIGZvciB0aGUgdmFyaW91cyBvcHRpb25zLiAgKi8KK2VudW0KKyAgeworICAgIEFSR1Bfd2hvbGVfYXJjaGl2ZSA9IDMwMCwKKyAgICBBUkdQX25vX3dob2xlX2FyY2hpdmUsCisgICAgQVJHUF9zdGF0aWMsCisgICAgQVJHUF9keW5hbWljLAorICAgIEFSR1BfcGFnZXNpemUsCisgICAgQVJHUF9ycGF0aCwKKyAgICBBUkdQX3JwYXRoX2xpbmssCisgICAgQVJHUF9ydW5wYXRoLAorICAgIEFSR1BfcnVucGF0aF9saW5rLAorICAgIEFSR1BfdmVyc2lvbl9zY3JpcHQsCisgICAgQVJHUF9nY19zZWN0aW9ucywKKyAgICBBUkdQX25vX2djX3NlY3Rpb25zLAorICAgIEFSR1Bfbm9fdW5kZWZpbmVkLAorICAgIEFSR1BfY29uc2VydmUsCisjaWYgWVlERUJVRworICAgIEFSR1BfeXlkZWJ1ZywKKyNlbmRpZgorICB9OworCisKKy8qIERlZmluaXRpb25zIG9mIGFyZ3VtZW50cyBmb3IgYXJncCBmdW5jdGlvbnMuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQoreworICAvKiBYWFggVGhpcyBsaXN0IHdpbGwgYmUgcmVvcmRlcmVkIGFuZCBzZWN0aW9uIG5hbWVzIHdpbGwgYmUgYWRkZWQuCisgICAgIEp1c3Qgbm90IHJpZ2h0IG5vdy4gICovCisgIHsgIndob2xlLWFyY2hpdmUiLCBBUkdQX3dob2xlX2FyY2hpdmUsIE5VTEwsIDAsCisgICAgTl8oIkluY2x1ZGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dCBmcm9tIG5vdyBvbi4iKSwgMCB9LAorICB7ICJuby13aG9sZS1hcmNoaXZlIiwgQVJHUF9ub193aG9sZV9hcmNoaXZlLCBOVUxMLCAwLAorICAgIE5fKCJTdG9wIGluY2x1ZGluZyB0aGUgd2hvbGUgYXJoaXZlcyBpbiB0aGUgb3V0cHV0LiIpLCAwIH0sCisKKyAgeyAib3V0cHV0IiwgJ28nLCBOXygiRklMRSIpLCAwLCBOXygiUGxhY2Ugb3V0cHV0IGluIEZJTEUuIiksIDAgfSwKKworICB7IE5VTEwsICdPJywgTl8oIkxFVkVMIiksIE9QVElPTl9BUkdfT1BUSU9OQUwsCisgICAgTl8oIlNldCBvcHRpbWl6YXRpb24gbGV2ZWwgdG8gTEVWRUwuIiksIDAgfSwKKworICB7ICJ2ZXJib3NlIiwgJ3YnLCBOVUxMLCAwLCBOXygiVmVyYm9zZSBtZXNzYWdlcy4iKSwgMCB9LAorICB7ICJ0cmFjZSIsICd0JywgTlVMTCwgMCwgTl8oIlRyYWNlIGZpbGUgb3BlbnMuIiksIDAgfSwKKyAgeyAiY29uc2VydmUtbWVtb3J5IiwgQVJHUF9jb25zZXJ2ZSwgTlVMTCwgMCwKKyAgICBOXygiVHJhZGUgc3BlZWQgZm9yIGxlc3MgbWVtb3J5IHVzYWdlIiksIDAgfSwKKworICB7IE5VTEwsICd6JywgIktFWVdPUkQiLCBPUFRJT05fSElEREVOLCBOVUxMLCAwIH0sCisgIHsgIi16IG5vZGVmYXVsdGxpYiIsICdcMCcsIE5VTEwsIE9QVElPTl9ET0MsCisgICAgTl8oIk9iamVjdCBpcyBtYXJrZWQgdG8gbm90IHVzZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGF0IHJ1bnRpbWUuIiksIDAgfSwKKyAgeyAiLXogYWxsZXh0cmFjdCIsICdcMCcsIE5VTEwsIE9QVElPTl9ET0MsCisgICAgTl8oIlNhbWUgYXMgLS13aG9sZS1hcmNoaXZlLiIpLCAwIH0sCisgIHsgIi16IGRlZmF1bHRleHRyYWN0IiwgJ1wwJywgTlVMTCwgT1BUSU9OX0RPQywgTl8oIlwKK0RlZmF1bHQgcnVsZXMgb2YgZXh0cmFjdGluZyBmcm9tIGFyY2hpdmU7IHdlYWsgcmVmZXJlbmNlcyBhcmUgbm90IGVub3VnaC4iKSwKKyAgICAwIH0sCisgIHsgIi16IHdlYWtleHRyYWN0IiwgJ1wwJywgTlVMTCwgT1BUSU9OX0RPQywKKyAgICBOXygiV2VhayByZWZlcmVuY2VzIGNhdXNlIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlLiIpLCAwIH0sCisgIHsgIi16IG11bGRlZnMiLCAnXDAnLCBOVUxMLCBPUFRJT05fRE9DLAorICAgIE5fKCJBbGxvdyBtdWx0aXBsZSBkZWZpbml0aW9uczsgZmlyc3QgaXMgdXNlZC4iKSwgMCB9LAorICB7ICIteiBkZWZzIHwgbm9kZWZzIiwgJ1wwJywgTlVMTCwgT1BUSU9OX0RPQywKKyAgICBOXygiRGlzYWxsb3cvYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMgaW4gRFNPcy4iKSwgMCB9LAorICAgIHsgIm5vLXVuZGVmaW5lZCIsIEFSR1Bfbm9fdW5kZWZpbmVkLCBOVUxMLCBPUFRJT05fSElEREVOLCBOVUxMLCAwIH0sCisgIHsgIi16IG9yaWdpbiIsICdcMCcsIE5VTEwsIE9QVElPTl9ET0MsCisgICAgTl8oIk9iamVjdCByZXF1aXJlcyBpbW1lZGlhdGUgaGFuZGxpbmcgb2YgJE9SSUdJTi4iKSwgMCB9LAorICB7ICIteiBub3ciLCAnXDAnLCBOVUxMLCBPUFRJT05fRE9DLAorICAgIE5fKCJSZWxvY2F0aW9uIHdpbGwgbm90IGJlIHByb2Nlc3NlZCBsYXppbHkuIiksIDAgfSwKKyAgeyAiLXogbm9kZWxldGUiLCAnXDAnLCBOVUxMLCBPUFRJT05fRE9DLAorICAgIE5fKCJPYmplY3QgY2Fubm90IGJlIHVubG9hZGVkIGF0IHJ1bnRpbWUuIiksIDAgfSwKKyAgeyAiLXogaW5pdGZpcnN0IiwgJ1wwJywgTlVMTCwgT1BUSU9OX0RPQywKKyAgICBOXygiTWFyayBvYmplY3QgdG8gYmUgaW5pdGlhbGl6ZWQgZmlyc3QuIiksIDAgfSwKKyAgeyAiLXogbGF6eWxvYWQgfCBub2xhenlsb2FkIiwgJ1wwJywgTlVMTCwgT1BUSU9OX0RPQywKKyAgICBOXygiRW5hYmxlL2Rpc2FibGUgbGF6eS1sb2FkaW5nIGZsYWcgZm9yIGZvbGxvd2luZyBkZXBlbmRlbmNpZXMuIiksIDAgfSwKKyAgeyAiLXogbm9kbG9wZW4iLCAnXDAnLCBOVUxMLCBPUFRJT05fRE9DLAorICAgIE5fKCJNYXJrIG9iamVjdCBhcyBub3QgbG9hZGFibGUgd2l0aCAnZGxvcGVuJy4iKSwgMCB9LAorICB7ICIteiBpZ25vcmUgfCByZWNvcmQiLCAnXDAnLCBOVUxMLCBPUFRJT05fRE9DLAorICAgIE5fKCJJZ25vcmUvcmVjb3JkIGRlcGVuZGVuY2llcyBvbiB1bnVzZWQgRFNPcy4iKSwgMCB9LAorICB7ICIteiBzeXN0ZW1saWJyYXJ5IiwgJ1wwJywgTlVMTCwgT1BUSU9OX0RPQywKKyAgICBOXygiR2VuZXJhdGVkIERTTyB3aWxsIGJlIGEgc3lzdGVtIGxpYnJhcnkuIiksIDAgfSwKKworICB7IE5VTEwsICdsJywgTl8oIkZJTEUiKSwgT1BUSU9OX0hJRERFTiwgTlVMTCwgMCB9LAorCisgIHsgTlVMTCwgJygnLCBOVUxMLCAwLCBOXygiU3RhcnQgYSBncm91cC4iKSwgMCB9LAorICB7IE5VTEwsICcpJywgTlVMTCwgMCwgTl8oIkVuZCBhIGdyb3VwLiIpLCAwIH0sCisKKyAgeyBOVUxMLCAnTCcsIE5fKCJQQVRIIiksIDAsCisgICAgTl8oIkFkZCBQQVRIIHRvIGxpc3Qgb2YgZGlyZWN0b3JpZXMgZmlsZXMgYXJlIHNlYXJjaGVkIGluLiIpLCAwIH0sCisKKyAgeyBOVUxMLCAnYycsIE5fKCJGSUxFIiksIDAsIE5fKCJVc2UgbGlua2VyIHNjcmlwdCBpbiBGSUxFLiIpLCAwIH0sCisKKyAgeyAiZW50cnkiLCAnZScsIE5fKCJBRERSRVNTIiksIDAsIE5fKCJTZXQgZW50cnkgcG9pbnQgYWRkcmVzcy4iKSwgMCB9LAorCisgIHsgInN0YXRpYyIsIEFSR1Bfc3RhdGljLCBOVUxMLCBPUFRJT05fSElEREVOLCBOVUxMLCAwIH0sCisgIHsgIi1CIHN0YXRpYyIsIEFSR1Bfc3RhdGljLCBOVUxMLCBPUFRJT05fRE9DLAorICAgIE5fKCJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIiksIDAgfSwKKyAgeyAiZHluYW1pYyIsIEFSR1BfZHluYW1pYywgTlVMTCwgT1BUSU9OX0hJRERFTiwgTlVMTCwgMCB9LAorICB7ICItQiBkeW5hbWljIiwgQVJHUF9keW5hbWljLCBOVUxMLCBPUFRJT05fRE9DLAorICAgIE5fKCJQcmVmZXIgbGlua2luZyBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIiksIDAgfSwKKworICB7ICJleHBvcnQtZHluYW1pYyIsICdFJywgTlVMTCwgMCwgTl8oIkV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzLiIpLCAwIH0sCisKKyAgeyAic3RyaXAtYWxsIiwgJ3MnLCBOVUxMLCAwLCBOXygiU3RyaXAgYWxsIHN5bWJvbHMuIiksIDAgfSwKKyAgeyAic3RyaXAtZGVidWciLCAnUycsIE5VTEwsIDAsIE5fKCJTdHJpcCBkZWJ1Z2dpbmcgc3ltYm9scy4iKSwgMCB9LAorCisgIHsgInBhZ2VzaXplIiwgQVJHUF9wYWdlc2l6ZSwgIlNJWkUiLCAwLAorICAgIE5fKCJBc3N1bWUgcGFnZXNpemUgZm9yIHRoZSB0YXJnZXQgc3lzdGVtIHRvIGJlIFNJWkUuIiksIDAgfSwKKworICB7ICJycGF0aCIsIEFSR1BfcnBhdGgsICJQQVRIIiwgT1BUSU9OX0hJRERFTiwgTlVMTCwgMCB9LAorICB7ICJycGF0aC1saW5rIiwgQVJHUF9ycGF0aF9saW5rLCAiUEFUSCIsIE9QVElPTl9ISURERU4sIE5VTEwsIDAgfSwKKworICB7ICJydW5wYXRoIiwgQVJHUF9ydW5wYXRoLCAiUEFUSCIsIDAsIE5fKCJTZXQgcnVudGltZSBEU08gc2VhcmNoIHBhdGguIiksCisgICAgMCB9LAorICB7ICJydW5wYXRoLWxpbmsiLCBBUkdQX3J1bnBhdGhfbGluaywgIlBBVEgiLCAwLAorICAgIE5fKCJTZXQgbGluayB0aW1lIERTTyBzZWFyY2ggcGF0aC4iKSwgMCB9LAorCisgIHsgTlVMTCwgJ2knLCBOVUxMLCAwLCBOXygiSWdub3JlIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4iKSwKKyAgICAwIH0sCisKKyAgeyAidmVyc2lvbi1zY3JpcHQiLCBBUkdQX3ZlcnNpb25fc2NyaXB0LCAiRklMRSIsIDAsCisgICAgTl8oIlJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIEZJTEUuIiksIDAgfSwKKworICB7ICJlbXVsYXRpb24iLCAnbScsICJOQU1FIiwgMCwgTl8oIlNldCBlbXVsYXRpb24gdG8gTkFNRS4iKSwgMCB9LAorCisgIHsgInNoYXJlZCIsICdHJywgTlVMTCwgMCwgTl8oIkdlbmVyYXRlIGR5bmFtaWMgc2hhcmVkIG9iamVjdC4iKSwgMCB9LAorICB7IE5VTEwsICdyJywgTlVMTCwgMEwsIE5fKCJHZW5lcmF0ZSByZWxvY2F0YWJsZSBvYmplY3QuIiksIDAgfSwKKworICB7IE5VTEwsICdCJywgIktFWVdPUkQiLCBPUFRJT05fSElEREVOLCAiIiwgMCB9LAorICB7ICItQiBsb2NhbCIsICdCJywgTlVMTCwgT1BUSU9OX0RPQywKKyAgICBOXygiQ2F1c2VzIHN5bWJvbCBub3QgYXNzaWduZWQgdG8gYSB2ZXJzaW9uIGJlIHJlZHVjZWQgdG8gbG9jYWwuIiksIDAgfSwKKworICB7ICJnYy1zZWN0aW9ucyIsIEFSR1BfZ2Nfc2VjdGlvbnMsIE5VTEwsIDAsIE5fKCJSZW1vdmUgdW51c2VkIHNlY3Rpb25zLiIpLAorICAgIDAgfSwKKyAgeyAibm8tZ2Mtc2VjdGlvbnMiLCBBUkdQX25vX2djX3NlY3Rpb25zLCBOVUxMLCAwLAorICAgIE5fKCJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zLiIpLCAwIH0sCisKKyAgeyAic29uYW1lIiwgJ2gnLCAiTkFNRSIsIDAsIE5fKCJTZXQgc29uYW1lIG9mIHNoYXJlZCBvYmplY3QuIiksIDAgfSwKKyAgeyAiZHluYW1pYy1saW5rZXIiLCAnSScsICJOQU1FIiwgMCwgTl8oIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgbmFtZS4iKSwgMCB9LAorCisgIHsgTlVMTCwgJ1EnLCAiWU4iLCBPUFRJT05fSElEREVOLCBOVUxMLCAwIH0sCisgIHsgIi1RIHkgfCBuIiwgJ1EnLCBOVUxMLCBPUFRJT05fRE9DLAorICAgIE5fKCJBZGQvc3VwcHJlc3MgYWRkaXRpb24gaW5kZW50aWZ5aW5nIGxpbmstZWRpdG9yIHRvIC5jb21tZW50IHNlY3Rpb24iKSwKKyAgICAwIH0sCisKKyNpZiBZWURFQlVHCisgIHsgInl5ZGVidWciLCBBUkdQX3l5ZGVidWcsIE5VTEwsIDAsCisgICAgTl8oIlNlbGVjdCB0byBnZXQgcGFyc2VyIGRlYnVnIGluZm9ybWF0aW9uIiksIDAgfSwKKyNlbmRpZgorCisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Cit9OworCisvKiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRvY1tdID0gTl8oIkNvbWJpbmUgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLiIpOworCisvKiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4gICovCitzdGF0aWMgY29uc3QgY2hhciBhcmdzX2RvY1tdID0gTl8oIltGSUxFXS4uLiIpOworCisvKiBQcm90b3R5cGUgZm9yIG9wdGlvbiBoYW5kbGVyLiAgKi8KK3N0YXRpYyBlcnJvcl90IHBhcnNlX29wdF8xc3QgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBlcnJvcl90IHBhcnNlX29wdF8ybmQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgc3RydWN0IGFyZ3AgYXJncF8xc3QgPQoreworICBvcHRpb25zLCBwYXJzZV9vcHRfMXN0LCBhcmdzX2RvYywgZG9jLCBOVUxMLCBOVUxMLCBOVUxMCit9Oworc3RhdGljIHN0cnVjdCBhcmdwIGFyZ3BfMm5kID0KK3sKKyAgb3B0aW9ucywgcGFyc2Vfb3B0XzJuZCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworCisvKiBMaW5rZXIgc3RhdGUuICBUaGlzIGNvbnRhaW5zIGFsbCBnbG9iYWwgaW5mb3JtYXRpb24uICAqLworc3RydWN0IGxkX3N0YXRlIGxkX3N0YXRlOworCisvKiBMaXN0IG9mIHRoZSBpbnB1dCBmaWxlcy4gICovCitzdGF0aWMgc3RydWN0IGZpbGVfbGlzdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBzdHJ1Y3QgZmlsZV9saXN0ICpuZXh0OworfSAqaW5wdXRfZmlsZV9saXN0OworCisvKiBJZiBub256ZXJvIGJlIHZlcmJvc2UuICAqLworaW50IHZlcmJvc2U7CisKKy8qIElmIG5vbnplcm8sIHRyYWRlIHNwZWVkIGZvciBsZXNzIG1lbW9yeS9hZGRyZXNzIHNwYWNlIHVzYWdlLiAgKi8KK2ludCBjb25zZXJ2ZV9tZW1vcnk7CisKKy8qIFRoZSBlbXVsYXRpb24gbmFtZSB0byB1c2UuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKmVtdWxhdGlvbjsKKworLyogS2VlcCB0cmFjayBvZiB0aGUgbmVzdGluZyBsZXZlbC4gIEV2ZW4gdGhvdWdoIHdlIGRvbid0IGhhbmRsZSBuZXN0ZWQKKyAgIGdyb3VwcyB3ZSBzdGlsbCBrZWVwIHRyYWNrIHRvIGltcHJvdmUgdGhlIGVycm9yIG1lc3NhZ2VzLiAgKi8KK3N0YXRpYyBpbnQgZ3JvdXBfbGV2ZWw7CisKKy8qIFRoZSBsYXN0IGZpbGUgd2UgcHJvY2Vzc2VkLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNlZGZpbGVzICpsYXN0X2ZpbGU7CisKKy8qIFRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICAqLworLyogWFhYIFdlJ2xsIGRvIHRoaXMgYSBiaXQgZGlmZmVyZW50IGluIHRoZSByZWFsIHNvbHV0aW9uLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpsaW5rZXJfc2NyaXB0ID0gU1JDRElSICIvZWxmMzItaTM4Ni5zY3JpcHQiOworCisvKiBOb256ZXJvIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGlucHV0IGZpbGVzLiAgKi8KK3N0YXRpYyBpbnQgZXJyb3JfbG9hZGluZzsKKworCisvKiBJbnRlcm1lZGlhdGUgc3RvcmFnZSBmb3IgdGhlIExEX0xJQlJBUllfUEFUSCBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICAgZW52aXJvbm1lbnQuICAqLworc3RhdGljIGNoYXIgKmxkX2xpYnJhcnlfcGF0aDE7CisKKy8qIEZsYWcgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzY2FubmVyLiAgKi8KK2ludCBsZF9zY2FuX3ZlcnNpb25fc2NyaXB0OworCisvKiBOYW1lIG9mIHRoZSBpbnB1dCBmaWxlLiAgKi8KK2NvbnN0IGNoYXIgKmxkaW5fZm5hbWU7CisKKy8qIERlZmluZSBieSBwYXJzZXIgaWYgcmVxdWlyZWQuICAqLworZXh0ZXJuIGludCBsZGRlYnVnOworCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgdm9pZCBwYXJzZV96X29wdGlvbiAoY29uc3QgY2hhciAqYXJnKTsKK3N0YXRpYyB2b2lkIHBhcnNlX3pfb3B0aW9uXzIgKGNvbnN0IGNoYXIgKmFyZyk7CitzdGF0aWMgdm9pZCBwYXJzZV9CX29wdGlvbiAoY29uc3QgY2hhciAqYXJnKTsKK3N0YXRpYyB2b2lkIHBhcnNlX0Jfb3B0aW9uXzIgKGNvbnN0IGNoYXIgKmFyZyk7CitzdGF0aWMgdm9pZCBkZXRlcm1pbmVfb3V0cHV0X2Zvcm1hdCAodm9pZCk7CitzdGF0aWMgdm9pZCBsb2FkX25lZWRlZCAodm9pZCk7CitzdGF0aWMgdm9pZCBjb2xsZWN0X3NlY3Rpb25zICh2b2lkKTsKK3N0YXRpYyB2b2lkIGFkZF9yeHhwYXRoIChzdHJ1Y3QgcGF0aGVsZW1lbnQgKipwYXRocCwgY29uc3QgY2hhciAqc3RyKTsKK3N0YXRpYyB2b2lkIGdlbl9yeHhwYXRoX2RhdGEgKHZvaWQpOworc3RhdGljIHZvaWQgcmVhZF92ZXJzaW9uX3NjcmlwdCAoY29uc3QgY2hhciAqZm5hbWUpOworc3RhdGljIHZvaWQgY3JlYXRlX2xzY3JpcHRfc3ltYm9scyAodm9pZCk7CitzdGF0aWMgdm9pZCBjcmVhdGVfc3BlY2lhbF9zZWN0aW9uX3N5bWJvbCAoc3RydWN0IHN5bWJvbCAqKnN5bXAsCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpOworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJlbWFpbmluZzsKKyAgaW50IGVycjsKKworI2lmbmRlZiBOREVCVUcKKyAgLyogRW5hYmxlIG1lbW9yeSBkZWJ1Z2dpbmcuICAqLworICBtdHJhY2UgKCk7CisjZW5kaWYKKworICAvKiBTYW5pdHkgY2hlY2suICBXZSBhbHdheXMgd2FudCB0byB1c2UgdGhlIExGUyBmdW5jdGlvbmFsaXR5LiAgKi8KKyAgaWYgKHNpemVvZiAob2ZmX3QpICE9IHNpemVvZiAob2ZmNjRfdCkpCisgICAgYWJvcnQgKCk7CisKKyAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLworICBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworICBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKyAgX19mc2V0bG9ja2luZyAoc3RkZXJyLCBGU0VUTE9DS0lOR19CWUNBTExFUik7CisKKyAgLyogU2V0IGxvY2FsZS4gICovCisgIHNldGxvY2FsZSAoTENfQUxMLCAiIik7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBtZXNzYWdlIGNhdGFsb2cgY2FuIGJlIGZvdW5kLiAgKi8KKyAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjYXRhbG9nLiAgKi8KKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgLyogQmVmb3JlIHdlIHN0YXJ0IHRlbGwgdGhlIEVMRiBsaWJyYXJ5IHdoaWNoIHZlcnNpb24gd2UgYXJlIHVzaW5nLiAgKi8KKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIC8qIFRoZSB1c2VyIGNhbiB1c2UgdGhlIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhZGQKKyAgICAgYWRkaXRpb25hbCBsb29rdXAgZGlyZWN0b3JpZXMuICAqLworICBsZF9saWJyYXJ5X3BhdGgxID0gZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWVtb3J5IGhhbmRsaW5nLiAgKi8KKyNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCisjZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCisgIG9ic3RhY2tfaW5pdCAoJmxkX3N0YXRlLnNtZW0pOworCisgIC8qIE9uZSBxdWljayBwYXNzIG92ZXIgdGhlIHBhcmFtZXRlcnMgd2hpY2ggYWxsb3dzIHVzIHRvIHNjYW4gZm9yIG9wdGlvbnMKKyAgICAgd2l0aCBnbG9iYWwgZWZmZWN0IHdoaWNoIGluZmx1ZW5jZSB0aGUgcmVzdCBvZiB0aGUgcHJvY2Vzc2luZy4gICovCisgIGFyZ3BfcGFyc2UgKCZhcmdwXzFzdCwgYXJnYywgYXJndiwgQVJHUF9JTl9PUkRFUiwgJnJlbWFpbmluZywgTlVMTCk7CisKKyAgLyogV2UgbmVlZCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsZS4gICovCisgIGlmIChpbnB1dF9maWxlX2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIkF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlIG5lZWRlZCIpKTsKKyAgICAgIGFyZ3BfaGVscCAoJmFyZ3BfMXN0LCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsICJsZCIpOworICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgLyogRGV0ZXJtaW5lIHdoaWNoIEVMRiBiYWNrZW5kIHRvIHVzZS4gICovCisgIGRldGVybWluZV9vdXRwdXRfZm9ybWF0ICgpOworCisgIC8qIFByZXBhcmUgc3RhdGUuICAqLworICBlcnIgPSBsZF9wcmVwYXJlX3N0YXRlIChlbXVsYXRpb24pOworICBpZiAoZXJyICE9IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoImVycm9yIHdoaWxlIHByZXBhcmluZyBsaW5raW5nIikpOworCisgIC8qIFhYWCBSZWFkIHRoZSBsaW5rZXIgc2NyaXB0IG5vdy4gIFNpbmNlIHdlIGxhdGVyIHdpbGwgaGF2ZSB0aGUgbGlua2VyCisgICAgIHNjcmlwdCBidWlsdCBpbiB3ZSBkb24ndCBnbyBpbnRvIHRyb3VibGUgdG8gbWFrZSBzdXJlIHdlIGhhbmRsZSBHUk9VUAorICAgICBzdGF0ZW1lbnRzIGluIHRoZSBzY3JpcHQuICBUaGlzIHNpbXBseSBtdXN0IG5vdCBoYXBwZW4uICAqLworICBsZGluID0gZm9wZW4gKGxpbmtlcl9zY3JpcHQsICJyIik7CisgIGlmIChsZGluID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgb3BlbiBsaW5rZXIgc2NyaXB0IFwiJXNcIiIpLAorCSAgIGxpbmtlcl9zY3JpcHQpOworICAvKiBObyBuZWVkIGZvciBsb2NraW5nLiAgKi8KKyAgX19mc2V0bG9ja2luZyAobGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworCisgIGxkX3N0YXRlLnNyY2ZpbGVzID0gTlVMTDsKKyAgbGRsaW5lbm8gPSAxOworICBsZF9zY2FuX3ZlcnNpb25fc2NyaXB0ID0gMDsKKyAgbGRpbl9mbmFtZSA9IGxpbmtlcl9zY3JpcHQ7CisgIGlmIChsZHBhcnNlICgpICE9IDApCisgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHBhcnNpbmcuICAqLworICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CisgIGZjbG9zZSAobGRpbik7CisKKyAgLyogV2Ugbm93IG1pZ2h0IGhhdmUgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIGxvb2sgZm9yIGxpYnJhcmllcyBpbgorICAgICBuYW1lZCBieSB0aGUgbGlua2VyIHNjcmlwdC4gIFB1dCB0aGVtIGluIGEgZGlmZmVyZW50IGxpc3Qgc28gdGhhdAorICAgICB0aGV5IGFyZSBzZWFyY2hlZCBhZnRlciBhbGwgcGF0aHMgZ2l2ZW4gYnkgdGhlIHVzZXIgb24gdGhlCisgICAgIGNvbW1hbmQgbGluZS4gICovCisgIGxkX3N0YXRlLmRlZmF1bHRfcGF0aHMgPSBsZF9zdGF0ZS5wYXRoczsKKyAgbGRfc3RhdGUucGF0aHMgPSBsZF9zdGF0ZS50YWlscGF0aHMgPSBOVUxMOworCisgIC8qIEdldCBydW5wYXRoL3JwYXRoIGluZm9ybWF0aW9uIGluIHVzYWJsZSBmb3JtLiAgKi8KKyAgZ2VuX3J4eHBhdGhfZGF0YSAoKTsKKworICAvKiBQYXJzZSBhbmQgcHJvY2VzcyBhcmd1bWVudHMgZm9yIHJlYWwuICAqLworICBhcmdwX3BhcnNlICgmYXJncF8ybmQsIGFyZ2MsIGFyZ3YsIEFSR1BfSU5fT1JERVIsICZyZW1haW5pbmcsIE5VTEwpOworICAvKiBBbGwgb3B0aW9ucyBzaG91bGQgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieSB0aGUgYXJncCBwYXJzZXIuICAqLworICBhc3NlcnQgKHJlbWFpbmluZyA9PSBhcmdjKTsKKworICAvKiBQcm9jZXNzIHRoZSBsYXN0IGZpbGUuICAqLworICB3aGlsZSAobGFzdF9maWxlICE9IE5VTEwpCisgICAgLyogVHJ5IHRvIG9wZW4gdGhlIGZpbGUuICAqLworICAgIGVycm9yX2xvYWRpbmcgfD0gRklMRV9QUk9DRVNTICgtMSwgbGFzdF9maWxlLCAmbGRfc3RhdGUsICZsYXN0X2ZpbGUpOworCisgIC8qIFN0b3AgaWYgdGhlcmUgaGFzIGJlZW4gYSBwcm9ibGVtIHdoaWxlIHJlYWRpbmcgdGhlIGlucHV0IGZpbGVzLiAgKi8KKyAgaWYgKGVycm9yX2xvYWRpbmcpCisgICAgZXhpdCAoZXJyb3JfbG9hZGluZyk7CisKKyAgLyogU2VlIHdoZXRoZXIgYWxsIG9wZW5lZCAtKCB3ZXJlIGNsb3NlZC4gICovCisgIGlmIChncm91cF9sZXZlbCA+IDApCisgICAgeworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCItKCB3aXRob3V0IG1hdGNoaW5nIC0pIikpOworICAgICAgYXJncF9oZWxwICgmYXJncF8xc3QsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwgImxkIik7CisgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAvKiBXaGVuIHdlIGNyZWF0ZSBhIHJlbG9jYXRhYmxlIGZpbGUgd2UgZG9uJ3QgaGF2ZSB0byBsb29rIGZvciB0aGUKKyAgICAgRFRfTkVFREVEIERTT3MgYW5kIHdlIGFsc28gZG9uJ3QgdGVzdCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuICAqLworICBpZiAobGRfc3RhdGUuZmlsZV90eXBlICE9IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZSkKKyAgICB7CisgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbG9hZGVkIGFsbCB0aGUgZGlyZWN0IGRlcGVuZGVuY2llcy4gIFdoYXQKKwkgcmVtYWlucyB0byBiZSBkb25lIGlzIGZpbmQgdGhlIGluZGlyZWN0IGRlcGVuZGVuY2llcy4gIFRoZXNlIGFyZQorCSBEU09zIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBEVF9ORUVERUQgZW50cmllcyBpbiB0aGUgRFNPcworCSB3aGljaCBhcmUgZGlyZWN0IGRlcGVuZGVuY2llcy4gIFdlIGhhdmUgdG8gdHJhbnNpdGl2ZWx5IGZpbmQgYW5kCisJIGxvYWQgYWxsIHRoZXNlIGRlcGVuZGVuY2llcy4gICovCisgICAgICBsb2FkX25lZWRlZCAoKTsKKworICAgICAgLyogQXQgdGhpcyBwb2ludCBhbGwgb2JqZWN0IGZpbGVzIGFuZCBEU09zIGFyZSByZWFkLiAgSWYgdGhlcmUKKyAgICAgICAgIGFyZSBzdGlsbCB1bmRlZmluZWQgc3ltYm9scyBsZWZ0IHRoZXkgbWlnaHQgaGF2ZSB0byBiZQorICAgICAgICAgc3ludGhlc2l6ZWQgZnJvbSB0aGUgbGlua2VyIHNjcmlwdC4gICovCisgICAgICBjcmVhdGVfbHNjcmlwdF9zeW1ib2xzICgpOworCisgICAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGxvYWRlZCBhbGwgdGhlIG9iamVjdCBmaWxlcyB3ZSBjYW4gZGV0ZXJtaW5lCisJIHdoZXRoZXIgd2UgaGF2ZSBhbnkgbm9uLXdlYWsgdW5yZXNvbHZlZCByZWZlcmVuY2VzIGxlZnQuICBJZgorCSB0aGVyZSBhcmUgYW55IHdlIHN0b3AuICBJZiB0aGUgdXNlciB1c2VkIHRoZSAnLXogbm9kZWZzJyBvcHRpb24KKwkgYW5kIHdlIGFyZSBjcmVhdGluZyBhIERTTyBkb24ndCBwZXJmb3JtIHRoZSB0ZXN0cy4gICovCisgICAgICBpZiAoRkxBR19VTlJFU09MVkVEICgmbGRfc3RhdGUpICE9IDApCisJZXhpdCAoMSk7CisgICAgfQorCisgIC8qIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbG9jYXRpb25zIHdoaWNoIHdpbGwgYmUgY2FycmllZAorICAgICBmb3J3YXJkIGludG8gdGhlIG91dHB1dC4gIFdlIGhhdmUgdG8gZG8gdGhpcyBoZXJlIGFuZCBub3cgc2luY2UKKyAgICAgd2UgbmVlZCB0byBrbm93IHdoaWNoIHNlY3Rpb25zIGhhdmUgdG8gYmUgY3JlYXRlZC4gICovCisgIGlmIChsZF9zdGF0ZS5maWxlX3R5cGUgIT0gcmVsb2NhdGFibGVfZmlsZV90eXBlKQorICAgIHsKKyAgICAgIHZvaWQgKnAgOworICAgICAgc3RydWN0IHNjbmhlYWQgKmg7CisKKyAgICAgIHAgPSBOVUxMOworICAgICAgd2hpbGUgKChoID0gbGRfc2VjdGlvbl90YWJfaXRlcmF0ZSAoJmxkX3N0YXRlLnNlY3Rpb25fdGFiLCAmcCkpICE9IE5VTEwpCisJaWYgKGgtPnR5cGUgPT0gU0hUX1JFTCB8fCBoLT50eXBlID09IFNIVF9SRUxBKQorCSAgeworCSAgICBzdHJ1Y3Qgc2NuaW5mbyAqcnVucCA9IGgtPmxhc3Q7CisJICAgIGRvCisJICAgICAgeworCQkvKiBJZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgcmVsb2NhdGlvbnMgZGV0ZXJtaW5lIGhvdworCQkgICBtYW55IHdpbGwgYmUgaW4gdGhlIG91dHB1dCBmaWxlLiAgQWxzbyBkZXRlcm1pbmUKKwkJICAgaG93IG1hbnkgR09UIGVudHJpZXMgYXJlIG5lZWRlZC4gICovCisJCUNPVU5UX1JFTE9DQVRJT05TICgmbGRfc3RhdGUsIHJ1bnApOworCisJCWxkX3N0YXRlLnJlbHNpemVfdG90YWwgKz0gcnVucC0+cmVsc2l6ZTsKKwkgICAgICB9CisJICAgIHdoaWxlICgocnVucCA9IHJ1bnAtPm5leHQpICE9IGgtPmxhc3QpOworCSAgfQorICAgIH0KKworICAvKiBOb3QgcGFydCBvZiB0aGUgZ0FCSSwgYnV0IHBhcnQgb2YgZXZlcnkgcHNBQkk6IHRoZSBzeW1ib2xzIGZvciB0aGUKKyAgICAgR09UIHNlY3Rpb24uICBBZGQgdGhlIHN5bWJvbCBpZiBuZWNlc3NhcnkuICAqLworICBpZiAobGRfc3RhdGUubmVlZF9nb3QpCisgICAgY3JlYXRlX3NwZWNpYWxfc2VjdGlvbl9zeW1ib2wgKCZsZF9zdGF0ZS5nb3Rfc3ltYm9sLAorCQkJCSAgICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKTsKKyAgLyogU2ltaWxhcmx5IGZvciB0aGUgX0RZTkFNSUMgc3ltYm9sIHdoaWNoIHBvaW50cyB0byB0aGUgZHluYW1pYworICAgICBzZWN0aW9uLiAgKi8KKyAgaWYgKGR5bmFtaWNhbGx5X2xpbmtlZF9wICgpKQorICAgIGNyZWF0ZV9zcGVjaWFsX3NlY3Rpb25fc3ltYm9sICgmbGRfc3RhdGUuZHluX3N5bWJvbCwgIl9EWU5BTUlDIik7CisKKyAgLyogV2UgYXJlIHJlYWR5IHRvIHN0YXJ0IHdvcmtpbmcgb24gdGhlIG91dHB1dCBmaWxlLiAgTm90IGFsbAorICAgICBpbmZvcm1hdGlvbiBoYXMgYmVlbiBnYXRoZXIgb3IgY3JlYXRlZCB5ZXQuICBUaGlzIHdpbGwgYmUgZG9uZSBhcworICAgICB3ZSBnby4gIE9wZW4gdGhlIGZpbGUgbm93LiAgKi8KKyAgaWYgKE9QRU5fT1VURklMRSAoJmxkX3N0YXRlLCBFTV9OT05FLCBFTEZDTEFTU05PTkUsIEVMRkRBVEFOT05FKSAhPSAwKQorICAgIGV4aXQgKDEpOworCisgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbnMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSB0aGUgbGlua2VyIGFuZCBhcmUgbm90CisgICAgIHByZXNlbnQgaW4gdGhlIGlucHV0IGZpbGUuICBUaGUgb3V0cHV0IGZpbGUgbXVzdCBhbHJlYWR5IGhhdmUKKyAgICAgYmVlbiBvcGVuZWQgc2luY2Ugd2UgbmVlZCB0aGUgRUxGIGRlc2NyaXB0b3IgdG8gZGVkdWNlIHR5cGUKKyAgICAgc2l6ZXMuICAqLworICBHRU5FUkFURV9TRUNUSU9OUyAoJmxkX3N0YXRlKTsKKworICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgcmVhZCBhbGwgdGhlIGZpbGVzIGFuZCBrbm93IGFsbCB0aGUKKyAgICAgc2VjdGlvbnMgd2hpY2ggaGF2ZSB0byBiZSBsaW5rZWQgaW50byB0aGUgYXBwbGljYXRpb24uICBXZSBkbyBub3cKKyAgICAgY3JlYXRlIGFuIGFycmF5IGxpc3RpbmcgYWxsIHRoZSBzZWN0aW9ucy4gIFdlIHdpbGwgdGhhbiBwYXNzIHRoaXMKKyAgICAgYXJyYXkgdG8gYSBzeXN0ZW0gc3BlY2lmaWMgZnVuY3Rpb24gd2hpY2ggY2FuIHJlb3JkZXIgaXQgYXQgd2lsbC4KKyAgICAgVGhlIGZ1bmN0aW9ucyBjYW4gYWxzbyBtZXJnZSBzZWN0aW9ucyBpZiB0aGlzIGlzIHdoYXQgaXMKKyAgICAgd2FudGVkLiAgKi8KKyAgY29sbGVjdF9zZWN0aW9ucyAoKTsKKworICAvKiBDcmVhdGUgdGhlIG91dHB1dCBzZWN0aW9ucyBub3cuICBUaGlzIG1heSByZXF1aXJlcyBzb3J0aW5nIHRoZW0KKyAgICAgZmlyc3QuICAqLworICBDUkVBVEVfU0VDVElPTlMgKCZsZF9zdGF0ZSk7CisKKyAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZSBkYXRhLiAgQXBwcm9wcmlhdGUgY29kZSBmb3IgdGhlIHNlbGVjdGVkCisgICAgIG91dHB1dCBmaWxlIHR5cGUgaXMgY2FsbGVkLiAgKi8KKyAgaWYgKENSRUFURV9PVVRGSUxFICgmbGRfc3RhdGUpICE9IDApCisgICAgZXhpdCAoMSk7CisKKyAgLyogRmluYWxpemUgdGhlIG91dHB1dCBmaWxlLCB3cml0ZSB0aGUgZGF0YSBvdXQuICAqLworICBlcnIgfD0gRklOQUxJWkUgKCZsZF9zdGF0ZSk7CisKKyAgLyogUmV0dXJuIHdpdGggYW4gbm9uLXplcm8gZXhpdCBzdGF0dXMgYWxzbyBpZiBhbnkgZXJyb3IgbWVzc2FnZSBoYXMKKyAgICAgYmVlbiBwcmludGVkLiAgKi8KKyAgcmV0dXJuIGVyciB8IChlcnJvcl9tZXNzYWdlX2NvdW50ICE9IDApOworfQorCisKKy8qIFF1aWNrIHNjYW4gb2YgdGhlIHBhcmFtZXRlciBsaXN0IGZvciBvcHRpb25zIHdpdGggZ2xvYmFsIGVmZmVjdC4gICovCitzdGF0aWMgZXJyb3JfdAorcGFyc2Vfb3B0XzFzdCAoaW50IGtleSwgY2hhciAqYXJnLAorCSAgICAgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBzd2l0Y2ggKGtleSkKKyAgICB7CisgICAgY2FzZSAnQic6CisgICAgICBwYXJzZV9CX29wdGlvbiAoYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYyc6CisgICAgICBsaW5rZXJfc2NyaXB0ID0gYXJnOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdFJzoKKyAgICAgIGxkX3N0YXRlLmV4cG9ydF9hbGxfZHluYW1pYyA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0cnOgorICAgICAgaWYgKGxkX3N0YXRlLmZpbGVfdHlwZSAhPSBub19maWxlX3R5cGUpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICAgICAgZ2V0dGV4dCAoIm9ubHkgb25lIG9wdGlvbiBvZiAtRyBhbmQgLXIgaXMgYWxsb3dlZCIpKTsKKyAgICAgIGxkX3N0YXRlLmZpbGVfdHlwZSA9IGRzb19maWxlX3R5cGU7CisKKyAgICAgIC8qIElmIHdlIGdlbmVyYXRlIGEgRFNPIHdlIGhhdmUgdG8gZXhwb3J0IGFsbCBzeW1ib2xzLiAgKi8KKyAgICAgIGxkX3N0YXRlLmV4cG9ydF9hbGxfZHluYW1pYyA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2gnOgorICAgICAgbGRfc3RhdGUuc29uYW1lID0gYXJnOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdpJzoKKyAgICAgIC8qIERpc2NhcmQgdGhlIExEX0xJQlJBUllfUEFUSCB2YWx1ZSB3ZSBmb3VuZC4gICovCisgICAgICBsZF9saWJyYXJ5X3BhdGgxID0gTlVMTDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnSSc6CisgICAgICBsZF9zdGF0ZS5pbnRlcnAgPSBhcmc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ20nOgorICAgICAgaWYgKGVtdWxhdGlvbiAhPSBOVUxMKQorCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJtb3JlIHRoYW4gb25lICctbScgcGFyYW1ldGVyIikpOworICAgICAgZW11bGF0aW9uID0gYXJnOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdRJzoKKyAgICAgIGlmIChhcmdbMV0gPT0gJ1wwJyAmJiAoYXJnWzBdID09ICd5JyB8fCBhcmdbMF0gPT0gJ1knKSkKKwlsZF9zdGF0ZS5hZGRfbGRfY29tbWVudCA9IHRydWU7CisgICAgICBlbHNlIGlmIChhcmdbMV0gPT0gJ1wwJyAmJiAoYXJnWzBdID09ICduJyB8fCBhcmdbMF0gPT0gJ04nKSkKKwlsZF9zdGF0ZS5hZGRfbGRfY29tbWVudCA9IHRydWU7CisgICAgICBlbHNlCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoInVua25vd24gb3B0aW9uIGAtJWMgJXMnIiksICdRJywgYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncic6CisgICAgICBpZiAobGRfc3RhdGUuZmlsZV90eXBlICE9IG5vX2ZpbGVfdHlwZSkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgib25seSBvbmUgb3B0aW9uIG9mIC1HIGFuZCAtciBpcyBhbGxvd2VkIikpOworICAgICAgbGRfc3RhdGUuZmlsZV90eXBlID0gcmVsb2NhdGFibGVfZmlsZV90eXBlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdTJzoKKyAgICAgIGxkX3N0YXRlLnN0cmlwID0gc3RyaXBfZGVidWc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3QnOgorICAgICAgbGRfc3RhdGUudHJhY2VfZmlsZXMgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd2JzoKKyAgICAgIHZlcmJvc2UgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd6JzoKKyAgICAgIC8qIFRoZSBTeXNWIGxpbmtlciB1c2VkICd6JyB0byBwYXNzIHZhcmlvdXMgZmxhZ3MgdG8gdGhlIGxpbmtlci4KKwkgV2UgZm9sbG93IHRoaXMuICBTZWUgJ3BhcnNlX3pfb3B0aW9uJyBmb3IgdGhlIG9wdGlvbnMgd2UKKwkgcmVjb2duaXplLiAgKi8KKyAgICAgIHBhcnNlX3pfb3B0aW9uIChhcmcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFSR1BfcGFnZXNpemU6CisgICAgICB7CisJY2hhciAqZW5kcDsKKwlsZF9zdGF0ZS5wYWdlc2l6ZSA9IHN0cnRvdWwgKGFyZywgJmVuZHAsIDApOworCWlmICgqZW5kcCAhPSAnXDAnKQorCSAgeworCSAgICBpZiAoZW5kcFsxXSA9PSAnXDAnICYmIHRvbG93ZXIgKCplbmRwKSA9PSAnaycpCisJICAgICAgbGRfc3RhdGUucGFnZXNpemUgKj0gMTAyNDsKKwkgICAgZWxzZSBpZiAoZW5kcFsxXSA9PSAnXDAnICYmIHRvbG93ZXIgKCplbmRwKSA9PSAnbScpCisJICAgICAgbGRfc3RhdGUucGFnZXNpemUgKj0gMTAyNCAqIDEwMjQ7CisJICAgIGVsc2UKKwkgICAgICB7CisJCWVycm9yICgwLCAwLAorCQkgICAgICAgZ2V0dGV4dCAoImludmFsaWQgcGFnZSBzaXplIHZhbHVlIFwiJXNcIjogaWdub3JlZCIpLAorCQkgICAgICAgYXJnKTsKKwkJbGRfc3RhdGUucGFnZXNpemUgPSAwOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBUkdQX3JwYXRoOgorICAgICAgYWRkX3J4eHBhdGggKCZsZF9zdGF0ZS5ycGF0aCwgYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBUkdQX3JwYXRoX2xpbms6CisgICAgICBhZGRfcnh4cGF0aCAoJmxkX3N0YXRlLnJwYXRoX2xpbmssIGFyZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVJHUF9ydW5wYXRoOgorICAgICAgYWRkX3J4eHBhdGggKCZsZF9zdGF0ZS5ydW5wYXRoLCBhcmcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFSR1BfcnVucGF0aF9saW5rOgorICAgICAgYWRkX3J4eHBhdGggKCZsZF9zdGF0ZS5ydW5wYXRoX2xpbmssIGFyZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVJHUF9nY19zZWN0aW9uczoKKyAgICBjYXNlIEFSR1Bfbm9fZ2Nfc2VjdGlvbnM6CisgICAgICBsZF9zdGF0ZS5nY19zZWN0aW9ucyA9IGtleSA9PSBBUkdQX2djX3NlY3Rpb25zOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdzJzoKKyAgICAgIGlmIChhcmcgPT0gTlVMTCkKKwl7CisJICBpZiAobGRfc3RhdGUuc3RyaXAgPT0gc3RyaXBfYWxsKQorCSAgICBsZF9zdGF0ZS5zdHJpcCA9IHN0cmlwX2V2ZXJ5dGhpbmc7CisJICBlbHNlCisJICAgIGxkX3N0YXRlLnN0cmlwID0gc3RyaXBfYWxsOworCSAgYnJlYWs7CisJfQorICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKworICAgIGNhc2UgJ2UnOgorICAgIGNhc2UgJ28nOgorICAgIGNhc2UgJ08nOgorICAgIGNhc2UgQVJHUF93aG9sZV9hcmNoaXZlOgorICAgIGNhc2UgQVJHUF9ub193aG9sZV9hcmNoaXZlOgorICAgIGNhc2UgJ0wnOgorICAgIGNhc2UgJygnOgorICAgIGNhc2UgJyknOgorICAgIGNhc2UgJ2wnOgorICAgIGNhc2UgQVJHUF9zdGF0aWM6CisgICAgY2FzZSBBUkdQX2R5bmFtaWM6CisgICAgY2FzZSBBUkdQX3ZlcnNpb25fc2NyaXB0OgorICAgICAgLyogV2UnbGwgaGFuZGxlIHRoZXNlIGluIHRoZSBzZWNvbmQgcGFzcy4gICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgQVJHUF9LRVlfQVJHOgorICAgICAgeworCXN0cnVjdCBmaWxlX2xpc3QgKm5ld3A7CisKKwluZXdwID0gKHN0cnVjdCBmaWxlX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZV9saXN0KSk7CisJbmV3cC0+bmFtZSA9IGFyZzsKKyNpZm5kZWYgTkRFQlVHCisJbmV3cC0+bmV4dCA9IE5VTEw7CisjZW5kaWYKKwlDU05HTF9MSVNUX0FERF9SRUFSIChpbnB1dF9maWxlX2xpc3QsIG5ld3ApOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyNpZiBZWURFQlVHCisgICAgY2FzZSBBUkdQX3l5ZGVidWc6CisgICAgICBsZGRlYnVnID0gMTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlIEFSR1Bfbm9fdW5kZWZpbmVkOgorICAgICAgbGRfc3RhdGUubm9kZWZzID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVJHUF9jb25zZXJ2ZToKKyAgICAgIGNvbnNlcnZlX21lbW9yeSA9IDE7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKKyAgICB9CisgIHJldHVybiAwOworfQorCisKKy8qIEhhbmRsZSBwcm9ncmFtIGFyZ3VtZW50cyBmb3IgcmVhbC4gICovCitzdGF0aWMgZXJyb3JfdAorcGFyc2Vfb3B0XzJuZCAoaW50IGtleSwgY2hhciAqYXJnLAorCSAgICAgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBzdGF0aWMgYm9vbCBncm91cF9zdGFydF9yZXF1ZXN0ZWQ7CisgIHN0YXRpYyBib29sIGdyb3VwX2VuZF9yZXF1ZXN0ZWQ7CisKKyAgc3dpdGNoIChrZXkpCisgICAgeworICAgIGNhc2UgJ0InOgorICAgICAgcGFyc2VfQl9vcHRpb25fMiAoYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZSc6CisgICAgICBsZF9zdGF0ZS5lbnRyeSA9IGFyZzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbyc6CisgICAgICBpZiAobGRfc3RhdGUub3V0Zm5hbWUgIT0gTlVMTCkKKwl7CisJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIk1vcmUgdGhhbiBvbmUgb3V0cHV0IGZpbGUgbmFtZSBnaXZlbi4iKSk7CisJc2VlX2hlbHA6CisJICBhcmdwX2hlbHAgKCZhcmdwXzJuZCwgc3RkZXJyLCBBUkdQX0hFTFBfU0VFLCAibGQiKTsKKwkgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CisJfQorICAgICAgbGRfc3RhdGUub3V0Zm5hbWUgPSBhcmc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ08nOgorICAgICAgaWYgKGFyZyA9PSBOVUxMKQorCWxkX3N0YXRlLm9wdGxldmVsID0gMTsKKyAgICAgIGVsc2UKKwl7CisJICBjaGFyICplbmRwOworCSAgdW5zaWduZWQgbG9uZyBpbnQgbGV2ZWwgPSBzdHJ0b3VsIChhcmcsICZlbmRwLCAxMCk7CisJICBpZiAoKmVuZHAgIT0gJ1wwJykKKwkgICAgeworCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiSW52YWxpZCBvcHRpbWl6YXRpb24gbGV2ZWwgYCVzJyIpLCBhcmcpOworCSAgICAgIGdvdG8gc2VlX2hlbHA7CisJICAgIH0KKwkgIGxkX3N0YXRlLm9wdGxldmVsID0gbGV2ZWw7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFSR1Bfd2hvbGVfYXJjaGl2ZToKKyAgICAgIGxkX3N0YXRlLmV4dHJhY3RfcnVsZSA9IGFsbGV4dHJhY3Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR1Bfbm9fd2hvbGVfYXJjaGl2ZToKKyAgICAgIGxkX3N0YXRlLmV4dHJhY3RfcnVsZSA9IGRlZmF1bHRleHRyYWN0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFSR1Bfc3RhdGljOgorICAgIGNhc2UgQVJHUF9keW5hbWljOgorICAgICAgLyogRW5hYmxlL2Rpc2FibGUgdXNlIGZvciBEU09zLiAgKi8KKyAgICAgIGxkX3N0YXRlLnN0YXRpY2FsbHkgPSBrZXkgPT0gQVJHUF9zdGF0aWM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3onOgorICAgICAgLyogVGhlIFN5c1YgbGlua2VyIHVzZWQgJ3onIHRvIHBhc3MgdmFyaW91cyBmbGFncyB0byB0aGUgbGlua2VyLgorCSBXZSBmb2xsb3cgdGhpcy4gIFNlZSAncGFyc2Vfel9vcHRpb24nIGZvciB0aGUgb3B0aW9ucyB3ZQorCSByZWNvZ25pemUuICAqLworICAgICAgcGFyc2Vfel9vcHRpb25fMiAoYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBUkdQX3ZlcnNpb25fc2NyaXB0OgorICAgICAgcmVhZF92ZXJzaW9uX3NjcmlwdCAoYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnTCc6CisgICAgICAvKiBBZGQgYSBuZXcgc2VhcmNoIGRpcmVjdG9yeS4gICovCisgICAgICBsZF9uZXdfc2VhcmNoZGlyIChhcmcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcoJzoKKyAgICAgIC8qIFN0YXJ0IGEgbGluayBncm91cC4gIFdlIGhhdmUgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIG9iamVjdAorCSBmaWxlIHdoaWNoIGlzIG5hbWVkIG5leHQuICBEbyB0aGlzIGJ5IHJlbWVtYmVyaW5nIGEgcG9pbnRlciB0bworCSB0aGUgcG9pbnRlciB3aGljaCB3aWxsIHBvaW50IHRvIHRoZSBuZXh0IG9iamVjdC4gICovCisgICAgICBpZiAodmVyYm9zZSAmJiAoZ3JvdXBfc3RhcnRfcmVxdWVzdGVkIHx8ICFncm91cF9lbmRfcmVxdWVzdGVkKSkKKwllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIm5lc3RlZCAtKCAtKSBncm91cHMgYXJlIG5vdCBhbGxvd2VkIikpOworCisgICAgICAvKiBJbmNyZW1lbnQgdGhlIG5lc3RpbmcgbGV2ZWwuICAqLworICAgICAgKytncm91cF9sZXZlbDsKKworICAgICAgLyogUmVjb3JkIGdyb3VwIHN0YXJ0LiAgKi8KKyAgICAgIGdyb3VwX3N0YXJ0X3JlcXVlc3RlZCA9IHRydWU7CisgICAgICBncm91cF9lbmRfcmVxdWVzdGVkID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyknOgorICAgICAgLyogRW5kIGEgbGluayBncm91cC4gIElmIHRoZXJlIGlzIG5vIGdyb3VwIG9wZW4gdGhpcyBpcyBjbGVhcmx5CisJIGEgYnVnLiAgSWYgdGhlcmUgaXMgYSBncm91cCBvcGVuIGluc2VydCBhIGJhY2sgcmVmZXJlbmNlCisJIHBvaW50ZXIgaW4gdGhlIHJlY29yZCBmb3IgdGhlIGxhc3Qgb2JqZWN0IG9mIHRoZSBncm91cC4gIElmCisJIHRoZXJlIGlzIG5vIG5ldyBvYmplY3Qgb3IganVzdCBvbmUgZG9uJ3QgZG8gYW55dGhpbmcuICAqLworICAgICAgaWYgKCFncm91cF9lbmRfcmVxdWVzdGVkKQorCXsKKwkgIGlmIChncm91cF9sZXZlbCA9PSAwKQorCSAgICB7CisJICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCItKSB3aXRob3V0IG1hdGNoaW5nIC0oIikpOworCSAgICAgIGdvdG8gc2VlX2hlbHA7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJbGFzdF9maWxlLT5ncm91cF9lbmQgPSB0cnVlOworCisgICAgICBpZiAoZ3JvdXBfbGV2ZWwgPiAwKQorCS0tZ3JvdXBfbGV2ZWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2wnOgorICAgIGNhc2UgQVJHUF9LRVlfQVJHOgorICAgICAgeworCXdoaWxlIChsYXN0X2ZpbGUgIT0gTlVMTCkKKwkgIC8qIFRyeSB0byBvcGVuIHRoZSBmaWxlLiAgKi8KKwkgIGVycm9yX2xvYWRpbmcgfD0gRklMRV9QUk9DRVNTICgtMSwgbGFzdF9maWxlLCAmbGRfc3RhdGUsICZsYXN0X2ZpbGUpOworCisJbGFzdF9maWxlID0gbGRfbmV3X2lucHV0ZmlsZSAoYXJnLAorCQkJCSAgICAgIGtleSA9PSAnbCcKKwkJCQkgICAgICA/IGFyY2hpdmVfZmlsZV90eXBlCisJCQkJICAgICAgOiByZWxvY2F0YWJsZV9maWxlX3R5cGUpOworCWlmIChncm91cF9zdGFydF9yZXF1ZXN0ZWQpCisJICB7CisJICAgIGxhc3RfZmlsZS0+Z3JvdXBfc3RhcnQgPSB0cnVlOworCisJICAgIGdyb3VwX3N0YXJ0X3JlcXVlc3RlZCA9IGZhbHNlOworCSAgICBncm91cF9lbmRfcmVxdWVzdGVkID0gdHJ1ZTsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFdlIGNhbiBjYXRjaCBhbGwgb3RoZXIgb3B0aW9ucyBoZXJlLiAgVGhleSBlaXRoZXIgaGF2ZQorCSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBvciwgaWYgdGhlIHBhcmFtZXRlciB3YXMgbm90IGNvcnJlY3QsCisJIHRoZSBlcnJvciBoYXMgYmVlbiByZXBvcnRlZC4gICovCisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAwOworfQorCisKKy8qIExvYWQgYWxsIHRoZSBEU09zIG5hbWVkIGFzIGRlcGVuZGVuY2llcyBpbiBvdGhlciBEU09zIHdlIGFscmVhZHkKKyAgIGxvYWRlZC4gICovCitzdGF0aWMgdm9pZAorbG9hZF9uZWVkZWQgKHZvaWQpCit7CisgIHN0cnVjdCB1c2VkZmlsZXMgKmZpcnN0OworICBzdHJ1Y3QgdXNlZGZpbGVzICpydW5wOworCisgIC8qIFhYWCBUaGVyZSBpcyBvbmUgcHJvYmxlbSBoZXJlOiBkbyB3ZSBhbGxvdyByZWZlcmVuY2VzIGZyb20KKyAgICAgcmVndWxhciBvYmplY3QgZmlsZXMgdG8gYmUgc2F0aXNmaWVkIGJ5IHRoZXNlIGltcGxpY2l0CisgICAgIGRlcGVuZGVuY2llcz8gIFRoZSBvbGQgbGlua2VyIGFsbG93cyB0aGlzIGFuZCBzZXZlcmFsIGxpYnJhcmllcworICAgICBkZXBlbmQgb24gdGhpcy4gIFNvbGFyaXMnIGxpbmtlciBkb2VzIG5vdCBhbGxvdyB0aGlzOyBpdCBwcm92aWRlcworICAgICB0aGUgdXNlciB3aXRoIGEgY29tcHJlaGVuc2l2ZSBlcnJvciBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlCisgICAgIHNpdHVhdGlvbi4KKworICAgICBYWFggSU1PIHRoZSBvbGQgbGQgYmVoYXZpb3IgaXMgY29ycmVjdCBzaW5jZSB0aGlzIGlzIGFsc28gaG93IHRoZQorICAgICBkeW5hbWljIGxpbmtlciB3aWxsIHdvcmsuICBJdCB3aWxsIGxvb2sgZm9yIHVucmVzb2x2ZWQgcmVmZXJlbmNlcworICAgICBpbiBhbGwgbG9hZGVkIERTT3MuCisKKyAgICAgWFhYIFNob3VsZCB3ZSBhZGQgYW4gb3B0aW9uIHRvIGdldCBTb2xhcmlzIGNvbXBhdGliaWxpdHk/ICAqLworICBpZiAobGRfc3RhdGUubmVlZGVkID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHJ1bnAgPSBmaXJzdCA9IGxkX3N0YXRlLm5lZWRlZC0+bmV4dDsKKyAgZG8KKyAgICB7CisgICAgICBzdHJ1Y3QgdXNlZGZpbGVzICppZ25vcmU7CisgICAgICBzdHJ1Y3QgdXNlZGZpbGVzICpuZXh0ID0gcnVucC0+bmV4dDsKKyAgICAgIGludCBlcnI7CisKKyAgICAgIGVyciA9IEZJTEVfUFJPQ0VTUyAoLTEsIHJ1bnAsICZsZF9zdGF0ZSwgJmlnbm9yZSk7CisgICAgICBpZiAoZXJyICE9IDApCisJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLworCWV4aXQgKGVycik7CisKKyAgICAgIHJ1bnAgPSBuZXh0OworICAgIH0KKyAgd2hpbGUgKHJ1bnAgIT0gZmlyc3QpOworfQorCisKKy8qIFByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGZwcmludGYgKHN0cmVhbSwgImxkICglcykgJXNcbiIsIFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIlwKK0NvcHlyaWdodCAoQykgJXMgUmVkIEhhdCwgSW5jLlxuXAorVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk9cblwKK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuXAorIiksICIyMDA1Iik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIldyaXR0ZW4gYnkgJXMuXG4iKSwgIlVscmljaCBEcmVwcGVyIik7Cit9CisKKworLyogVGhlcmUgYXJlIGEgbG90IG9mIC16IG9wdGlvbnMsIHBhcnNlIHRoZW0gaGVyZS4gIFNvbWUgb2YgdGhlbSBoYXZlCisgICB0byBiZSBwYXJzZWQgaW4gdGhlIGZpcnN0IHBhc3MsIG90aGVycyBtdXN0IGJlIGhhbmRsZWQgaW4gdGhlCisgICBzZWNvbmQgcGFzcy4gICovCitzdGF0aWMgdm9pZAorcGFyc2Vfel9vcHRpb24gKGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgaWYgKHN0cmNtcCAoYXJnLCAibm9kZWZhdWx0bGliIikgPT0gMAorICAgICAgLyogVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgd2UgY3JlYXRlIGEgRFNPLiAgKi8KKyAgICAgICYmIGxkX3N0YXRlLmZpbGVfdHlwZSA9PSBkc29fZmlsZV90eXBlKQorICAgIGxkX3N0YXRlLmR0X2ZsYWdzXzEgfD0gREZfMV9OT0RFRkxJQjsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJtdWxkZWZzIikgPT0gMCkKKyAgICBsZF9zdGF0ZS5tdWxkZWZzID0gdHJ1ZTsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJub2RlZnMiKSA9PSAwKQorICAgIGxkX3N0YXRlLm5vZGVmcyA9IHRydWU7CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiZGVmcyIpID09IDApCisgICAgbGRfc3RhdGUubm9kZWZzID0gZmFsc2U7CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm93IikgPT0gMCkKKyAgICAvKiBXZSBjb3VsZCBhbHNvIHNldCB0aGUgREZfMV9OT1cgZmxhZyBpbiBEVF9GTEFHU18xIGJ1dCB0aGlzIGlzbid0CisgICAgICAgbmVjZXNzYXJ5LiAgKi8KKyAgICBsZF9zdGF0ZS5kdF9mbGFncyB8PSBERl9CSU5EX05PVzsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJvcmlnaW4iKSA9PSAwKQorICAgIC8qIFdlIGNvdWxkIGFsc28gc2V0IHRoZSBERl8xX09SSUdJTiBmbGFnIGluIERUX0ZMQUdTXzEgYnV0IHRoaXMgaXNuJ3QKKyAgICAgICBuZWNlc3NhcnkuICAqLworICAgIGxkX3N0YXRlLmR0X2ZsYWdzIHw9IERGX09SSUdJTjsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJub2RlbGV0ZSIpID09IDAKKwkgICAvKiBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB3ZSBjcmVhdGUgYSBEU08uICAqLworCSAgICYmIGxkX3N0YXRlLmZpbGVfdHlwZSA9PSBkc29fZmlsZV90eXBlKQorICAgIGxkX3N0YXRlLmR0X2ZsYWdzXzEgfD0gREZfMV9OT0RFTEVURTsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJpbml0Zmlyc3QiKSA9PSAwKQorICAgIGxkX3N0YXRlLmR0X2ZsYWdzXzEgfD0gREZfMV9JTklURklSU1Q7CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm9kbG9wZW4iKSA9PSAwCisJICAgLyogVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgd2UgY3JlYXRlIGEgRFNPLiAgKi8KKwkgICAmJiBsZF9zdGF0ZS5maWxlX3R5cGUgPT0gZHNvX2ZpbGVfdHlwZSkKKyAgICBsZF9zdGF0ZS5kdF9mbGFnc18xIHw9IERGXzFfTk9PUEVOOworICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImlnbm9yZSIpID09IDApCisgICAgbGRfc3RhdGUuaWdub3JlX3VudXNlZF9kc29zID0gdHJ1ZTsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWNvcmQiKSA9PSAwKQorICAgIGxkX3N0YXRlLmlnbm9yZV91bnVzZWRfZHNvcyA9IGZhbHNlOworICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInN5c3RlbWxpYnJhcnkiKSA9PSAwKQorICAgIGxkX3N0YXRlLmlzX3N5c3RlbV9saWJyYXJ5ID0gdHJ1ZTsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJhbGxleHRyYWN0IikgIT0gMAorCSAgICYmIHN0cmNtcCAoYXJnLCAiZGVmYXVsdGV4dHJhY3QiKSAhPSAwCisJICAgJiYgc3RyY21wIChhcmcsICJ3ZWFrZXh0cmFjdCIpICE9IDAKKwkgICAmJiBzdHJjbXAgKGFyZywgImxhenlsb2FkIikgIT0gMAorCSAgICYmIHN0cmNtcCAoYXJnLCAibm9sYXp5bG9hZCIpICE9IDApCisgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJ1bmtub3duIG9wdGlvbiBgLSVjICVzJyIpLCAneicsIGFyZyk7Cit9CisKKworc3RhdGljIHZvaWQKK3BhcnNlX3pfb3B0aW9uXzIgKGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgaWYgKHN0cmNtcCAoYXJnLCAiYWxsZXh0cmFjdCIpID09IDApCisgICAgbGRfc3RhdGUuZXh0cmFjdF9ydWxlID0gYWxsZXh0cmFjdDsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJkZWZhdWx0ZXh0cmFjdCIpID09IDApCisgICAgbGRfc3RhdGUuZXh0cmFjdF9ydWxlID0gZGVmYXVsdGV4dHJhY3Q7CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAid2Vha2V4dHJhY3QiKSA9PSAwKQorICAgIGxkX3N0YXRlLmV4dHJhY3RfcnVsZSA9IHdlYWtleHRyYWN0OworICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImxhenlsb2FkIikgPT0gMCkKKyAgICBsZF9zdGF0ZS5sYXp5bG9hZCA9IHRydWU7CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm9sYXp5bG9hZCIpID09IDApCisgICAgbGRfc3RhdGUubGF6eWxvYWQgPSBmYWxzZTsKK30KKworCisvKiBUaGVyZSBhcmUgYSBsb3Qgb2YgLUIgb3B0aW9ucywgcGFyc2UgdGhlbSBoZXJlLiAgKi8KK3N0YXRpYyB2b2lkCitwYXJzZV9CX29wdGlvbiAoY29uc3QgY2hhciAqYXJnKQoreworICBpZiAoc3RyY21wIChhcmcsICJsb2NhbCIpID09IDApCisgICAgbGRfc3RhdGUuZGVmYXVsdF9iaW5kX2xvY2FsID0gdHJ1ZTsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJzeW1ib2xpYyIpICE9IDAKKwkgICAmJiBzdHJjbXAgKGFyZywgInN0YXRpYyIpICE9IDAKKwkgICAmJiBzdHJjbXAgKGFyZywgImR5bmFtaWMiKSAhPSAwKQorICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgidW5rbm93biBvcHRpb24gJy0lYyAlcyciKSwgJ0InLCBhcmcpOworfQorCisKKy8qIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHksIGJ1dCBjYWxsZWQgaW4gdGhlIHNlY29uZCBwYXNzIG92ZXIgdGhlCisgICBwYXJhbWV0ZXJzLiAgKi8KK3N0YXRpYyB2b2lkCitwYXJzZV9CX29wdGlvbl8yIChjb25zdCBjaGFyICphcmcpCit7CisgIGlmIChzdHJjbXAgKGFyZywgInN0YXRpYyIpID09IDApCisgICAgbGRfc3RhdGUuc3RhdGljYWxseSA9IHRydWU7CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiZHluYW1pYyIpID09IDApCisgICAgbGRfc3RhdGUuc3RhdGljYWxseSA9IGZhbHNlOworICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInN5bWJvbGljIikgPT0gMAorCSAgIC8qIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGlmIHdlIGNyZWF0ZSBhIERTTy4gICovCisJICAgJiYgbGRfc3RhdGUuZmlsZV90eXBlID09IGRzb19maWxlX3R5cGUpCisgICAgbGRfc3RhdGUuZHRfZmxhZ3MgfD0gREZfU1lNQk9MSUM7Cit9CisKKworc3RhdGljIHZvaWQKK2RldGVybWluZV9vdXRwdXRfZm9ybWF0ICh2b2lkKQoreworICAvKiBGaXJzdCBjaGFuZ2UgdGhlICdpbnB1dF9maWxlX2xpc3QnIHZhcmlhYmxlIGluIGEgc2ltcGxlCisgICAgIHNpbmdsZS1saW5rZWQgbGlzdC4gICovCisgIHN0cnVjdCBmaWxlX2xpc3QgKmxhc3QgPSBpbnB1dF9maWxlX2xpc3Q7CisgIGlucHV0X2ZpbGVfbGlzdCA9IGlucHV0X2ZpbGVfbGlzdC0+bmV4dDsKKyAgbGFzdC0+bmV4dCA9IE5VTEw7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbiB3aGljaCB3ZSBhcmUgc3VwcG9zZWQgdG8gdXNlLgorICAgICBUaGUgdXNlciBjYW4gdXNlIHRoZSAnLW0nIG9wdGlvbiB0byBzZWxlY3Qgb25lLiAgSWYgdGhpcyBpcworICAgICBtaXNzaW5nIHdlIGFyZSB0cnlpbmcgdG8gbG9hZCBvbmUgZmlsZSBhbmQgZGV0ZXJtaW5lIHRoZQorICAgICBhcmNoaXRlY3R1cmUgZnJvbSB0aGF0LiAgKi8KKyAgaWYgKGVtdWxhdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxkX3N0YXRlLmVibCA9IGVibF9vcGVuYmFja2VuZF9lbXVsYXRpb24gKGVtdWxhdGlvbik7CisKKyAgICAgIGFzc2VydCAobGRfc3RhdGUuZWJsICE9IE5VTEwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZpbmQgYW4gRUxGIGlucHV0IGZpbGUgYW5kIGxldCBpdCBkZXRlcm1pbmUgdGhlIEVMZiBiYWNrZW5kLiAgKi8KKyAgICAgIHN0cnVjdCBmaWxlX2xpc3QgKnJ1bnAgPSBpbnB1dF9maWxlX2xpc3Q7CisKKyAgICAgIHdoaWxlIChydW5wICE9IE5VTEwpCisJeworCSAgaW50IGZkID0gb3BlbiAocnVucC0+bmFtZSwgT19SRE9OTFkpOworCSAgaWYgKGZkICE9IC0xKQorCSAgICB7CisJICAgICAgaW50IHRyeSAoRWxmICplbGYpCisJCXsKKwkJICBpbnQgcmVzdWx0ID0gMDsKKworCQkgIGlmIChlbGYgPT0gTlVMTCkKKwkJICAgIHJldHVybiAwOworCisJCSAgaWYgKGVsZl9raW5kIChlbGYpID09IEVMRl9LX0VMRikKKwkJICAgIHsKKwkJICAgICAgLyogV2UgaGF2ZSBhbiBFTEYgZmlsZS4gIFdlIG5vdyBjYW4gZmluZCBvdXQKKwkJCSB3aGF0IHRoZSBvdXRwdXQgZm9ybWF0IHNob3VsZCBiZS4gICovCisJCSAgICAgIFhFbGZfRWhkcl92YXJkZWYoZWhkcik7CisKKwkJICAgICAgLyogR2V0IHRoZSBFTEYgaGVhZGVyIG9mIHRoZSBvYmplY3QuICAqLworCQkgICAgICB4ZWxmX2dldGVoZHIgKGVsZiwgZWhkcik7CisJCSAgICAgIGlmIChlaGRyICE9IE5VTEwpCisJCQlsZF9zdGF0ZS5lYmwgPQorCQkJICBlYmxfb3BlbmJhY2tlbmRfbWFjaGluZSAoZWhkci0+ZV9tYWNoaW5lKTsKKworCQkgICAgICByZXN1bHQgPSAxOworCQkgICAgfQorCQkgIGVsc2UgaWYgKGVsZl9raW5kIChlbGYpID09IEVMRl9LX0FSKQorCQkgICAgeworCQkgICAgICAvKiBUcnkgdGhlIGFyY2hpdmUgbWVtYmVycy4gIFRoaXMgY291bGQKKwkJCSBwb3RlbnRpYWxseSBsZWFkIHRvIHdyb25nIHJlc3VsdHMgaWYgdGhlCisJCQkgYXJjaGl2ZSBjb250YWlucyBmaWxlcyBmb3IgbW9yZSB0aGFuIG9uZQorCQkJIGFyY2hpdGVjdHVyZS4gIEJ1dCB0aGlzIGlzIHRoZSB1c2VyJ3MKKwkJCSBwcm9ibGVtLiAgKi8KKwkJICAgICAgRWxmICpzdWJlbGY7CisJCSAgICAgIEVsZl9DbWQgY21kID0gRUxGX0NfUkVBRF9NTUFQOworCisJCSAgICAgIHdoaWxlICgoc3ViZWxmID0gZWxmX2JlZ2luIChmZCwgY21kLCBlbGYpKSAhPSBOVUxMKQorCQkJeworCQkJICBjbWQgPSBlbGZfbmV4dCAoc3ViZWxmKTsKKworCQkJICBpZiAodHJ5IChzdWJlbGYpICE9IDApCisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICB9CisKKwkJICBlbGZfZW5kIChlbGYpOworCisJCSAgcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJICAgICAgaWYgKHRyeSAoZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKSkgIT0gMCkKKwkJLyogRm91bmQgYSBmaWxlLiAgKi8KKwkJYnJlYWs7CisJICAgIH0KKworCSAgcnVucCA9IHJ1bnAtPm5leHQ7CisJfQorCisgICAgICBpZiAobGRfc3RhdGUuZWJsID09IE5VTEwpCisJeworCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJcCitjb3VsZCBub3QgZmluZCBpbnB1dCBmaWxlIHRvIGRldGVybWluZSBvdXRwdXQgZmlsZSBmb3JtYXQiKSk7CisJICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiXAordHJ5IGFnYWluIHdpdGggYW4gYXBwcm9wcmlhdGUgJy1tJyBwYXJhbWV0ZXIiKSk7CisJfQorICAgIH0KKworICAvKiBXZSBkb24ndCBuZWVkIHRoZSBsaXN0IG9mIGlucHV0IGZpbGVzIGFueW1vcmUuICBUaGUgc2Vjb25kIHJ1biBvdmVyCisgICAgIHRoZSBwYXJhbWV0ZXJzIHdpbGwgaGFuZGxlIHRoZW0uICAqLworICB3aGlsZSAoaW5wdXRfZmlsZV9saXN0ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGZpbGVfbGlzdCAqb2xkcCA9IGlucHV0X2ZpbGVfbGlzdDsKKyAgICAgIGlucHV0X2ZpbGVfbGlzdCA9IGlucHV0X2ZpbGVfbGlzdC0+bmV4dDsKKyAgICAgIGZyZWUgKG9sZHApOworICAgIH0KKworICAvKiBXZSBhbHNvIGtub3cgbm93IHdoYXQga2luZCBvZiBmaWxlIHdlIGFyZSBzdXBwb3NlZCB0byBjcmVhdGUuICBJZgorICAgICB0aGUgdXNlciBoYXNuJ3Qgc2VsZWN0ZWQgYW55dGhpZ24gd2UgY3JlYXRlIGFuZCBleGVjdXRhYmxlLiAgKi8KKyAgaWYgKGxkX3N0YXRlLmZpbGVfdHlwZSA9PSBub19maWxlX3R5cGUpCisgICAgbGRfc3RhdGUuZmlsZV90eXBlID0gZXhlY3V0YWJsZV9maWxlX3R5cGU7Cit9CisKKy8qIEFkZCBESVIgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgc2VhcmNoZWQgZm9yIG9iamVjdCBmaWxlcyBhbmQKKyAgIGxpYnJhcmllcy4gICovCit2b2lkCitsZF9uZXdfc2VhcmNoZGlyIChjb25zdCBjaGFyICpkaXIpCit7CisgIHN0cnVjdCBwYXRoZWxlbWVudCAqbmV3cGF0aDsKKworICBuZXdwYXRoID0gKHN0cnVjdCBwYXRoZWxlbWVudCAqKQorICAgIG9ic3RhY2tfY2FsbG9jICgmbGRfc3RhdGUuc21lbSwgc2l6ZW9mIChzdHJ1Y3QgcGF0aGVsZW1lbnQpKTsKKworICBuZXdwYXRoLT5wbmFtZSA9IGRpcjsKKworICAvKiBFbnF1ZXVlIHRoZSBmaWxlLiAgKi8KKyAgaWYgKGxkX3N0YXRlLnRhaWxwYXRocyA9PSBOVUxMKQorICAgIGxkX3N0YXRlLnBhdGhzID0gbGRfc3RhdGUudGFpbHBhdGhzID0gbmV3cGF0aDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGxkX3N0YXRlLnRhaWxwYXRocy0+bmV4dCA9IG5ld3BhdGg7CisgICAgICBsZF9zdGF0ZS50YWlscGF0aHMgPSBuZXdwYXRoOworICAgIH0KK30KKworCitzdHJ1Y3QgdXNlZGZpbGVzICoKK2xkX25ld19pbnB1dGZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBlbnVtIGZpbGVfdHlwZSB0eXBlKQoreworICBzdHJ1Y3QgdXNlZGZpbGVzICpuZXdmaWxlID0gKHN0cnVjdCB1c2VkZmlsZXMgKikKKyAgICBvYnN0YWNrX2NhbGxvYyAoJmxkX3N0YXRlLnNtZW0sIHNpemVvZiAoc3RydWN0IHVzZWRmaWxlcykpOworCisgIG5ld2ZpbGUtPnNvbmFtZSA9IG5ld2ZpbGUtPmZuYW1lID0gbmV3ZmlsZS0+cmZuYW1lID0gZm5hbWU7CisgIG5ld2ZpbGUtPmZpbGVfdHlwZSA9IHR5cGU7CisgIG5ld2ZpbGUtPmV4dHJhY3RfcnVsZSA9IGxkX3N0YXRlLmV4dHJhY3RfcnVsZTsKKyAgbmV3ZmlsZS0+bGF6eWxvYWQgPSBsZF9zdGF0ZS5sYXp5bG9hZDsKKyAgbmV3ZmlsZS0+c3RhdHVzID0gbm90X29wZW5lZDsKKworICByZXR1cm4gbmV3ZmlsZTsKK30KKworCisvKiBDcmVhdGUgYW4gYXJyYXkgbGlzdGluZyBhbGwgdGhlIHNlY3Rpb25zLiAgV2Ugd2lsbCB0aGFuIHBhc3MgdGhpcworICAgYXJyYXkgdG8gYSBzeXN0ZW0gc3BlY2lmaWMgZnVuY3Rpb24gd2hpY2ggY2FuIHJlb3JkZXIgaXQgYXQgd2lsbC4KKyAgIFRoZSBmdW5jdGlvbnMgY2FuIGFsc28gbWVyZ2Ugc2VjdGlvbnMgaWYgdGhpcyBpcyB3aGF0IGlzCisgICB3YW50ZWQuICAqLworc3RhdGljIHZvaWQKK2NvbGxlY3Rfc2VjdGlvbnMgKHZvaWQpCit7CisgIHZvaWQgKnAgOworICBzdHJ1Y3Qgc2NuaGVhZCAqaDsKKyAgc2l6ZV90IGNudDsKKworICAvKiBXZSBoYXZlIHRoYXQgbWFueSBzZWN0aW9ucy4gIEF0IGxlYXN0IGZvciBub3cuICAqLworICBsZF9zdGF0ZS5uYWxsc2VjdGlvbnMgPSBsZF9zdGF0ZS5zZWN0aW9uX3RhYi5maWxsZWQ7CisKKyAgLyogQWxsb2NhdGUgdGhlIGFycmF5LiAgV2UgYWxsb2NhdGUgb25lIG1vcmUgZW50cnkgdGhhbiBjb21wdXRlZCBzbworICAgICBmYXIgc2luY2Ugd2UgbWlnaHQgbmVlZCBhIG5ldyBzZWN0aW9uIGZvciB0aGUgY29weSByZWxvY2F0aW9ucy4gICovCisgIGxkX3N0YXRlLmFsbHNlY3Rpb25zID0KKyAgICAoc3RydWN0IHNjbmhlYWQgKiopIG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLAorCQkJCSAgICAgICAobGRfc3RhdGUubmFsbHNlY3Rpb25zICsgMSkKKwkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBzY25oZWFkICopKTsKKworICAvKiBGaWxsIHRoZSBhcnJheS4gIFdlIHJlbHkgaGVyZSBvbiB0aGUgaGFzaCB0YWJsZSBpdGVyYXRvciB0bworICAgICByZXR1cm4gdGhlIGVudHJpZXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZC4gICovCisgIGNudCA9IDA7CisgIHAgPSBOVUxMOworICB3aGlsZSAoKGggPSBsZF9zZWN0aW9uX3RhYl9pdGVyYXRlICgmbGRfc3RhdGUuc2VjdGlvbl90YWIsICZwKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc2NuaW5mbyAqcnVucDsKKyAgICAgIGJvb2wgdXNlZCA9IGZhbHNlOworCisgICAgICBpZiAoaC0+a2luZCA9PSBzY25fbm9ybWFsKQorCXsKKwkgIHJ1bnAgPSBoLT5sYXN0OworCSAgZG8KKwkgICAgeworCSAgICAgIGlmIChoLT50eXBlID09IFNIVF9SRUwgfHwgaC0+dHlwZSA9PSBTSFRfUkVMQSkKKwkJeworCQkgIGlmIChydW5wLT51c2VkKQorCQkgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gc2VjdGlvbi4gIElmIHRoZSBzZWN0aW9uCisJCSAgICAgICBpdCBpcyByZWxvY2F0aW5nIGlzIHVzZWQgaW4gdGhlIHJlc3VsdCBzbyBtdXN0CisJCSAgICAgICB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KKwkJICAgIHJ1bnAtPnVzZWQKKwkJICAgICAgPSBydW5wLT5maWxlaW5mby0+c2NuaW5mb1tTQ05JTkZPX1NIRFIgKHJ1bnAtPnNoZHIpLnNoX2luZm9dLnVzZWQ7CisJCX0KKworCSAgICAgIC8qIEFjY3VtdWxhdGUgdGhlIHJlc3VsdC4gICovCisJICAgICAgdXNlZCB8PSBydW5wLT51c2VkOworCisJICAgICAgLyogTmV4dCBpbnB1dCBzZWN0aW9uLiAgKi8KKwkgICAgICBydW5wID0gcnVucC0+bmV4dDsKKwkgICAgfQorCSAgd2hpbGUgKHJ1bnAgIT0gaC0+bGFzdCk7CisKKwkgIGgtPnVzZWQgPSB1c2VkOworCX0KKworICAgICAgbGRfc3RhdGUuYWxsc2VjdGlvbnNbY250KytdID0gaDsKKyAgICB9CisgIGxkX3N0YXRlLm51c2Vkc2VjdGlvbnMgPSBjbnQ7CisKKyAgYXNzZXJ0IChjbnQgPT0gbGRfc3RhdGUubmFsbHNlY3Rpb25zKTsKK30KKworCisvKiBBZGQgZ2l2ZW4gcGF0aCB0byB0aGUgZW5kIG9mIGxpc3QuICAqLworc3RhdGljIHZvaWQKK2FkZF9yeHhwYXRoIChzdHJ1Y3QgcGF0aGVsZW1lbnQgKipwYXRocCwgY29uc3QgY2hhciAqc3RyKQoreworICBzdHJ1Y3QgcGF0aGVsZW1lbnQgKm5ld3A7CisKKyAgLyogVGhlIHBhdGggZWxlbWVudHMgY2FuIGluIHRoZW9yeSBiZSBmcmVlZCBhZnRlciB3ZSByZWFkIGFsbCB0aGUKKyAgICAgZmlsZXMuICBCdXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgd2UgYXJlIHRhbGtpbmcgYWJvdXQgaXMgc21hbGwKKyAgICAgYW5kIHRoZSBjb3N0IG9mIGZyZWUoKSBjYWxscyBpcyBub3QgbmVnbGVjdGFibGUuICAqLworICBuZXdwID0gKHN0cnVjdCBwYXRoZWxlbWVudCAqKSBvYnN0YWNrX2FsbG9jICgmbGRfc3RhdGUuc21lbSwgc2l6ZW9mICgqbmV3cCkpOworICBuZXdwLT5wbmFtZSA9IHN0cjsKKyAgbmV3cC0+ZXhpc3QgPSAwOworI2lmbmRlZiBOREVCVUcKKyAgbmV3cC0+bmV4dCA9IE5VTEw7CisjZW5kaWYKKworICBDU05HTF9MSVNUX0FERF9SRUFSICgqcGF0aHAsIG5ld3ApOworfQorCisKKy8qIENvbnZlcnQgbGlzdHMgb2YgcG9zc2libHkgY29sb24tc2VwYXJhdGVkIGRpcmVjdG9yeSBsaXN0cyBpbnRvIGxpc3RzCisgICB3aGVyZSBlYWNoIGVudHJ5IGlzIGZvciBhIHNpbmdsZSBkaXJlY3RvcnkuICAqLworc3RhdGljIHZvaWQKK25vcm1hbGl6ZV9kaXJsaXN0IChzdHJ1Y3QgcGF0aGVsZW1lbnQgKipwYXRocCkKK3sKKyAgc3RydWN0IHBhdGhlbGVtZW50ICpmaXJzdHAgPSAqcGF0aHA7CisKKyAgZG8KKyAgICB7CisgICAgICBjb25zdCBjaGFyICpwbmFtZSA9ICgqcGF0aHApLT5wbmFtZTsKKyAgICAgIGNvbnN0IGNoYXIgKmNvbG9ucCA9IHN0cmNocm51bCAocG5hbWUsICc6Jyk7CisKKyAgICAgIGlmIChjb2xvbnAgIT0gTlVMTCkKKwl7CisJICBzdHJ1Y3QgcGF0aGVsZW1lbnQgKmxhc3RwID0gKnBhdGhwOworCSAgc3RydWN0IHBhdGhlbGVtZW50ICpuZXdwOworCisJICB3aGlsZSAoMSkKKwkgICAgeworCSAgICAgIGlmIChjb2xvbnAgPT0gcG5hbWUpCisJCWxhc3RwLT5wbmFtZSA9ICIuIjsKKwkgICAgICBlbHNlCisJCWxhc3RwLT5wbmFtZSA9IG9ic3RhY2tfc3RybmR1cCAoJmxkX3N0YXRlLnNtZW0sIHBuYW1lLAorCQkJCQkJY29sb25wIC0gcG5hbWUpOworCisJICAgICAgaWYgKCpjb2xvbnAgPT0gJ1wwJykKKwkJYnJlYWs7CisJICAgICAgcG5hbWUgPSBjb2xvbnAgKyAxOworCisJICAgICAgbmV3cCA9IChzdHJ1Y3QgcGF0aGVsZW1lbnQgKikgb2JzdGFja19hbGxvYyAoJmxkX3N0YXRlLnNtZW0sCisJCQkJCQkJICAgc2l6ZW9mICgqbmV3cCkpOworCSAgICAgIG5ld3AtPm5leHQgPSBsYXN0cC0+bmV4dDsKKwkgICAgICBuZXdwLT5leGlzdCA9IDA7CisJICAgICAgbGFzdHAgPSBsYXN0cC0+bmV4dCA9IG5ld3A7CisKKwkgICAgICBjb2xvbnAgPSBzdHJjaHJudWwgKHBuYW1lLCAnOicpOworCSAgICB9CisKKwkgIHBhdGhwID0gJmxhc3RwLT5uZXh0OworCX0KKyAgICAgIGVsc2UKKwlwYXRocCA9ICYoKnBhdGhwKS0+bmV4dDsKKyAgICB9CisgIHdoaWxlICgqcGF0aHAgIT0gZmlyc3RwKTsKK30KKworCisvKiBDYWxsZWQgYWZ0ZXIgYWxsIHBhcmFtZXRlcnMgYXJlIHBhcnNlZCB0byBicmluZyB0aGUgcnVucGF0aC9ycGF0aAorICAgaW5mb3JtYXRpb24gaW50byBhIHVzYWJsZSBmb3JtLiAgKi8KK3N0YXRpYyB2b2lkCitnZW5fcnh4cGF0aF9kYXRhICh2b2lkKQoreworICBjaGFyICpsZF9saWJyYXJ5X3BhdGgyOworCisgIC8qIENvbnZlcnQgdGhlIGluZm9ybWF0aW9uIGluIHRydWUgc2luZ2xlLWxpbmtlZCBsaXN0cyBmb3IgZWFzeSB1c2UuCisgICAgIEF0IHRoaXMgcG9pbnQgd2UgYWxzbyBkaXNjYXJkIHRoZSBycGF0aCBpbmZvcm1hdGlvbiBpZiBydW5wYXRoCisgICAgIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkLiAgcnBhdGggaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZQorICAgICB1c2VkIChvciBldmVyIGJlIGludmVudGVkIGZvciB0aGF0IG1hdHRlcikuICAqLworICBpZiAobGRfc3RhdGUucnBhdGggIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgcGF0aGVsZW1lbnQgKmVuZHAgPSBsZF9zdGF0ZS5ycGF0aDsKKyAgICAgIGxkX3N0YXRlLnJwYXRoID0gbGRfc3RhdGUucnBhdGgtPm5leHQ7CisgICAgICBlbmRwLT5uZXh0ID0gTlVMTDsKKyAgICB9CisgIGlmIChsZF9zdGF0ZS5ycGF0aF9saW5rICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IHBhdGhlbGVtZW50ICplbmRwID0gbGRfc3RhdGUucnBhdGhfbGluazsKKyAgICAgIGxkX3N0YXRlLnJwYXRoX2xpbmsgPSBsZF9zdGF0ZS5ycGF0aF9saW5rLT5uZXh0OworICAgICAgZW5kcC0+bmV4dCA9IE5VTEw7CisgICAgfQorCisgIGlmIChsZF9zdGF0ZS5ydW5wYXRoICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IHBhdGhlbGVtZW50ICplbmRwID0gbGRfc3RhdGUucnVucGF0aDsKKyAgICAgIGxkX3N0YXRlLnJ1bnBhdGggPSBsZF9zdGF0ZS5ydW5wYXRoLT5uZXh0OworICAgICAgZW5kcC0+bmV4dCA9IE5VTEw7CisKKyAgICAgIC8qIElmIHJwYXRoIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIGRpc2NhcmQgaXQuCisJIFhYWCBTaG91bGQgdGhlcmUgYmUgYSBwb3NzaWJpbGl0eSB0byBhdm9pZCB0aGlzPyAgKi8KKyAgICAgIHdoaWxlIChsZF9zdGF0ZS5ycGF0aCAhPSBOVUxMKQorCXsKKwkgIHN0cnVjdCBwYXRoZWxlbWVudCAqb2xkID0gbGRfc3RhdGUucnBhdGg7CisJICBsZF9zdGF0ZS5ycGF0aCA9IGxkX3N0YXRlLnJwYXRoLT5uZXh0OworCSAgZnJlZSAob2xkKTsKKwl9CisgICAgfQorICBpZiAobGRfc3RhdGUucnVucGF0aF9saW5rICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IHBhdGhlbGVtZW50ICplbmRwID0gbGRfc3RhdGUucnVucGF0aF9saW5rOworICAgICAgbGRfc3RhdGUucnVucGF0aF9saW5rID0gbGRfc3RhdGUucnVucGF0aF9saW5rLT5uZXh0OworICAgICAgZW5kcC0+bmV4dCA9IE5VTEw7CisKKyAgICAgIC8qIElmIHJwYXRoIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIGRpc2NhcmQgaXQuCisJIFhYWCBTaG91bGQgdGhlcmUgYmUgYSBwb3NzaWJpbGl0eSB0byBhdm9pZCB0aGlzPyAgKi8KKyAgICAgIHdoaWxlIChsZF9zdGF0ZS5ycGF0aF9saW5rICE9IE5VTEwpCisJeworCSAgc3RydWN0IHBhdGhlbGVtZW50ICpvbGQgPSBsZF9zdGF0ZS5ycGF0aF9saW5rOworCSAgbGRfc3RhdGUucnBhdGhfbGluayA9IGxkX3N0YXRlLnJwYXRoX2xpbmstPm5leHQ7CisJICBmcmVlIChvbGQpOworCX0KKworICAgICAgLyogVGhlIGluZm9ybWF0aW9uIGluIHRoZSBzdHJpbmdzIGluIHRoZSBsaXN0IGNhbiBhY3R1YWxseSBiZQorCSBkaXJlY3RvcnkgbGlzdHMgdGhlbXNlbHZlcywgd2l0aCBlbnRyaWVzIHNlcGFyYXRlZCBieSBjb2xvbnMuCisJIENvbnZlcnQgdGhlIGxpc3Qgbm93IHRvIGEgbGlzdCB3aXRoIG9uZSBsaXN0IGVudHJ5IGZvciBlYWNoCisJIGRpcmVjdG9yeS4gICovCisgICAgICBub3JtYWxpemVfZGlybGlzdCAoJmxkX3N0YXRlLnJ1bnBhdGhfbGluayk7CisgICAgfQorICBlbHNlIGlmIChsZF9zdGF0ZS5ycGF0aF9saW5rICE9IE5VTEwpCisgICAgLyogU2FtZSBhcyBmb3IgdGhlIHJ1bnBhdGhfbGluayBhYm92ZS4gICovCisgICAgbm9ybWFsaXplX2Rpcmxpc3QgKCZsZF9zdGF0ZS5ycGF0aF9saW5rKTsKKworCisgIC8qIEFzIGEgcmVsYXRlZCB0YXNrLCBoYW5kbGUgdGhlIExEX0xJQlJBUllfUEFUSCB2YWx1ZSBoZXJlLiAgRmlyc3QKKyAgICAgd2UgaGF2ZSB0byBwb3NzaWJseSBzcGxpdCB0aGUgdmFsdWUgZm91bmQgKGlmIGl0IGNvbnRhaW5zIGEKKyAgICAgc2VtaWNvbG9uKS4gIFRoZW4gd2UgaGF2ZSB0byBzcGxpdCB0aGUgdmFsdWUgaW4gbGlzdCBvZgorICAgICBkaXJlY3RvcmllcywgaS5lLiwgc3BsaXQgYXQgdGhlIGNvbG9ucy4gICovCisgIGlmIChsZF9saWJyYXJ5X3BhdGgxICE9IE5VTEwpCisgICAgeworICAgICAgbGRfbGlicmFyeV9wYXRoMiA9IHN0cmNociAobGRfbGlicmFyeV9wYXRoMSwgJzsnKTsKKyAgICAgIGlmIChsZF9saWJyYXJ5X3BhdGgyID09IE5VTEwpCisJeworCSAgLyogSWYgbm8gc2VtaWNvbG9uIGlzIHByZXNlbnQgdGhlIGRpcmVjdG9yaWVzIGFyZSBsb29rZWQgYXQKKwkgICAgIGFmdGVyIHRoZSAtTCBwYXJhbWV0ZXJzICgtPiBsZF9saWJyYXJ5X3BhdGgyKS4gICovCisJICBsZF9saWJyYXJ5X3BhdGgyID0gbGRfbGlicmFyeV9wYXRoMTsKKwkgIGxkX2xpYnJhcnlfcGF0aDEgPSBOVUxMOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBOVUwgdGVybWluYXRlIHRoZSBmaXJzdCBwYXJ0LiAgKi8KKwkgICpsZF9saWJyYXJ5X3BhdGgyKysgPSAnXDAnOworCisJICAvKiBDb252ZXJ0IHRoZSBzdHJpbmcgdmFsdWUgaW4gYSBsaXN0LiAgKi8KKwkgIGFkZF9yeHhwYXRoICgmbGRfc3RhdGUubGRfbGlicmFyeV9wYXRoMSwgbGRfbGlicmFyeV9wYXRoMSk7CisJICBub3JtYWxpemVfZGlybGlzdCAoJmxkX3N0YXRlLmxkX2xpYnJhcnlfcGF0aDEpOworCX0KKworICAgICAgYWRkX3J4eHBhdGggKCZsZF9zdGF0ZS5sZF9saWJyYXJ5X3BhdGgyLCBsZF9saWJyYXJ5X3BhdGgyKTsKKyAgICAgIG5vcm1hbGl6ZV9kaXJsaXN0ICgmbGRfc3RhdGUubGRfbGlicmFyeV9wYXRoMik7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCityZWFkX3ZlcnNpb25fc2NyaXB0IChjb25zdCBjaGFyICpmbmFtZSkKK3sKKyAgLyogT3BlbiB0aGUgZmlsZS4gIFRoZSBuYW1lIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBjb21wbGV0ZSAocmVsYXRpdmUKKyAgICAgb3IgYWJzb2x1dGUpIHBhdGguICBObyBzZWFyY2ggYWxvbmcgYSBwYXRoIHdpbGwgYmUgcGVyZm9ybWVkLiAgKi8KKyAgbGRpbiA9IGZvcGVuIChmbmFtZSwgInIiKTsKKyAgaWYgKGxkaW4gPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCByZWFkIHZlcnNpb24gc2NyaXB0IFwiJXNcIiIpLAorCSAgIGZuYW1lKTsKKyAgLyogTm8gbmVlZCBmb3IgbG9ja2luZy4gICovCisgIF9fZnNldGxvY2tpbmcgKGxkaW4sIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKworICAvKiBUZWxsIHRoZSBwYXJzZXIgdGhhdCB0aGlzIGlzIGEgdmVyc2lvbiBzY3JpcHQuICAqLworICBsZF9zY2FuX3ZlcnNpb25fc2NyaXB0ID0gMTsKKworICBsZGxpbmVubyA9IDE7CisgIGxkaW5fZm5hbWUgPSBmbmFtZTsKKyAgaWYgKGxkcGFyc2UgKCkgIT0gMCkKKyAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgcGFyc2luZy4gICovCisgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKworICBmY2xvc2UgKGxkaW4pOworfQorCisKK3N0YXRpYyB2b2lkCitjcmVhdGVfbHNjcmlwdF9zeW1ib2xzICh2b2lkKQoreworICAvKiBXYWxrIHRocm91Z2ggdGhlIGRhdGEgZnJvbSB0aGUgbGlua2VyIHNjcmlwdCBhbmQgZ2VuZXJhdGUgYWxsIHRoZQorICAgICBzeW1ib2xzIHdoaWNoIGFyZSByZXF1aXJlZCB0byBiZSBwcmVzZW50IGFuZCBhbmQgdGhvc2UgbWFya2VkCisgICAgIHdpdGggUFJPVklERSBpZiB0aGVyZSBpcyBhIHVuZGVmaW5lZCByZWZlcmVuY2UuICAqLworICBpZiAobGRfc3RhdGUub3V0cHV0X3NlZ21lbnRzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHN0cnVjdCBvdXRwdXRfc2VnbWVudCAqc2VnbWVudCA9IGxkX3N0YXRlLm91dHB1dF9zZWdtZW50cy0+bmV4dDsKKyAgZG8KKyAgICB7CisgICAgICBzdHJ1Y3Qgb3V0cHV0X3J1bGUgKm9ydWxlOworCisgICAgICBmb3IgKG9ydWxlID0gc2VnbWVudC0+b3V0cHV0X3J1bGVzOyBvcnVsZSAhPSBOVUxMOyBvcnVsZSA9IG9ydWxlLT5uZXh0KQorCWlmIChvcnVsZS0+dGFnID09IG91dHB1dF9hc3NpZ25tZW50CisJICAgIC8qIFRoZSBhc3NpZ25tZW50cyB0byAiLiIgKGkuZS4sIHRoZSBQQykgaGF2ZSB0byBiZQorICAgICAgICAgICAgICAgaWdub3JlZCBoZXJlLiAgKi8KKwkgICAgJiYgc3RyY21wIChvcnVsZS0+dmFsLmFzc2lnbm1lbnQtPnZhcmlhYmxlLCAiLiIpICE9IDApCisJICB7CisJICAgIHN0cnVjdCBzeW1ib2wgKnMgPSBsZF9zdGF0ZS51bnJlc29sdmVkOworCisJICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIHN5bWJvbCBpcyBuZWVkZWQuICAqLworCSAgICBpZiAobGlrZWx5IChzICE9IE5VTEwpKQorCSAgICAgIHsKKwkJc3RydWN0IHN5bWJvbCAqZmlyc3QgPSBzOworCQljb25zdCBjaGFyICpwcm92aWRlbmFtZSA9IG9ydWxlLT52YWwuYXNzaWdubWVudC0+dmFyaWFibGU7CisKKwkJLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHN5bWJvbCBpcyBzdGlsbAorCQkgICB1bmRlZmluZWQuICAqLworCQkvLyBYWFggVE9ETyBMb29wIGluc2lkZSBhIGxvb3AuICBHYWchICBNdXN0IHJld3JpdGUuICAqLworCQlkbworCQkgIGlmIChzdHJjbXAgKHMtPm5hbWUsIHByb3ZpZGVuYW1lKSA9PSAwKQorCQkgICAgeworCQkgICAgICAvKiBOb3QgZGVmaW5lZCBidXQgcmVmZXJlbmNlZC4gICovCisJCSAgICAgIGlmICh1bmxpa2VseSAoIXMtPmRlZmluZWQpKQorCQkJeworCQkJICAvKiBQdXQgb24gdGhlIGxpc3Qgb2Ygc3ltYm9scy4gIEZpcnN0IHJlbW92ZSBpdCBmcm9tCisJCQkgICAgIHdoYXRldmVyIGxpc3QgaXQgY3VycmVudGx5IGlzIG9uLiAgKi8KKwkJCSAgQ0RCTF9MSVNUX0RFTCAobGRfc3RhdGUudW5yZXNvbHZlZCwgcyk7CisJCQkgIC0tbGRfc3RhdGUubnVucmVzb2x2ZWQ7CisJCQkgIGdvdG8gdXNlX2l0OworCQkJfQorCisJCSAgICAgIGlmICh1bmxpa2VseSAoIW9ydWxlLT52YWwuYXNzaWdubWVudC0+cHJvdmlkZV9mbGFnKSkKKwkJCXsKKwkJCSAgLyogVGhlIHN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQgYW5kIG5vdyBhZ2FpbgorCQkJICAgICBpbiB0aGUgbGlua2VyIHNjcmlwdC4gIFRoaXMgaXMgYW4gZXJyb3IuICAqLworCQkJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKK2R1cGxpY2F0ZSBkZWZpbml0aW9uIG9mICclcycgaW4gbGlua2VyIHNjcmlwdCIpLAorCQkJCSBwcm92aWRlbmFtZSk7CisJCQkgIGdvdG8gbmV4dF9ydWxlOworCQkJfQorCQkgICAgfQorCQl3aGlsZSAoKHMgPSBzLT5uZXh0KSAhPSBmaXJzdCk7CisJICAgICAgfQorCisJICAgIC8qIElmIHRoZSBzeW1ib2wgb25seSBoYXMgdG8gYmUgcHJvdmlkZWQgaWYgaXQgaXMgbmVlZGVkLAorICAgICAgICAgICAgICAgaWdub3JlIGl0IGhlcmUgc2luY2UgaXQgaXMgbm90IHVuZGVmaW5lZC4gICovCisJICAgIGlmIChvcnVsZS0+dmFsLmFzc2lnbm1lbnQtPnByb3ZpZGVfZmxhZykKKwkgICAgICBjb250aW51ZTsKKworCSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgbmV3IHN5bWJvbC4gICovCisJICAgIHMgPSAoc3RydWN0IHN5bWJvbCAqKQorCSAgICAgIG9ic3RhY2tfY2FsbG9jICgmbGRfc3RhdGUuc21lbSwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisKKwkgICAgLyogSW5pdGlhbGl6ZSBpdC4gICovCisJICAgIHMtPm5hbWUgPSBvcnVsZS0+dmFsLmFzc2lnbm1lbnQtPnZhcmlhYmxlOworCisJICAgIC8qIEluc2VydCBpdCBpbnRvIHRoZSBzeW1ib2wgaGFzaCB0YWJsZS4gICovCisJICAgIHVuc2lnbmVkIGxvbmcgaW50IGh2YWwgPSBlbGZfaGFzaCAocy0+bmFtZSk7CisJICAgIGlmICh1bmxpa2VseSAobGRfc3ltYm9sX3RhYl9pbnNlcnQgKCZsZF9zdGF0ZS5zeW1ib2xfdGFiLAorCQkJCQkJaHZhbCwgcykgIT0gMCkpCisJICAgICAgeworCQkvKiBUaGlzIG1lYW5zIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBzb21ld2hlcmUgZWxzZS4KKwkJICAgTWF5YmUgaXQgY29tZXMgZnJvbSBhIERTTyBvciBzby4gIEdldCB0aGUKKwkJICAgZGVmaW5pdGlvbi4gICovCisJCWZyZWUgKHMpOworCQlzdHJ1Y3Qgc3ltYm9sICpvbGQgPSBsZF9zeW1ib2xfdGFiX2ZpbmQgKCZsZF9zdGF0ZS5zeW1ib2xfdGFiLAorCQkJCQkJCSBodmFsLCBzKTsKKwkJYXNzZXJ0IChvbGQgIT0gTlVMTCk7CisJCWZyZWUgKHMpOworCisJCS8qIElmIHRoaXMgaXMgYSBkZWZpbml0aW9uIGZyb20gdGhlIGFwcGxpY2F0aW9uIGl0c2VsZgorCQkgICB0aGlzIG1lYW5zIGEgZHVwbGljYXRlIGRlZmluaXRpb24uICAqLworCQlpZiAoISBvbGQtPmluX2RzbykKKwkJICB7CisJCSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKK2R1cGxpY2F0ZSBkZWZpbml0aW9uIG9mICclcycgaW4gbGlua2VyIHNjcmlwdCIpLAorCQkJICAgcy0+bmFtZSk7CisJCSAgICBnb3RvIG5leHRfcnVsZTsKKwkJICB9CisKKwkJLyogV2UgdXNlIHRoZSBkZWZpbml0aW9uIGZyb20gdGhlIGxpbmtlciBzY3JpcHQuICAqLworCQlzID0gb2xkOworCSAgICAgIH0KKworCSAgdXNlX2l0OgorCSAgICAvKiBUaGUgc3ltYm9sIGlzIChub3cpIGRlZmluZWQuICAqLworCSAgICBzLT5kZWZpbmVkID0gMTsKKwkgICAgcy0+dHlwZSA9IFNUVF9OT1RZUEU7CisKKwkgICAgLyogQWRkIGEgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2wgcmVjb3JkLiAgV2Ugd2lsbCBjb21lCisJICAgICAgIGFjcm9zcyBpdCB3aGVuIGNyZWF0aW5nIHRoZSBvdXRwdXQgZmlsZS4gICovCisJICAgIG9ydWxlLT52YWwuYXNzaWdubWVudC0+c3ltID0gczsKKworCSAgICBTTkdMX0xJU1RfUFVTSCAobGRfc3RhdGUubHNjcmlwdF9zeW1zLCBzKTsKKwkgICAgKytsZF9zdGF0ZS5ubHNjcmlwdF9zeW1zOworCisJICBuZXh0X3J1bGU6CisJICAgIDsKKwkgIH0KKworICAgICAgc2VnbWVudCA9IHNlZ21lbnQtPm5leHQ7CisgICAgfQorICB3aGlsZSAoc2VnbWVudCAhPSBsZF9zdGF0ZS5vdXRwdXRfc2VnbWVudHMtPm5leHQpOworfQorCisKKy8qIENyZWF0ZSBjcmVhdGlvbiBvZiBzcGVjdGlvbiBzZWN0aW9uIHN5bWJvbHMgcmVwcmVzZW50aW5nIHNlY3Rpb25zIGluIHRoZQorICAgb3V0cHV0IGZpbGUuICBUaGlzIGlzIGRvbmUgZm9yIHN5bWJvbHMgbGlrZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYW5kCisgICBfRFlOQU1JQy4gICovCitzdGF0aWMgdm9pZAorY3JlYXRlX3NwZWNpYWxfc2VjdGlvbl9zeW1ib2wgKHN0cnVjdCBzeW1ib2wgKipzeW1wLCBjb25zdCBjaGFyICpuYW1lKQoreworICBpZiAoKnN5bXAgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBObyBzeW1ib2wgZGVmaW5lZCBmb3VuZCB5ZXQuICBDcmVhdGUgb25lLiAgKi8KKyAgICAgIHN0cnVjdCBzeW1ib2wgKm5ld3N5bSA9IChzdHJ1Y3Qgc3ltYm9sICopCisJb2JzdGFja19jYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBzaXplb2YgKCpuZXdzeW0pKTsKKworICAgICAgbmV3c3ltLT5uYW1lID0gbmFtZTsKKyAgICAgIC8vIFhYWCBTaG91bGQgd2UgbWFyayB0aGUgc3ltYm9sIGhpZGRlbj8gIFRoZXkgYXJlIGhhcmRseSB1c2VmdWwKKyAgICAgIC8vIHVzZWQgb3V0c2lkZSB0aGUgY3VycmVudCBvYmplY3QuCisKKyAgICAgIC8qIEFkZCB0byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAobGRfc3ltYm9sX3RhYl9pbnNlcnQgKCZsZF9zdGF0ZS5zeW1ib2xfdGFiLAorCQkJCQkgIGVsZl9oYXNoIChuYW1lKSwgbmV3c3ltKSAhPSAwKSkKKwlhYm9ydCAoKTsKKworICAgICAgKnN5bXAgPSBuZXdzeW07CisgICAgfQorICBlbHNlIGlmICgoKnN5bXApLT5kZWZpbmVkKQorICAgIC8qIENhbm5vdCBoYXBwZW4uICBXZSBkbyB1c2UgdGhpcyBzeW1ib2wgZnJvbSBhbnkgaW5wdXQgZmlsZS4gICovCisgICAgYWJvcnQgKCk7CisKKyAgKCpzeW1wKS0+ZGVmaW5lZCA9IDE7CisgICgqc3ltcCktPnR5cGUgPSBTVFRfT0JKRUNUOworCisgICsrbGRfc3RhdGUubnN5bXRhYjsKK30KZGlmZiAtLWdpdCBhL3NyYy9sZC5oIGIvc3JjL2xkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2M2ExOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sZC5oCkBAIC0wLDAgKzEsMTA3NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIExEX0gKKyNkZWZpbmUgTERfSAkxCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPG9ic3RhY2suaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ4ZWxmLmgiCisKKworLyogUmVjb21tZW5kZWQgc2l6ZSBvZiB0aGUgYnVmZmVyIHBhc3NlZCB0byBsZF9zdHJlcnJvci4gICovCisjZGVmaW5lIEVSUkJVRlNJWkUJKDUxMikKKworLyogQ2hhcmFjdGVyIHVzZWQgdG8gaW50cm9kdWNlIHZlcnNpb24gbmFtZSBhZnRlciBzeW1ib2wuICAqLworI2RlZmluZSBWRVJfQ0hSCSdAJworCisKKy8qIE1ldGhvZHMgZm9yIGhhbmRsaW5nIGFyY2hpdmVzLiAgKi8KK2VudW0gZXh0cmFjdF9ydWxlCisgIHsKKyAgICBkZWZhdWx0ZXh0cmFjdCwJLyogV2VhayByZWZlcmVuY2VzIGRvbid0IGNhdXNlIGFyY2hpdmUgbWVtYmVyIHRvCisJCQkgICBiZSB1c2VkLiAgKi8KKyAgICB3ZWFrZXh0cmFjdCwJLyogV2VhayByZWZlcmVuY2VzIGNhdXNlIGFyY2hpdmUgbWVtYmVyIHRvIGJlCisJCQkgICBleHRyYWN0ZWQuICAqLworICAgIGFsbGV4dHJhY3QJCS8qIEV4dHJhY3QgYWxsIGFyY2hpdmUgbWVtYmVycyByZWdhcmRsZXNzIG9mCisJCQkgICByZWZlcmVuY2VzIChha2Egd2hvbGUtYXJjaGl2ZSkuICAqLworICB9OworCisKKy8qIFR5cGUgb2Ygb3V0cHV0IGZpbGUuICAqLworZW51bSBmaWxlX3R5cGUKKyAgeworICAgIG5vX2ZpbGVfdHlwZSA9IDAsCQkvKiBOb25lIHNlbGVjdGVkIHNvIGZhci4gICovCisgICAgZXhlY3V0YWJsZV9maWxlX3R5cGUsCS8qIEV4ZWN1dGFibGUuICAqLworICAgIGRzb19maWxlX3R5cGUsCQkvKiBEU08uICAqLworICAgIGRzb19uZWVkZWRfZmlsZV90eXBlLAkvKiBEU08gaW50cm9kdWNlZCBieSBEVF9ORUVERUQuICAqLworICAgIHJlbG9jYXRhYmxlX2ZpbGVfdHlwZSwJLyogUmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAqLworICAgIGFyY2hpdmVfZmlsZV90eXBlCQkvKiBBcmNoaXZlIChpbnB1dCBvbmx5KS4gICovCisgIH07CisKKworc3RydWN0IHVzZWRmaWxlcworeworICAvKiBUaGUgbmV4dCBmaWxlIGdpdmVuIGF0IHRoZSBjb21tYW5kIGxpbmUuICAqLworICBzdHJ1Y3QgdXNlZGZpbGVzICpuZXh0OworICAvKiBOb256ZXJvIGlmIHRoaXMgZmlsZSBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgZ3JvdXAuICAqLworICBib29sIGdyb3VwX3N0YXJ0OworICAvKiBOb256ZXJvIGlmIHRoaXMgZmlsZSBpcyB0aGUgZW5kIG9mIGEgZ3JvdXAuICAqLworICBib29sIGdyb3VwX2VuZDsKKyAgLyogUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBncm91cC4gIEl0IGlzIG5lY2Vzc2FyeSB0bworICAgICBleHBsYWluIHdoeSB3ZSBjYW5ub3Qgc2ltcGx5IHVzZSB0aGUgJ25leHQnIHBvaW50ZXIgYW5kIGhhdmUgYQorICAgICBjaXJjdWxhciBzaW5nbGUtbGlua2VkIGxpc3QgbGlrZSBpbiBtYW55IGNhc2VzLiAgVGhlIHByb2JsZW0gaXMKKyAgICAgdGhhdCB0aGUgbGFzdCBhcmNoaXZlIG9mIHRoZSBncm91cCwgaWYgaXQgaXMgdGhlIGxhc3QgZmlsZSBvZiB0aGUKKyAgICAgZ3JvdXAsIGNvbnRhaW5zIHRoZSBvbmx5IGV4aXN0aW5nIHBvaW50ZXIgdG8gdGhlIG5leHQgZmlsZSB3ZQorICAgICBoYXZlIHRvIGxvb2sgYXQuICBBbGwgZmlsZXMgYXJlIGluaXRpYWxseSBjb25uZWN0ZWQgdmlhIHRoZQorICAgICAnbmV4dCcgcG9pbnRlciBpbiBhIHNpbmdsZS1saW5rZWQgbGlzdC4gIFRoZXJlZm9yZSB3ZSBjYW5ub3QKKyAgICAgb3ZlcndyaXRlIHRoaXMgdmFsdWUuICBJdCBpbnN0ZWFkIHdpbGwgYmUgdXNlZCBvbmNlIHRoZSBncm91cCBpcworICAgICBoYW5kbGVkIGFuZCB3ZSBnbyBvbiBwcm9jZXNzaW5nIHRoZSByZXN0IG9mIHRoZSBmaWxlcy4gICovCisgIHN0cnVjdCB1c2VkZmlsZXMgKmdyb3VwX2JhY2tyZWY7CisKKyAgLyogTmFtZS9wYXRoIG9mIHRoZSBmaWxlLiAgKi8KKyAgY29uc3QgY2hhciAqZm5hbWU7CisgIC8qIFJlc29sdmVkIGZpbGUgbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKnJmbmFtZTsKKyAgLyogTmFtZSB1c2VkIGFzIHJlZmVyZW5jZSBpbiBEVF9ORUVERUQgZW50cmllcy4gIFRoaXMgaXMgbm9ybWFsbHkKKyAgICAgdGhlIFNPTkFNRS4gIElmIGl0IGlzIG1pc3NpbmcgaXQncyBub3JtYWxseSB0aGUgZm5hbWUgYWJvdmUuICAqLworICBjb25zdCBjaGFyICpzb25hbWU7CisgIC8qIEhhbmRsZSBmb3IgdGhlIFNPTkFNRSBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KKyAgc3RydWN0IEVibF9TdHJlbnQgKnNvbmFtZWVudDsKKworICAvKiBIZWxwIHRvIGlkZW50aWZ5IGR1cGxpY2F0ZXMuICAqLworICBkZXZfdCBkZXY7CisgIGlub190IGlubzsKKworICBlbnVtCisgICAgeworICAgICAgbm90X29wZW5lZCwKKyAgICAgIG9wZW5lZCwKKyAgICAgIGluX2FyY2hpdmUsCisgICAgICBjbG9zZWQKKyAgICB9IHN0YXR1czsKKworICAvKiBIb3cgdG8gZXh0cmFjdCBlbGVtZW50cyBmcm9tIGFyY2hpdmVzLiAgKi8KKyAgZW51bSBleHRyYWN0X3J1bGUgZXh0cmFjdF9ydWxlOworCisgIC8qIExhenktbG9hZGluZyBydWxlLiAgKi8KKyAgYm9vbCBsYXp5bG9hZDsKKworICAvKiBJZiB0aGlzIGlzIGEgRFNPIHRoZSBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlIGlzIGRpcmVjdGx5CisgICAgIHVzZWQgaW4gYSByZWZlcmVuY2UuICAqLworICBib29sIHVzZWQ7CisKKyAgLyogSWYgbm9uemVybyB0aGlzIGlzIHRoZSBhcmNoaXZlIHNlcXVlbmNlIG51bWJlciB3aGljaCBjYW4gYmUgdXNlZCB0bworICAgICBkZXRlcm1pbmUgd2hldGhlciBiYWNrIHJlZmVybmNlcyBmcm9tIC0oIC0pIG9yIEdST1VQIHN0YXRlbWVudHMKKyAgICAgaGF2ZSB0byBiZSBmb2xsb3dlZC4gICovCisgIGludCBhcmNoaXZlX3NlcTsKKworICAvKiBQb2ludGVyIHRvIHRoZSByZWNvcmQgZm9yIHRoZSBhcmNoaXZlIGNvbnRhaW5pbmcgdGhpcyBmaWxlLiAgKi8KKyAgc3RydWN0IHVzZWRmaWxlcyAqYXJjaGl2ZV9maWxlOworCisgIC8qIFR5cGUgb2YgZmlsZS4gIFdlIGhhdmUgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgdHlwZXMgc2luY2UgdGhleQorICAgICBhcmUgc2VhcmNoZWQgZm9yIGRpZmZlcmVudGx5LiAgKi8KKyAgZW51bSBmaWxlX3R5cGUgZmlsZV90eXBlOworICAvKiBUaGlzIGlzIHRoZSBFTEYgbGlicmFyeSBoYW5kbGUgZm9yIHRoaXMgZmlsZS4gICovCisgIEVsZiAqZWxmOworCisgIC8qIFRoZSBFTEYgaGVhZGVyLiAgKi8KKyNpZiBOQVRJVkVfRUxGICE9IDAKKyAgWEVsZl9FaGRyICplaGRyOworIyBkZWZpbmUgRklMRUlORk9fRUhEUihmaSkgKCooZmkpKQorI2Vsc2UKKyAgWEVsZl9FaGRyIGVoZHI7CisjIGRlZmluZSBGSUxFSU5GT19FSERSKGZpKSAoZmkpCisjZW5kaWYKKworICAvKiBJbmRleCBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICBXZSB1c2UgYQorICAgICBzZXBhcmF0ZSBmaWVsZCBhbmQgbm90IHRoZSBlX3Noc3RybmR4IGZpZWxkIGluIHRoZSBFTEYgaGVhZGVyCisgICAgIHNpbmNlIGluIGNhc2Ugb2YgYSBmaWxlIHdpdGggbW9yZSB0aGFuIDY0MDAwIHNlY3Rpb25zIHRoZSBpbmRleAorICAgICBtaWdodCBiZSBzdG9yZWQgaW4gdGhlIHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gemVyby4gIFRoZQorICAgICBlbGZfZ2V0c2hzdHJuZHgoKSBmdW5jdGlvbiBjYW4gZmluZCB0aGUgdmFsdWUgYnV0IGl0IGlzIHRvbworICAgICBjb3N0bHkgdG8gcmVwZWF0IHRoaXMgY2FsbCBvdmVyIGFuZCBvdmVyLiAgKi8KKyAgc2l6ZV90IHNoc3RybmR4OworCisgIC8qIEluZm8gYWJvdXQgdGhlIHNlY3Rpb25zIG9mIHRoZSBmaWxlLiAgKi8KKyAgc3RydWN0IHNjbmluZm8KKyAgeworICAgIC8qIEhhbmRsZSBmb3IgdGhlIHNlY3Rpb24uICBOb3RlIHRoYXQgd2UgY2FuIHN0b3JlIGEgc2VjdGlvbgorICAgICAgIGhhbmRsZSBoZXJlIGJlY2F1c2UgdGhlIGZpbGUgaXMgbm90IGNoYW5naW5nLiAgVGhpcyB0b2dldGhlcgorICAgICAgIHdpdGggdGhlIGtub3dsZWRnZSBhYm91dCB0aGUgbGliZWxmIGxpYnJhcnkgaXMgZW5vdWdoIGZvciB1cyB0bworICAgICAgIGFzc3VtZSB0aGUgc2VjdGlvbiByZWZlcmVuY2UgcmVtYWlucyB2YWxpZCBhdCBhbGwgdGltZXMuICAqLworICAgIEVsZl9TY24gKnNjbjsKKyAgICAvKiBTZWN0aW9uIGhlYWRlci4gICovCisjaWYgTkFUSVZFX0VMRiAhPSAwCisgICAgWEVsZl9TaGRyICpzaGRyOworIyBkZWZpbmUgU0NOSU5GT19TSERSKHNpKSAoKihzaSkpCisjZWxzZQorICAgIFhFbGZfU2hkciBzaGRyOworIyBkZWZpbmUgU0NOSU5GT19TSERSKHNpKSAoc2kpCisjZW5kaWYKKyAgICAvKiBPZmZzZXQgb2YgdGhpcyBmaWxlcyBzZWN0aW9uIGluIHRoZSBjb21iaW5lZCBzZWN0aW9uLiAgKi8KKyAgICBYRWxmX09mZiBvZmZzZXQ7CisgICAgLyogSW5kZXggb2YgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgICBFbGYzMl9Xb3JkIG91dHNjbm5keDsKKyAgICAvKiBJbmRleCBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gaW4gdGhlICdhbGxzZWN0aW9uJyBhcnJheS4gICovCisgICAgRWxmMzJfV29yZCBhbGxzZWN0aW9uc2lkeDsKKyAgICAvKiBUcnVlIGlmIHRoZSBzZWN0aW9uIGlzIHVzZWQuICAqLworICAgIGJvb2wgdXNlZDsKKyAgICAvKiBTZWN0aW9uIGdyb3VwIG51bWJlci4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBTSFRfR1JPVVAgc2VjdGlvbi4gICovCisgICAgRWxmMzJfV29yZCBncnBpZDsKKyAgICAvKiBQb2ludGVyIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgZmlsZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICAqLworICAgIHN0cnVjdCB1c2VkZmlsZXMgKmZpbGVpbmZvOworICAgIC8qIExpc3Qgb2Ygc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24gKHNldCBvbmx5IGZvciBtZXJnZS1hYmxlIHNlY3Rpb25zKS4gICovCisgICAgc3RydWN0IHN5bWJvbCAqc3ltYm9sczsKKyAgICAvKiBTaXplIG9mIHJlbG9jYXRpb25zIGluIHRoaXMgc2VjdGlvbi4gIE9ubHkgdXNlZCBmb3IgcmVsb2NhdGlvbgorICAgICAgIHNlY3Rpb25zLiAgKi8KKyAgICBzaXplX3QgcmVsc2l6ZTsKKyAgICAvKiBQb2ludGVyIHRvIG5leHQgc2VjdGlvbiB3aGljaCBpcyBwdXQgaW4gdGhlIGdpdmVuIG91dHB1dAorICAgICAgIHNlY3Rpb24uICAqLworICAgIHN0cnVjdCBzY25pbmZvICpuZXh0OworICB9ICpzY25pbmZvOworCisgIC8qIExpc3Qgb2Ygc2VjdGlvbiBncm91cCBzZWN0aW9ucy4gICovCisgIHN0cnVjdCBzY25pbmZvICpncm91cHM7CisKKyAgLyogVGhlIHN5bWJvbCB0YWJsZSBzZWN0aW9uLgorCisgICAgIFhYWCBNYXliZSBzdXBwb3J0IGZvciBtb3JlIHRoYW4gb25lIHN5bWJvbCB0YWJsZSBpcyBuZWVkZWQuICAqLworICBFbGZfRGF0YSAqc3ltdGFiZGF0YTsKKyAgLyogRXh0cmEgc2VjdGlvbiBpbmRleCB0YWJsZSBzZWN0aW9uLiAgKi8KKyAgRWxmX0RhdGEgKnhuZHhkYXRhOworICAvKiBEeW5hbWljIHN5bWJvbCB0YWJsZSBzZWN0aW9uLiAgKi8KKyAgRWxmX0RhdGEgKmR5bnN5bXRhYmRhdGE7CisgIC8qIFRoZSB2ZXJzaW9uIG51bWJlciBzZWN0aW9uLiAgKi8KKyAgRWxmX0RhdGEgKnZlcnN5bWRhdGE7CisgIC8qIFRoZSBkZWZpbmVkIHZlcnNpb25zLiAgKi8KKyAgRWxmX0RhdGEgKnZlcmRlZmRhdGE7CisgIC8qIE51bWJlciBvZiB2ZXJzaW9ucyBkZWZpbmVkLiAgKi8KKyAgc2l6ZV90IG52ZXJkZWY7CisgIC8qIFRydWUgaWYgdGhlIHZlcnNpb24gd2l0aCB0aGUgZ2l2ZW4gaW5kZXggbnVtYmVyIGlzIHVzZWQgaW4gdGhlCisgICAgIG91dHB1dC4gICovCisgIFhFbGZfVmVyc3ltICp2ZXJkZWZ1c2VkOworICAvKiBIb3cgbWFueSB2ZXJzaW9ucyBhcmUgdXNlZC4gICovCisgIHNpemVfdCBudmVyZGVmdXNlZDsKKyAgLyogSGFuZGxlIGZvciBuYW1lIG9mIHRoZSB2ZXJzaW9uLiAgKi8KKyAgc3RydWN0IEVibF9TdHJlbnQgKip2ZXJkZWZlbnQ7CisgIC8qIFRoZSBuZWVkZWQgdmVyc2lvbnMuICAqLworICBFbGZfRGF0YSAqdmVybmVlZGRhdGE7CisgIC8qIFN0cmluZyB0YWJsZSBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKyAgRWxmMzJfV29yZCBzeW1zdHJpZHg7CisgIC8qIFN0cmluZyB0YWJsZSBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLworICBFbGYzMl9Xb3JkIGR5bnN5bXN0cmlkeDsKKyAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCisgIHNpemVfdCBuc3ltdGFiOworICBzaXplX3QgbmxvY2Fsc3ltYm9sczsKKyAgc2l6ZV90IG5keW5zeW10YWI7CisgIC8qIER5bmFtaWMgc2VjdGlvbi4gICovCisgIEVsZl9TY24gKmR5bnNjbjsKKworICAvKiBJbmRpcmVjdGlvbiB0YWJsZSBmb3IgdGhlIHN5bWJvbHMgZGVmaW5lZCBoZXJlLiAgKi8KKyAgRWxmMzJfV29yZCAqc3ltaW5kaXJlY3Q7CisgIEVsZjMyX1dvcmQgKmR5bnN5bWluZGlyZWN0OworICAvKiBGb3IgdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2xzIHdlIG5lZWQgYSByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbAorICAgICByZWNvcmQuICAqLworICBzdHJ1Y3Qgc3ltYm9sICoqc3ltcmVmOworICBzdHJ1Y3Qgc3ltYm9sICoqZHluc3ltcmVmOworCisgIC8qIFRoaXMgaXMgdGhlIGZpbGUgZGVzY3JpcHRvci4gIFRoZSB2YWx1ZSBpcyAtMSBpZiB0aGUgZGVzY3JpcHRvcgorICAgICB3YXMgYWxyZWFkeSBjbG9zZWQuICBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgbmVlZGVkIGZpbGUgZGVzY3JpcHRvcnMKKyAgICAgdG8gb3BlbiBuZXcgZmlsZXMuICAqLworICBpbnQgZmQ7CisgIC8qIFRoaXMgZmxhZyBpcyB0cnVlIGlmIHRoZSBkZXNjcmlwdG9yIHdhcyBwYXNzZWQgdG8gdGhlIGdlbmVyaWMKKyAgICAgZnVuY3Rpb25zIGZyb20gc29tZXdoZXJlIGVsc2UuICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbDsKKyAgICAgbm8gbWFjaGluZS1zcGVjaWZpYyBjb2RlIG11c3QgdXNlIHRoaXMgZmxhZy4gICovCisgIGJvb2wgZmRfcGFzc2VkOworCisgIC8qIFRydWUgaWYgYW55IG9mIHRoZSBzZWN0aW9ucyBpcyBtZXJnZS1hYmxlLiAgKi8KKyAgYm9vbCBoYXNfbWVyZ2Vfc2VjdGlvbnM7Cit9OworCisKKy8qIEZ1bmN0aW9ucyB0byB0ZXN0IGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBmaWxlcyB3ZSBoYW5kbGUuICAqLworc3RhdGljIGlubGluZSBpbnQKK2xkX2ZpbGVfcmVsX3AgKHN0cnVjdCB1c2VkZmlsZXMgKmZpbGUpCit7CisgIHJldHVybiAoZWxmX2tpbmQgKGZpbGUtPmVsZikgPT0gRUxGX0tfRUxGCisJICAmJiBGSUxFSU5GT19FSERSIChmaWxlLT5laGRyKS5lX3R5cGUgPT0gRVRfUkVMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2xkX2ZpbGVfZHNvX3AgKHN0cnVjdCB1c2VkZmlsZXMgKmZpbGUpCit7CisgIHJldHVybiAoZWxmX2tpbmQgKGZpbGUtPmVsZikgPT0gRUxGX0tfRUxGCisJICAmJiBGSUxFSU5GT19FSERSIChmaWxlLT5laGRyKS5lX3R5cGUgPT0gRVRfRFlOKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2xkX2ZpbGVfYXJfcCAoc3RydWN0IHVzZWRmaWxlcyAqZmlsZSkKK3sKKyAgcmV0dXJuIGVsZl9raW5kIChmaWxlLT5lbGYpID09IEVMRl9LX0FSOworfQorCisKK3N0cnVjdCBwYXRoZWxlbWVudAoreworICAvKiBUaGUgbmV4dCBwYXRoIHRvIHNlYXJjaC4gICovCisgIHN0cnVjdCBwYXRoZWxlbWVudCAqbmV4dDsKKyAgLyogVGhlIHBhdGggbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKnBuYW1lOworICAvKiBMYXJnZXIgdGhhbiB6ZXJvIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzLCBzbWFsbGVyIHRoYW4gemVybyBpZiBub3QsCisgICAgIHplcm8gaWYgaXQgaXMgbm90IHlldCBrbm93bi4gICovCisgIGludCBleGlzdDsKK307CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbi4gICovCitzdHJ1Y3QgbGRfc3RhdGU7CisKKworLyogQ2FsbGJhY2sgZnVuY3Rpb25zLiAgKi8KK3N0cnVjdCBjYWxsYmFja3MKK3sKKyAgLyogTGlicmFyeSBuYW1lcyBwYXNzZWQgdG8gdGhlIGxpbmtlciBhcyAtbFhYWCByZXByZXNlbnQgZmlsZXMgbmFtZWQKKyAgICAgbGliWFhYLllZLiAgVGhlIFlZIHBhcnQgY2FuIGhhdmUgZGlmZmVyZW50IGZvcm1zLCBkZXBlbmRpbmcgb24gdGhlCisgICAgIGFyY2hpdGVjdHVyZS4gIFRoZSBnZW5lcmljIHNldCBpcyAuc28gYW5kIC5hIChpbiB0aGlzIG9yZGVyKS4gICovCisgIGNvbnN0IGNoYXIgKiooKmxpYl9leHRlbnNpb25zKSAoc3RydWN0IGxkX3N0YXRlICopCisgICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworI2RlZmluZSBMSUJfRVhURU5TSU9OKHN0YXRlKSBcCisgIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MubGliX2V4dGVuc2lvbnMsIChzdGF0ZSkpCisKKyAgLyogUHJvY2VzcyB0aGUgZ2l2ZW4gZmlsZS4gIElmIHRoZSBmaWxlIGlzIG5vdCB5ZXQgb3Blbiwgb3BlbiBpdC4KKyAgICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGZpbGUgd2hpY2ggY2FuCisgICAgIGJlIC0xIHRvIGluZGljYXRlIHRoZSBmaWxlIGhhcyBub3QgeWV0IGJlZW4gZm91bmQuICBUaGUgc2Vjb25kCisgICAgIHBhcmFtZXRlciBkZXNjcmliZXMgdGhlIGZpbGUgdG8gYmUgb3BlbmVkLCB0aGUgbGFzdCBvbmUgaXMgdGhlCisgICAgIHN0YXRlIG9mIHRoZSBsaW5rZXIgd2hpY2ggYW1vbmcgb3RoZXIgaW5mb3JtYXRpb24gY29udGFpbiB0aGUKKyAgICAgcGF0aHMgd2UgbG9vayBhdC4qLworICBpbnQgKCpmaWxlX3Byb2Nlc3MpIChpbnQgZmQsIHN0cnVjdCB1c2VkZmlsZXMgKiwgc3RydWN0IGxkX3N0YXRlICosCisJCSAgICAgICBzdHJ1Y3QgdXNlZGZpbGVzICoqKTsKKyNkZWZpbmUgRklMRV9QUk9DRVNTKGZkLCBmaWxlLCBzdGF0ZSwgbmV4dHApIFwKKyAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5maWxlX3Byb2Nlc3MsIChmZCwgZmlsZSwgc3RhdGUsIG5leHRwKSkKKworICAvKiBDbG9zZSB0aGUgZ2l2ZW4gZmlsZS4gICovCisgIGludCAoKmZpbGVfY2xvc2UpIChzdHJ1Y3QgdXNlZGZpbGVzICosIHN0cnVjdCBsZF9zdGF0ZSAqKTsKKyNkZWZpbmUgRklMRV9DTE9TRShmaWxlLCBzdGF0ZSkgXAorICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmZpbGVfY2xvc2UsIChmaWxlLCBzdGF0ZSkpCisKKyAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgc2VjdGlvbnMgbm93LiAgVGhpcyByZXF1aXJlcyBrbm93bGVkZ2UgYWJvdXQKKyAgICAgYWxsIHRoZSBzZWN0aW9ucyB3ZSB3aWxsIG5lZWQuICBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHNvcnQgdGhlCisgICAgIHNlY3Rpb25zIGluIHRoZSBvcmRlciB0aGV5IGFyZSBzdXBwb3NlZCB0byBhcHBlYXIgaW4gdGhlCisgICAgIGV4ZWN1dGFibGUuICBUaGUgc29ydGluZyB1c2UgbWFueSBkaWZmZXJlbnQga2luZHMgb2YgaW5mb3JtYXRpb24KKyAgICAgdG8gb3B0aW1pemUgdGhlIHJlc3VsdGluZyBiaW5hcnkuICBJbXBvcnRhbnQgaXMgdG8gcmVzcGVjdAorICAgICBzZWdtZW50IGJvdW5kYXJpZXMgYW5kIHRoZSBuZWVkZWQgYWxpZ25tZW50LiAgVGhlIG1vZGUgb2YgdGhlCisgICAgIHNlZ21lbnRzIHdpbGwgYmUgZGV0ZXJtaW5lZCBhZnRlcndhcmRzIGF1dG9tYXRpY2FsbHkgYnkgdGhlCisgICAgIG91dHB1dCByb3V0aW5lcy4gICovCisgIHZvaWQgKCpjcmVhdGVfc2VjdGlvbnMpIChzdHJ1Y3QgbGRfc3RhdGUgKik7CisjZGVmaW5lIENSRUFURV9TRUNUSU9OUyhzdGF0ZSkgXAorICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmNyZWF0ZV9zZWN0aW9ucywgKHN0YXRlKSkKKworICAvKiBEZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIGFueSBub24td2VhayB1bnJlc29sdmVkIHJlZmVyZW5jZXMgbGVmdC4gICovCisgIGludCAoKmZsYWdfdW5yZXNvbHZlZCkgKHN0cnVjdCBsZF9zdGF0ZSAqKTsKKyNkZWZpbmUgRkxBR19VTlJFU09MVkVEKHN0YXRlKSBcCisgIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuZmxhZ191bnJlc29sdmVkLCAoc3RhdGUpKQorCisgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbnMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSB0aGUgbGlua2VyIGFuZCBhcmUgbm90CisgICAgIHByZXNlbnQgaW4gdGhlIGlucHV0IGZpbGUuICAqLworICB2b2lkICgqZ2VuZXJhdGVfc2VjdGlvbnMpIChzdHJ1Y3QgbGRfc3RhdGUgKik7CisjZGVmaW5lIEdFTkVSQVRFX1NFQ1RJT05TKHN0YXRlKSBcCisgIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuZ2VuZXJhdGVfc2VjdGlvbnMsIChzdGF0ZSkpCisKKyAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICBUaGUgZmlsZSBuYW1lIGlzIGdpdmVuIG9yICJhLm91dCIuICBXZQorICAgICBjcmVhdGUgYXMgbXVjaCBvZiB0aGUgRUxGIHN0cnVjdHVyZSBhcyBwb3NzaWJsZS4gICovCisgIGludCAoKm9wZW5fb3V0ZmlsZSkgKHN0cnVjdCBsZF9zdGF0ZSAqLCBpbnQsIGludCwgaW50KTsKKyNkZWZpbmUgT1BFTl9PVVRGSUxFKHN0YXRlLCBtYWNoaW5lLCBjbGFzcywgZGF0YSkgXAorICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLm9wZW5fb3V0ZmlsZSwgKHN0YXRlLCBtYWNoaW5lLCBjbGFzcywgZGF0YSkpCisKKyAgLyogQ3JlYXRlIHRoZSBkYXRhIGZvciB0aGUgb3V0cHV0IGZpbGUuICAqLworICBpbnQgKCpjcmVhdGVfb3V0ZmlsZSkgKHN0cnVjdCBsZF9zdGF0ZSAqKTsKKyNkZWZpbmUgQ1JFQVRFX09VVEZJTEUoc3RhdGUpIFwKKyAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5jcmVhdGVfb3V0ZmlsZSwgKHN0YXRlKSkKKworICAvKiBQcm9jZXNzIGEgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KKyAgdm9pZCAoKnJlbG9jYXRlX3NlY3Rpb24pIChzdHJ1Y3QgbGRfc3RhdGUgKiwgRWxmX1NjbiAqLCBzdHJ1Y3Qgc2NuaW5mbyAqLAorCQkJICAgIGNvbnN0IEVsZjMyX1dvcmQgKik7CisjZGVmaW5lIFJFTE9DQVRFX1NFQ1RJT04oc3RhdGUsIG91dHNjbiwgZmlyc3QsIGRibGluZGlyZWN0KSBcCisgIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MucmVsb2NhdGVfc2VjdGlvbiwgKHN0YXRlLCBvdXRzY24sIGZpcnN0LCAgICBcCisJCQkJCQkgICAgIGRibGluZGlyZWN0KSkKKworICAvKiBBbGxvY2F0ZSBhIGRhdGEgYnVmZmVyIGZvciB0aGUgcmVsb2NhdGlvbnMgb2YgdGhlIGdpdmVuIG91dHB1dAorICAgICBzZWN0aW9uLiAgKi8KKyAgdm9pZCAoKmNvdW50X3JlbG9jYXRpb25zKSAoc3RydWN0IGxkX3N0YXRlICosIHN0cnVjdCBzY25pbmZvICopOworI2RlZmluZSBDT1VOVF9SRUxPQ0FUSU9OUyhzdGF0ZSwgc2NuaW5mbykgXAorICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmNvdW50X3JlbG9jYXRpb25zLCAoc3RhdGUsIHNjbmluZm8pKQorCisgIC8qIENyZWF0ZSByZWxvY2F0aW9ucyBmb3IgZXhlY3V0YWJsZSBvciBEU08uICAqLworICB2b2lkICgqY3JlYXRlX3JlbG9jYXRpb25zKSAoc3RydWN0IGxkX3N0YXRlICosIGNvbnN0IEVsZjMyX1dvcmQgKik7CisjZGVmaW5lIENSRUFURV9SRUxPQ0FUSU9OUyhzdGF0ZSwgZGxiaW5kaXJlY3QpIFwKKyAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5jcmVhdGVfcmVsb2NhdGlvbnMsIChzdGF0ZSwgZGJsaW5kaXJlY3QpKQorCisgIC8qIEZpbmFsaXplIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGludCAoKmZpbmFsaXplKSAoc3RydWN0IGxkX3N0YXRlICopOworI2RlZmluZSBGSU5BTElaRShzdGF0ZSkgXAorICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLmZpbmFsaXplLCAoc3RhdGUpKQorCisgIC8qIENoZWNrIHdoZXRoZXIgc3BlY2lhbCBzZWN0aW9uIG51bWJlciBpcyBrbm93bi4gICovCisgIGJvb2wgKCpzcGVjaWFsX3NlY3Rpb25fbnVtYmVyX3ApIChzdHJ1Y3QgbGRfc3RhdGUgKiwgc2l6ZV90KTsKKyNkZWZpbmUgU1BFQ0lBTF9TRUNUSU9OX05VTUJFUl9QKHN0YXRlLCBudW1iZXIpIFwKKyAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5zcGVjaWFsX3NlY3Rpb25fbnVtYmVyX3AsIChzdGF0ZSwgbnVtYmVyKSkKKworICAvKiBDaGVjayB3aGV0aGVyIHNlY3Rpb24gdHlwZSBpcyBrbm93bi4gICovCisgIGJvb2wgKCpzZWN0aW9uX3R5cGVfcCkgKHN0cnVjdCBsZF9zdGF0ZSAqLCBYRWxmX1dvcmQpOworI2RlZmluZSBTRUNUSU9OX1RZUEVfUChzdGF0ZSwgdHlwZSkgXAorICBETF9DQUxMX0ZDVCAoKHN0YXRlKS0+Y2FsbGJhY2tzLnNlY3Rpb25fdHlwZV9wLCAoc3RhdGUsIHR5cGUpKQorCisgIC8qIFJldHVybiBzZWN0aW9uIGZsYWdzIGZvciAuZHluYW1pYyBzZWN0aW9uLiAgKi8KKyAgWEVsZl9Yd29yZCAoKmR5bmFtaWNfc2VjdGlvbl9mbGFncykgKHN0cnVjdCBsZF9zdGF0ZSAqKTsKKyNkZWZpbmUgRFlOQU1JQ19TRUNUSU9OX0ZMQUdTKHN0YXRlKSBcCisgIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuZHluYW1pY19zZWN0aW9uX2ZsYWdzLCAoc3RhdGUpKQorCisgIC8qIENyZWF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgLnBsdCBzZWN0aW9uIGFuZCBpbml0aWFsaXplIGl0LiAgKi8KKyAgdm9pZCAoKmluaXRpYWxpemVfcGx0KSAoc3RydWN0IGxkX3N0YXRlICosIEVsZl9TY24gKnNjbik7CisjZGVmaW5lIElOSVRJQUxJWkVfUExUKHN0YXRlLCBzY24pIFwKKyAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5pbml0aWFsaXplX3BsdCwgKHN0YXRlLCBzY24pKQorCisgIC8qIENyZWF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgLnJlbC5wbHQgc2VjdGlvbiBhbmQgaW5pdGlhbGl6ZSBpdC4gICovCisgIHZvaWQgKCppbml0aWFsaXplX3BsdHJlbCkgKHN0cnVjdCBsZF9zdGF0ZSAqLCBFbGZfU2NuICpzY24pOworI2RlZmluZSBJTklUSUFMSVpFX1BMVFJFTChzdGF0ZSwgc2NuKSBcCisgIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuaW5pdGlhbGl6ZV9wbHRyZWwsIChzdGF0ZSwgc2NuKSkKKworICAvKiBGaW5hbGl6ZSB0aGUgLnBsdCBzZWN0aW9uIHRoZSB3aGF0IGJlbG9uZ3MgdG8gdGhlbS4gICovCisgIHZvaWQgKCpmaW5hbGl6ZV9wbHQpIChzdHJ1Y3QgbGRfc3RhdGUgKiwgc2l6ZV90LCBzaXplX3QpOworI2RlZmluZSBGSU5BTElaRV9QTFQoc3RhdGUsIG5zeW0sIG5zeW1fZHluKSBcCisgIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuZmluYWxpemVfcGx0LCAoc3RhdGUsIG5zeW0sIG5zeW1fZHluKSkKKworICAvKiBDcmVhdGUgdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIC5nb3Qgc2VjdGlvbiBhbmQgaW5pdGlhbGl6ZSBpdC4gICovCisgIHZvaWQgKCppbml0aWFsaXplX2dvdCkgKHN0cnVjdCBsZF9zdGF0ZSAqLCBFbGZfU2NuICpzY24pOworI2RlZmluZSBJTklUSUFMSVpFX0dPVChzdGF0ZSwgc2NuKSBcCisgIERMX0NBTExfRkNUICgoc3RhdGUpLT5jYWxsYmFja3MuaW5pdGlhbGl6ZV9nb3QsIChzdGF0ZSwgc2NuKSkKKworICAvKiBSZXR1cm4gdGhlIHRhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYXRpdmUgcmVsb2NhdGlvbiB0eXBlIGZvcgorICAgICB0aGUgcGxhdGZvcm0uICAqLworICBpbnQgKCpyZWxfdHlwZSkgKHN0cnVjdCBsZF9zdGF0ZSAqKTsKKyNkZWZpbmUgUkVMX1RZUEUoc3RhdGUpIFwKKyAgRExfQ0FMTF9GQ1QgKChzdGF0ZSktPmNhbGxiYWNrcy5yZWxfdHlwZSwgKHN0YXRlKSkKK307CisKKworLyogU3RydWN0dXJlIGZvciBzeW1ib2wgcmVwcmVzZW50YXRpb24uICBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgYQorICAgbG90LCBzbyBzaXplIGlzIGltcG9ydGFudC4gICovCitzdHJ1Y3Qgc3ltYm9sCit7CisgIC8qIFN5bWJvbCBuYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgLyogU2l6ZSBvZiB0aGUgb2JqZWN0LiAgKi8KKyAgWEVsZl9Yd29yZCBzaXplOworICAvKiBJbmRleCBvZiB0aGUgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIG9iamVjdC4gICovCisgIHNpemVfdCBzeW1pZHg7CisgIC8qIEluZGV4IG9mIHRoZSBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLworICBzaXplX3Qgb3V0c3ltaWR4OworCisgIC8qIERlc2NyaXB0aW9uIHdoZXJlIHRoZSBzeW1ib2wgaXMgZm91bmQvbmVlZGVkLiAgKi8KKyAgc2l6ZV90IHNjbmR4OworICBzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlOworICAvKiBJbmRleCBvZiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKyAgRWxmMzJfV29yZCBzeW1zY25keDsKKworICAvKiBJbmRleCBvZiB0aGUgc3ltYm9sIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBvZiB0aGUgb3V0cHV0CisgICAgIGZpbGUuICBOb3RlIHRoYXQgdGhlIHZhbHVlIG9ubHkgbmVlZHMgdG8gYmUgMTYgYml0IHdpZGUgc2luY2UKKyAgICAgdGhlcmUgY2Fubm90IGJlIG1vcmUgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBvciBEU08uICAqLworICB1bnNpZ25lZCBpbnQgb3V0ZHluc3ltaWR4OjE2OworCisgIC8qIFR5cGUgb2YgdGhlIHN5bWJvbC4gICovCisgIHVuc2lnbmVkIGludCB0eXBlOjQ7CisgIC8qIFZhcmlvdXMgZmxhZ3MuICAqLworICB1bnNpZ25lZCBpbnQgZGVmaW5lZDoxOworICB1bnNpZ25lZCBpbnQgY29tbW9uOjE7CisgIHVuc2lnbmVkIGludCB3ZWFrOjE7CisgIHVuc2lnbmVkIGludCBhZGRlZDoxOworICB1bnNpZ25lZCBpbnQgbWVyZ2VkOjE7CisgIC8qIE5vbnplcm8gaWYgdGhlIHN5bWJvbCBpcyBvbiB0aGUgZnJvbV9kc28gbGlzdC4gICovCisgIHVuc2lnbmVkIGludCBvbl9kc29saXN0OjE7CisgIC8qIE5vbnplcm8gaWYgc3ltYm9sIG5lZWRzIGNvcHkgcmVsb2NhdGlvbiwgcmVzZXQgd2hlbiB0aGUKKyAgICAgcmVsb2NhdGlvbiBoYXMgYmVlbiBjcmVhdGVkLiAgKi8KKyAgdW5zaWduZWQgaW50IG5lZWRfY29weToxOworICB1bnNpZ25lZCBpbnQgaW5fZHNvOjE7CisKKyAgdW5pb24KKyAgeworICAgIC8qIFBvaW50ZXIgdG8gdGhlIGhhbmRsZSBjcmVhdGVkIGJ5IHRoZSBmdW5jdGlvbnMgd2hpY2ggY3JlYXRlCisgICAgICAgbWVyZ2VkIHNlY3Rpb24gY29udGVudHMuICBXZSB1c2UgJ3ZvaWQgKicgYmVjYXVzZSB0aGVyZSBhcmUKKyAgICAgICBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIHVzZWQuICAqLworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBYRWxmX0FkZHIgdmFsdWU7CisgIH0gbWVyZ2U7CisKKyAgLyogUG9pbnRlciB0byBuZXh0L3ByZXZpb3VzIHN5bWJvbCBvbiB3aGF0ZXZlciBsaXN0IHRoZSBzeW1ib2wgaXMuICAqLworICBzdHJ1Y3Qgc3ltYm9sICpuZXh0OworICBzdHJ1Y3Qgc3ltYm9sICpwcmV2aW91czsKKyAgLyogUG9pbnRlciB0byBuZXh0IHN5bWJvbCBvZiB0aGUgc2FtZSBzZWN0aW9uIChvbmx5IHNldCBmb3IgbWVyZ2UtYWJsZQorICAgICBzZWN0aW9ucykuICAqLworICBzdHJ1Y3Qgc3ltYm9sICpuZXh0X2luX3NjbjsKK307CisKKworLyogR2V0IHRoZSBkZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKyNpbmNsdWRlIDxzeW1ib2xoYXNoLmg+CisKKy8qIFNpbXBsZSBzaW5nbGUgbGlua2VkIGxpc3Qgb2YgZmlsZSBuYW1lcy4gICovCitzdHJ1Y3QgZmlsZW5hbWVfbGlzdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBzdHJ1Y3QgdXNlZGZpbGVzICpyZWFsOworICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqbmV4dDsKKyAgYm9vbCBncm91cF9zdGFydDsKKyAgYm9vbCBncm91cF9lbmQ7CisgIGJvb2wgYXNfbmVlZGVkOworfTsKKworCisvKiBEYXRhIHN0cnVjdHVyZSB0byBkZXNjcmliZSBleHByZXNzaW9uIGluIGxpbmtlciBzY3JpcHQuICAqLworc3RydWN0IGV4cHJlc3Npb24KK3sKKyAgZW51bSBleHByZXNzaW9uX3RhZworICAgIHsKKyAgICAgIGV4cF9udW0sCisgICAgICBleHBfc2l6ZW9mX2hlYWRlcnMsCisgICAgICBleHBfcGFnZXNpemUsCisgICAgICBleHBfaWQsCisgICAgICBleHBfbXVsdCwKKyAgICAgIGV4cF9kaXYsCisgICAgICBleHBfbW9kLAorICAgICAgZXhwX3BsdXMsCisgICAgICBleHBfbWludXMsCisgICAgICBleHBfYW5kLAorICAgICAgZXhwX29yLAorICAgICAgZXhwX2FsaWduCisgICAgfSB0YWc7CisKKyAgdW5pb24KKyAgeworICAgIHVpbnRtYXhfdCBudW07CisgICAgc3RydWN0IGV4cHJlc3Npb24gKmNoaWxkOworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHN0cnVjdCBleHByZXNzaW9uICpsZWZ0OworICAgICAgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0OworICAgIH0gYmluYXJ5OworICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgfSB2YWw7Cit9OworCisKKy8qIERhdGEgc3RydWN0dXJlIGZvciBzZWN0aW9uIG5hbWUgd2l0aCBmbGFncy4gICovCitzdHJ1Y3QgaW5wdXRfc2VjdGlvbl9uYW1lCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGJvb2wgc29ydF9mbGFnOworfTsKKworLyogRmlsZSBuYW1lIG1hc2sgd2l0aCBzZWN0aW9uIG5hbWUuICAqLworc3RydWN0IGZpbGVtYXNrX3NlY3Rpb25fbmFtZQoreworICBjb25zdCBjaGFyICpmaWxlbWFzazsKKyAgY29uc3QgY2hhciAqZXhjbHVkZW1hc2s7CisgIHN0cnVjdCBpbnB1dF9zZWN0aW9uX25hbWUgKnNlY3Rpb25fbmFtZTsKKyAgYm9vbCBrZWVwX2ZsYWc7Cit9OworCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgYXNzaWdubWVudHMuICAqLworc3RydWN0IGFzc2lnbm1lbnQKK3sKKyAgY29uc3QgY2hhciAqdmFyaWFibGU7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHByZXNzaW9uOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIGJvb2wgcHJvdmlkZV9mbGFnOworfTsKKworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGlucHV0IGZvciBhbiBvdXRwdXQgc2VjdGlvbi4gICovCitzdHJ1Y3QgaW5wdXRfcnVsZQoreworICBlbnVtCisgICAgeworICAgICAgaW5wdXRfc2VjdGlvbiwKKyAgICAgIGlucHV0X2Fzc2lnbm1lbnQKKyAgICB9IHRhZzsKKworICB1bmlvbgorICB7CisgICAgc3RydWN0IGFzc2lnbm1lbnQgKmFzc2lnbm1lbnQ7CisgICAgc3RydWN0IGZpbGVtYXNrX3NlY3Rpb25fbmFtZSAqc2VjdGlvbjsKKyAgfSB2YWw7CisKKyAgc3RydWN0IGlucHV0X3J1bGUgKm5leHQ7Cit9OworCisKKy8qIERhdGEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIG91dHB1dCBzZWN0aW9uLiAgKi8KK3N0cnVjdCBvdXRwdXRfc2VjdGlvbgoreworICBjb25zdCBjaGFyICpuYW1lOworICBzdHJ1Y3QgaW5wdXRfcnVsZSAqaW5wdXQ7CisgIFhFbGZfQWRkciBtYXhfYWxpZ25tZW50OworICBib29sIGlnbm9yZWQ7Cit9OworCisKKy8qIERhdGEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIG91dHB1dCBmaWxlIGZvcm1hdC4gICovCitzdHJ1Y3Qgb3V0cHV0X3J1bGUKK3sKKyAgZW51bQorICAgIHsKKyAgICAgIG91dHB1dF9zZWN0aW9uLAorICAgICAgb3V0cHV0X2Fzc2lnbm1lbnQKKyAgICB9IHRhZzsKKworICB1bmlvbgorICB7CisgICAgc3RydWN0IGFzc2lnbm1lbnQgKmFzc2lnbm1lbnQ7CisgICAgc3RydWN0IG91dHB1dF9zZWN0aW9uIHNlY3Rpb247CisgIH0gdmFsOworCisgIHN0cnVjdCBvdXRwdXRfcnVsZSAqbmV4dDsKK307CisKKworLyogTGlzdCBvZiBhbGwgdGhlIHNlZ21lbnRzIHRoZSBsaW5rZXIgc2NyaXB0IGRlc2NyaWJlcy4gICovCitzdHJ1Y3Qgb3V0cHV0X3NlZ21lbnQKK3sKKyAgaW50IG1vZGU7CisgIHN0cnVjdCBvdXRwdXRfcnVsZSAqb3V0cHV0X3J1bGVzOworICBzdHJ1Y3Qgb3V0cHV0X3NlZ21lbnQgKm5leHQ7CisKKyAgWEVsZl9PZmYgb2Zmc2V0OworICBYRWxmX0FkZHIgYWRkcjsKKyAgWEVsZl9Yd29yZCBhbGlnbjsKK307CisKKworLyogTGlzdCBvZiBpZGVudGlmaWVycy4gICovCitzdHJ1Y3QgaWRfbGlzdAoreworICB1bmlvbgorICB7CisgICAgZW51bSBpZF90eXBlCisgICAgICB7CisJaWRfc3RyLAkJLyogTm9ybWFsIHN0cmluZy4gICovCisJaWRfYWxsLAkJLyogIioiLCBtYXRjaGVzIGFsbC4gICovCisJaWRfd2lsZAkJLyogR2xvYmJpbmcgd2lsZGNhcmQgc3RyaW5nLiAgKi8KKyAgICAgIH0gaWRfdHlwZTsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBib29sIGxvY2FsOworICAgICAgY29uc3QgY2hhciAqdmVyc2lvbm5hbWU7CisgICAgfSBzOworICB9IHU7CisgIGNvbnN0IGNoYXIgKmlkOworICBzdHJ1Y3QgaWRfbGlzdCAqbmV4dDsKK307CisKKworLyogVmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCitzdHJ1Y3QgdmVyc2lvbgoreworICBzdHJ1Y3QgdmVyc2lvbiAqbmV4dDsKKyAgc3RydWN0IGlkX2xpc3QgKmxvY2FsX25hbWVzOworICBzdHJ1Y3QgaWRfbGlzdCAqZ2xvYmFsX25hbWVzOworICBjb25zdCBjaGFyICp2ZXJzaW9ubmFtZTsKKyAgY29uc3QgY2hhciAqcGFyZW50bmFtZTsKK307CisKKworLyogSGVhZCBmb3IgbGlzdCBvZiBzZWN0aW9ucy4gICovCitzdHJ1Y3Qgc2NuaGVhZAoreworICAvKiBOYW1lIG9mIHRoZSBzZWN0aW9ucy4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgLyogQWNjdW11bGF0ZWQgZmxhZ3MgZm9yIHRoZSBzZWN0aW9ucy4gICovCisgIFhFbGZfWHdvcmQgZmxhZ3M7CisKKyAgLyogVHlwZSBvZiB0aGUgc2VjdGlvbnMuICAqLworICBYRWxmX1dvcmQgdHlwZTsKKworICAvKiBFbnRyeSBzaXplLiAgSWYgdGhlcmUgYXJlIGRpZmZlcmVuY3MgYmV0d2VlbiB0aGUgc2VjdGlvbnMgd2l0aAorICAgICB0aGUgc2FtZSBuYW1lIHRoaXMgZmllbGQgY29udGFpbnMgMS4gICovCisgIFhFbGZfV29yZCBlbnRzaXplOworCisgIC8qIElmIG5vbi1OVUxMIHBvaW50ZXIgdG8gZ3JvdXAgc2lnbmF0dXJlLiAgKi8KKyAgY29uc3QgY2hhciAqZ3JwX3NpZ25hdHVyZTsKKworICAvKiBNYXhpbXVtIGFsaWdubWVudCBmb3IgYWxsIHNlY3Rpb25zLiAgKi8KKyAgWEVsZl9Xb3JkIGFsaWduOworCisgIC8qIERpc3Rpbmd1aXNoIGJldHdlZW4gbm9ybWFsIHNlY3Rpb25zIGNvbWluZyBmcm9tIHRoZSBpbnB1dCBmaWxlCisgICAgIGFuZCBzZWN0aW9ucyBnZW5lcmF0ZWQgYnkgdGhlIGxpbmtlci4gICovCisgIGVudW0gc2NuX2tpbmQKKyAgICB7CisgICAgICBzY25fbm9ybWFsLAkJLyogU2VjdGlvbiBmcm9tIHRoZSBpbnB1dCBmaWxlKHMpLiAgKi8KKyAgICAgIHNjbl9kb3RfaW50ZXJwLAkJLyogR2VuZXJhdGVkIC5pbnRlcnAgc2VjdGlvbi4gICovCisgICAgICBzY25fZG90X2dvdCwJCS8qIEdlbmVyYXRlZCAuZ290IHNlY3Rpb24uICAqLworICAgICAgc2NuX2RvdF9keW5yZWwsCQkvKiBHZW5lcmF0ZWQgLnJlbC5keW4gc2VjdGlvbi4gICovCisgICAgICBzY25fZG90X2R5bmFtaWMsCQkvKiBHZW5lcmF0ZWQgLmR5bmFtaWMgc2VjdGlvbi4gICovCisgICAgICBzY25fZG90X2R5bnN5bSwJCS8qIEdlbmVyYXRlZCAuZHluc3ltIHNlY3Rpb24uICAqLworICAgICAgc2NuX2RvdF9keW5zdHIsCQkvKiBHZW5lcmF0ZWQgLmR5bnN0ciBzZWN0aW9uLiAgKi8KKyAgICAgIHNjbl9kb3RfaGFzaCwJCS8qIEdlbmVyYXRlZCAuaGFzaCBzZWN0aW9uLiAgKi8KKyAgICAgIHNjbl9kb3RfcGx0LAkJLyogR2VuZXJhdGVkIC5wbHQgc2VjdGlvbi4gICovCisgICAgICBzY25fZG90X3BsdHJlbCwJCS8qIEdlbmVyYXRlZCAucmVsLnBsdCBzZWN0aW9uLiAgKi8KKyAgICAgIHNjbl9kb3RfdmVyc2lvbiwJCS8qIEdlbmVyYXRlZCAuZ251LnZlcnNpb24gc2VjdGlvbi4gICovCisgICAgICBzY25fZG90X3ZlcnNpb25fcgkJLyogR2VuZXJhdGVkIC5nbnUudmVyc2lvbl9yIHNlY3Rpb24uICAqLworICAgIH0ga2luZDsKKworICAvKiBUcnVlIGlzIHRoZSBzZWN0aW9uIGlzIHVzZWQgaW4gdGhlIG91dHB1dC4gICovCisgIGJvb2wgdXNlZDsKKworICAvKiBUb3RhbCBzaXplIChvbmx5IGRldGVybWluZWQgdGhpcyB3YXkgZm9yIHJlbG9jYXRpb24gc2VjdGlvbnMpLiAgKi8KKyAgc2l6ZV90IHJlbHNpemU7CisKKyAgLyogRmlsbGVkIGluIGJ5IHRoZSBzZWN0aW9uIHNvcnRpbmcgdG8gaW5kaWNhdGUgd2hpY2ggc2VnbWVudCB0aGUKKyAgICAgc2VjdGlvbiBnb2VzIGluLiAgKi8KKyAgaW50IHNlZ21lbnRfbnI7CisKKyAgLyogSW5kZXggb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgV2UgY2Fubm90IHN0b3JlIHRoZSBzZWN0aW9uIGhhbmRsZQorICAgICBkaXJlY3RseSBoZXJlIHNpbmNlIHRoZSBoYW5kbGUgaXMgYSBwb2ludGVyIGluIGEgZHluYW1pY2FsbHkKKyAgICAgYWxsb2NhdGVkIHRhYmxlIHdoaWNoIG1pZ2h0IG1vdmUgaWYgaXQgYmVjb21lcyB0b28gc21hbGwgZm9yIGFsbAorICAgICB0aGUgc2VjdGlvbnMuICBVc2luZyB0aGUgaW5kZXggdGhlIGNvcnJlY3QgdmFsdWUgY2FuIGJlIGZvdW5kIGF0CisgICAgIGFsbCB0aW1lcy4gICovCisgIFhFbGZfV29yZCBzY25pZHg7CisKKyAgLyogSW5kZXggb2YgdGhlIFNUVF9TRUNUSU9OIGVudHJ5IGZvciB0aGlzIHNlY3Rpb24gaW4gdGhlIHN5bWJvbAorICAgICB0YWJsZS4gICovCisgIFhFbGZfV29yZCBzY25zeW1pZHg7CisKKyAgLyogQWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLworICBYRWxmX0FkZHIgYWRkcjsKKworICAvKiBIYW5kbGUgZm9yIHRoZSBzZWN0aW9uIG5hbWUgaW4gdGhlIG91dHB1dCBmaWxlJ3Mgc2VjdGlvbiBoZWFkZXIKKyAgICAgc3RyaW5nIHRhYmxlLiAgKi8KKyAgc3RydWN0IEVibF9TdHJlbnQgKm5hbWVlbnQ7CisKKyAgLyogVGFpbCBvZiBsaXN0IG9mIHN5bWJvbHMgZm9yIHRoaXMgc2VjdGlvbi4gIE9ubHkgc2V0IGlmIHRoZQorICAgICBzZWN0aW9uIGlzIG1lcmdlLWFibGUuICAqLworICBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xzOworCisgIC8qIFBvaW50ZXIgdG8gbGFzdCBzZWN0aW9uLiAgKi8KKyAgc3RydWN0IHNjbmluZm8gKmxhc3Q7Cit9OworCisKKy8qIERlZmluZSBoYXNoIHRhYmxlIGZvciBzZWN0aW9ucy4gICovCisjaW5jbHVkZSA8c2VjdGlvbmhhc2guaD4KKworLyogRGVmaW5lIGhhc2ggdGFibGUgZm9yIHZlcnNpb24gc3ltYm9scy4gICovCisjaW5jbHVkZSA8dmVyc2lvbmhhc2guaD4KKworCisvKiBTdGF0ZSBvZiB0aGUgbGlua2VyLiAgKi8KK3N0cnVjdCBsZF9zdGF0ZQoreworICAvKiBFTEYgYmFja2VuZCBsaWJyYXJ5IGhhbmRsZS4gICovCisgIEVibCAqZWJsOworCisgIC8qIExpc3Qgb2YgYWxsIGFyY2hpdmVzIHBhcnRpY2lwYXRpbmcsIGluIHRoaXMgb3JkZXIuICAqLworICBzdHJ1Y3QgdXNlZGZpbGVzICphcmNoaXZlczsKKyAgLyogRW5kIG9mIHRoZSBsaXN0LiAgKi8KKyAgc3RydWN0IHVzZWRmaWxlcyAqdGFpbGFyY2hpdmVzOworICAvKiBJZiBub256ZXJvIHdlIGFyZSBsb29raW5nIGZvciB0aGUgYmVnaW5uaW5nIG9mIGEgZ3JvdXAuICAqLworICBib29sIGdyb3VwX3N0YXJ0X3JlcXVlc3RlZDsKKyAgLyogUG9pbnRlciB0byB0aGUgYXJjaGl2ZSBzdGFydGluZyB0aGUgZ3JvdXAuICAqLworICBzdHJ1Y3QgdXNlZGZpbGVzICpncm91cF9zdGFydF9hcmNoaXZlOworCisgIC8qIExpc3Qgb2YgdGhlIERTT3Mgd2UgZm91bmQuICAqLworICBzdHJ1Y3QgdXNlZGZpbGVzICpkc29maWxlczsKKyAgLyogTnVtYmVyIG9mIERTTyBmaWxlcy4gICovCisgIHNpemVfdCBuZHNvZmlsZXM7CisgIC8qIFVsdGltYXRlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHdoaWNoIGFyZSBsaW5rZWQgaW4uICAqLworICBzdHJ1Y3QgdXNlZGZpbGVzICpyZWxmaWxlczsKKworICAvKiBMaXN0IHRoZSBEVF9ORUVERUQgRFNPcy4gICovCisgIHN0cnVjdCB1c2VkZmlsZXMgKm5lZWRlZDsKKworICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdGhlIHBhcnNlci4gICovCisgIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpzcmNmaWxlczsKKworICAvKiBMaXN0IG9mIGFsbCB0aGUgcGF0aHMgdG8gbG9vayBhdC4gICovCisgIHN0cnVjdCBwYXRoZWxlbWVudCAqcGF0aHM7CisgIC8qIFRhaWwgb2YgdGhlIGxpc3QuICAqLworICBzdHJ1Y3QgcGF0aGVsZW1lbnQgKnRhaWxwYXRoczsKKworICAvKiBVc2VyIHByb3ZpZGVkIHBhdGhzIGZvciBsb29rdXAgb2YgRFNPcy4gICovCisgIHN0cnVjdCBwYXRoZWxlbWVudCAqcnBhdGg7CisgIHN0cnVjdCBwYXRoZWxlbWVudCAqcnBhdGhfbGluazsKKyAgc3RydWN0IHBhdGhlbGVtZW50ICpydW5wYXRoOworICBzdHJ1Y3QgcGF0aGVsZW1lbnQgKnJ1bnBhdGhfbGluazsKKyAgc3RydWN0IEVibF9TdHJlbnQgKnJ4eHBhdGhfc3RyZW50OworICBpbnQgcnh4cGF0aF90YWc7CisKKyAgLyogRnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTERfTElCUkFSWV9QQVRILiAgKi8KKyAgc3RydWN0IHBhdGhlbGVtZW50ICpsZF9saWJyYXJ5X3BhdGgxOworICBzdHJ1Y3QgcGF0aGVsZW1lbnQgKmxkX2xpYnJhcnlfcGF0aDI7CisKKyAgLyogTmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLworICBjb25zdCBjaGFyICpvdXRmbmFtZTsKKyAgLyogTmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgd2UgaW5pdGlhbGx5IGNyZWF0ZS4gICovCisgIGNvbnN0IGNoYXIgKnRlbXBmbmFtZTsKKyAgLyogRmlsZSBkZXNjcmlwdG9yIG9wZW5lZCBmb3IgdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgaW50IG91dGZkOworICAvKiBUaGUgRUxGIGRlc2NyaXB0b3IgZm9yIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIEVsZiAqb3V0ZWxmOworCisgIC8qIFR5cGUgb2Ygb3V0cHV0IGZpbGUuICAqLworICBlbnVtIGZpbGVfdHlwZSBmaWxlX3R5cGU7CisKKyAgLyogSXMgdGhpcyBhIHN5c3RlbSBsaWJyYXJ5IG9yIG5vdC4gICovCisgIGJvb2wgaXNfc3lzdGVtX2xpYnJhcnk7CisKKyAgLyogUGFnZSBzaXplIHRvIGJlIGFzc3VtZWQgZm9yIHRoZSBiaW5hcnkuICAqLworICBzaXplX3QgcGFnZXNpemU7CisKKyAgLyogTmFtZSBvZiB0aGUgaW50ZXJwcmV0ZXIgZm9yIGR5bmFtaWNhbGx5IGxpbmtlZCBvYmplY3RzLiAgKi8KKyAgY29uc3QgY2hhciAqaW50ZXJwOworICAvKiBJbmRleCBvZiB0aGUgLmludGVycCBzZWN0aW9uLiAgKi8KKyAgRWxmMzJfV29yZCBpbnRlcnBzY25pZHg7CisKKyAgLyogT3B0aW1pemF0aW9uIGxldmVsLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgb3B0bGV2ZWw7CisKKyAgLyogSWYgdHJ1ZSBzdGF0aWMgbGlua2luZyBpcyByZXF1ZXN0ZWQuICAqLworICBib29sIHN0YXRpY2FsbHk7CisKKyAgLyogSG93IHRvIGV4dHJhY3QgZWxlbWVudHMgZnJvbSBhcmNoaXZlcy4gICovCisgIGVudW0gZXh0cmFjdF9ydWxlIGV4dHJhY3RfcnVsZTsKKworICAvKiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgYXJjaGl2ZSB3ZSB1c2VkLiAgKi8KKyAgaW50IGxhc3RfYXJjaGl2ZV91c2VkOworCisgIC8qIElmIHRydWUgcHJpbnQgdG8gc3Rkb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlcyB3ZSBhcmUKKyAgICAgdHJ5aW5nIHRvIG9wZW4uICAqLworICBib29sIHRyYWNlX2ZpbGVzOworCisgIC8qIElmIHRydWUgbXVsdGlwbGUgZGVmaW5pdGlvbnMgYXJlIG5vdCBjb25zaWRlcmVkIGFuIGVycm9yOyB0aGUKKyAgICAgZmlyc3QgaXMgdXNlZC4gICovCisgIGJvb2wgbXVsZGVmczsKKworICAvKiBJZiB0cnVlIHVuZGVmaW5lZCBzeW1ib2xzIHdoZW4gYnVpbGRpbmcgRFNPcyBhcmUgbm90IGZhdGFsLiAgKi8KKyAgYm9vbCBub2RlZnM7CisKKyAgLyogSWYgdHJ1ZSBhZGQgbGluZSBpbmRlbnRpZnlpbmcgbGluay1lZGl0b3IgdG8gLmNvbW1lbnQgc2VjdGlvbi4gICovCisgIGJvb2wgYWRkX2xkX2NvbW1lbnQ7CisKKyAgLyogU3RyaXBwaW5nIHdoaWxlIGxpbmtpbmcuICAqLworICBlbnVtCisgICAgeworICAgICAgc3RyaXBfbm9uZSwKKyAgICAgIHN0cmlwX2RlYnVnLAorICAgICAgc3RyaXBfYWxsLAorICAgICAgc3RyaXBfZXZlcnl0aGluZworICAgIH0gc3RyaXA7CisKKyAgLyogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHZlY3Rvci4gICovCisgIHN0cnVjdCBjYWxsYmFja3MgY2FsbGJhY2tzOworCisgIC8qIE5hbWUgb2YgdGhlIGVudHJ5IHN5bWJvbC4gIENhbiBhbHNvIGJlIGEgbnVtZXJpYyB2YWx1ZS4gICovCisgIGNvbnN0IGNoYXIgKmVudHJ5OworCisgIC8qIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VnbWVudHMgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgc3RydWN0IG91dHB1dF9zZWdtZW50ICpvdXRwdXRfc2VnbWVudHM7CisKKyAgLyogTGlzdCBvZiB0aGUgc3ltYm9scyB3ZSBjcmVhdGVkIGZyb20gbGlua2VyIHNjcmlwdCBkZWZpbml0aW9ucy4gICovCisgIHN0cnVjdCBzeW1ib2wgKmxzY3JpcHRfc3ltczsKKyAgc2l6ZV90IG5sc2NyaXB0X3N5bXM7CisKKyAgLyogVGFibGUgd2l0aCBrbm93biBzeW1ib2xzLiAgKi8KKyAgbGRfc3ltYm9sX3RhYiBzeW1ib2xfdGFiOworCisgIC8qIFRhYmxlIHdpdGggdXNlZCBzZWN0aW9ucy4gICovCisgIGxkX3NlY3Rpb25fdGFiIHNlY3Rpb25fdGFiOworCisgIC8qIFRoZSBsaXN0IG9mIHNlY3Rpb25zIG9uY2Ugd2UgY29sbGVjdGVkIHRoZW0uICAgKi8KKyAgc3RydWN0IHNjbmhlYWQgKiphbGxzZWN0aW9uczsKKyAgc2l6ZV90IG5hbGxzZWN0aW9uczsKKyAgc2l6ZV90IG51c2Vkc2VjdGlvbnM7CisgIHNpemVfdCBubm90ZXNlY3Rpb25zOworCisgIC8qIEJlZ2lubmluZyBvZiB0aGUgbGlzdCBvZiBzeW1ib2xzIHdoaWNoIGFyZSBzdGlsbCB1bnJlc29sdmVkLiAgKi8KKyAgc3RydWN0IHN5bWJvbCAqdW5yZXNvbHZlZDsKKyAgLyogTnVtYmVyIG9mIHRydWVseSB1bnJlc29sdmVkIGVudHJpZXMgaW4gdGhlIGxpc3QuICAqLworICBzaXplX3QgbnVucmVzb2x2ZWQ7CisgIC8qIE51bWJlciBvZiB0cnVlbHkgdW5yZXNvbHZlZCwgbm9uLXdlYWsgZW50cmllcyBpbiB0aGUgbGlzdC4gICovCisgIHNpemVfdCBudW5yZXNvbHZlZF9ub253ZWFrOworCisgIC8qIExpc3Qgb2YgY29tbW9uIHN5bWJvbHMuICAqLworICBzdHJ1Y3Qgc3ltYm9sICpjb21tb25fc3ltczsKKyAgLyogU2VjdGlvbiBmb3IgdGhlIGNvbW1vbiBzeW1ib2xzLiAgKi8KKyAgc3RydWN0IHNjbmluZm8gKmNvbW1vbl9zZWN0aW9uOworCisgIC8qIExpc3Qgb2Ygc3ltYm9scyBkZWZpbmVkIGluIERTT3MgYW5kIHVzZWQgaW4gYSByZWxvY2F0YWJsZSBmaWxlLgorICAgICBEU08gc3ltYm9scyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgcmVsb2NhdGFibGUgZmlsZXMgYXJlIG5vdCBvbgorICAgICB0aGUgbGlzdC4gIElmIGEgc3ltYm9sIGlzIG9uIHRoZSBsaXN0IHRoZSBvbl9kc29saXN0IGZpZWxkIGluIHRoZQorICAgICAnc3RydWN0IHN5bWJvbCcgaXMgbm9uemVyby4gICovCisgIHN0cnVjdCBzeW1ib2wgKmZyb21fZHNvOworICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBmcm9tX2Rzby4gICovCisgIHNpemVfdCBuZnJvbV9kc287CisgIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCisgIHNpemVfdCBuZHluc3ltOworICAvKiBOdW1iZXIgb2YgUExUIGVudHJpZXMgZnJvbSBEU08gcmVmZXJlbmNlcy4gICovCisgIHNpemVfdCBucGx0OworICAvKiBOdW1iZXIgb2YgUExUIGVudHJpZXMgZnJvbSBEU08gcmVmZXJlbmNlcy4gICovCisgIHNpemVfdCBuZ290OworICAvKiBOdW1iZXIgb2YgY29weSByZWxvY2F0aW9ucy4gICovCisgIHNpemVfdCBuY29weTsKKyAgLyogU2VjdGlvbiBmb3IgY29weSByZWxvY2F0aW9ucy4gICovCisgIHN0cnVjdCBzY25pbmZvICpjb3B5X3NlY3Rpb247CisKKyAgLyogS2VlcGluZyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgc2l6ZV90IG5zeW10YWI7CisgIHNpemVfdCBubG9jYWxzeW1ib2xzOworCisgIC8qIFNwZWNpYWwgc3ltYm9scy4gICovCisgIHN0cnVjdCBzeW1ib2wgKmluaXRfc3ltYm9sOworICBzdHJ1Y3Qgc3ltYm9sICpmaW5pX3N5bWJvbDsKKworICAvKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlZ21lbnRzIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBkZXNjcmliZWQKKyAgICAgaW4gdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGluCisgICAgIGFkZGl0aW9uIHRvIHRoZSB1c2VyLXByb3ZpZGVkIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IG91dHB1dF9zZWdtZW50ICpkZWZhdWx0X291dHB1dF9zZWdtZW50czsKKyAgLyogU2VhcmNoIHBhdGhzIGFkZGVkIGJ5IHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICAqLworICBzdHJ1Y3QgcGF0aGVsZW1lbnQgKmRlZmF1bHRfcGF0aHM7CisKKyNpZm5kZWYgQkFTRV9FTEZfTkFNRQorICAvKiBUaGUgaGFuZGxlIG9mIHRoZSBsZCBiYWNrZW5kIGxpYnJhcnkuICAqLworICB2b2lkICpsZGxpYjsKKyNlbmRpZgorCisgIC8qIFN0cmluZyB0YWJsZSBmb3IgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCisgIHN0cnVjdCBFYmxfU3RydGFiICpzaHN0cnRhYjsKKworICAvKiBUcnVlIGlmIG91dHB1dCBmaWxlIHNob3VsZCBjb250YWluIHN5bWJvbCB0YWJsZS4gICovCisgIGJvb2wgbmVlZF9zeW10YWI7CisgIC8qIFN5bWJvbCB0YWJsZSBzZWN0aW9uLiAgKi8KKyAgRWxmMzJfV29yZCBzeW1zY25pZHg7CisgIC8qIEV4dGVuZGVkIHNlY3Rpb24gdGFibGUgc2VjdGlvbi4gICovCisgIEVsZjMyX1dvcmQgeG5keHNjbmlkeDsKKyAgLyogU3ltYm9sIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAgKi8KKyAgRWxmMzJfV29yZCBzdHJzY25pZHg7CisKKyAgLyogVHJ1ZSBpZiBvdXRwdXQgZmlsZSBzaG91bGQgY29udGFpbiBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCisgIGJvb2wgbmVlZF9keW5zeW07CisgIC8qIER5bmFtaWMgc3ltYm9sIHRhYmxlIHNlY3Rpb24uICAqLworICBFbGYzMl9Xb3JkIGR5bnN5bXNjbmlkeDsKKyAgLyogRHluYW1pYyBzeW1ib2wgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICAqLworICBFbGYzMl9Xb3JkIGR5bnN0cnNjbmlkeDsKKyAgLyogRHluYW1pYyBzeW1ib2wgaGFzaCB0YWJsZS4gICovCisgIHNpemVfdCBoYXNoc2NuaWR4OworCisgIC8qIFByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHNlY3Rpb24uICAqLworICBFbGYzMl9Xb3JkIHBsdHNjbmlkeDsKKyAgLyogTnVtYmVyIG9mIGVudHJpZXMgYWxyZWFkeSBpbiB0aGUgUExUIHNlY3Rpb24uICAqLworICBzaXplX3QgbnBsdF91c2VkOworICAvKiBSZWxvY2F0aW9uIGZvciBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBzZWN0aW9uLiAgKi8KKyAgRWxmMzJfV29yZCBwbHRyZWxzY25pZHg7CisKKyAgLyogR2xvYmFsIG9mZnNldCB0YWJsZSBzZWN0aW9uLiAgKi8KKyAgRWxmMzJfV29yZCBnb3RzY25pZHg7CisKKyAgLyogVGhpcyBzZWN0aW9uIHdpbGwgaG9sZSBhbGwgbm9uLVBMVCByZWxvY2F0aW9ucy4gICovCisgIEVsZjMyX1dvcmQgcmVsZHluc2NuaWR4OworCisgIC8qIEluZGV4IG9mIHRoZSBzZWN0aW9ucyB0byBoYW5kbGUgdmVyc2lvbmluZy4gICovCisgIEVsZjMyX1dvcmQgdmVyc3ltc2NuaWR4OworICBFbGYzMl9Xb3JkIHZlcm5lZWRzY25pZHg7CisgIC8qIFhYWCBTaG91bGQgdGhlIGZvbGxvd2luZyBuYW1lcyBiZSB2ZXJuZWVkLi4uPyAgKi8KKyAgLyogTnVtYmVyIG9mIHZlcnNpb24gZGVmaW5pdGlvbnMgaW4gaW5wdXQgRFNPcyB1c2VkLiAgKi8KKyAgaW50IG52ZXJkZWZ1c2VkOworICAvKiBOdW1iZXIgb2YgaW5wdXQgRFNPcyB1c2luZyB2ZXJzaW9uaW5nLiAgKi8KKyAgaW50IG52ZXJkZWZmaWxlOworICAvKiBJbmRleCBvZiBuZXh0IHZlcnNpb24uICAqLworICBpbnQgbmV4dHZlcmlkeDsKKworICAvKiBIYXNoIHRhYmxlIGZvciB2ZXJzaW9uIHN5bWJvbCBzdHJpbmdzLiAgT25seSBzdHJpbmdzIHdpdGhvdXQKKyAgICAgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBoYXNoZWQgaGVyZS4gICovCisgIGxkX3ZlcnNpb25fc3RyX3RhYiB2ZXJzaW9uX3N0cl90YWI7CisgIC8qIEF0IG1vc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHZhcmlhYmxlcyBpcyBzZXQgdG8gdHJ1ZSBpZiBlaXRoZXIKKyAgICAgZ2xvYmFsIG9yIGxvY2FsIHN5bWJvbCBiaW5kaW5nIGlzIHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0LiAgKi8KKyAgYm9vbCBkZWZhdWx0X2JpbmRfbG9jYWw7CisgIGJvb2wgZGVmYXVsdF9iaW5kX2dsb2JhbDsKKworICAvKiBUcnVlIGlmIG9ubHkgdXNlZCBzZWN0aW9ucyBhcmUgdXNlZC4gICovCisgIGJvb2wgZ2Nfc2VjdGlvbnM7CisKKyAgLyogQXJyYXkgdG8gZGV0ZXJtaW5lIGZpbmFsIGluZGV4IG9mIHN5bWJvbC4gICovCisgIEVsZjMyX1dvcmQgKmRibGluZGlyZWN0OworCisgIC8qIFNlY3Rpb24gZ3JvdXAgaGFuZGxpbmcuICAqLworICBzdHJ1Y3Qgc2NuZ3JvdXAKKyAgeworICAgIEVsZjMyX1dvcmQgb3V0c2NuaWR4OworICAgIGludCBuc2NuczsKKyAgICBzdHJ1Y3QgbWVtYmVyCisgICAgeworICAgICAgc3RydWN0IHNjbmhlYWQgKnNjbjsKKyAgICAgIHN0cnVjdCBtZW1iZXIgKm5leHQ7CisgICAgfSAqbWVtYmVyOworICAgIHN0cnVjdCBFYmxfU3RyZW50ICpuYW1lZW50OworICAgIHN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKKyAgICBzdHJ1Y3Qgc2NuZ3JvdXAgKm5leHQ7CisgIH0gKmdyb3VwczsKKworICAvKiBUcnVlIGlmIHRoZSBvdXRwdXQgZmlsZSBuZWVkcyBhIC5nb3Qgc2VjdGlvbi4gICovCisgIGJvb2wgbmVlZF9nb3Q7CisgIC8qIE51bWJlciBvZiByZWxvY2F0aW9ucyBmb3IgR09UIHNlY3Rpb24gY2F1c2VkLiAgKi8KKyAgc2l6ZV90IG5yZWxfZ290OworCisgIC8qIE51bWJlciBvZiBlbnRyaWVzIG5lZWRlZCBpbiB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gICovCisgIGludCBuZHluYW1pYzsKKyAgLyogVG8ga2VlcCB0cmFjayBvZiBhZGRlZCBlbnRyaWVzLiAgKi8KKyAgaW50IG5keW5hbWljX2ZpbGxlZDsKKyAgLyogSW5kZXggZm9yIHRoZSBkeW5hbWljIHNlY3Rpb24uICAqLworICBFbGYzMl9Xb3JkIGR5bmFtaWNzY25pZHg7CisKKyAgLyogRmxhZ3Mgc2V0IGluIHRoZSBEVF9GTEFHUyB3b3JkLiAgKi8KKyAgRWxmMzJfV29yZCBkdF9mbGFnczsKKyAgLyogRmxhZ3Mgc2V0IGluIHRoZSBEVF9GTEFHU18xIHdvcmQuICAqLworICBFbGYzMl9Xb3JkIGR0X2ZsYWdzXzE7CisgIC8qIEZsYWdzIHNldCBpbiB0aGUgRFRfRkVBVFVSRV8xIHdvcmQuICAqLworICBFbGYzMl9Xb3JkIGR0X2ZlYXR1cmVfMTsKKworICAvKiBMYXp5LWxvYWRpbmcgc3RhdGUgZm9yIGRlcGVuZGVuY2llcy4gICovCisgIGJvb2wgbGF6eWxvYWQ7CisKKyAgLyogVHJ1ZSBpcyBEU09zIHdoaWNoIGFyZSBub3QgdXNlZCBpbiB0aGUgbGlua2luZyBwcm9jZXNzIGFyZSBub3QKKyAgICAgcmVjb3JkZWQuICAqLworICBib29sIGlnbm9yZV91bnVzZWRfZHNvczsKKworCisgIC8qIFRydWUgaWYgaW4gZXhlY3V0YWJsZXMgYWxsIGdsb2JhbCBzeW1ib2xzIHNob3VsZCBiZSBleHBvcnRlZCBpbgorICAgICB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLworICBib29sIGV4cG9ydF9hbGxfZHluYW1pYzsKKworICAvKiBJZiBEU08gaXMgZ2VuZXJhdGVkLCB0aGlzIGlzIHRoZSBTT05BTUUuICAqLworICBjb25zdCBjaGFyICpzb25hbWU7CisKKyAgLyogTGlzdCBvZiBhbGwgcmVsb2NhdGlvbiBzZWN0aW9ucy4gICovCisgIHN0cnVjdCBzY25pbmZvICpyZWxsaXN0OworICAvKiBUb3RhbCBzaXplIG9mIG5vbi1QTFQgcmVsb2NhdGlvbnMuICAqLworICBzaXplX3QgcmVsc2l6ZV90b3RhbDsKKworICAvKiBSZWNvcmQgZm9yIHRoZSBHT1Qgc3ltYm9sLCBpZiBrbm93bi4gICovCisgIHN0cnVjdCBzeW1ib2wgKmdvdF9zeW1ib2w7CisgIC8qIFJlY29yZCBmb3IgdGhlIGR5bmFtaWMgc2VjdGlvbiBzeW1ib2wsIGlmIGtub3duLiAgKi8KKyAgc3RydWN0IHN5bWJvbCAqZHluX3N5bWJvbDsKKworICAvKiBPYnN0YWNrIHVzZWQgZm9yIHNtYWxsIG9iamVjdHMgd2hpY2ggd2lsbCBub3QgYmUgZGVsZXRlZC4gICovCisgIHN0cnVjdCBvYnN0YWNrIHNtZW07Cit9OworCisKKy8qIFRoZSBpbnRlcmZhY2UgdG8gdGhlIHNjYW5uZXIuICAqLworCisvKiBQYXJzZXIgZW50cnkgcG9pbnQuICAqLworZXh0ZXJuIGludCBsZHBhcnNlICh2b2lkKTsKKworLyogVGhlIGlucHV0IGZpbGUuICAqLworZXh0ZXJuIEZJTEUgKmxkaW47CisKKy8qIE5hbWUgb2YgdGhlIGlucHV0IGZpbGUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmxkaW5fZm5hbWU7CisKKy8qIEN1cnJlbnQgbGluZSBudW1iZXIuICBNdXN0IGJlIHJlc2V0IGZvciBhIG5ldyBmaWxlLiAgKi8KK2V4dGVybiBpbnQgbGRsaW5lbm87CisKKy8qIElmIG5vbnplcm8gd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIGEgdmVyc2lvbiBzY3JpcHQuICAqLworZXh0ZXJuIGludCBsZF9zY2FuX3ZlcnNpb25fc2NyaXB0OworCisvKiBGbGFncyBkZWZpbmVkIGluIGxkLmMuICAqLworZXh0ZXJuIGludCB2ZXJib3NlOworZXh0ZXJuIGludCBjb25zZXJ2ZV9tZW1vcnk7CisKKworLyogTGlua2VyIHN0YXRlLiAgVGhpcyBjb250YWlucyBhbGwgZ2xvYmFsIGluZm9ybWF0aW9uLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbGRfc3RhdGUgbGRfc3RhdGU7CisKKworLyogR2VuZXJpYyBsZCBoZWxwZXIgZnVuY3Rpb25zLiAgKi8KKworLyogQXBwZW5kIGEgbmV3IGRpcmVjdG9yeSB0byBzZWFyY2ggbGlicmFyaWVzIGluLiAgKi8KK2V4dGVybiB2b2lkIGxkX25ld19zZWFyY2hkaXIgKGNvbnN0IGNoYXIgKmRpcik7CisKKy8qIEFwcGVuZCBhIG5ldyBmaWxlIHRvIHRoZSBsaXN0IG9mIGlucHV0IGZpbGVzLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdXNlZGZpbGVzICpsZF9uZXdfaW5wdXRmaWxlIChjb25zdCBjaGFyICpmbmFtZSwKKwkJCQkJICAgZW51bSBmaWxlX3R5cGUgdHlwZSk7CisKKworLyogVGhlc2UgYXJlIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGNhbGxiYWNrcyB1c2VkIGJ5IGxkLiAgKi8KKworLyogSW5pdGlhbGl6ZSBzdGF0ZSBvYmplY3QuICBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUKKyAgIHBhcmFtZXRlcnMgYXJlIHBhcnNlZCBidXQgYmVmb3JlIGFueSBmaWxlIGlzIHNlYXJjaGVkIGZvci4gICovCitleHRlcm4gaW50IGxkX3ByZXBhcmVfc3RhdGUgKGNvbnN0IGNoYXIgKmVtdWxhdGlvbik7CisKKworLyogRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gb2JqZWN0IHdpbGwgYmUgZHluYW1pY2FsbHkgbGlua2VkLiAgKi8KK2V4dGVybiBib29sIGR5bmFtaWNhbGx5X2xpbmtlZF9wICh2b2lkKTsKKworLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlLiAgKi8KKworLyogQ2hlY2tlZCB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIGFuZCByZWZlcmVuY2VkIGZyb20gYSBEU08uICAqLworZXh0ZXJuIGJvb2wgbGlua2VkX2Zyb21fZHNvX3AgKHN0cnVjdCBzY25pbmZvICpzY25pbmZvLCBzaXplX3Qgc3ltaWR4KTsKK2V4dGVybiBpbmxpbmUgYm9vbAorbGlua2VkX2Zyb21fZHNvX3AgKHN0cnVjdCBzY25pbmZvICpzY25pbmZvLCBzaXplX3Qgc3ltaWR4KQoreworICBzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlID0gc2NuaW5mby0+ZmlsZWluZm87CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IHVuZGVmaW5lZCBpbiB0aGlzIGZpbGUgaXQgY2Fubm90IGNvbWUgZnJvbQorICAgICBhIERTTy4gICovCisgIGlmIChzeW1pZHggPCBmaWxlLT5ubG9jYWxzeW1ib2xzKQorICAgIHJldHVybiBmYWxzZTsKKworICBzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBmaWxlLT5zeW1yZWZbc3ltaWR4XTsKKworICByZXR1cm4gc3ltLT5kZWZpbmVkICYmIHN5bS0+aW5fZHNvOworfQorCisjZW5kaWYJLyogbGQuaCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2xkZ2VuZXJpYy5jIGIvc3JjL2xkZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNmM3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGRnZW5lcmljLmMKQEAgLTAsMCArMSw2Mzc2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0uaD4KKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxpc3QuaCIKKworCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKipsZF9nZW5lcmljX2xpYl9leHRlbnNpb25zIChzdHJ1Y3QgbGRfc3RhdGUgKikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworc3RhdGljIGludCBsZF9nZW5lcmljX2ZpbGVfY2xvc2UgKHN0cnVjdCB1c2VkZmlsZXMgKmZpbGVpbmZvLAorCQkJCSAgc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApOworc3RhdGljIGludCBsZF9nZW5lcmljX2ZpbGVfcHJvY2VzcyAoaW50IGZkLCBzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlaW5mbywKKwkJCQkgICAgc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsCisJCQkJICAgIHN0cnVjdCB1c2VkZmlsZXMgKipuZXh0cCk7CitzdGF0aWMgdm9pZCBsZF9nZW5lcmljX2dlbmVyYXRlX3NlY3Rpb25zIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCk7CitzdGF0aWMgdm9pZCBsZF9nZW5lcmljX2NyZWF0ZV9zZWN0aW9ucyAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApOworc3RhdGljIGludCBsZF9nZW5lcmljX2ZsYWdfdW5yZXNvbHZlZCAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApOworc3RhdGljIGludCBsZF9nZW5lcmljX29wZW5fb3V0ZmlsZSAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsIGludCBtYWNoaW5lLAorCQkJCSAgICBpbnQgY2xhc3MsIGludCBkYXRhKTsKK3N0YXRpYyBpbnQgbGRfZ2VuZXJpY19jcmVhdGVfb3V0ZmlsZSAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApOworc3RhdGljIHZvaWQgbGRfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCwKKwkJCQkJIEVsZl9TY24gKm91dHNjbiwKKwkJCQkJIHN0cnVjdCBzY25pbmZvICpmaXJzdHAsCisJCQkJCSBjb25zdCBFbGYzMl9Xb3JkICpkYmxpbmRpcmVjdCk7CitzdGF0aWMgaW50IGxkX2dlbmVyaWNfZmluYWxpemUgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwKTsKK3N0YXRpYyBib29sIGxkX2dlbmVyaWNfc3BlY2lhbF9zZWN0aW9uX251bWJlcl9wIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCwKKwkJCQkJCSBzaXplX3QgbnVtYmVyKTsKK3N0YXRpYyBib29sIGxkX2dlbmVyaWNfc2VjdGlvbl90eXBlX3AgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwLAorCQkJCSAgICAgICBYRWxmX1dvcmQgdHlwZSk7CitzdGF0aWMgWEVsZl9Yd29yZCBsZF9nZW5lcmljX2R5bmFtaWNfc2VjdGlvbl9mbGFncyAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApOworc3RhdGljIHZvaWQgbGRfZ2VuZXJpY19pbml0aWFsaXplX3BsdCAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsIEVsZl9TY24gKnNjbik7CitzdGF0aWMgdm9pZCBsZF9nZW5lcmljX2luaXRpYWxpemVfcGx0cmVsIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCwKKwkJCQkJICBFbGZfU2NuICpzY24pOworc3RhdGljIHZvaWQgbGRfZ2VuZXJpY19pbml0aWFsaXplX2dvdCAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsIEVsZl9TY24gKnNjbik7CitzdGF0aWMgdm9pZCBsZF9nZW5lcmljX2ZpbmFsaXplX3BsdCAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsIHNpemVfdCBuc3ltLAorCQkJCSAgICAgc2l6ZV90IG5zeW1fZHluKTsKK3N0YXRpYyBpbnQgbGRfZ2VuZXJpY19yZWxfdHlwZSAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApOworc3RhdGljIHZvaWQgbGRfZ2VuZXJpY19jb3VudF9yZWxvY2F0aW9ucyAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsCisJCQkJCSAgc3RydWN0IHNjbmluZm8gKnNjbmluZm8pOworc3RhdGljIHZvaWQgbGRfZ2VuZXJpY19jcmVhdGVfcmVsb2NhdGlvbnMgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwLAorCQkJCQkgICBjb25zdCBFbGYzMl9Xb3JkICpkYmxpbmRpcmVjdCk7CisKK3N0YXRpYyBpbnQgZmlsZV9wcm9jZXNzMiAoc3RydWN0IHVzZWRmaWxlcyAqZmlsZWluZm8pOworc3RhdGljIHZvaWQgbWFya19zZWN0aW9uX3VzZWQgKHN0cnVjdCBzY25pbmZvICpzY25pbmZvLCBFbGYzMl9Xb3JkIHNobmR4LAorCQkJICAgICAgIHN0cnVjdCBzY25pbmZvICoqZ3Jwc2NucCk7CisKKworLyogTWFwIHN5bWJvbCBpbmRleCB0byBzdHJ1Y3Qgc3ltYm9sIHJlY29yZC4gICovCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqKm5keHRvc3ltOworCisvKiBTdHJpbmcgdGFibGUgcmVmZXJlbmNlIHRvIGFsbCBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLworc3RhdGljIHN0cnVjdCBFYmxfU3RyZW50ICoqc3ltc3RyZW50OworCisKKy8qIENoZWNrIHdoZXRoZXIgZmlsZSBhc3NvY2lhdGVkIHdpdGggRkQgaXMgYSBEU08uICAqLworc3RhdGljIGJvb2wKK2lzX2Rzb19wIChpbnQgZmQpCit7CisgIC8qIFdlIGhhdmUgdG8gcmVhZCB0aGUgJ2VfdHlwZScgZmllbGQuICBJdCBoYXMgdGhlIHNhbWUgc2l6ZSAoMTYKKyAgICAgYml0cykgaW4gMzItIGFuZCA2NC1iaXQgRUxGLiAgKi8KKyAgWEVsZl9IYWxmIGVfdHlwZTsKKworICByZXR1cm4gKHByZWFkIChmZCwgJmVfdHlwZSwgc2l6ZW9mIChlX3R5cGUpLCBvZmZzZXRvZiAoWEVsZl9FaGRyLCBlX3R5cGUpKQorCSAgPT0gc2l6ZW9mIChlX3R5cGUpCisJICAmJiBlX3R5cGUgPT0gRVRfRFlOKTsKK30KKworCisvKiBQcmludCB0aGUgY29tcGxldGUgbmFtZSBvZiBhIGZpbGUsIGluY2x1ZGluZyB0aGUgYXJjaGl2ZSBpdCBpcworICAgY29udGFpbmVkIGluLiAgKi8KK3N0YXRpYyBpbnQKK3ByaW50X2ZpbGVfbmFtZSAoRklMRSAqcywgc3RydWN0IHVzZWRmaWxlcyAqZmlsZWluZm8sIGludCBmaXJzdF9sZXZlbCwKKwkJIGludCBuZXdsaW5lKQoreworICBpbnQgbnBhciA9IDA7CisKKyAgaWYgKGZpbGVpbmZvLT5hcmNoaXZlX2ZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBucGFyID0gcHJpbnRfZmlsZV9uYW1lIChzLCBmaWxlaW5mby0+YXJjaGl2ZV9maWxlLCAwLCAwKSArIDE7CisgICAgICBmcHV0Y191bmxvY2tlZCAoJygnLCBzKTsKKyAgICAgIGZwdXRzX3VubG9ja2VkIChmaWxlaW5mby0+cmZuYW1lLCBzKTsKKworICAgICAgaWYgKGZpcnN0X2xldmVsKQorCXdoaWxlIChucGFyLS0gPiAwKQorCSAgZnB1dGNfdW5sb2NrZWQgKCcpJywgcyk7CisgICAgfQorICBlbHNlCisgICAgZnB1dHNfdW5sb2NrZWQgKGZpbGVpbmZvLT5yZm5hbWUsIHMpOworCisgIGlmIChmaXJzdF9sZXZlbCAmJiBuZXdsaW5lKQorICAgIGZwdXRjX3VubG9ja2VkICgnXG4nLCBzKTsKKworICByZXR1cm4gbnBhcjsKK30KKworCisvKiBGdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBvYmplY3Qgd2lsbCBiZSBkeW5hbWljYWxseSBsaW5rZWQuICAqLworYm9vbAorZHluYW1pY2FsbHlfbGlua2VkX3AgKHZvaWQpCit7CisgIHJldHVybiAobGRfc3RhdGUuZmlsZV90eXBlID09IGRzb19maWxlX3R5cGUgfHwgbGRfc3RhdGUubnBsdCA+IDAKKwkgIHx8IGxkX3N0YXRlLm5nb3QgPiAwKTsKK30KKworCitib29sCitsaW5rZWRfZnJvbV9kc29fcCAoc3RydWN0IHNjbmluZm8gKnNjbmluZm8sIHNpemVfdCBzeW1pZHgpCit7CisgIHN0cnVjdCB1c2VkZmlsZXMgKmZpbGUgPSBzY25pbmZvLT5maWxlaW5mbzsKKworICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgdW5kZWZpbmVkIGluIHRoaXMgZmlsZSBpdCBjYW5ub3QgY29tZSBmcm9tCisgICAgIGEgRFNPLiAgKi8KKyAgaWYgKHN5bWlkeCA8IGZpbGUtPm5sb2NhbHN5bWJvbHMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN0cnVjdCBzeW1ib2wgKnN5bSA9IGZpbGUtPnN5bXJlZltzeW1pZHhdOworCisgIHJldHVybiBzeW0tPmRlZmluZWQgJiYgc3ltLT5pbl9kc287Cit9CisKKworLyogSW5pdGlhbGl6ZSBzdGF0ZSBvYmplY3QuICBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUKKyAgIHBhcmFtZXRlcnMgYXJlIHBhcnNlZCBidXQgYmVmb3JlIGFueSBmaWxlIGlzIHNlYXJjaGVkIGZvci4gICovCitpbnQKK2xkX3ByZXBhcmVfc3RhdGUgKGNvbnN0IGNoYXIgKmVtdWxhdGlvbikKK3sKKyAgLyogV2hlbiBnZW5lcmF0aW5nIERTTyB3ZSBub3JtYWxseSBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4gICovCisgIGxkX3N0YXRlLm5vZGVmcyA9IHRydWU7CisKKyAgLyogVG8gYmUgYWJsZSB0byBkZXRlY3QgcHJvYmxlbXMgd2UgYWRkIGEgLmNvbW1lbnQgc2VjdGlvbiBlbnRyeSBieQorICAgICBkZWZhdWx0LiAgKi8KKyAgbGRfc3RhdGUuYWRkX2xkX2NvbW1lbnQgPSB0cnVlOworCisgIC8qIFhYWCBXZSBwcm9iYWJseSBzaG91bGQgZmluZCBhIGJldHRlciBwbGFjZSBmb3IgdGhpcy4gIFRoZSBpbmRleAorICAgICBvZiB0aGUgZmlyc3QgdXNlci1kZWZpbmVkIHZlcnNpb24gaXMgMi4gICovCisgIGxkX3N0YXRlLm5leHR2ZXJpZHggPSAyOworCisgIC8qIFBpY2sgYW4gbm90IHRvbyBzbWFsbCBudW1iZXIgZm9yIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHRhYmxlcy4gICovCisgIGxkX3N5bWJvbF90YWJfaW5pdCAoJmxkX3N0YXRlLnN5bWJvbF90YWIsIDEwMjcpOworICBsZF9zZWN0aW9uX3RhYl9pbml0ICgmbGRfc3RhdGUuc2VjdGlvbl90YWIsIDY3KTsKKyAgbGRfdmVyc2lvbl9zdHJfdGFiX2luaXQgKCZsZF9zdGF0ZS52ZXJzaW9uX3N0cl90YWIsIDY3KTsKKworICAvKiBJbml0aWFsaXplIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLworICBsZF9zdGF0ZS5zaHN0cnRhYiA9IGVibF9zdHJ0YWJpbml0ICh0cnVlKTsKKyAgaWYgKGxkX3N0YXRlLnNoc3RydGFiID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHN0cmluZyB0YWJsZSIpKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBjYWxsYmFja3MuICBUaGVzZSBhcmUgdGhlIGRlZmF1bHRzLCB0aGUgYXBwcm9wcmlhdGUKKyAgICAgYmFja2VuZCBjYW4gbGF0ZXIgaW5zdGFsbCBpdHMgb3duIGNhbGxiYWNrcy4gICovCisgIGxkX3N0YXRlLmNhbGxiYWNrcy5saWJfZXh0ZW5zaW9ucyA9IGxkX2dlbmVyaWNfbGliX2V4dGVuc2lvbnM7CisgIGxkX3N0YXRlLmNhbGxiYWNrcy5maWxlX3Byb2Nlc3MgPSBsZF9nZW5lcmljX2ZpbGVfcHJvY2VzczsKKyAgbGRfc3RhdGUuY2FsbGJhY2tzLmZpbGVfY2xvc2UgPSBsZF9nZW5lcmljX2ZpbGVfY2xvc2U7CisgIGxkX3N0YXRlLmNhbGxiYWNrcy5nZW5lcmF0ZV9zZWN0aW9ucyA9IGxkX2dlbmVyaWNfZ2VuZXJhdGVfc2VjdGlvbnM7CisgIGxkX3N0YXRlLmNhbGxiYWNrcy5jcmVhdGVfc2VjdGlvbnMgPSBsZF9nZW5lcmljX2NyZWF0ZV9zZWN0aW9uczsKKyAgbGRfc3RhdGUuY2FsbGJhY2tzLmZsYWdfdW5yZXNvbHZlZCA9IGxkX2dlbmVyaWNfZmxhZ191bnJlc29sdmVkOworICBsZF9zdGF0ZS5jYWxsYmFja3Mub3Blbl9vdXRmaWxlID0gbGRfZ2VuZXJpY19vcGVuX291dGZpbGU7CisgIGxkX3N0YXRlLmNhbGxiYWNrcy5jcmVhdGVfb3V0ZmlsZSA9IGxkX2dlbmVyaWNfY3JlYXRlX291dGZpbGU7CisgIGxkX3N0YXRlLmNhbGxiYWNrcy5yZWxvY2F0ZV9zZWN0aW9uID0gbGRfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uOworICBsZF9zdGF0ZS5jYWxsYmFja3MuZmluYWxpemUgPSBsZF9nZW5lcmljX2ZpbmFsaXplOworICBsZF9zdGF0ZS5jYWxsYmFja3Muc3BlY2lhbF9zZWN0aW9uX251bWJlcl9wID0KKyAgICBsZF9nZW5lcmljX3NwZWNpYWxfc2VjdGlvbl9udW1iZXJfcDsKKyAgbGRfc3RhdGUuY2FsbGJhY2tzLnNlY3Rpb25fdHlwZV9wID0gbGRfZ2VuZXJpY19zZWN0aW9uX3R5cGVfcDsKKyAgbGRfc3RhdGUuY2FsbGJhY2tzLmR5bmFtaWNfc2VjdGlvbl9mbGFncyA9IGxkX2dlbmVyaWNfZHluYW1pY19zZWN0aW9uX2ZsYWdzOworICBsZF9zdGF0ZS5jYWxsYmFja3MuaW5pdGlhbGl6ZV9wbHQgPSBsZF9nZW5lcmljX2luaXRpYWxpemVfcGx0OworICBsZF9zdGF0ZS5jYWxsYmFja3MuaW5pdGlhbGl6ZV9wbHRyZWwgPSBsZF9nZW5lcmljX2luaXRpYWxpemVfcGx0cmVsOworICBsZF9zdGF0ZS5jYWxsYmFja3MuaW5pdGlhbGl6ZV9nb3QgPSBsZF9nZW5lcmljX2luaXRpYWxpemVfZ290OworICBsZF9zdGF0ZS5jYWxsYmFja3MuZmluYWxpemVfcGx0ID0gbGRfZ2VuZXJpY19maW5hbGl6ZV9wbHQ7CisgIGxkX3N0YXRlLmNhbGxiYWNrcy5yZWxfdHlwZSA9IGxkX2dlbmVyaWNfcmVsX3R5cGU7CisgIGxkX3N0YXRlLmNhbGxiYWNrcy5jb3VudF9yZWxvY2F0aW9ucyA9IGxkX2dlbmVyaWNfY291bnRfcmVsb2NhdGlvbnM7CisgIGxkX3N0YXRlLmNhbGxiYWNrcy5jcmVhdGVfcmVsb2NhdGlvbnMgPSBsZF9nZW5lcmljX2NyZWF0ZV9yZWxvY2F0aW9uczsKKworI2lmbmRlZiBCQVNFX0VMRl9OQU1FCisgIC8qIEZpbmQgdGhlIGxkIGJhY2tlbmQgbGlicmFyeS4gIFVzZSBFQkwgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIGlmCisgICAgIHRoZSB1c2VyIGhhc24ndCBwcm92aWRlZCBvbmUgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCisgIGlmIChlbXVsYXRpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBlbXVsYXRpb24gPSBlYmxfYmFja2VuZF9uYW1lIChsZF9zdGF0ZS5lYmwpOworICAgICAgYXNzZXJ0IChlbXVsYXRpb24gIT0gTlVMTCk7CisgICAgfQorICBzaXplX3QgZW11bGF0aW9uX2xlbiA9IHN0cmxlbiAoZW11bGF0aW9uKTsKKworICAvKiBDb25zdHJ1Y3QgdGhlIGZpbGUgbmFtZS4gICovCisgIGNoYXIgKmZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzaXplb2YgImxpYmxkXyIgLSAxICsgZW11bGF0aW9uX2xlbgorCQkJCSArIHNpemVvZiAiLnNvIik7CisgIHN0cmNweSAobWVtcGNweSAoc3RwY3B5IChmbmFtZSwgImxpYmxkXyIpLCBlbXVsYXRpb24sIGVtdWxhdGlvbl9sZW4pLCAiLnNvIik7CisKKyAgLyogVHJ5IGxvYWRpbmcuICAqLworICB2b2lkICpoID0gZGxvcGVuIChmbmFtZSwgUlRMRF9MQVpZKTsKKyAgaWYgKGggPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgbG9hZCBsZCBiYWNrZW5kIGxpYnJhcnkgJyVzJzogJXMiKSwKKwkgICBmbmFtZSwgZGxlcnJvciAoKSk7CisKKyAgLyogRmluZCB0aGUgaW5pdGlhbGl6ZXIuICBJdCBtdXN0IGJlIHByZXNlbnQuICAqLworICBjaGFyICppbml0bmFtZSA9IChjaGFyICopIGFsbG9jYSAoZW11bGF0aW9uX2xlbiArIHNpemVvZiAiX2xkX2luaXQiKTsKKyAgc3RyY3B5IChtZW1wY3B5IChpbml0bmFtZSwgZW11bGF0aW9uLCBlbXVsYXRpb25fbGVuKSwgIl9sZF9pbml0Iik7CisgIGludCAoKmluaXRmY3QpIChzdHJ1Y3QgbGRfc3RhdGUgKikKKyAgICA9IChpbnQgKCopIChzdHJ1Y3QgbGRfc3RhdGUgKikpIGRsc3ltIChoLCBpbml0bmFtZSk7CisKKyAgaWYgKGluaXRmY3QgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiXAorY2Fubm90IGZpbmQgaW5pdCBmdW5jdGlvbiBpbiBsZCBiYWNrZW5kIGxpYnJhcnkgJyVzJzogJXMiKSwKKwkgICBmbmFtZSwgZGxlcnJvciAoKSk7CisKKyAgLyogU3RvcmUgdGhlIGhhbmRsZS4gICovCisgIGxkX3N0YXRlLmxkbGliID0gaDsKKworICAvKiBDYWxsIHRoZSBpbml0IGZ1bmN0aW9uLiAgKi8KKyAgcmV0dXJuIGluaXRmY3QgKCZsZF9zdGF0ZSk7CisjZWxzZQorIyBkZWZpbmUgSU5JVF9GQ1RfTkFNRShiYXNlKSBfSU5JVF9GQ1RfTkFNRShiYXNlKQorIyBkZWZpbmUgX0lOSVRfRkNUX05BTUUoYmFzZSkgYmFzZSMjX2xkX2luaXQKKyAgLyogRGVjbGFyZSBhbmQgY2FsbCB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICAqLworICBleHRlcm4gaW50IElOSVRfRkNUX05BTUUoQkFTRV9FTEZfTkFNRSkgKHN0cnVjdCBsZF9zdGF0ZSAqKTsKKyAgcmV0dXJuIElOSVRfRkNUX05BTUUoQkFTRV9FTEZfTkFNRSkgKCZsZF9zdGF0ZSk7CisjZW5kaWYKK30KKworCitzdGF0aWMgaW50CitjaGVja19mb3JfZHVwbGljYXRlMiAoc3RydWN0IHVzZWRmaWxlcyAqbmV3cCwgc3RydWN0IHVzZWRmaWxlcyAqbGlzdCkKK3sKKyAgc3RydWN0IHVzZWRmaWxlcyAqZmlyc3Q7CisgIHN0cnVjdCB1c2VkZmlsZXMgKnByZXZwOworCisgIGlmIChsaXN0ID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgcHJldnAgPSBsaXN0OworICBsaXN0ID0gZmlyc3QgPSBsaXN0LT5uZXh0OworICBkbworICAgIHsKKyAgICAgIC8qIFdoZW4gc2VhcmNoaW5nIHRoZSBuZWVkZWQgbGlzdCB3ZSBtaWdodCBjb21lIGFjcm9zcyBlbnRyaWVzCisJIGZvciBmaWxlcyB3aGljaCBhcmUgbm90IHlldCBvcGVuZWQuICBTdG9wIHRoZW4sIHRoZXJlIGlzCisJIG5vdGhpbmcgbW9yZSB0byB0ZXN0LiAgKi8KKyAgICAgIGlmIChsaWtlbHkgKGxpc3QtPnN0YXR1cyA9PSBub3Rfb3BlbmVkKSkKKwlicmVhazsKKworICAgICAgaWYgKHVubGlrZWx5IChsaXN0LT5pbm8gPT0gbmV3cC0+aW5vKQorCSAgJiYgdW5saWtlbHkgKGxpc3QtPmRldiA9PSBuZXdwLT5kZXYpKQorCXsKKwkgIGNsb3NlIChuZXdwLT5mZCk7CisJICBuZXdwLT5mZCA9IC0xOworCSAgbmV3cC0+c3RhdHVzID0gY2xvc2VkOworCSAgaWYgKG5ld3AtPmZpbGVfdHlwZSA9PSByZWxvY2F0YWJsZV9maWxlX3R5cGUpCisJICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGFzIGlucHV0IiksCisJCSAgIG5ld3AtPnJmbmFtZSk7CisKKwkgIHJldHVybiAxOworCX0KKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKyAgd2hpbGUgKGxpa2VseSAobGlzdCAhPSBmaXJzdCkpOworCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2NoZWNrX2Zvcl9kdXBsaWNhdGUgKHN0cnVjdCB1c2VkZmlsZXMgKm5ld3ApCit7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIGlmICh1bmxpa2VseSAoZnN0YXQgKG5ld3AtPmZkLCAmc3QpIDwgMCkpCisgICAgeworICAgICAgY2xvc2UgKG5ld3AtPmZkKTsKKyAgICAgIHJldHVybiBlcnJubzsKKyAgICB9CisKKyAgbmV3cC0+ZGV2ID0gc3Quc3RfZGV2OworICBuZXdwLT5pbm8gPSBzdC5zdF9pbm87CisKKyAgcmV0dXJuIChjaGVja19mb3JfZHVwbGljYXRlMiAobmV3cCwgbGRfc3RhdGUucmVsZmlsZXMpCisJICB8fCBjaGVja19mb3JfZHVwbGljYXRlMiAobmV3cCwgbGRfc3RhdGUuZHNvZmlsZXMpCisJICB8fCBjaGVja19mb3JfZHVwbGljYXRlMiAobmV3cCwgbGRfc3RhdGUubmVlZGVkKSk7Cit9CisKKworLyogRmluZCBhIGZpbGUgYWxvbmcgdGhlIHBhdGggZGVzY3JpYmVkIGluIHRoZSBzdGF0ZS4gICovCitzdGF0aWMgaW50CitvcGVuX2Fsb25nX3BhdGgyIChzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlaW5mbywgc3RydWN0IHBhdGhlbGVtZW50ICpwYXRoKQoreworICBjb25zdCBjaGFyICpmbmFtZSA9IGZpbGVpbmZvLT5mbmFtZTsKKyAgc2l6ZV90IGZuYW1lbGVuID0gc3RybGVuIChmbmFtZSk7CisgIGludCBlcnIgPSBFTk9FTlQ7CisgIHN0cnVjdCBwYXRoZWxlbWVudCAqZmlyc3RwID0gcGF0aDsKKworICBpZiAocGF0aCA9PSBOVUxMKQorICAgIC8qIENhbm5vdCBmaW5kIGFueXRoaW5nIHNpbmNlIHdlIGhhdmUgbm8gcGF0aC4gICovCisgICAgcmV0dXJuIEVOT0VOVDsKKworICBkbworICAgIHsKKyAgICAgIGlmIChsaWtlbHkgKHBhdGgtPmV4aXN0ID49IDApKQorCXsKKwkgIC8qIENyZWF0ZSB0aGUgZmlsZSBuYW1lLiAgKi8KKwkgIGNoYXIgKnJmbmFtZSA9IE5VTEw7CisJICBzaXplX3QgZGlybGVuID0gc3RybGVuIChwYXRoLT5wbmFtZSk7CisJICBpbnQgZmQgPSAtMTsKKworCSAgaWYgKGZpbGVpbmZvLT5maWxlX3R5cGUgPT0gYXJjaGl2ZV9maWxlX3R5cGUpCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICoqZXh0cyA9IChsZF9zdGF0ZS5zdGF0aWNhbGx5CisJCQkJICAgPyAoY29uc3QgY2hhciAqWzJdKSB7ICIuYSIsIE5VTEwgfQorCQkJCSAgIDogTElCX0VYVEVOU0lPTiAoJmxkX3N0YXRlKSk7CisKKwkgICAgICAvKiBXZSBoYXZlIHRvIGNyZWF0ZSB0aGUgYWN0dWFsIGZpbGUgbmFtZS4gIFdlIHByZXBlbmQgImxpYiIKKwkJIGFuZCBhZGQgb25lIG9mIHRoZSBleHRlbnNpb25zIHRoZSBwbGF0Zm9ybSBoYXMuICAqLworCSAgICAgIHdoaWxlICgqZXh0cyAhPSBOVUxMKQorCQl7CisJCSAgc2l6ZV90IGV4dGxlbiA9IHN0cmxlbiAoKmV4dHMpOworCQkgIHJmbmFtZSA9IChjaGFyICopIGFsbG9jYSAoZGlybGVuICsgNSArIGZuYW1lbGVuICsgZXh0bGVuKTsKKwkJICBtZW1jcHkgKG1lbXBjcHkgKHN0cGNweSAobWVtcGNweSAocmZuYW1lLCBwYXRoLT5wbmFtZSwKKwkJCQkJCSAgICBkaXJsZW4pLAorCQkJCQkgICAiL2xpYiIpLAorCQkJCSAgIGZuYW1lLCBmbmFtZWxlbiksCisJCQkgICpleHRzLCBleHRsZW4gKyAxKTsKKworCQkgIGZkID0gb3BlbiAocmZuYW1lLCBPX1JET05MWSk7CisJCSAgaWYgKGxpa2VseSAoZmQgIT0gLTEpIHx8IGVycm5vICE9IEVOT0VOVCkKKwkJICAgIHsKKwkJICAgICAgZXJyID0gZmQgPT0gLTEgPyBlcnJubyA6IDA7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCisJCSAgLyogTmV4dCBleHRlbnNpb24uICAqLworCQkgICsrZXh0czsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc3NlcnQgKGZpbGVpbmZvLT5maWxlX3R5cGUgPT0gZHNvX2ZpbGVfdHlwZQorCQkgICAgICB8fCBmaWxlaW5mby0+ZmlsZV90eXBlID09IGRzb19uZWVkZWRfZmlsZV90eXBlKTsKKworCSAgICAgIHJmbmFtZSA9IChjaGFyICopIGFsbG9jYSAoZGlybGVuICsgMSArIGZuYW1lbGVuICsgMSk7CisJICAgICAgbWVtY3B5IChzdHBjcHkgKG1lbXBjcHkgKHJmbmFtZSwgcGF0aC0+cG5hbWUsIGRpcmxlbiksICIvIiksCisJCSAgICAgIGZuYW1lLCBmbmFtZWxlbiArIDEpOworCisJICAgICAgZmQgPSBvcGVuIChyZm5hbWUsIE9fUkRPTkxZKTsKKwkgICAgICBpZiAodW5saWtlbHkgKGZkID09IC0xKSkKKwkJZXJyID0gZXJybm87CisJICAgIH0KKworCSAgaWYgKGxpa2VseSAoZmQgIT0gLTEpKQorCSAgICB7CisJICAgICAgLyogV2UgZm91bmQgdGhlIGZpbGUuICBUaGlzIGFsc28gbWVhbnMgdGhlIGRpcmVjdG9yeQorCQkgZXhpc3RzLiAgKi8KKwkgICAgICBmaWxlaW5mby0+ZmQgPSBmZDsKKwkgICAgICBwYXRoLT5leGlzdCA9IDE7CisKKwkgICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdGhpcyBmaWxlIGFscmVhZHkgbG9hZGVkLiAgKi8KKwkgICAgICBpZiAodW5saWtlbHkgKGNoZWNrX2Zvcl9kdXBsaWNhdGUgKGZpbGVpbmZvKSAhPSAwKSkKKwkJcmV0dXJuIEVBR0FJTjsKKworCSAgICAgIC8qIE1ha2UgYSBjb3B5IG9mIHRoZSBuYW1lLiAgKi8KKwkgICAgICBmaWxlaW5mby0+cmZuYW1lID0gb2JzdGFja19zdHJkdXAgKCZsZF9zdGF0ZS5zbWVtLCByZm5hbWUpOworCisJICAgICAgaWYgKHVubGlrZWx5IChsZF9zdGF0ZS50cmFjZV9maWxlcykpCisJCXByaW50ZiAoZmlsZWluZm8tPmZpbGVfdHlwZSA9PSBhcmNoaXZlX2ZpbGVfdHlwZQorCQkJPyBnZXR0ZXh0ICgiJXMgKGZvciAtbCVzKVxuIikKKwkJCTogZ2V0dGV4dCAoIiVzIChmb3IgRFRfTkVFREVEICVzKVxuIiksCisJCQlyZm5hbWUsIGZuYW1lKTsKKworCSAgICAgIHJldHVybiAwOworCSAgICB9CisKKwkgIC8qIFRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LiAgTWF5YmUgdGhlIHdob2xlIGRpcmVjdG9yeSBkb2Vzbid0LgorCSAgICAgQ2hlY2sgaXQgdW5sZXNzIHdlIGtub3cgaXQgZXhpc3RzLiAgKi8KKwkgIGlmICh1bmxpa2VseSAocGF0aC0+ZXhpc3QgPT0gMCkpCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworCSAgICAgIC8qIEtlZXAgb25seSB0aGUgZGlyZWN0b3J5IG5hbWUuICBOb3RlIHRoYXQgdGhlIHBhdGgKKwkJIG1pZ2h0IGJlIHJlbGF0aXZlLiAgVGhpcyBkb2Vzbid0IG1hdHRlciBoZXJlLiAgV2UgZG8KKwkJIHRoZSB0ZXN0IGluIGFueSBjYXNlIGV2ZW4gaWYgdGhlcmUgaXMgdGhlIGNoYW5jZSB0aGF0CisJCSBzb21lYm9keSB3YW50cyB0byBjaGFuZ2UgdGhlIHByb2dyYW1zIHdvcmtpbmcKKwkJIGRpcmVjdG9yeSBhdCBzb21lIHBvaW50IHdoaWNoIHdvdWxkIG1ha2UgdGhlIHJlc3VsdAorCQkgb2YgdGhpcyB0ZXN0IHZvaWQuICBTaW5jZSBjaGFuZ2luZyB0aGUgd29ya2luZworCQkgZGlyZWN0b3J5IGlzIGNvbXBsZXRlbHkgd3Jvbmcgd2UgYXJlIG5vdCB0YWtpbmcgdGhpcworCQkgY2FzZSBpbnRvIGFjY291bnQuICAqLworCSAgICAgIHJmbmFtZVtkaXJsZW5dID0gJ1wwJzsKKwkgICAgICBpZiAodW5saWtlbHkgKHN0YXQgKHJmbmFtZSwgJnN0KSA8IDApIHx8ICEgU19JU0RJUiAoc3Quc3RfbW9kZSkpCisJCS8qIFRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Qgb3IgdGhlIG5hbWVkIGZpbGUgaXMgbm8KKwkJICAgZGlyZWN0b3J5LiAgKi8KKwkJcGF0aC0+ZXhpc3QgPSAtMTsKKwkgICAgICBlbHNlCisJCXBhdGgtPmV4aXN0ID0gMTsKKwkgICAgfQorCX0KKworICAgICAgLyogTmV4dCBwYXRoIGVsZW1lbnQuICAqLworICAgICAgcGF0aCA9IHBhdGgtPm5leHQ7CisgICAgfQorICB3aGlsZSAobGlrZWx5IChlcnIgPT0gRU5PRU5UICYmIHBhdGggIT0gZmlyc3RwKSk7CisKKyAgcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50CitvcGVuX2Fsb25nX3BhdGggKHN0cnVjdCB1c2VkZmlsZXMgKmZpbGVpbmZvKQoreworICBjb25zdCBjaGFyICpmbmFtZSA9IGZpbGVpbmZvLT5mbmFtZTsKKyAgaW50IGVyciA9IEVOT0VOVDsKKworICBpZiAoZmlsZWluZm8tPmZpbGVfdHlwZSA9PSByZWxvY2F0YWJsZV9maWxlX3R5cGUpCisgICAgeworICAgICAgLyogT25seSBsaWJyYXJpZXMgYXJlIHNlYXJjaGVkIGFsb25nIHRoZSBwYXRoLiAgKi8KKyAgICAgIGZpbGVpbmZvLT5mZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7CisKKyAgICAgIGlmIChsaWtlbHkgKGZpbGVpbmZvLT5mZCAhPSAtMSkpCisJeworCSAgLyogV2UgZm91bmQgdGhlIGZpbGUuICAqLworCSAgaWYgKHVubGlrZWx5IChsZF9zdGF0ZS50cmFjZV9maWxlcykpCisJICAgIHByaW50X2ZpbGVfbmFtZSAoc3Rkb3V0LCBmaWxlaW5mbywgMSwgMSk7CisKKwkgIHJldHVybiBjaGVja19mb3JfZHVwbGljYXRlIChmaWxlaW5mbyk7CisJfQorCisgICAgICAvKiBJZiB0aGUgbmFtZSBpcyBhbiBhYnNvbHV0ZSBwYXRoIHdlIGFyZSBkb25lLiAgKi8KKyAgICAgIGVyciA9IGVycm5vOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSB1c2VyIHNwZWNpZmllZCB0d28gcGFydHMgdG8gdGhlIExEX0xJQlJBUllfUEFUSCB2YXJpYWJsZQorCSB0cnkgdGhlIGZpcnN0IHBhcnQgbm93LiAgKi8KKyAgICAgIGVyciA9IG9wZW5fYWxvbmdfcGF0aDIgKGZpbGVpbmZvLCBsZF9zdGF0ZS5sZF9saWJyYXJ5X3BhdGgxKTsKKworICAgICAgLyogVHJ5IHRoZSB1c2VyLXNwZWNpZmllZCBwYXRoIG5leHQuICAqLworICAgICAgaWYgKGVyciA9PSBFTk9FTlQpCisJZXJyID0gb3Blbl9hbG9uZ19wYXRoMiAoZmlsZWluZm8sCisJCQkJZmlsZWluZm8tPmZpbGVfdHlwZSA9PSBhcmNoaXZlX2ZpbGVfdHlwZQorCQkJCT8gbGRfc3RhdGUucGF0aHMgOiBsZF9zdGF0ZS5ycGF0aF9saW5rKTsKKworICAgICAgLyogVGhlbiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIExEX0xJQlJBUllfUEFUSCB2YWx1ZS4gICovCisgICAgICBpZiAodW5saWtlbHkgKGVyciA9PSBFTk9FTlQpKQorCXsKKwkgIGVyciA9IG9wZW5fYWxvbmdfcGF0aDIgKGZpbGVpbmZvLCBsZF9zdGF0ZS5sZF9saWJyYXJ5X3BhdGgyKTsKKworCSAgLyogSW4gY2FzZSB3ZSBsb29rIGZvciBhIERTTyBoYW5kbGUgbm93IHRoZSBSVU5QQVRILiAgKi8KKwkgIGlmIChlcnIgPT0gRU5PRU5UKQorCSAgICB7CisJICAgICAgaWYgKGZpbGVpbmZvLT5maWxlX3R5cGUgPT0gZHNvX2ZpbGVfdHlwZSkKKwkJZXJyID0gb3Blbl9hbG9uZ19wYXRoMiAoZmlsZWluZm8sIGxkX3N0YXRlLnJ1bnBhdGhfbGluayk7CisKKwkgICAgICAvKiBGaW5hbGx5IHRoZSBwYXRoIGZyb20gdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gICovCisJICAgICAgaWYgKGVyciA9PSBFTk9FTlQpCisJCWVyciA9IG9wZW5fYWxvbmdfcGF0aDIgKGZpbGVpbmZvLCBsZF9zdGF0ZS5kZWZhdWx0X3BhdGhzKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChlcnIgIT0gMCkKKyAgICAgICYmIChlcnIgIT0gRUFHQUlOIHx8IGZpbGVpbmZvLT5maWxlX3R5cGUgPT0gcmVsb2NhdGFibGVfZmlsZV90eXBlKSkKKyAgICBlcnJvciAoMCwgZXJyLCBnZXR0ZXh0ICgiY2Fubm90IG9wZW4gJXMiKSwgZmlsZWluZm8tPmZuYW1lKTsKKworICByZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkCitjaGVja190eXBlX2FuZF9zaXplIChjb25zdCBYRWxmX1N5bSAqc3ltLCBzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlaW5mbywKKwkJICAgICBzdHJ1Y3Qgc3ltYm9sICpvbGRwKQoreworICAvKiBXZSBjaGVjayB0aGUgdHlwZSBhbmQgc2l6ZSBvZiB0aGUgc3ltYm9scy4gIEluIGJvdGggY2FzZXMgdGhlCisgICAgIGluZm9ybWF0aW9uIGNhbiBiZSBtaXNzaW5nIChzaXplIGlzIHplcm8sIHR5cGUgaXMgU1RUX05PVFlQRSkgaW4KKyAgICAgd2hpY2ggY2FzZSB3ZSBpc3N1ZSBubyB3YXJuaW5ncy4gIE90aGVyd2lzZSBldmVyeXRoaW5nIG11c3QKKyAgICAgbWF0Y2guICBJZiB0aGUgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGVyZSBpcyBubyBwb2ludCBpbiBjaGVja2luZworICAgICB0aGUgc2l6ZS4gICovCisKKyAgaWYgKFhFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfTk9UWVBFICYmIG9sZHAtPnR5cGUgIT0gU1RUX05PVFlQRQorICAgICAgJiYgdW5saWtlbHkgKG9sZHAtPnR5cGUgIT0gWEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pKSkKKyAgICB7CisgICAgICBjaGFyIGJ1ZjFbNjRdOworICAgICAgY2hhciBidWYyWzY0XTsKKworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJcCitXYXJuaW5nOiB0eXBlIG9mIGAlcycgY2hhbmdlZCBmcm9tICVzIGluICVzIHRvICVzIGluICVzIiksCisJICAgICBvbGRwLT5uYW1lLAorCSAgICAgZWJsX3N5bWJvbF90eXBlX25hbWUgKGxkX3N0YXRlLmVibCwgb2xkcC0+dHlwZSwKKwkJCQkgICBidWYxLCBzaXplb2YgKGJ1ZjEpKSwKKwkgICAgIG9sZHAtPmZpbGUtPnJmbmFtZSwKKwkgICAgIGVibF9zeW1ib2xfdHlwZV9uYW1lIChsZF9zdGF0ZS5lYmwsIFhFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSwKKwkJCQkgICBidWYyLCBzaXplb2YgKGJ1ZjIpKSwKKwkgICAgIGZpbGVpbmZvLT5yZm5hbWUpOworICAgIH0KKyAgZWxzZSBpZiAoWEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9PQkpFQ1QKKwkgICAmJiBvbGRwLT5zaXplICE9IDAKKwkgICAmJiB1bmxpa2VseSAob2xkcC0+c2l6ZSAhPSBzeW0tPnN0X3NpemUpKQorICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiXAorV2FybmluZzogc2l6ZSBvZiBgJXMnIGNoYW5nZWQgZnJvbSAlIiBQUkl1NjQgIiBpbiAlcyB0byAlIiBQUkl1NjQgIiBpbiAlcyIpLAorCSAgIG9sZHAtPm5hbWUsICh1aW50NjRfdCkgb2xkcC0+c2l6ZSwgb2xkcC0+ZmlsZS0+cmZuYW1lLAorCSAgICh1aW50NjRfdCkgc3ltLT5zdF9zaXplLCBmaWxlaW5mby0+cmZuYW1lKTsKK30KKworCitzdGF0aWMgaW50CitjaGVja19kZWZpbml0aW9uIChjb25zdCBYRWxmX1N5bSAqc3ltLCBzaXplX3Qgc3ltaWR4LAorCQkgIHN0cnVjdCB1c2VkZmlsZXMgKmZpbGVpbmZvLCBzdHJ1Y3Qgc3ltYm9sICpvbGRwKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgYm9vbCBvbGRfaW5fZHNvID0gRklMRUlORk9fRUhEUiAob2xkcC0+ZmlsZS0+ZWhkcikuZV90eXBlID09IEVUX0RZTjsKKyAgYm9vbCBuZXdfaW5fZHNvID0gRklMRUlORk9fRUhEUiAoZmlsZWluZm8tPmVoZHIpLmVfdHlwZSA9PSBFVF9EWU47CisgIGJvb2wgdXNlX25ld19kZWYgPSBmYWxzZTsKKworICBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYKKyAgICAgICYmICghIG9sZHAtPmRlZmluZWQKKwkgIHx8IChzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04gJiYgb2xkcC0+Y29tbW9uICYmICEgbmV3X2luX2RzbykKKwkgIHx8IChvbGRfaW5fZHNvICYmICEgbmV3X2luX2RzbykpKQorICAgIHsKKyAgICAgIC8qIFdlIGZvdW5kIGEgZGVmaW5pdGlvbiBmb3IgYSBwcmV2aW91c2x5IHVuZGVmaW5lZCBzeW1ib2wgb3IgYQorCSByZWFsIGRlZmluaXRpb24gZm9yIGEgcHJldmlvdXMgY29tbW9uLW9ubHkgZGVmaW5pdGlvbiBvciBhCisJIHJlZGVmaW5pdGlvbiBvZiBhIHN5bWJvbCBkZWZpbml0aW9uIGluIGFuIG9iamVjdCBmaWxlCisJIHByZXZpb3VzbHkgZGVmaW5lZCBpbiBhIERTTy4gIEZpcnN0IHBlcmZvcm0gc29tZSB0ZXN0cyB3aGljaAorCSB3aWxsIHNob3cgd2hldGhlciB0aGUgY29tbW9uIGlzIHJlYWxseSBtYXRjaGluZyB0aGUKKwkgZGVmaW5pdGlvbi4gICovCisgICAgICBjaGVja190eXBlX2FuZF9zaXplIChzeW0sIGZpbGVpbmZvLCBvbGRwKTsKKworICAgICAgLyogV2UgbGVhdmUgdGhlIG5leHQgZWxlbWVudCBpbnRhY3QgdG8gbm90IGludGVycnVwdCB0aGUgbGlzdAorCSB3aXRoIHRoZSB1bnJlc29sdmVkIHN5bWJvbHMuICBXaG9ldmVyIHdhbGtzIHRoZSBsaXN0IHdpbGwKKwkgaGF2ZSB0byBjaGVjayB0aGUgYGRlZmluZWQnIGZsYWcuICBCdXQgd2UgcmVtZW1iZXIgdGhhdCB0aGlzCisJIGxpc3QgZWxlbWVudCBpcyBub3QgdW5yZXNvbHZlZCBhbnltb3JlLiAgKi8KKyAgICAgIGlmICghIG9sZHAtPmRlZmluZWQpCisJeworCSAgLyogUmVtb3ZlIGZyb20gdGhlIGxpc3QuICAqLworCSAgLS1sZF9zdGF0ZS5udW5yZXNvbHZlZDsKKwkgIGlmICghIG9sZHAtPndlYWspCisJICAgIC0tbGRfc3RhdGUubnVucmVzb2x2ZWRfbm9ud2VhazsKKwkgIENEQkxfTElTVF9ERUwgKGxkX3N0YXRlLnVucmVzb2x2ZWQsIG9sZHApOworCX0KKyAgICAgIGVsc2UgaWYgKG9sZHAtPmNvbW1vbikKKwkvKiBSZW1vdmUgZnJvbSB0aGUgbGlzdC4gICovCisJQ0RCTF9MSVNUX0RFTCAobGRfc3RhdGUuY29tbW9uX3N5bXMsIG9sZHApOworCisgICAgICAvKiBVc2UgdGhlIHZhbHVlcyBvZiB0aGUgZGVmaW5pdGlvbiBmcm9tIG5vdyBvbi4gICovCisgICAgICB1c2VfbmV3X2RlZiA9IHRydWU7CisgICAgfQorICBlbHNlIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9VTkRFRgorCSAgICYmIHVubGlrZWx5ICghIG9sZHAtPmNvbW1vbikKKwkgICAmJiBvbGRwLT5kZWZpbmVkCisJICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OCisJICAgLyogTXVsdGlwbGUgZGVmaW5pdGlvbnMgYXJlIG5vIGZhdGFsIGVycm9ycyBpZiB0aGUgLXogbXVsZGVmcyBmbGFnCisJICAgICAgaXMgdXNlZC4gIFdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIG11bHRpcGxlIGRlZmluaXRpb24gdW5sZXNzIHdlCisJICAgICAgYXJlIHRvbGQgdG8gYmUgdmVyYm9zZS4gICovCisJICAgJiYgKCFsZF9zdGF0ZS5tdWxkZWZzIHx8IHZlcmJvc2UpCisJICAgJiYgISBvbGRfaW5fZHNvICYmIGZpbGVpbmZvLT5maWxlX3R5cGUgPT0gcmVsb2NhdGFibGVfZmlsZV90eXBlKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYSBkb3VibGUgZGVmaW5pdGlvbi4gIFRoaXMgaXMgYSBwcm9ibGVtLiAgKi8KKyAgICAgIGNoYXIgYnVmWzY0XTsKKyAgICAgIFhFbGZfU3ltX3ZhcmRlZiAob2xkc3ltKTsKKyAgICAgIHN0cnVjdCB1c2VkZmlsZXMgKm9sZGZpbGU7CisgICAgICBjb25zdCBjaGFyICpzY25uYW1lOworICAgICAgRWxmMzJfV29yZCB4bmR4OworICAgICAgc2l6ZV90IHNobmR4OworICAgICAgc2l6ZV90IHNobnVtOworCisgICAgICBpZiAoZWxmX2dldHNobnVtIChmaWxlaW5mby0+ZWxmLCAmc2hudW0pIDwgMCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGRldGVybWluZSBudW1iZXIgb2Ygc2VjdGlvbnM6ICVzIiksCisJICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgICAgIC8qIFhYWCBVc2Ugb25seSBlYmxfc2VjdGlvbl9uYW1lLiAgKi8KKyAgICAgIGlmIChzeW0tPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSAvLyB8fCBzeW0tPnN0X3NobmR4ID4gU0hOX0hJUkVTRVJWRQorCSAgJiYgc3ltLT5zdF9zaG5keCA8IHNobnVtKQorCXNjbm5hbWUgPSBlbGZfc3RycHRyIChmaWxlaW5mby0+ZWxmLAorCQkJICAgICAgZmlsZWluZm8tPnNoc3RybmR4LAorCQkJICAgICAgU0NOSU5GT19TSERSIChmaWxlaW5mby0+c2NuaW5mb1tzeW0tPnN0X3NobmR4XS5zaGRyKS5zaF9uYW1lKTsKKyAgICAgIGVsc2UKKwkvLyBYWFggZXh0ZW5kZWQgc2VjdGlvbgorCXNjbm5hbWUgPSBlYmxfc2VjdGlvbl9uYW1lIChsZF9zdGF0ZS5lYmwsIHN5bS0+c3Rfc2huZHgsIDAsCisJCQkJICAgIGJ1Ziwgc2l6ZW9mIChidWYpLCBOVUxMLCBzaG51bSk7CisKKyAgICAgIC8qIFhYWCBQcmludCBzb3VyY2UgZmlsZSBhbmQgbGluZSBudW1iZXIuICAqLworICAgICAgcHJpbnRfZmlsZV9uYW1lIChzdGRlcnIsIGZpbGVpbmZvLCAxLCAwKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKwkgICAgICAgZ2V0dGV4dCAoIiglcyslIyIgUFJJeDY0ICIpOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mICVzIGAlcydcbiIpLAorCSAgICAgICBzY25uYW1lLAorCSAgICAgICAodWludDY0X3QpIHN5bS0+c3RfdmFsdWUsCisJICAgICAgIGVibF9zeW1ib2xfdHlwZV9uYW1lIChsZF9zdGF0ZS5lYmwsIFhFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSwKKwkJCQkgICAgIGJ1Ziwgc2l6ZW9mIChidWYpKSwKKwkgICAgICAgb2xkcC0+bmFtZSk7CisKKyAgICAgIG9sZGZpbGUgPSBvbGRwLT5maWxlOworICAgICAgeGVsZl9nZXRzeW1zaG5keCAob2xkZmlsZS0+c3ltdGFiZGF0YSwgb2xkZmlsZS0+eG5keGRhdGEsIG9sZHAtPnN5bWlkeCwKKwkJCW9sZHN5bSwgeG5keCk7CisgICAgICBpZiAob2xkc3ltID09IE5VTEwpCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHNpbmNlIHRoZSBzYW1lIGNhbGwKKwkgICBzdWNjZWVkZWQgYmVmb3JlLiAgKi8KKwlhYm9ydCAoKTsKKworICAgICAgc2huZHggPSBvbGRzeW0tPnN0X3NobmR4OworICAgICAgaWYgKHVubGlrZWx5IChvbGRzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgpKQorCXNobmR4ID0geG5keDsKKworICAgICAgLyogWFhYIFVzZSBvbmx5IGVibF9zZWN0aW9uX25hbWUuICAqLworICAgICAgaWYgKHNobmR4IDwgU0hOX0xPUkVTRVJWRSB8fCBzaG5keCA+IFNITl9ISVJFU0VSVkUpCisJc2NubmFtZSA9IGVsZl9zdHJwdHIgKG9sZGZpbGUtPmVsZiwKKwkJCSAgICAgIG9sZGZpbGUtPnNoc3RybmR4LAorCQkJICAgICAgU0NOSU5GT19TSERSIChvbGRmaWxlLT5zY25pbmZvW3NobmR4XS5zaGRyKS5zaF9uYW1lKTsKKyAgICAgIGVsc2UKKwlzY25uYW1lID0gZWJsX3NlY3Rpb25fbmFtZSAobGRfc3RhdGUuZWJsLCBvbGRzeW0tPnN0X3NobmR4LCBzaG5keCwgYnVmLAorCQkJCSAgICBzaXplb2YgKGJ1ZiksIE5VTEwsIHNobnVtKTsKKworICAgICAgLyogWFhYIFByaW50IHNvdXJjZSBmaWxlIGFuZCBsaW5lIG51bWJlci4gICovCisgICAgICBwcmludF9maWxlX25hbWUgKHN0ZGVyciwgb2xkZmlsZSwgMSwgMCk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIGdldHRleHQgKCIoJXMrJSMiIFBSSXg2NCAiKTogZmlyc3QgZGVmaW5lZCBoZXJlXG4iKSwKKwkgICAgICAgc2NubmFtZSwgKHVpbnQ2NF90KSBvbGRzeW0tPnN0X3ZhbHVlKTsKKworICAgICAgaWYgKGxpa2VseSAoIWxkX3N0YXRlLm11bGRlZnMpKQorCXJlc3VsdCA9IDE7CisgICAgfQorICBlbHNlIGlmIChvbGRfaW5fZHNvICYmIGZpbGVpbmZvLT5maWxlX3R5cGUgPT0gcmVsb2NhdGFibGVfZmlsZV90eXBlCisJICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpCisgICAgLyogV2UgdXNlIHRoZSBkZWZpbml0aW9uIGZyb20gYSBub3JtYWwgcmVsb2NhdGFibGUgZmlsZSBvdmVyIHRoZQorICAgICAgIGRlZmluaXRpb24gaW4gYSBEU08uICBUaGlzIGlzIHdoYXQgdGhlIGR5bmFtaWMgbGlua2VyIHdvdWxkCisgICAgICAgZG8sIHRvby4gICovCisgICAgdXNlX25ld19kZWYgPSB0cnVlOworICBlbHNlIGlmIChvbGRfaW5fZHNvICYmICFuZXdfaW5fZHNvICYmIG9sZHAtPmRlZmluZWQgJiYgIW9sZHAtPm9uX2Rzb2xpc3QpCisgICAgeworICAgICAgQ0RCTF9MSVNUX0FERF9SRUFSIChsZF9zdGF0ZS5mcm9tX2Rzbywgb2xkcCk7CisgICAgICArK2xkX3N0YXRlLm5mcm9tX2RzbzsKKworICAgICAgLyogSWYgdGhlIG9iamVjdCBpcyBhIGZ1bmN0aW9uIHdlIGFsbG9jYXRlIGEgUExUIGVudHJ5LAorCSBvdGhlcndpc2Ugb25seSBhIEdPVCBlbnRyeS4gICovCisgICAgICBpZiAob2xkcC0+dHlwZSA9PSBTVFRfRlVOQykKKwkrK2xkX3N0YXRlLm5wbHQ7CisgICAgICBlbHNlCisJKytsZF9zdGF0ZS5uZ290OworCisgICAgICBvbGRwLT5vbl9kc29saXN0ID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKG9sZHAtPmNvbW1vbiAmJiBzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04pCisgICAgeworICAgICAgLyogVGhlIHN5bWJvbCBzaXplIGlzIHRoZSBsYXJnZXN0IG9mIGFsbCBjb21tb24gZGVmaW5pdGlvbnMuICAqLworICAgICAgb2xkcC0+c2l6ZSA9IE1BWCAob2xkcC0+c2l6ZSwgc3ltLT5zdF9zaXplKTsKKyAgICAgIC8qIFNpbWlsYXJseSBmb3IgdGhlIGFsaWdubWVudC4gICovCisgICAgICBvbGRwLT5tZXJnZS52YWx1ZSA9IE1BWCAob2xkcC0+bWVyZ2UudmFsdWUsIHN5bS0+c3RfdmFsdWUpOworICAgIH0KKworICBpZiAodW5saWtlbHkgKHVzZV9uZXdfZGVmKSkKKyAgICB7CisgICAgICAvKiBBZGp1c3QgdGhlIHN5bWJvbCByZWNvcmQgYXBwcm9wcmlhdGVseSBhbmQgcmVtb3ZlCisJIHRoZSBzeW1ib2wgZnJvbSB0aGUgbGlzdCBvZiBzeW1ib2xzIHdoaWNoIGFyZSB0YWtlbiBmcm9tIERTT3MuICAqLworICAgICAgaWYgKG9sZF9pbl9kc28gJiYgZmlsZWluZm8tPmZpbGVfdHlwZSA9PSByZWxvY2F0YWJsZV9maWxlX3R5cGUpCisJeworCSAgQ0RCTF9MSVNUX0RFTCAobGRfc3RhdGUuZnJvbV9kc28sIG9sZHApOworCSAgLS1sZF9zdGF0ZS5uZnJvbV9kc287CisKKwkgIGlmIChsaWtlbHkgKG9sZHAtPnR5cGUgPT0gU1RUX0ZVTkMpKQorCSAgICAtLWxkX3N0YXRlLm5wbHQ7CisJICBlbHNlCisJICAgIC0tbGRfc3RhdGUubmdvdDsKKworCSAgb2xkcC0+b25fZHNvbGlzdCA9IDA7CisJfQorCisgICAgICAvKiBVc2UgdGhlIHZhbHVlcyBvZiB0aGUgZGVmaW5pdGlvbiBmcm9tIG5vdyBvbi4gICovCisgICAgICBvbGRwLT5zaXplID0gc3ltLT5zdF9zaXplOworICAgICAgb2xkcC0+dHlwZSA9IFhFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKTsKKyAgICAgIG9sZHAtPnN5bWlkeCA9IHN5bWlkeDsKKyAgICAgIG9sZHAtPnNjbmR4ID0gc3ltLT5zdF9zaG5keDsKKyAgICAgIC8vb2xkcC0+c3ltc2NuZHggPSBUSEVTWU1TQ05EWCBtdXN0IGJlIHBhc3NlZDsKKyAgICAgIG9sZHAtPmZpbGUgPSBmaWxlaW5mbzsKKyAgICAgIG9sZHAtPmRlZmluZWQgPSAxOworICAgICAgb2xkcC0+aW5fZHNvID0gbmV3X2luX2RzbzsKKyAgICAgIG9sZHAtPmNvbW1vbiA9IHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTjsKKyAgICAgIGlmIChsaWtlbHkgKGZpbGVpbmZvLT5maWxlX3R5cGUgPT0gcmVsb2NhdGFibGVfZmlsZV90eXBlKSkKKwl7CisJICAvKiBJZiB0aGUgZGVmaW5pdGlvbiBjb21lcyBmcm9tIGEgRFNPIHdlIHBlcnRhaW4gdGhlIHdlYWsgZmxhZworCSAgICAgYW5kIGl0J3MgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgd2VhayBvciBub3QuICAqLworCSAgb2xkcC0+d2VhayA9IFhFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfV0VBSzsKKworCSAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikKKwkgICAgeworCSAgICAgIHN0cnVjdCBzY25pbmZvICppZ25vcmU7CisJICAgICAgbWFya19zZWN0aW9uX3VzZWQgKCZmaWxlaW5mby0+c2NuaW5mb1tzeW0tPnN0X3NobmR4XSwKKwkJCQkgc3ltLT5zdF9zaG5keCwgJmlnbm9yZSk7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIEFkZCB0byB0aGUgbGlzdCBvZiBzeW1ib2xzIHVzZWQgZnJvbSBEU09zIGlmIG5lY2Vzc2FyeS4gICovCisgICAgICBpZiAobmV3X2luX2RzbyAmJiAhb2xkX2luX2RzbykKKwl7CisJICBDREJMX0xJU1RfQUREX1JFQVIgKGxkX3N0YXRlLmZyb21fZHNvLCBvbGRwKTsKKwkgICsrbGRfc3RhdGUubmZyb21fZHNvOworCisJICAvKiBJZiB0aGUgb2JqZWN0IGlzIGEgZnVuY3Rpb24gd2UgYWxsb2NhdGUgYSBQTFQgZW50cnksCisJICAgICBvdGhlcndpc2Ugb25seSBhIEdPVCBlbnRyeS4gICovCisJICBpZiAob2xkcC0+dHlwZSA9PSBTVFRfRlVOQykKKwkgICAgKytsZF9zdGF0ZS5ucGx0OworCSAgZWxzZQorCSAgICArK2xkX3N0YXRlLm5nb3Q7CisKKwkgIG9sZHAtPm9uX2Rzb2xpc3QgPSAxOworCX0KKyAgICAgIGVsc2UgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKKwl7CisJICAvKiBTdG9yZSB0aGUgYWxpZ25tZW50LiAgKi8KKwkgIG9sZHAtPm1lcmdlLnZhbHVlID0gc3ltLT5zdF92YWx1ZTsKKworCSAgQ0RCTF9MSVNUX0FERF9SRUFSIChsZF9zdGF0ZS5jb21tb25fc3ltcywgb2xkcCk7CisJfQorICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2NuaW5mbyAqCitmaW5kX3NlY3Rpb25fZ3JvdXAgKHN0cnVjdCB1c2VkZmlsZXMgKmZpbGVpbmZvLCBFbGYzMl9Xb3JkIHNobmR4LAorCQkgICAgRWxmX0RhdGEgKipkYXRhcCkKK3sKKyAgc3RydWN0IHNjbmluZm8gKnJ1bnA7CisKKyAgZm9yIChydW5wID0gZmlsZWluZm8tPmdyb3VwczsgcnVucCAhPSBOVUxMOyBydW5wID0gcnVucC0+bmV4dCkKKyAgICBpZiAoIXJ1bnAtPnVzZWQpCisgICAgICB7CisJRWxmMzJfV29yZCAqZ3JwcmVmOworCXNpemVfdCBjbnQ7CisJRWxmX0RhdGEgKmRhdGE7CisKKwlkYXRhID0gZWxmX2dldGRhdGEgKHJ1bnAtPnNjbiwgTlVMTCk7CisJaWYgKGRhdGEgPT0gTlVMTCkKKwkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJCSBnZXR0ZXh0ICgiJXM6IGNhbm5vdCBnZXQgc2VjdGlvbiBncm91cCBkYXRhOiAlcyIpLAorCQkgZmlsZWluZm8tPmZuYW1lLCBlbGZfZXJybXNnICgtMSkpOworCisJLyogVGhlcmUgY2Fubm90IGJlIGFub3RoZXIgZGF0YSBibG9jay4gICovCisJYXNzZXJ0IChlbGZfZ2V0ZGF0YSAocnVucC0+c2NuLCBkYXRhKSA9PSBOVUxMKTsKKworCWdycHJlZiA9IChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmOworCWNudCA9IGRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoRWxmMzJfV29yZCk7CisJLyogTm90ZSB0aGF0IHdlIHN0b3AgYWZ0ZXIgbG9va2luZyBhdCBpbmRleCAxIHNpbmNlIGluZGV4IDAKKwkgICBjb250YWlucyB0aGUgZmxhZ3MgZm9yIHRoZSBzZWN0aW9uIGdyb3VwLiAgKi8KKwl3aGlsZSAoY250ID4gMSkKKwkgIGlmIChncnByZWZbLS1jbnRdID09IHNobmR4KQorCSAgICB7CisJICAgICAgKmRhdGFwID0gZGF0YTsKKwkgICAgICByZXR1cm4gcnVucDsKKwkgICAgfQorICAgICAgfQorCisgIC8qIElmIHdlIGNvbWUgaGVyZSBubyBzZWN0aW9uIGdyb3VwIGNvbnRhaW5lZCB0aGUgZ2l2ZW4gc2VjdGlvbgorICAgICBkZXNwaXRlIHRoZSBTSEZfR1JPVVAgZmxhZy4gIFRoaXMgaXMgYW4gZXJyb3IgaW4gdGhlIGlucHV0CisgICAgIGZpbGUuICAqLworICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiXAorJXM6IHNlY3Rpb24gJyVzJyB3aXRoIGdyb3VwIGZsYWcgc2V0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgZ3JvdXAiKSwKKwkgZmlsZWluZm8tPmZuYW1lLAorCSBlbGZfc3RycHRyIChmaWxlaW5mby0+ZWxmLCBmaWxlaW5mby0+c2hzdHJuZHgsCisJCSAgICAgU0NOSU5GT19TSERSIChmaWxlaW5mby0+c2NuaW5mb1tzaG5keF0uc2hkcikuc2hfbmFtZSkpOworICByZXR1cm4gTlVMTDsKK30KKworCisvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBiZWxvbmcgdG8gdGhlIHNhbWUgZ3JvdXAgYXMgc2VjdGlvbiBTSE5EWAorICAgYXMgdXNlZC4gICovCitzdGF0aWMgdm9pZAorbWFya19zZWN0aW9uX2dyb3VwIChzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlaW5mbywgRWxmMzJfV29yZCBzaG5keCwKKwkJICAgIHN0cnVjdCBzY25pbmZvICoqZ3Jwc2NucCkKK3sKKyAgLyogRmlyc3QgbG9jYXRlIHRoZSBzZWN0aW9uIGdyb3VwLiAgVGhlcmUgY2FuIGJlIHNldmVyYWwgKG1hbnkpIG9mCisgICAgIHRoZW0uICAqLworICBzaXplX3QgY250OworICBFbGYzMl9Xb3JkICpncnByZWY7CisgIEVsZl9EYXRhICpkYXRhOworICBzdHJ1Y3Qgc2NuaW5mbyAqZ3Jwc2NuID0gZmluZF9zZWN0aW9uX2dyb3VwIChmaWxlaW5mbywgc2huZHgsICZkYXRhKTsKKyAgKmdycHNjbnAgPSBncnBzY247CisKKyAgLyogTWFyayBhbGwgdGhlIHNlY3Rpb25zIGFzIHVzZWQuCisKKyAgICAgWFhYIFR3byBwb3NzaWJsZSBwcm9ibGVtcyBoZXJlOgorCisgICAgIC0gdGhlIGdBQkkgc2F5cyAiVGhlIHNlY3Rpb24gbXVzdCBiZSByZWZlcmVuY2VkIGJ5IGEgc2VjdGlvbiBvZiB0eXBlCisgICAgICAgU0hUX0dST1VQIi4gIEkgaG9wZSBldmVyeWJvZHkgcmVhZHMgdGhpcyBhcyAiZXhhY3RseSBvbmUgc2VjdGlvbiIuCisKKyAgICAgLSBzZWN0aW9uIGdyb3VwcyBhcmUgYWxzbyB1c2VmdWwgdG8gbWFyayB0aGUgZGVidWdnaW5nIHNlY3Rpb24gd2hpY2gKKyAgICAgICBiZWxvbmdzIHRvIGEgdGV4dCBzZWN0aW9uLiAgVW5jb25kaXRpb25hbGx5IGFkZGluZyBkZWJ1Z2dpbmcgc2VjdGlvbnMKKyAgICAgICBpcyB0aGVyZWZvcmUgcHJvYmFibHkgbm90IHdoYXQgaXMgd2FudGVkIGlmIHN0cmlwcGluZyBpcyByZXF1aXJlZC4gICovCisKKyAgLyogTWFyayB0aGUgc2VjdGlvbiBncm91cCBhcyBoYW5kbGVkLiAgKi8KKyAgZ3Jwc2NuLT51c2VkID0gdHJ1ZTsKKworICBncnByZWYgPSAoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZjsKKyAgY250ID0gZGF0YS0+ZF9zaXplIC8gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKKyAgd2hpbGUgKGNudCA+IDEpCisgICAgeworICAgICAgRWxmMzJfV29yZCBpZHggPSBncnByZWZbLS1jbnRdOworICAgICAgWEVsZl9TaGRyICpzaGRyID0gJlNDTklORk9fU0hEUiAoZmlsZWluZm8tPnNjbmluZm9baWR4XS5zaGRyKTsKKworICAgICAgaWYgKGZpbGVpbmZvLT5zY25pbmZvW2lkeF0uZ3JwaWQgIT0gMCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiXAorJXM6IHNlY3Rpb24gWyUyZF0gJyVzJyBpcyBpbiBtb3JlIHRoYW4gb25lIHNlY3Rpb24gZ3JvdXAiKSwKKwkgICAgICAgZmlsZWluZm8tPmZuYW1lLCAoaW50KSBpZHgsCisJICAgICAgIGVsZl9zdHJwdHIgKGZpbGVpbmZvLT5lbGYsIGZpbGVpbmZvLT5zaHN0cm5keCwgc2hkci0+c2hfbmFtZSkpOworCisgICAgICBmaWxlaW5mby0+c2NuaW5mb1tpZHhdLmdycGlkID0gZ3Jwc2NuLT5ncnBpZDsKKworICAgICAgaWYgKGxkX3N0YXRlLnN0cmlwID09IHN0cmlwX25vbmUKKwkgIC8qIElmIHdlIGFyZSBzdHJpcHBpbmcsIHJlbW92ZSBkZWJ1ZyBzZWN0aW9ucy4gICovCisJICB8fCAoIWVibF9kZWJ1Z3Njbl9wIChsZF9zdGF0ZS5lYmwsCisJCQkgICAgICAgZWxmX3N0cnB0ciAoZmlsZWluZm8tPmVsZiwgZmlsZWluZm8tPnNoc3RybmR4LAorCQkJCQkgICBzaGRyLT5zaF9uYW1lKSkKKwkgICAgICAvKiBBbmQgdGhlIHJlbG9jYXRpb24gc2VjdGlvbnMgZm9yIHRoZSBkZWJ1ZyBzZWN0aW9ucy4gICovCisJICAgICAgJiYgKChzaGRyLT5zaF90eXBlICE9IFNIVF9SRUxBICYmIHNoZHItPnNoX3R5cGUgIT0gU0hUX1JFTCkKKwkJICB8fCAhZWJsX2RlYnVnc2NuX3AgKGxkX3N0YXRlLmVibCwKKwkJCQkgICAgICBlbGZfc3RycHRyIChmaWxlaW5mby0+ZWxmLAorCQkJCQkJICBmaWxlaW5mby0+c2hzdHJuZHgsCisJCQkJCQkgIFNDTklORk9fU0hEUiAoZmlsZWluZm8tPnNjbmluZm9bc2hkci0+c2hfaW5mb10uc2hkcikuc2hfbmFtZSkpKSkpCisJeworCSAgc3RydWN0IHNjbmluZm8gKmlnbm9yZTsKKworCSAgbWFya19zZWN0aW9uX3VzZWQgKCZmaWxlaW5mby0+c2NuaW5mb1tpZHhdLCBpZHgsICZpZ25vcmUpOworCX0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK21hcmtfc2VjdGlvbl91c2VkIChzdHJ1Y3Qgc2NuaW5mbyAqc2NuaW5mbywgRWxmMzJfV29yZCBzaG5keCwKKwkJICAgc3RydWN0IHNjbmluZm8gKipncnBzY25wKQoreworICBpZiAobGlrZWx5IChzY25pbmZvLT51c2VkKSkKKyAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUuICAqLworICAgIHJldHVybjsKKworICAvKiBXZSBuZWVkIHRoaXMgc2VjdGlvbi4gICovCisgIHNjbmluZm8tPnVzZWQgPSB0cnVlOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiBoZWFkZXIgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBmaWxlLiAgKi8KKyAgWEVsZl9TaGRyICpzaGRyID0gJlNDTklORk9fU0hEUiAoc2NuaW5mby0+c2hkcik7CisjaWYgTkFUSVZFX0VMRgorICBpZiAodW5saWtlbHkgKHNjbmluZm8tPnNoZHIgPT0gTlVMTCkpCisjZWxzZQorICBpZiAodW5saWtlbHkgKHNjbmluZm8tPnNoZHIuc2hfdHlwZSA9PSBTSFRfTlVMTCkpCisjZW5kaWYKKyAgICB7CisjaWYgTkFUSVZFX0VMRiAhPSAwCisgICAgICBzaGRyID0geGVsZl9nZXRzaGRyIChzY25pbmZvLT5zY24sIHNjbmluZm8tPnNoZHIpOworI2Vsc2UKKyAgICAgIHhlbGZfZ2V0c2hkcl9jb3B5IChzY25pbmZvLT5zY24sIHNoZHIsIHNjbmluZm8tPnNoZHIpOworI2VuZGlmCisgICAgICBpZiAodW5saWtlbHkgKHNoZHIgPT0gTlVMTCkpCisJLyogU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICBUaGUgY2FsbGluZyBjb2RlIHdpbGwgbm90aWNlIGl0CisJICAgc29vbiBhbmQgcHJpbnQgYSBtZXNzYWdlLiAgKi8KKwlyZXR1cm47CisgICAgfQorCisgIC8qIEhhbmRsZSBzZWN0aW9uIGxpbmtlZCBieSAnc2hfbGluaycuICAqLworICBpZiAodW5saWtlbHkgKHNoZHItPnNoX2xpbmsgIT0gMCkpCisgICAgeworICAgICAgc3RydWN0IHNjbmluZm8gKmlnbm9yZTsKKyAgICAgIG1hcmtfc2VjdGlvbl91c2VkICgmc2NuaW5mby0+ZmlsZWluZm8tPnNjbmluZm9bc2hkci0+c2hfbGlua10sCisJCQkgc2hkci0+c2hfbGluaywgJmlnbm9yZSk7CisgICAgfQorCisgIC8qIEhhbmRsZSBzZWN0aW9uIGxpbmtlZCBieSAnc2hfaW5mbycuICAqLworICBpZiAodW5saWtlbHkgKHNoZHItPnNoX2luZm8gIT0gMCkgJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0lORk9fTElOSykpCisgICAgeworICAgICAgc3RydWN0IHNjbmluZm8gKmlnbm9yZTsKKyAgICAgIG1hcmtfc2VjdGlvbl91c2VkICgmc2NuaW5mby0+ZmlsZWluZm8tPnNjbmluZm9bc2hkci0+c2hfaW5mb10sCisJCQkgc2hkci0+c2hfaW5mbywgJmlnbm9yZSk7CisgICAgfQorCisgIGlmICh1bmxpa2VseSAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfR1JPVVApICYmIGxkX3N0YXRlLmdjX3NlY3Rpb25zKQorICAgIC8qIEZpbmQgdGhlIHNlY3Rpb24gZ3JvdXAgd2hpY2ggY29udGFpbnMgdGhpcyBzZWN0aW9uLiAgKi8KKyAgICBtYXJrX3NlY3Rpb25fZ3JvdXAgKHNjbmluZm8tPmZpbGVpbmZvLCBzaG5keCwgZ3Jwc2NucCk7Cit9CisKKworLyogV2UgY29sbGVjdCBhbGwgc2VjdGlvbnMgaW4gYSBoYXNoaW5nIHRhYmxlLiAgQWxsIHNlY3Rpb25zIHdpdGggdGhlCisgICBzYW1lIG5hbWUgYXJlIGNvbGxlY3RlZCBpbiBhIGxpc3QuICBOb3RlIHRoYXQgd2UgZG8gbm90IGRldGVybWluZQorICAgd2hpY2ggc2VjdGlvbnMgYXJlIGZpbmFsbHkgY29sbGVjdGVkIGluIHRoZSBzYW1lIG91dHB1dCBzZWN0aW9uCisgICBoZXJlLiAgVGhpcyB3b3VsZCBiZSB0ZXJyaWJseSBpbmVmZmljaWVudC4gIEl0IHdpbGwgYmUgZG9uZSBsYXRlci4gICovCitzdGF0aWMgdm9pZAorYWRkX3NlY3Rpb24gKHN0cnVjdCB1c2VkZmlsZXMgKmZpbGVpbmZvLCBzdHJ1Y3Qgc2NuaW5mbyAqc2NuaW5mbykKK3sKKyAgc3RydWN0IHNjbmhlYWQgKnF1ZXVlZDsKKyAgc3RydWN0IHNjbmhlYWQgc2VhcmNoOworICB1bnNpZ25lZCBsb25nIGludCBodmFsOworICBYRWxmX1NoZHIgKnNoZHIgPSAmU0NOSU5GT19TSERSIChzY25pbmZvLT5zaGRyKTsKKyAgc3RydWN0IHNjbmluZm8gKmdycHNjbiA9IE5VTEw7CisgIEVsZl9EYXRhICpncnBzY25kYXRhID0gTlVMTDsKKworICAvKiBTZWUgd2hldGhlciB3ZSBjYW4gZGV0ZXJtaW5lIHJpZ2h0IGF3YXkgd2hldGhlciB3ZSBuZWVkIHRoaXMKKyAgICAgc2VjdGlvbiBpbiB0aGUgb3V0cHV0LgorCisgICAgIFhYWCBJIGFzc3VtZSBoZXJlIHRoYXQgLS1nYy1zZWN0aW9ucyBvbmx5IGFmZmVjdHMgZXh0cmFjdGlvbgorICAgICBmcm9tIGFuIGFyY2hpdmUuICBJZiBpdCBhbHNvIGFmZmVjdHMgb2JqZWN0cyBmaWxlcyBnaXZlbiBvbgorICAgICB0aGUgY29tbWFuZCBsaW5lIHRoZW4gc29tZWJvZHkgbXVzdCBleHBsYWluIHRvIG1lIGhvdyB0aGUKKyAgICAgZGVwZW5kZW5jeSBhbmFseXNpcyBzaG91bGQgd29yay4gIFNob3VsZCB0aGUgZW50cnkgcG9pbnQgYmUKKyAgICAgdGhlIHJvb3Q/ICBXaGF0IGlmIGl0IGlzIGEgbnVtZXJpYyB2YWx1ZT8gICovCisgIGlmICghc2NuaW5mby0+dXNlZAorICAgICAgJiYgKGxkX3N0YXRlLnN0cmlwID09IHN0cmlwX25vbmUKKwkgIHx8IChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMAorCSAgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9URQorCSAgfHwgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTCisJICAgICAgJiYgc3RyY21wIChlbGZfc3RycHRyIChmaWxlaW5mby0+ZWxmLAorCQkJCSAgICAgZmlsZWluZm8tPnNoc3RybmR4LAorCQkJCSAgICAgc2hkci0+c2hfbmFtZSksICIuY29tbWVudCIpID09IDApKQorICAgICAgJiYgKGZpbGVpbmZvLT5zdGF0dXMgIT0gaW5fYXJjaGl2ZSB8fCAhbGRfc3RhdGUuZ2Nfc2VjdGlvbnMpKQorICAgIC8qIE1hcmsgYXMgdXNlZCBhbmQgaGFuZGxlIHJlZmVyZW5jZSByZWN1cnNpdmVseSBpZiBuZWNlc3NhcnkuICAqLworICAgIG1hcmtfc2VjdGlvbl91c2VkIChzY25pbmZvLCBlbGZfbmR4c2NuIChzY25pbmZvLT5zY24pLCAmZ3Jwc2NuKTsKKworICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0dST1VQKSAmJiBncnBzY24gPT0gTlVMTCkKKyAgICAvKiBEZXRlcm1pbmUgdGhlIHN5bWJvbCB3aGljaCBuYW1lIGNvbnN0aXR1dGVzIHRoZSBzaWduYXR1cmUKKyAgICAgICBmb3IgdGhlIHNlY3Rpb24gZ3JvdXAuICAqLworICAgIGdycHNjbiA9IGZpbmRfc2VjdGlvbl9ncm91cCAoZmlsZWluZm8sIGVsZl9uZHhzY24gKHNjbmluZm8tPnNjbiksCisJCQkJICZncnBzY25kYXRhKTsKKyAgYXNzZXJ0IChncnBzY24gPT0gTlVMTCB8fCBncnBzY24tPnN5bWJvbHMtPm5hbWUgIT0gTlVMTCk7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBzZWN0aW9uIG5hbWUuICAqLworICBzZWFyY2gubmFtZSA9IGVsZl9zdHJwdHIgKGZpbGVpbmZvLT5lbGYsIGZpbGVpbmZvLT5zaHN0cm5keCwgc2hkci0+c2hfbmFtZSk7CisgIHNlYXJjaC50eXBlID0gc2hkci0+c2hfdHlwZTsKKyAgc2VhcmNoLmZsYWdzID0gc2hkci0+c2hfZmxhZ3M7CisgIHNlYXJjaC5lbnRzaXplID0gc2hkci0+c2hfZW50c2l6ZTsKKyAgc2VhcmNoLmdycF9zaWduYXR1cmUgPSBncnBzY24gIT0gTlVMTCA/IGdycHNjbi0+c3ltYm9scy0+bmFtZSA6IE5VTEw7CisgIHNlYXJjaC5raW5kID0gc2NuX25vcm1hbDsKKyAgaHZhbCA9IGVsZl9oYXNoIChzZWFyY2gubmFtZSk7CisKKyAgLyogRmluZCBhbHJlYWR5IHF1ZXVlZCBzZWN0aW9ucy4gICovCisgIHF1ZXVlZCA9IGxkX3NlY3Rpb25fdGFiX2ZpbmQgKCZsZF9zdGF0ZS5zZWN0aW9uX3RhYiwgaHZhbCwgJnNlYXJjaCk7CisgIGlmIChxdWV1ZWQgIT0gTlVMTCkKKyAgICB7CisgICAgICBib29sIGlzX2NvbWRhdCA9IGZhbHNlOworCisgICAgICAvKiBJZiB0aGlzIHNlY3Rpb24gaXMgcGFydCBvZiBhIENPTURBVCBzZWN0aW9uIGdyb3VwIHdlIHNpbXBseQorCSBpZ25vcmUgaXQgc2luY2Ugd2UgYWxyZWFkeSBoYXZlIGEgY29weS4gICovCisgICAgICBpZiAodW5saWtlbHkgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0dST1VQKSkKKwl7CisJICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24gZ3JvdXAgc2VjdGlvbi4gICovCisJICBpZiAoZ3Jwc2NuZGF0YSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZ3Jwc2NuZGF0YSA9IGVsZl9nZXRkYXRhIChncnBzY24tPnNjbiwgTlVMTCk7CisJICAgICAgYXNzZXJ0IChncnBzY25kYXRhICE9IE5VTEwpOworCSAgICB9CisKKwkgIC8qIFhYWCBQb3NzaWJseSB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzcy4gICovCisJICBpc19jb21kYXQgPSAoKEVsZjMyX1dvcmQgKikgZ3Jwc2NuZGF0YS0+ZF9idWYpWzBdICYgR1JQX0NPTURBVDsKKwl9CisKKyAgICAgIGlmICghaXNfY29tZGF0KQorCXsKKwkgIC8qIE5vIENPTURBVCBzZWN0aW9uLCB3ZSB1c2UgdGhlIGRhdGEuICAqLworCSAgc2NuaW5mby0+bmV4dCA9IHF1ZXVlZC0+bGFzdC0+bmV4dDsKKwkgIHF1ZXVlZC0+bGFzdCA9IHF1ZXVlZC0+bGFzdC0+bmV4dCA9IHNjbmluZm87CisKKwkgIHF1ZXVlZC0+ZmxhZ3MgPSBTSF9GTEFHU19DT01CSU5FIChxdWV1ZWQtPmZsYWdzLCBzaGRyLT5zaF9mbGFncyk7CisJICBxdWV1ZWQtPmFsaWduID0gTUFYIChxdWV1ZWQtPmFsaWduLCBzaGRyLT5zaF9hZGRyYWxpZ24pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBkbyBub3QgdXNlIG9ic3RhY2tzIGhlcmUgc2luY2UgdGhlIG1lbW9yeSBtaWdodCBiZQorCSBkZWFsbG9jYXRlZC4gICovCisgICAgICBxdWV1ZWQgPSAoc3RydWN0IHNjbmhlYWQgKikgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2NuaGVhZCksIDEpOworICAgICAgcXVldWVkLT5raW5kID0gc2NuX25vcm1hbDsKKyAgICAgIHF1ZXVlZC0+bmFtZSA9IHNlYXJjaC5uYW1lOworICAgICAgcXVldWVkLT50eXBlID0gc2hkci0+c2hfdHlwZTsKKyAgICAgIHF1ZXVlZC0+ZmxhZ3MgPSBzaGRyLT5zaF9mbGFnczsKKyAgICAgIHF1ZXVlZC0+YWxpZ24gPSBzaGRyLT5zaF9hZGRyYWxpZ247CisgICAgICBxdWV1ZWQtPmVudHNpemUgPSBzaGRyLT5zaF9lbnRzaXplOworICAgICAgcXVldWVkLT5ncnBfc2lnbmF0dXJlID0gZ3Jwc2NuICE9IE5VTEwgPyBncnBzY24tPnN5bWJvbHMtPm5hbWUgOiBOVUxMOworICAgICAgcXVldWVkLT5zZWdtZW50X25yID0gfjA7CisgICAgICBxdWV1ZWQtPmxhc3QgPSBzY25pbmZvLT5uZXh0ID0gc2NuaW5mbzsKKworICAgICAgLyogQWRkIHRvIHRoZSBoYXNoIHRhYmxlIGFuZCBwb3NzaWJseSBvdmVyd3JpdGUgZXhpc3RpbmcgdmFsdWUuICAqLworICAgICAgbGRfc2VjdGlvbl90YWJfaW5zZXJ0ICgmbGRfc3RhdGUuc2VjdGlvbl90YWIsIGh2YWwsIHF1ZXVlZCk7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQKK2FkZF9yZWxvY2F0YWJsZV9maWxlIChzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlaW5mbywgR0VsZl9Xb3JkIHNlY3R0eXBlKQoreworICBzaXplX3Qgc2NuY250OworICBzaXplX3QgY250OworICBFbGZfRGF0YSAqc3ltdGFiZGF0YSA9IE5VTEw7CisgIEVsZl9EYXRhICp4bmR4ZGF0YSA9IE5VTEw7CisgIEVsZl9EYXRhICp2ZXJzeW1kYXRhID0gTlVMTDsKKyAgRWxmX0RhdGEgKnZlcmRlZmRhdGEgPSBOVUxMOworICBFbGZfRGF0YSAqdmVybmVlZGRhdGEgPSBOVUxMOworICBzaXplX3Qgc3ltc3RyaWR4ID0gMDsKKyAgc2l6ZV90IG5zeW1ib2xzID0gMDsKKyAgc2l6ZV90IG5sb2NhbHN5bWJvbHMgPSAwOworICBib29sIGhhc19tZXJnZV9zZWN0aW9ucyA9IGZhbHNlOworCisgIC8qIFByZXJlcXVpc2l0ZXMuICAqLworICBhc3NlcnQgKGZpbGVpbmZvLT5lbGYgIT0gTlVMTCk7CisKKyAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbnMuICAqLworICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaG51bSAoZmlsZWluZm8tPmVsZiwgJnNjbmNudCkgPCAwKSkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBzZWN0aW9uczogJXMiKSwKKwkgICBlbGZfZXJybXNnICgtMSkpOworCisgIGZpbGVpbmZvLT5zY25pbmZvID0gKHN0cnVjdCBzY25pbmZvICopCisgICAgb2JzdGFja19jYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBzY25jbnQgKiBzaXplb2YgKHN0cnVjdCBzY25pbmZvKSk7CisKKyAgLyogUmVhZCBhbGwgdGhlIHNlY3Rpb24gaGVhZGVycyBhbmQgZmluZCB0aGUgc3ltYm9sIHRhYmxlLiAgTm90ZQorICAgICB0aGF0IHdlIGRvbid0IHNraXAgdGhlIHNlY3Rpb24gd2l0aCBpbmRleCB6ZXJvLiAgRXZlbiB0aG91Z2ggdGhlCisgICAgIHNlY3Rpb24gaXRzZWxmIGlzIGFsd2F5cyBlbXB0eSB0aGUgc2VjdGlvbiBoZWFkZXIgY29udGFpbnMKKyAgICAgaW5mb3JtYXRvbiBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgc2VjdGlvbiBpbmRleCBmb3IgdGhlIHNlY3Rpb24KKyAgICAgaGVhZGVyIHN0cmluZyB0YWJsZSBpcyB0b28gbGFyZ2UgdG8gZml0IGluIHRoZSBFTEYgaGVhZGVyLiAgKi8KKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBzY25jbnQ7ICsrY250KQorICAgIHsKKyAgICAgIC8qIFN0b3JlIHRoZSBoYW5kbGUgZm9yIHRoZSBzZWN0aW9uLiAgKi8KKyAgICAgIGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc2NuID0gZWxmX2dldHNjbiAoZmlsZWluZm8tPmVsZiwgY250KTsKKworICAgICAgLyogR2V0IHRoZSBFTEYgc2VjdGlvbiBoZWFkZXIgYW5kIGRhdGEuICAqLworICAgICAgWEVsZl9TaGRyICpzaGRyOworI2lmIE5BVElWRV9FTEYgIT0gMAorICAgICAgaWYgKGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc2hkciA9PSBOVUxMKQorI2Vsc2UKKyAgICAgIGlmIChmaWxlaW5mby0+c2NuaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfTlVMTCkKKyNlbmRpZgorCXsKKyNpZiBOQVRJVkVfRUxGICE9IDAKKwkgIHNoZHIgPSB4ZWxmX2dldHNoZHIgKGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc2NuLAorCQkJICAgICAgIGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc2hkcik7CisjZWxzZQorCSAgeGVsZl9nZXRzaGRyX2NvcHkgKGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc2NuLCBzaGRyLAorCQkJICAgICBmaWxlaW5mby0+c2NuaW5mb1tjbnRdLnNoZHIpOworI2VuZGlmCisJICBpZiAoc2hkciA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgKi8KKwkgICAgICBmcHJpbnRmIChzdGRlcnIsIGdldHRleHQgKCIlczogaW52YWxpZCBFTEYgZmlsZSAoJXM6JWQpXG4iKSwKKwkJICAgICAgIGZpbGVpbmZvLT5yZm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJc2hkciA9ICZTQ05JTkZPX1NIRFIgKGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc2hkcik7CisKKyAgICAgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc2NuLCBOVUxMKTsKKworICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGlzIHNlY3Rpb24gaXMgbWFya2VkIGFzIG1lcmdlLWFibGUuICAqLworICAgICAgaGFzX21lcmdlX3NlY3Rpb25zIHw9IChzaGRyLT5zaF9mbGFncyAmIFNIRl9NRVJHRSkgIT0gMDsKKworICAgICAgLyogR2V0IHRoZSBFTEYgc2VjdGlvbiBoZWFkZXIgYW5kIGRhdGEuICAqLworICAgICAgLyogTWFrZSB0aGUgZmlsZSBzdHJ1Y3R1cmUgYXZhaWxhYmxlLiAgKi8KKyAgICAgIGZpbGVpbmZvLT5zY25pbmZvW2NudF0uZmlsZWluZm8gPSBmaWxlaW5mbzsKKworICAgICAgaWYgKHVubGlrZWx5IChzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUIpCisJICB8fCB1bmxpa2VseSAoc2hkci0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKSkKKwl7CisJICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCKQorCSAgICB7CisJICAgICAgYXNzZXJ0IChmaWxlaW5mby0+c3ltdGFiZGF0YSA9PSBOVUxMKTsKKwkgICAgICBmaWxlaW5mby0+c3ltdGFiZGF0YSA9IGRhdGE7CisJICAgICAgZmlsZWluZm8tPm5zeW10YWIgPSBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKKwkgICAgICBmaWxlaW5mby0+bmxvY2Fsc3ltYm9scyA9IHNoZHItPnNoX2luZm87CisJICAgICAgZmlsZWluZm8tPnN5bXN0cmlkeCA9IHNoZHItPnNoX2xpbms7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFzc2VydCAoZmlsZWluZm8tPmR5bnN5bXRhYmRhdGEgPT0gTlVMTCk7CisJICAgICAgZmlsZWluZm8tPmR5bnN5bXRhYmRhdGEgPSBkYXRhOworCSAgICAgIGZpbGVpbmZvLT5uZHluc3ltdGFiID0gc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7CisJICAgICAgZmlsZWluZm8tPmR5bnN5bXN0cmlkeCA9IHNoZHItPnNoX2xpbms7CisJICAgIH0KKworCSAgLyogSWYgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBub3JtYWwgc3ltYm9sIHRhYmxlIHdlIGp1c3QKKwkgICAgIGZvdW5kIGl0LiAgKi8KKwkgIGlmIChzZWN0dHlwZSA9PSBzaGRyLT5zaF90eXBlKQorCSAgICB7CisJICAgICAgYXNzZXJ0IChzeW10YWJkYXRhID09IE5VTEwpOworCSAgICAgIHN5bXRhYmRhdGEgPSBkYXRhOworCSAgICAgIHN5bXN0cmlkeCA9IHNoZHItPnNoX2xpbms7CisJICAgICAgbnN5bWJvbHMgPSBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKKwkgICAgICBubG9jYWxzeW1ib2xzID0gc2hkci0+c2hfaW5mbzsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHVubGlrZWx5IChzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgpKQorCXsKKwkgIGFzc2VydCAoeG5keGRhdGEgPT0gTlVMTCk7CisJICBmaWxlaW5mby0+eG5keGRhdGEgPSB4bmR4ZGF0YSA9IGRhdGE7CisJfQorICAgICAgZWxzZSBpZiAodW5saWtlbHkgKHNoZHItPnNoX3R5cGUgPT0gU0hUX0dOVV92ZXJzeW0pKQorCXsKKwkgIGFzc2VydCAodmVyc3ltZGF0YSA9PSAwKTsKKwkgIGZpbGVpbmZvLT52ZXJzeW1kYXRhID0gdmVyc3ltZGF0YSA9IGRhdGE7CisJfQorICAgICAgZWxzZSBpZiAodW5saWtlbHkgKHNoZHItPnNoX3R5cGUgPT0gU0hUX0dOVV92ZXJkZWYpKQorCXsKKwkgIHNpemVfdCBudmVyc2lvbnM7CisKKwkgIGFzc2VydCAodmVyZGVmZGF0YSA9PSAwKTsKKwkgIGZpbGVpbmZvLT52ZXJkZWZkYXRhID0gdmVyZGVmZGF0YSA9IGRhdGE7CisKKwkgIC8qIEFsbG9jYXRlIHRoZSBhcnJheXMgZmxhZ2dpbmcgdGhlIHVzZSBvZiB0aGUgdmVyc2lvbiBhbmQKKwkgICAgIHRvIHRyYWNrIG9mIGFsbG9jYXRlZCBuYW1lcy4gICovCisJICBmaWxlaW5mby0+bnZlcmRlZiA9IG52ZXJzaW9ucyA9IHNoZHItPnNoX2luZm87CisJICAvKiBXZSBoYXZlIE5WRVJTSU9OUyArIDEgYmVjYXVzZSB0aGUgaW5kZWNlcyB1c2VkIHRvIGFjY2VzcyB0aGUKKwkgICAgIHNlY3Rpbm8gc3RhcnQgd2l0aCBvbmU7IHplcm8gcmVwcmVzZW50cyBsb2NhbCBiaW5kaW5nLiAgKi8KKwkgIGZpbGVpbmZvLT52ZXJkZWZ1c2VkID0gKFhFbGZfVmVyc3ltICopCisJICAgIG9ic3RhY2tfY2FsbG9jICgmbGRfc3RhdGUuc21lbSwKKwkJCSAgICBzaXplb2YgKFhFbGZfVmVyc3ltKSAqIChudmVyc2lvbnMgKyAxKSk7CisJICBmaWxlaW5mby0+dmVyZGVmZW50ID0gKHN0cnVjdCBFYmxfU3RyZW50ICoqKQorCSAgICBvYnN0YWNrX2FsbG9jICgmbGRfc3RhdGUuc21lbSwKKwkJCSAgIHNpemVvZiAoc3RydWN0IEVibF9TdHJlbnQgKikgKiAobnZlcnNpb25zICsgMSkpOworCX0KKyAgICAgIGVsc2UgaWYgKHVubGlrZWx5IChzaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVybmVlZCkpCisJeworCSAgYXNzZXJ0ICh2ZXJuZWVkZGF0YSA9PSAwKTsKKwkgIGZpbGVpbmZvLT52ZXJuZWVkZGF0YSA9IHZlcm5lZWRkYXRhID0gZGF0YTsKKwl9CisgICAgICBlbHNlIGlmICh1bmxpa2VseSAoc2hkci0+c2hfdHlwZSA9PSBTSFRfRFlOQU1JQykpCisJeworCSAgYXNzZXJ0IChmaWxlaW5mby0+ZHluc2NuID09IE5VTEwpOworCSAgZmlsZWluZm8tPmR5bnNjbiA9IGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc2NuOworCX0KKyAgICAgIGVsc2UgaWYgKHVubGlrZWx5IChzaGRyLT5zaF90eXBlID09IFNIVF9HUk9VUCkpCisJeworCSAgRWxmX1NjbiAqc3ltc2NuOworCSAgWEVsZl9TaGRyX3ZhcmRlZiAoc3ltc2hkcik7CisJICBFbGZfRGF0YSAqc3ltZGF0YTsKKworCSAgaWYgKEZJTEVJTkZPX0VIRFIgKGZpbGVpbmZvLT5laGRyKS5lX3R5cGUgIT0gRVRfUkVMKQorCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiXAorJXM6IG9ubHkgZmlsZXMgb2YgdHlwZSBFVF9SRUwgbWlnaHQgY29udGFpbiBzZWN0aW9uIGdyb3VwcyIpLAorCQkgICBmaWxlaW5mby0+Zm5hbWUpOworCisJICBmaWxlaW5mby0+c2NuaW5mb1tjbnRdLm5leHQgPSBmaWxlaW5mby0+Z3JvdXBzOworCSAgZmlsZWluZm8tPnNjbmluZm9bY250XS5ncnBpZCA9IGNudDsKKwkgIGZpbGVpbmZvLT5ncm91cHMgPSAmZmlsZWluZm8tPnNjbmluZm9bY250XTsKKworCSAgLyogRGV0ZXJtaW5lIHRoZSBzaWduYXR1cmUuICBXZSBjcmVhdGUgYSBzeW1ib2wgcmVjb3JkIGZvcgorCSAgICAgaXQuICBPbmx5IHRoZSBuYW1lIGVsZW1lbnQgaXMgaW1wb3J0YW50LiAgKi8KKwkgIGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc3ltYm9scyA9IChzdHJ1Y3Qgc3ltYm9sICopCisJICAgIG9ic3RhY2tfY2FsbG9jICgmbGRfc3RhdGUuc21lbSwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisKKwkgIHN5bXNjbiA9IGVsZl9nZXRzY24gKGZpbGVpbmZvLT5lbGYsIHNoZHItPnNoX2xpbmspOworCSAgeGVsZl9nZXRzaGRyIChzeW1zY24sIHN5bXNoZHIpOworCSAgc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOworCSAgaWYgKHN5bXNoZHIgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKworCSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIHNlY3Rpb24gaW5kZXggYW5kIHRoZXJlZm9yZSB3ZSBkb24ndAorCQkgaGF2ZSB0byB1c2UgJ3hlbGZfZ2V0c3ltc2huZHgnLiAgKi8KKwkgICAgICB4ZWxmX2dldHN5bSAoc3ltZGF0YSwgc2hkci0+c2hfaW5mbywgc3ltKTsKKwkgICAgICBpZiAoc3ltICE9IE5VTEwpCisJCXsKKwkJICBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2wgPSBmaWxlaW5mby0+c2NuaW5mb1tjbnRdLnN5bWJvbHM7CisKKwkJICBzeW1ib2wtPm5hbWUgPSBlbGZfc3RycHRyIChmaWxlaW5mby0+ZWxmLCBzeW1zaGRyLT5zaF9saW5rLAorCQkJCQkgICAgIHN5bS0+c3RfbmFtZSk7CisJCSAgc3ltYm9sLT5zeW1pZHggPSBzaGRyLT5zaF9pbmZvOworCQkgIHN5bWJvbC0+ZmlsZSA9IGZpbGVpbmZvOworCQl9CisJICAgIH0KKwkgIGlmIChmaWxlaW5mby0+c2NuaW5mb1tjbnRdLnN5bWJvbHMtPm5hbWUgPT0gTlVMTCkKKwkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIlwKKyVzOiBjYW5ub3QgZGV0ZXJtaW5lIHNpZ25hdHVyZSBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnOiAlcyIpLAorCQkgICBmaWxlaW5mby0+Zm5hbWUsCisJCSAgIGVsZl9uZHhzY24gKGZpbGVpbmZvLT5zY25pbmZvW2NudF0uc2NuKSwKKwkJICAgZWxmX3N0cnB0ciAoZmlsZWluZm8tPmVsZiwgZmlsZWluZm8tPnNoc3RybmR4LAorCQkJICAgICAgIHNoZHItPnNoX25hbWUpLAorCQkgICBlbGZfZXJybXNnICgtMSkpOworCisJICAvKiBUaGUgJ3VzZWQnIGZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGVuIHRoZSBpbmZvcm1hdGlvbgorCSAgICAgaW4gdGhlIHNlY3Rpb24gZ3JvdXAgaXMgdXNlZCB0byBtYXJrIGFsbCBvdGhlciBzZWN0aW9ucworCSAgICAgYXMgdXNlZC4gIFNvIGl0IG11c3Qgbm90IGJlIHRydWUgeWV0LiAgKi8KKwkgIGFzc2VydCAoZmlsZWluZm8tPnNjbmluZm9bY250XS51c2VkID09IGZhbHNlKTsKKwl9CisgICAgICBlbHNlIGlmICghIFNFQ1RJT05fVFlQRV9QICgmbGRfc3RhdGUsIHNoZHItPnNoX3R5cGUpCisJICAgICAgICYmIHVubGlrZWx5ICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfT1NfTk9OQ09ORk9STUlORykgIT0gMCkpCisJLyogQWNjb3JkaW5nIHRvIHRoZSBnQUJJIGl0IGlzIGEgZmF0YWwgZXJyb3IgaWYgdGhlIGZpbGUgY29udGFpbnMKKwkgICBhIHNlY3Rpb24gd2l0aCB1bmtub3duIHR5cGUgYW5kIHRoZSBTSEZfT1NfTk9OQ09ORk9STUlORyBmbGFnCisJICAgc2V0LiAgKi8KKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiJXM6IHNlY3Rpb24gJyVzJyBoYXMgdW5rbm93biB0eXBlOiAlZCIpLAorCSAgICAgICBmaWxlaW5mby0+Zm5hbWUsCisJICAgICAgIGVsZl9zdHJwdHIgKGZpbGVpbmZvLT5lbGYsIGZpbGVpbmZvLT5zaHN0cm5keCwKKwkJCSAgIHNoZHItPnNoX25hbWUpLAorCSAgICAgICAoaW50KSBzaGRyLT5zaF90eXBlKTsKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gYWRkIGEgZmV3IHNlY3Rpb24gdHlwZXMgaGVyZS4gIFRoZXNlIHdpbGwgYmUKKwkgZ2VuZXJhdGVkIGZyb20gc2NyYXRjaCBmb3IgdGhlIG5ldyBvdXRwdXQgZmlsZS4gIFdlIGFsc28KKwkgZG9uJ3QgYWRkIHRoZSBzZWN0aW9ucyBvZiBEU09zIGhlcmUgc2luY2UgdGhlc2Ugc2VjdGlvbnMgYXJlCisJIG5vdCB1c2VkIGluIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGUuICAqLworICAgICAgZWxzZSBpZiAobGlrZWx5IChmaWxlaW5mby0+ZmlsZV90eXBlID09IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZSkKKwkgICAgICAgJiYgbGlrZWx5IChjbnQgPiAwKQorCSAgICAgICAmJiBsaWtlbHkgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTCisJCQkgIHx8IHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEKKwkJCSAgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMCisJCQkgIHx8IHNoZHItPnNoX3R5cGUgPT0gU0hUX05PVEUKKwkJCSAgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTCisJCQkgIHx8IHNoZHItPnNoX3R5cGUgPT0gU0hUX0lOSVRfQVJSQVkKKwkJCSAgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfRklOSV9BUlJBWQorCQkJICB8fCBzaGRyLT5zaF90eXBlID09IFNIVF9QUkVJTklUX0FSUkFZKSkKKwlhZGRfc2VjdGlvbiAoZmlsZWluZm8sICZmaWxlaW5mby0+c2NuaW5mb1tjbnRdKTsKKyAgICB9CisKKyAgLyogSGFuZGxlIHRoZSBzeW1ib2xzLiAgUmVjb3JkIGRlZmluZWQgYW5kIHVuZGVmaW5lZCBzeW1ib2xzIGluIHRoZQorICAgICBoYXNoIHRhYmxlLiAgSW4gdGhlb3J5IHRoZXJlIGNhbiBiZSBhIGZpbGUgd2l0aG91dCBhbnkgc3ltYm9sCisgICAgIHRhYmxlLiAgKi8KKyAgaWYgKGxpa2VseSAoc3ltdGFiZGF0YSAhPSBOVUxMKSkKKyAgICB7CisgICAgICAvKiBJbiBjYXNlIHRoaXMgZmlsZSBjb250YWlucyBtZXJnZS1hYmxlIHNlY3Rpb25zIHdlIGhhdmUgdG8KKwkgbG9jYXRlIHRoZSBzeW1ib2xzIHdoaWNoIGFyZSBpbiB0aGVzZSBzZWN0aW9ucy4gICovCisgICAgICBmaWxlaW5mby0+aGFzX21lcmdlX3NlY3Rpb25zID0gaGFzX21lcmdlX3NlY3Rpb25zOworICAgICAgaWYgKGxpa2VseSAoaGFzX21lcmdlX3NlY3Rpb25zKSkKKwl7CisJICBmaWxlaW5mby0+c3ltcmVmID0gKHN0cnVjdCBzeW1ib2wgKiopCisJICAgIG9ic3RhY2tfY2FsbG9jICgmbGRfc3RhdGUuc21lbSwKKwkJCSAgICBuc3ltYm9scyAqIHNpemVvZiAoc3RydWN0IHN5bWJvbCAqKSk7CisKKwkgIC8qIE9ubHkgaGFuZGxlIHRoZSBsb2NhbCBzeW1ib2xzIGhlcmUuICAqLworCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBubG9jYWxzeW1ib2xzOyArK2NudCkKKwkgICAgeworCSAgICAgIEVsZjMyX1dvcmQgc2huZHg7CisJICAgICAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCisJICAgICAgeGVsZl9nZXRzeW1zaG5keCAoc3ltdGFiZGF0YSwgeG5keGRhdGEsIGNudCwgc3ltLCBzaG5keCk7CisJICAgICAgaWYgKHN5bSA9PSBOVUxMKQorCQl7CisJCSAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgKi8KKwkJICBmcHJpbnRmIChzdGRlcnIsIGdldHRleHQgKCIlczogaW52YWxpZCBFTEYgZmlsZSAoJXM6JWQpXG4iKSwKKwkJCSAgIGZpbGVpbmZvLT5yZm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCSAgcmV0dXJuIDE7CisJCX0KKworCSAgICAgIGlmIChsaWtlbHkgKHNobmR4ICE9IFNITl9YSU5ERVgpKQorCQlzaG5keCA9IHN5bS0+c3Rfc2huZHg7CisJICAgICAgZWxzZSBpZiAodW5saWtlbHkgKHNobmR4ID09IDApKQorCQl7CisJCSAgZnByaW50ZiAoc3RkZXJyLCBnZXR0ZXh0ICgiJXM6IGludmFsaWQgRUxGIGZpbGUgKCVzOiVkKVxuIiksCisJCQkgICBmaWxlaW5mby0+cmZuYW1lLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQkgIHJldHVybiAxOworCQl9CisKKwkgICAgICBpZiAoWEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9TRUNUSU9OCisJCSAgJiYgKHNobmR4IDwgU0hOX0xPUkVTRVJWRSB8fCBzaG5keCA+IFNITl9ISVJFU0VSVkUpCisJCSAgJiYgKFNDTklORk9fU0hEUiAoZmlsZWluZm8tPnNjbmluZm9bc2huZHhdLnNoZHIpLnNoX2ZsYWdzCisJCSAgICAgICYgU0hGX01FUkdFKSkKKwkJeworCQkgIC8qIENyZWF0ZSBhIHN5bWJvbCByZWNvcmQgZm9yIHRoaXMgc3ltYm9sIGFuZCBhZGQgaXQKKwkJICAgICB0byB0aGUgbGlzdCBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KKwkJICBzdHJ1Y3Qgc3ltYm9sICpuZXdwOworCisJCSAgbmV3cCA9IChzdHJ1Y3Qgc3ltYm9sICopCisJCSAgICBvYnN0YWNrX2NhbGxvYyAoJmxkX3N0YXRlLnNtZW0sIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworCisJCSAgbmV3cC0+c3ltaWR4ID0gY250OworCQkgIG5ld3AtPnNjbmR4ID0gc2huZHg7CisJCSAgbmV3cC0+ZmlsZSA9IGZpbGVpbmZvOworCQkgIGZpbGVpbmZvLT5zeW1yZWZbY250XSA9IG5ld3A7CisKKwkJICBpZiAoZmlsZWluZm8tPnNjbmluZm9bc2huZHhdLnN5bWJvbHMgPT0gTlVMTCkKKwkJICAgIGZpbGVpbmZvLT5zY25pbmZvW3NobmR4XS5zeW1ib2xzID0gbmV3cC0+bmV4dF9pbl9zY24KKwkJICAgICAgPSBuZXdwOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgbmV3cC0+bmV4dF9pbl9zY24KKwkJCT0gZmlsZWluZm8tPnNjbmluZm9bc2huZHhdLnN5bWJvbHMtPm5leHRfaW5fc2NuOworCQkgICAgICBmaWxlaW5mby0+c2NuaW5mb1tzaG5keF0uc3ltYm9scworCQkJPSBmaWxlaW5mby0+c2NuaW5mb1tzaG5keF0uc3ltYm9scy0+bmV4dF9pbl9zY24gPSBuZXdwOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJLyogQ3JlYXRlIGFycmF5IHdpdGggcG9pbnRlcnMgdG8gdGhlIHN5bWJvbCBkZWZpbml0aW9ucy4gIE5vdGUKKwkgICB0aGF0IHdlIG9ubHkgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbm9uLWxvY2FsIHN5bWJvbHMKKwkgICBzaW5jZSB3ZSBoYXZlIG5vIG1lcmdlLWFibGUgc2VjdGlvbnMuICBCdXQgd2Ugc3RvcmUgdGhlCisJICAgcG9pbnRlciBhcyBpZiBpdCB3YXMgZm9yIHRoZSB3aG9sZSBzeW1ib2wgdGFibGUuICBUaGlzCisJICAgc2F2ZXMgc29tZSBtZW1vcnkuICAqLworCWZpbGVpbmZvLT5zeW1yZWYgPSAoc3RydWN0IHN5bWJvbCAqKikKKwkgIG9ic3RhY2tfY2FsbG9jICgmbGRfc3RhdGUuc21lbSwgKChuc3ltYm9scyAtIG5sb2NhbHN5bWJvbHMpCisJCQkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sICopKSkKKwkgIC0gbmxvY2Fsc3ltYm9sczsKKworICAgICAgLyogRG9uJ3QgaGFuZGxlIGxvY2FsIHN5bWJvbHMgaGVyZS4gIEl0J3MgZWl0aGVyIG5vdCBuZWNlc3NhcnkKKwkgYXQgYWxsIG9yIGhhcyBhbHJlYWR5IGhhcHBlbmVkLiAgKi8KKyAgICAgIGZvciAoY250ID0gbmxvY2Fsc3ltYm9sczsgY250IDwgbnN5bWJvbHM7ICsrY250KQorCXsKKwkgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKwkgIEVsZjMyX1dvcmQgc2huZHg7CisJICB4ZWxmX2dldHN5bXNobmR4IChzeW10YWJkYXRhLCB4bmR4ZGF0YSwgY250LCBzeW0sIHNobmR4KTsKKworCSAgaWYgKHN5bSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgKi8KKwkgICAgICBmcHJpbnRmIChzdGRlcnIsIGdldHRleHQgKCIlczogaW52YWxpZCBFTEYgZmlsZSAoJXM6JWQpXG4iKSwKKwkJICAgICAgIGZpbGVpbmZvLT5yZm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKworCSAgaWYgKGxpa2VseSAoc2huZHggIT0gU0hOX1hJTkRFWCkpCisJICAgIHNobmR4ID0gc3ltLT5zdF9zaG5keDsKKwkgIGVsc2UgaWYgKHVubGlrZWx5IChzaG5keCA9PSAwKSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgZ2V0dGV4dCAoIiVzOiBpbnZhbGlkIEVMRiBmaWxlICglczolZClcbiIpLAorCQkgICAgICAgZmlsZWluZm8tPnJmbmFtZSwgX19GSUxFX18sIF9fTElORV9fKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCisJICAvKiBXZSBpZ25vcmUgQUJTIHN5bWJvbHMgZnJvbSBEU09zLiAgKi8KKwkgIC8vIFhYWCBJcyB0aGlzIGNvcnJlY3Q/CisJICBpZiAodW5saWtlbHkgKHNobmR4ID09IFNITl9BQlMpICYmIHNlY3R0eXBlID09IFNIVF9EWU5TWU0pCisJICAgIGNvbnRpbnVlOworCisJICAvKiBJZiB0aGUgRFNPIHVzZXMgc3ltYm9scyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIHRoZSBkZWZhdWx0CisJICAgICB2ZXJzaW9uLiAgT3RoZXJ3aXNlIHdlJ2xsIGlnbm9yZSB0aGUgc3ltYm9sLiAgKi8KKwkgIGlmICh2ZXJzeW1kYXRhICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBYRWxmX1ZlcnN5bSB2ZXJzeW07CisKKwkgICAgICBpZiAoeGVsZl9nZXR2ZXJzeW1fY29weSAodmVyc3ltZGF0YSwgY250LCB2ZXJzeW0pID09IE5VTEwpCisJCS8qIFhYWCBTaG91bGQgd2UgaGFuZGxlIGZhdWx0eSBpbnB1dCBmaWxlcyBtb3JlIGdyYWNlZnVsPyAgKi8KKwkJYXNzZXJ0ICghICJ4ZWxmX2dldHZlcnN5bSBmYWlsZWQiKTsKKworCSAgICAgIGlmICgodmVyc3ltICYgMHg4MDAwKSAhPSAwKQorCQkvKiBJZ25vcmUgdGhlIHN5bWJvbCwgaXQncyBub3QgdGhlIGRlZmF1bHQgdmVyc2lvbi4gICovCisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIFNlZSB3aGV0aGVyIHdlIGtub3cgYW55dGhpbmcgYWJvdXQgdGhpcyBzeW1ib2wuICAqLworCSAgc3RydWN0IHN5bWJvbCBzZWFyY2g7CisJICBzZWFyY2gubmFtZSA9IGVsZl9zdHJwdHIgKGZpbGVpbmZvLT5lbGYsIHN5bXN0cmlkeCwgc3ltLT5zdF9uYW1lKTsKKwkgIHVuc2lnbmVkIGxvbmcgaW50IGh2YWwgPSBlbGZfaGFzaCAoc2VhcmNoLm5hbWUpOworCisJICAvKiBXZSBpZ25vcmUgdGhlIHN5bWJvbHMgdGhlIGxpbmtlciBnZW5lcmF0ZXMuICBUaGlzIGFyZQorCSAgICAgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBfRFlOQU1JQy4gICovCisJICAvLyBYWFggVGhpcyBsb29wIGlzIGhvdCBhbmQgdGhlIGZvbGxvd2luZyB0ZXN0cyBoYXJkbHkgZXZlciBtYXRjaC4KKwkgIC8vIFhYWCBNYXliZSBtb3ZlIHRoZSB0ZXN0cyBzb21ld2hlcmUgdGhleSBhcmUgZXhlY3V0ZWQgbGVzcyBvZnRlbi4KKwkgIGlmICgoKHVubGlrZWx5IChodmFsID09IDE2NTgzMjY3NSkKKwkJJiYgc3RyY21wIChzZWFyY2gubmFtZSwgIl9EWU5BTUlDIikgPT0gMCkKKwkgICAgICAgfHwgKHVubGlrZWx5IChodmFsID09IDEwMjI2NDMzNSkKKwkJICAgJiYgc3RyY21wIChzZWFyY2gubmFtZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApKQorCSAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGCisJICAgICAgLyogSWYgc29tZWJvZHkgZGVmaW5lcyBzdWNoIGEgdmFyaWFibGUgaW4gYSByZWxvY2F0YWJsZSB3ZQorCQkgZG9uJ3QgaWdub3JlIGl0LiAgTGV0IHRoZSB1c2VyIGdldCB3aGF0IHMvaGUgZGVzZXJ2ZXMuICAqLworCSAgICAgICYmIGZpbGVpbmZvLT5maWxlX3R5cGUgIT0gcmVsb2NhdGFibGVfZmlsZV90eXBlKQorCSAgICBjb250aW51ZTsKKworCSAgc3RydWN0IHN5bWJvbCAqb2xkcCA9IGxkX3N5bWJvbF90YWJfZmluZCAoJmxkX3N0YXRlLnN5bWJvbF90YWIsCisJCQkJCQkgICAgaHZhbCwgJnNlYXJjaCk7CisJICBzdHJ1Y3Qgc3ltYm9sICpuZXdwOworCSAgaWYgKGxpa2VseSAob2xkcCA9PSBOVUxMKSkKKwkgICAgeworCSAgICAgIC8qIE5vIHN5bWJvbCBvZiB0aGlzIG5hbWUga25vdy4gIEFkZCBpdC4gICovCisJICAgICAgbmV3cCA9IChzdHJ1Y3Qgc3ltYm9sICopIG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLAorCQkJCQkJICAgICAgc2l6ZW9mICgqbmV3cCkpOworCSAgICAgIG5ld3AtPm5hbWUgPSBzZWFyY2gubmFtZTsKKwkgICAgICBuZXdwLT5zaXplID0gc3ltLT5zdF9zaXplOworCSAgICAgIG5ld3AtPnR5cGUgPSBYRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbyk7CisJICAgICAgbmV3cC0+c3ltaWR4ID0gY250OworCSAgICAgIG5ld3AtPm91dHN5bWlkeCA9IDA7CisJICAgICAgbmV3cC0+b3V0ZHluc3ltaWR4ID0gMDsKKwkgICAgICBuZXdwLT5zY25keCA9IHNobmR4OworCSAgICAgIG5ld3AtPmZpbGUgPSBmaWxlaW5mbzsKKwkgICAgICBuZXdwLT5kZWZpbmVkID0gbmV3cC0+c2NuZHggIT0gU0hOX1VOREVGOworCSAgICAgIG5ld3AtPmNvbW1vbiA9IG5ld3AtPnNjbmR4ID09IFNITl9DT01NT047CisJICAgICAgbmV3cC0+d2VhayA9IFhFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfV0VBSzsKKwkgICAgICBuZXdwLT5hZGRlZCA9IDA7CisJICAgICAgbmV3cC0+bWVyZ2VkID0gMDsKKwkgICAgICBuZXdwLT5uZWVkX2NvcHkgPSAwOworCSAgICAgIG5ld3AtPm9uX2Rzb2xpc3QgPSAwOworCSAgICAgIG5ld3AtPmluX2RzbyA9IHNlY3R0eXBlID09IFNIVF9EWU5TWU07CisJICAgICAgbmV3cC0+bmV4dF9pbl9zY24gPSBOVUxMOworI2lmbmRlZiBOREVCVUcKKwkgICAgICBuZXdwLT5uZXh0ID0gTlVMTDsKKwkgICAgICBuZXdwLT5wcmV2aW91cyA9IE5VTEw7CisjZW5kaWYKKworCSAgICAgIGlmIChuZXdwLT5zY25keCA9PSBTSE5fVU5ERUYpCisJCXsKKwkJICBDREJMX0xJU1RfQUREX1JFQVIgKGxkX3N0YXRlLnVucmVzb2x2ZWQsIG5ld3ApOworCQkgICsrbGRfc3RhdGUubnVucmVzb2x2ZWQ7CisJCSAgaWYgKCEgbmV3cC0+d2VhaykKKwkJICAgICsrbGRfc3RhdGUubnVucmVzb2x2ZWRfbm9ud2VhazsKKwkJfQorCSAgICAgIGVsc2UgaWYgKG5ld3AtPnNjbmR4ID09IFNITl9DT01NT04pCisJCXsKKwkJICAvKiBTdG9yZSB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50LiAgKi8KKwkJICBuZXdwLT5tZXJnZS52YWx1ZSA9IHN5bS0+c3RfdmFsdWU7CisKKwkJICBDREJMX0xJU1RfQUREX1JFQVIgKGxkX3N0YXRlLmNvbW1vbl9zeW1zLCBuZXdwKTsKKwkJfQorCisJICAgICAgLyogSW5zZXJ0IHRoZSBuZXcgc3ltYm9sLiAgKi8KKwkgICAgICBpZiAodW5saWtlbHkgKGxkX3N5bWJvbF90YWJfaW5zZXJ0ICgmbGRfc3RhdGUuc3ltYm9sX3RhYiwKKwkJCQkJCSAgaHZhbCwgbmV3cCkgIT0gMCkpCisJCS8qIFRoaXMgY2Fubm90IGhhcHBlbi4gICovCisJCWFib3J0ICgpOworCisJICAgICAgZmlsZWluZm8tPnN5bXJlZltjbnRdID0gbmV3cDsKKworCSAgICAgIC8qIFdlIGhhdmUgYSBmZXcgc3BlY2lhbCBzeW1ib2xzIHRvIHJlY29nbml6ZS4gIFRoZSBzeW1ib2xzCisJCSBfaW5pdCBhbmQgX2ZpbmkgYXJlIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgZmluYWxpemF0aW9uCisJCSBmdW5jdGlvbnMgcmVzcGVjdGl2ZWx5LiAgVGhleSBoYXZlIHRvIGJlIG1hZGUga25vd24gaW4KKwkJIHRoZSBkeW5hbWljIHNlY3Rpb24gYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGZpbmQgb3V0CisJCSBub3cgd2hldGhlciB0aGVzZSBmdW5jdGlvbnMgZXhpc3Qgb3Igbm90LiAgKi8KKwkgICAgICBpZiAoaHZhbCA9PSA2Njg1OTU2ICYmIHN0cmNtcCAobmV3cC0+bmFtZSwgIl9pbml0IikgPT0gMCkKKwkJbGRfc3RhdGUuaW5pdF9zeW1ib2wgPSBuZXdwOworCSAgICAgIGVsc2UgaWYgKGh2YWwgPT0gNjY3MjQ1NyAmJiBzdHJjbXAgKG5ld3AtPm5hbWUsICJfZmluaSIpID09IDApCisJCWxkX3N0YXRlLmZpbmlfc3ltYm9sID0gbmV3cDsKKwkgICAgfQorCSAgZWxzZSBpZiAodW5saWtlbHkgKGNoZWNrX2RlZmluaXRpb24gKHN5bSwgY250LCBmaWxlaW5mbywgb2xkcCkgIT0gMCkpCisJICAgIC8qIEEgZmF0YWwgZXJyb3IgKG11bHRpcGxlIGRlZmluaXRpb24gb2YgYSBzeW1ib2wpCisJICAgICAgIG9jY3VycmVkLCBubyBuZWVkIHRvIGNvbnRpbnVlLiAgKi8KKwkgICAgcmV0dXJuIDE7CisJICBlbHNlCisJICAgIC8qIFVzZSB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgc3ltYm9sIHJlY29yZC4gIEl0IGhhcworCSAgICAgICBiZWVuIHVwZGF0ZWQgaW4gY2hlY2tfZGVmaW5pdGlvbigpLCBpZiBuZWNlc3NhcnkuICAqLworCSAgICBuZXdwID0gZmlsZWluZm8tPnN5bXJlZltjbnRdID0gb2xkcDsKKworCSAgLyogTWFyayB0aGUgc2VjdGlvbiB0aGUgc3ltYm9sIHdlIG5lZWQgY29tZXMgZnJvbSBhcyB1c2VkLiAgKi8KKwkgIGlmIChzaG5keCAhPSBTSE5fVU5ERUYKKwkgICAgICAmJiAoc2huZHggPCBTSE5fTE9SRVNFUlZFIHx8IHNobmR4ID4gU0hOX0hJUkVTRVJWRSkpCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc2NuaW5mbyAqaWdub3JlOworCisjaWZuZGVmIE5ERUJVRworCSAgICAgIHNpemVfdCBzaG51bTsKKwkgICAgICBhc3NlcnQgKGVsZl9nZXRzaG51bSAoZmlsZWluZm8tPmVsZiwgJnNobnVtKSA9PSAwKTsKKwkgICAgICBhc3NlcnQgKHNobmR4IDwgc2hudW0pOworI2VuZGlmCisKKwkgICAgICAvKiBNYXJrIHNlY3Rpb24gKGFuZCBhbGwgZGVwZW5kZW5jaWVzKSBhcyB1c2VkLiAgKi8KKwkgICAgICBtYXJrX3NlY3Rpb25fdXNlZCAoJmZpbGVpbmZvLT5zY25pbmZvW3NobmR4XSwgc2huZHgsICZpZ25vcmUpOworCisJICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGUgc2VjdGlvbiBpcyBtZXJnZS1hYmxlLiAgSW4gdGhpcyBjYXNlIHdlCisJCSBoYXZlIHRvIHJlY29yZCB0aGUgc3ltYm9sLiAgKi8KKwkgICAgICBpZiAoU0NOSU5GT19TSERSIChmaWxlaW5mby0+c2NuaW5mb1tzaG5keF0uc2hkcikuc2hfZmxhZ3MKKwkJICAmIFNIRl9NRVJHRSkKKwkJeworCQkgIGlmIChmaWxlaW5mby0+c2NuaW5mb1tzaG5keF0uc3ltYm9scyA9PSBOVUxMKQorCQkgICAgZmlsZWluZm8tPnNjbmluZm9bc2huZHhdLnN5bWJvbHMgPSBuZXdwLT5uZXh0X2luX3NjbgorCQkgICAgICA9IG5ld3A7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBuZXdwLT5uZXh0X2luX3NjbgorCQkJPSBmaWxlaW5mby0+c2NuaW5mb1tzaG5keF0uc3ltYm9scy0+bmV4dF9pbl9zY247CisJCSAgICAgIGZpbGVpbmZvLT5zY25pbmZvW3NobmR4XS5zeW1ib2xzCisJCQk9IGZpbGVpbmZvLT5zY25pbmZvW3NobmR4XS5zeW1ib2xzLT5uZXh0X2luX3NjbiA9IG5ld3A7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKworICAgICAgLyogVGhpcyBmaWxlIGlzIHVzZWQuICAqLworICAgICAgaWYgKGxpa2VseSAoZmlsZWluZm8tPmZpbGVfdHlwZSA9PSByZWxvY2F0YWJsZV9maWxlX3R5cGUpKQorCXsKKwkgIGlmICh1bmxpa2VseSAobGRfc3RhdGUucmVsZmlsZXMgPT0gTlVMTCkpCisJICAgIGxkX3N0YXRlLnJlbGZpbGVzID0gZmlsZWluZm8tPm5leHQgPSBmaWxlaW5mbzsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZpbGVpbmZvLT5uZXh0ID0gbGRfc3RhdGUucmVsZmlsZXMtPm5leHQ7CisJICAgICAgbGRfc3RhdGUucmVsZmlsZXMgPSBsZF9zdGF0ZS5yZWxmaWxlcy0+bmV4dCA9IGZpbGVpbmZvOworCSAgICB9CisKKwkgIC8qIFVwZGF0ZSBzb21lIHN1bW1hcnkgaW5mb3JtYXRpb24gaW4gdGhlIHN0YXRlIHN0cnVjdHVyZS4gICovCisJICBsZF9zdGF0ZS5uc3ltdGFiICs9IGZpbGVpbmZvLT5uc3ltdGFiOworCSAgbGRfc3RhdGUubmxvY2Fsc3ltYm9scyArPSBmaWxlaW5mby0+bmxvY2Fsc3ltYm9sczsKKwl9CisgICAgICBlbHNlIGlmIChsaWtlbHkgKGZpbGVpbmZvLT5maWxlX3R5cGUgPT0gZHNvX2ZpbGVfdHlwZSkpCisJeworCSAgQ1NOR0xfTElTVF9BRERfUkVBUiAobGRfc3RhdGUuZHNvZmlsZXMsIGZpbGVpbmZvKTsKKwkgICsrbGRfc3RhdGUubmRzb2ZpbGVzOworCisJICBpZiAoZmlsZWluZm8tPmxhenlsb2FkKQorCSAgICAvKiBXZSBoYXZlIHRvIGNyZWF0ZSBhbm90aGVyIGR5bmFtaWMgc2VjdGlvbiBlbnRyeSBmb3IgdGhlCisJICAgICAgIERUX1BPU0ZMQUdfMSBlbnRyeS4KKworCSAgICAgICBYWFggT25jZSBtb3JlIGZ1bmN0aW9uYWxpdHkgdGhhbiB0aGUgbGF6eWxvYWRpbmcgZmxhZworCSAgICAgICBhcmUgc3VwcHBvcnRlZCB0aGUgdGVzdCBtdXN0IGJlIGV4dGVuZGVkLiAgKi8KKwkgICAgKytsZF9zdGF0ZS5uZHNvZmlsZXM7CisJfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKworCitpbnQKK2xkX2hhbmRsZV9maWxlbmFtZV9saXN0IChzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZm5hbWVzKQoreworICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqcnVucDsKKyAgaW50IHJlcyA9IDA7CisKKyAgZm9yIChydW5wID0gZm5hbWVzOyBydW5wICE9IE5VTEw7IHJ1bnAgPSBydW5wLT5uZXh0KQorICAgIHsKKyAgICAgIHN0cnVjdCB1c2VkZmlsZXMgKmN1cnA7CisKKyAgICAgIC8qIENyZWF0ZSBhIHJlY29yZCBmb3IgdGhlIG5ldyBmaWxlLiAgKi8KKyAgICAgIGN1cnAgPSBydW5wLT5yZWFsID0gbGRfbmV3X2lucHV0ZmlsZSAocnVucC0+bmFtZSwgcmVsb2NhdGFibGVfZmlsZV90eXBlKTsKKworICAgICAgLyogU2V0IGZsYWdzIGZvciBncm91cCBoYW5kbGluZy4gICovCisgICAgICBydW5wLT5yZWFsLT5ncm91cF9zdGFydCA9IHJ1bnAtPmdyb3VwX3N0YXJ0OworICAgICAgcnVucC0+cmVhbC0+Z3JvdXBfZW5kID0gcnVucC0+Z3JvdXBfZW5kOworCisgICAgICAvKiBSZWFkIHRoZSBmaWxlIGFuZCBldmVyeXRoaW5nIGVsc2Ugd2hpY2ggY29tZXMgdXAsIGluY2x1ZGluZworCSBoYW5kbGluZyBncm91cHMuICAqLworICAgICAgZG8KKwlyZXMgfD0gRklMRV9QUk9DRVNTICgtMSwgY3VycCwgJmxkX3N0YXRlLCAmY3VycCk7CisgICAgICB3aGlsZSAoY3VycCAhPSBOVUxMKTsKKyAgICB9CisKKyAgLyogRnJlZSB0aGUgbGlzdC4gICovCisgIHdoaWxlIChmbmFtZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBydW5wID0gZm5hbWVzOworICAgICAgZm5hbWVzID0gZm5hbWVzLT5uZXh0OworICAgICAgZnJlZSAocnVucCk7CisgICAgfQorCisgIHJldHVybiByZXM7Cit9CisKKworLyogSGFuZGxlIG9wZW5pbmcgb2YgdGhlIGdpdmVuIGZpbGUgd2l0aCBFTEYgZGVzY3JpcHRvci4gICovCitzdGF0aWMgaW50CitvcGVuX2VsZiAoc3RydWN0IHVzZWRmaWxlcyAqZmlsZWluZm8sIEVsZiAqZWxmKQoreworICBpbnQgcmVzID0gMDsKKworICBpZiAoZWxmID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBkZXNjcmlwdG9yIGZvciBFTEYgZmlsZSAoJXM6JWQpOiAlc1xuIiksCisJICAgX19GSUxFX18sIF9fTElORV9fLCBlbGZfZXJybXNnICgtMSkpOworCisgIGlmICh1bmxpa2VseSAoZWxmX2tpbmQgKGVsZikgPT0gRUxGX0tfTk9ORSkpCisgICAgeworICAgICAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZuYW1lczsKKworICAgICAgLyogV2UgZG9uJ3QgaGF2ZSB0byBsb29rIGF0IHRoaXMgZmlsZSBhZ2Fpbi4gICovCisgICAgICBmaWxlaW5mby0+c3RhdHVzID0gY2xvc2VkOworCisgICAgICAvKiBMZXQncyBzZWUgd2hldGhlciB0aGlzIGlzIGEgbGlua2VyIHNjcmlwdC4gICovCisgICAgICBpZiAoZmlsZWluZm8tPmZkICE9IC0xKQorCS8qIENyZWF0ZSBhIHN0cmVhbSBmcm9tIHRoZSBmaWxlIGhhbmRsZSB3ZSBrbm93LiAgKi8KKwlsZGluID0gZmRvcGVuIChmaWxlaW5mby0+ZmQsICJyIik7CisgICAgICBlbHNlCisJeworCSAgLyogR2V0IHRoZSBtZW1vcnkgZm9yIHRoZSBhcmNoaXZlIG1lbWJlci4gICovCisJICBjaGFyICpjb250ZW50OworCSAgc2l6ZV90IGNvbnRlbnRzaXplOworCisJICAvKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuICAqLworCSAgY29udGVudCA9IGVsZl9yYXdmaWxlIChlbGYsICZjb250ZW50c2l6ZSk7CisJICBpZiAoY29udGVudCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBnZXR0ZXh0ICgiJXM6IGludmFsaWQgRUxGIGZpbGUgKCVzOiVkKVxuIiksCisJCSAgICAgICBmaWxlaW5mby0+cmZuYW1lLCBfX0ZJTEVfXywgX19MSU5FX18pOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisKKwkgIC8qIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIGlzIGF2YWlsYWJsZSBpbiBtZW1vcnkuICBSZWFkIHRoZQorCSAgICAgbWVtb3J5IHJlZ2lvbiBhcyBhIHN0cmVhbS4gICovCisJICBsZGluID0gZm1lbW9wZW4gKGNvbnRlbnQsIGNvbnRlbnRzaXplLCAiciIpOworCX0KKworICAgICAgLyogTm8gbmVlZCBmb3IgbG9ja2luZy4gICovCisgICAgICBfX2ZzZXRsb2NraW5nIChsZGluLCBGU0VUTE9DS0lOR19CWUNBTExFUik7CisKKyAgICAgIGlmIChsZGluID09IE5VTEwpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgb3BlbiBcIiVzXCIiKSwKKwkgICAgICAgZmlsZWluZm8tPnJmbmFtZSk7CisKKyAgICAgIC8qIFBhcnNlIHRoZSBmaWxlLiAgSWYgaXQgaXMgYSBsaW5rZXIgc2NyaXB0IG5vIHByb2JsZW1zIHdpbGwgYmUKKwkgcmVwb3J0ZWQuICAqLworICAgICAgbGRfc3RhdGUuc3JjZmlsZXMgPSBOVUxMOworICAgICAgbGRsaW5lbm8gPSAxOworICAgICAgbGRfc2Nhbl92ZXJzaW9uX3NjcmlwdCA9IDA7CisgICAgICBsZGluX2ZuYW1lID0gZmlsZWluZm8tPnJmbmFtZTsKKyAgICAgIHJlcyA9IGxkcGFyc2UgKCk7CisKKyAgICAgIGZjbG9zZSAobGRpbik7CisgICAgICBpZiAoZmlsZWluZm8tPmZkICE9IC0xICYmICFmaWxlaW5mby0+ZmRfcGFzc2VkKQorCXsKKwkgIC8qIFdlIHdvbid0IG5lZWQgdGhlIGZpbGUgZGVzY3JpcHRvciBhZ2Fpbi4gICovCisJICBjbG9zZSAoZmlsZWluZm8tPmZkKTsKKwkgIGZpbGVpbmZvLT5mZCA9IC0xOworCX0KKworICAgICAgZWxmX2VuZCAoZWxmKTsKKworICAgICAgaWYgKHVubGlrZWx5IChyZXMgIT0gMCkpCisJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHBhcnNpbmcuICAqLworCXJldHVybiAxOworCisgICAgICAvKiBUaGlzIGlzIG5vIEVMRiBmaWxlLiAgKi8KKyAgICAgIGZpbGVpbmZvLT5lbGYgPSBOVUxMOworCisgICAgICAvKiBOb3cgd2UgaGF2ZSB0byBoYW5kbGUgZXZlbnR1YWwgSU5QVVQgYW5kIEdST1VQIHN0YXRlbWVudHMgaW4KKwkgdGhlIHNjcmlwdC4gIFJlYWQgdGhlIGZpbGVzIG1lbnRpb25lZC4gICovCisgICAgICBmbmFtZXMgPSBsZF9zdGF0ZS5zcmNmaWxlczsKKyAgICAgIGlmIChmbmFtZXMgIT0gTlVMTCkKKwl7CisJICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqb2xkcDsKKworCSAgLyogQ29udmVydCB0aGUgbGlzdCBpbnRvIGEgbm9ybWFsIHNpbmdsZS1saW5rZWQgbGlzdC4gICovCisJICBvbGRwID0gZm5hbWVzOworCSAgZm5hbWVzID0gZm5hbWVzLT5uZXh0OworCSAgb2xkcC0+bmV4dCA9IE5VTEw7CisKKwkgIC8qIFJlbW92ZSB0aGUgbGlzdCBmcm9tIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUuICAqLworCSAgbGRfc3RhdGUuc3JjZmlsZXMgPSBOVUxMOworCisJICBpZiAodW5saWtlbHkgKGxkX2hhbmRsZV9maWxlbmFtZV9saXN0IChmbmFtZXMpICE9IDApKQorCSAgICByZXR1cm4gMTsKKwl9CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBTdG9yZSB0aGUgZmlsZSBpbmZvLiAgKi8KKyAgZmlsZWluZm8tPmVsZiA9IGVsZjsKKworICAvKiBUaGUgZmlsZSBpcyByZWFkeSBmb3IgYWN0aW9uLiAgKi8KKyAgZmlsZWluZm8tPnN0YXR1cyA9IG9wZW5lZDsKKworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CithZGRfd2hvbGVfYXJjaGl2ZSAoc3RydWN0IHVzZWRmaWxlcyAqZmlsZWluZm8pCit7CisgIEVsZiAqYXJlbGY7CisgIEVsZl9DbWQgY21kID0gRUxGX0NfUkVBRF9NTUFQX1BSSVZBVEU7CisgIGludCByZXMgPSAwOworCisgIHdoaWxlICgoYXJlbGYgPSBlbGZfYmVnaW4gKGZpbGVpbmZvLT5mZCwgY21kLCBmaWxlaW5mby0+ZWxmKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBFbGZfQXJoZHIgKmFyaGRyID0gZWxmX2dldGFyaGRyIChhcmVsZik7CisgICAgICBzdHJ1Y3QgdXNlZGZpbGVzICpuZXdwOworCisgICAgICBpZiAoYXJoZHIgPT0gTlVMTCkKKwlhYm9ydCAoKTsKKworICAgICAgLyogSnVzdCB0byBiZSBzdXJlOyBzaW5jZSB0aGVzZSBhcmUgbm8gZmlsZXMgaW4gdGhlIGFyY2hpdmUKKwkgdGhlc2UgbmFtZXMgc2hvdWxkIG5ldmVyIGJlIHJldHVybmVkLiAgKi8KKyAgICAgIGFzc2VydCAoc3RyY21wIChhcmhkci0+YXJfbmFtZSwgIi8iKSAhPSAwKTsKKyAgICAgIGFzc2VydCAoc3RyY21wIChhcmhkci0+YXJfbmFtZSwgIi8vIikgIT0gMCk7CisKKyAgICAgIG5ld3AgPSBsZF9uZXdfaW5wdXRmaWxlIChhcmhkci0+YXJfbmFtZSwgcmVsb2NhdGFibGVfZmlsZV90eXBlKTsKKyAgICAgIG5ld3AtPmFyY2hpdmVfZmlsZSA9IGZpbGVpbmZvOworCisgICAgICBpZiAodW5saWtlbHkgKGxkX3N0YXRlLnRyYWNlX2ZpbGVzKSkKKwlwcmludF9maWxlX25hbWUgKHN0ZG91dCwgbmV3cCwgMSwgMSk7CisKKyAgICAgIC8qIFRoaXMgc2hvd3MgdGhhdCB0aGlzIGZpbGUgaXMgY29udGFpbmVkIGluIGFuIGFyY2hpdmUuICAqLworICAgICAgbmV3cC0+ZmQgPSAtMTsKKyAgICAgIC8qIFN0b3JlIHRoZSBFTEYgZGVzY3JpcHRvci4gICovCisgICAgICBuZXdwLT5lbGYgPSBhcmVsZjsKKyAgICAgIC8qIFNob3cgdGhhdCB3ZSBhcmUgb3BlbiBmb3IgYnVzaW5lc3MuICAqLworICAgICAgbmV3cC0+c3RhdHVzID0gb3BlbmVkOworCisgICAgICAvKiBQcm9jZXMgdGhlIGZpbGUsIGFkZCBhbGwgdGhlIHN5bWJvbHMgZXRjLiAgKi8KKyAgICAgIHJlcyA9IGZpbGVfcHJvY2VzczIgKG5ld3ApOworICAgICAgaWYgKHVubGlrZWx5IChyZXMgIT0gMCkpCisJICAgIGJyZWFrOworCisgICAgICAvKiBBZHZhbmNlIHRvIHRoZSBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCisgICAgICBjbWQgPSBlbGZfbmV4dCAoYXJlbGYpOworICAgIH0KKworICByZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBpbnQKK2V4dHJhY3RfZnJvbV9hcmNoaXZlIChzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlaW5mbykKK3sKKyAgc3RhdGljIGludCBhcmNoaXZlX3NlcTsKKyAgaW50IHJlcyA9IDA7CisKKyAgLyogVGhpcyBpcyBhbiBhcmNoaXZlIHdlIGFyZSBub3QgdXNpbmcgY29tcGxldGVseS4gIEdpdmUgaXQgYQorICAgICB1bmlxdWUgbnVtYmVyLiAgKi8KKyAgZmlsZWluZm8tPmFyY2hpdmVfc2VxID0gKythcmNoaXZlX3NlcTsKKworICAvKiBJZiB0aGVyZSBhcmUgbm8gdW5yZXNvbHZlZCBzeW1ib2xzIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KKyAgaWYgKChsaWtlbHkgKGxkX3N0YXRlLmV4dHJhY3RfcnVsZSA9PSBkZWZhdWx0ZXh0cmFjdCkKKyAgICAgICAmJiBsZF9zdGF0ZS5udW5yZXNvbHZlZF9ub253ZWFrID09IDApCisgICAgICB8fCAodW5saWtlbHkgKGxkX3N0YXRlLmV4dHJhY3RfcnVsZSA9PSB3ZWFrZXh0cmFjdCkKKwkgICYmIGxkX3N0YXRlLm51bnJlc29sdmVkID09IDApKQorICAgIHJldHVybiAwOworCisgIEVsZl9BcnN5bSAqc3ltczsKKyAgc2l6ZV90IG5zeW1zOworCisgIC8qIEdldCBhbGwgdGhlIHN5bWJvbHMuICAqLworICBzeW1zID0gZWxmX2dldGFyc3ltIChmaWxlaW5mby0+ZWxmLCAmbnN5bXMpOworICBpZiAoc3ltcyA9PSBOVUxMKQorICAgIHsKKyAgICBjYW5ub3RfcmVhZF9hcmNoaXZlOgorICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgcmVhZCBhcmNoaXZlIGAlcyc6ICVzIiksCisJICAgICBmaWxlaW5mby0+cmZuYW1lLCBlbGZfZXJybXNnICgtMSkpOworCisgICAgICAvKiBXZSBjYW5ub3QgdXNlIHRoaXMgYXJjaGl2ZSBhbnltb3JlLiAgKi8KKyAgICAgIGZpbGVpbmZvLT5zdGF0dXMgPSBjbG9zZWQ7CisKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBOb3cgYWRkIGFsbCB0aGUgc3ltYm9scyB0byB0aGUgaGFzaCB0YWJsZS4gIE5vdGUgdGhhdCB0aGVyZQorICAgICBjYW4gcG90ZW50aWFsbHkgYmUgZHVwbGljYXRlIGRlZmluaXRpb25zLiAgV2UnbGwgYWx3YXlzIHVzZQorICAgICB0aGUgZmlyc3QgZGVmaW5pdGlvbi4gICovCisgIC8vIFhYWCBJcyB0aGlzIGEgY29tcGF0aWJsZSBiZWhhdmlvcj8KKyAgYm9vbCBhbnlfdXNlZDsKKyAgaW50IG5yb3VuZCA9IDA7CisgIGRvCisgICAgeworICAgICAgYW55X3VzZWQgPSBmYWxzZTsKKworICAgICAgc2l6ZV90IGNudDsKKyAgICAgIGZvciAoY250ID0gMDsgY250IDwgbnN5bXM7ICsrY250KQorCXsKKwkgIHN0cnVjdCBzeW1ib2wgc2VhcmNoID0geyAubmFtZSA9IHN5bXNbY250XS5hc19uYW1lIH07CisJICBzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBsZF9zeW1ib2xfdGFiX2ZpbmQgKCZsZF9zdGF0ZS5zeW1ib2xfdGFiLAorCQkJCQkJICAgc3ltc1tjbnRdLmFzX2hhc2gsICZzZWFyY2gpOworCSAgaWYgKHN5bSAhPSBOVUxMICYmICEgc3ltLT5kZWZpbmVkKQorCSAgICB7CisJICAgICAgLyogVGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkIGFuZCBub3QgZGVmaW5lZC4gICovCisJICAgICAgRWxmICphcmVsZjsKKwkgICAgICBFbGZfQXJoZHIgKmFyaGRyOworCSAgICAgIHN0cnVjdCB1c2VkZmlsZXMgKm5ld3A7CisKKwkgICAgICAvKiBGaW5kIHRoZSBhcmNoaXZlIG1lbWJlciBmb3IgdGhpcyBzeW1ib2wuICAqLworCSAgICAgIGlmICh1bmxpa2VseSAoZWxmX3JhbmQgKGZpbGVpbmZvLT5lbGYsIHN5bXNbY250XS5hc19vZmYpCisJCQkgICAgIT0gc3ltc1tjbnRdLmFzX29mZikpCisJCWdvdG8gY2Fubm90X3JlYWRfYXJjaGl2ZTsKKworCSAgICAgIC8qIE5vdGU6IG5vIHRlc3Qgb2YgYSBmYWlsaW5nICdlbGZfYmVnaW4nIGNhbGwuICBUaGF0J3MgZmluZQorCQkgc2luY2UgJ2VsZidnZXRhcmhkcicgd2lsbCByZXBvcnQgdGhlIHByb2JsZW0uICAqLworCSAgICAgIGFyZWxmID0gZWxmX2JlZ2luIChmaWxlaW5mby0+ZmQsIEVMRl9DX1JFQURfTU1BUF9QUklWQVRFLAorCQkJCSBmaWxlaW5mby0+ZWxmKTsKKwkgICAgICBhcmhkciA9IGVsZl9nZXRhcmhkciAoYXJlbGYpOworCSAgICAgIGlmIChhcmhkciA9PSBOVUxMKQorCQlnb3RvIGNhbm5vdF9yZWFkX2FyY2hpdmU7CisKKwkgICAgICAvKiBXZSBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gYW5kIGFuIEVMRiBoYW5kbGUgZm9yIHRoZQorCQkgYXJjaGl2ZSBtZW1iZXIuICBDcmVhdGUgdGhlIG5vcm1hbCBkYXRhIHN0cnVjdHVyZSBmb3IKKwkJIGEgZmlsZSBub3cuICAqLworCSAgICAgIG5ld3AgPSBsZF9uZXdfaW5wdXRmaWxlIChvYnN0YWNrX3N0cmR1cCAoJmxkX3N0YXRlLnNtZW0sCisJCQkJCQkgICAgICAgYXJoZHItPmFyX25hbWUpLAorCQkJCSAgICAgICByZWxvY2F0YWJsZV9maWxlX3R5cGUpOworCSAgICAgIG5ld3AtPmFyY2hpdmVfZmlsZSA9IGZpbGVpbmZvOworCisJICAgICAgaWYgKHVubGlrZWx5IChsZF9zdGF0ZS50cmFjZV9maWxlcykpCisJCXByaW50X2ZpbGVfbmFtZSAoc3Rkb3V0LCBuZXdwLCAxLCAxKTsKKworCSAgICAgIC8qIFRoaXMgc2hvd3MgdGhhdCB0aGlzIGZpbGUgaXMgY29udGFpbmVkIGluIGFuIGFyY2hpdmUuICAqLworCSAgICAgIG5ld3AtPmZkID0gLTE7CisJICAgICAgLyogU3RvcmUgdGhlIEVMRiBkZXNjcmlwdG9yLiAgKi8KKwkgICAgICBuZXdwLT5lbGYgPSBhcmVsZjsKKwkgICAgICAvKiBTaG93IHRoYXQgd2UgYXJlIG9wZW4gZm9yIGJ1c2luZXNzLiAgKi8KKwkgICAgICBuZXdwLT5zdGF0dXMgPSBpbl9hcmNoaXZlOworCisJICAgICAgLyogTm93IHJlYWQgdGhlIGZpbGUgYW5kIGFkZCBhbGwgdGhlIHN5bWJvbHMuICAqLworCSAgICAgIHJlcyA9IGZpbGVfcHJvY2VzczIgKG5ld3ApOworCSAgICAgIGlmICh1bmxpa2VseSAocmVzICE9IDApKQorCQlyZXR1cm4gcmVzOworCisJICAgICAgYW55X3VzZWQgPSB0cnVlOworCSAgICB9CisJfQorCisgICAgICBpZiAoKytucm91bmQgPT0gMSkKKwl7CisJICAvKiBUaGlzIGlzIGFuIGFyY2hpdmUgdGhlcmVmb3JlIGl0IG11c3QgaGF2ZSBhIG51bWJlci4gICovCisJICBhc3NlcnQgKGZpbGVpbmZvLT5hcmNoaXZlX3NlcSAhPSAwKTsKKwkgIGxkX3N0YXRlLmxhc3RfYXJjaGl2ZV91c2VkID0gZmlsZWluZm8tPmFyY2hpdmVfc2VxOworCX0KKyAgICB9CisgIHdoaWxlIChhbnlfdXNlZCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgaW50CitmaWxlX3Byb2Nlc3MyIChzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlaW5mbykKK3sKKyAgaW50IHJlczsKKworICBpZiAobGlrZWx5IChlbGZfa2luZCAoZmlsZWluZm8tPmVsZikgPT0gRUxGX0tfRUxGKSkKKyAgICB7CisgICAgICAvKiBUaGUgZmlyc3QgdGltZSB3ZSBnZXQgaGVyZSB3ZSByZWFkIHRoZSBFTEYgaGVhZGVyLiAgKi8KKyNpZiBOQVRJVkVfRUxGICE9IDAKKyAgICAgIGlmIChsaWtlbHkgKGZpbGVpbmZvLT5laGRyID09IE5VTEwpKQorI2Vsc2UKKyAgICAgIGlmIChsaWtlbHkgKEZJTEVJTkZPX0VIRFIgKGZpbGVpbmZvLT5laGRyKS5lX3R5cGUgPT0gRVRfTk9ORSkpCisjZW5kaWYKKwl7CisJICBYRWxmX0VoZHIgKmVoZHI7CisjaWYgTkFUSVZFX0VMRiAhPSAwCisJICBlaGRyID0geGVsZl9nZXRlaGRyIChmaWxlaW5mby0+ZWxmLCBmaWxlaW5mby0+ZWhkcik7CisjZWxzZQorCSAgeGVsZl9nZXRlaGRyX2NvcHkgKGZpbGVpbmZvLT5lbGYsIGVoZHIsIGZpbGVpbmZvLT5laGRyKTsKKyNlbmRpZgorCSAgaWYgKGVoZHIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgZ2V0dGV4dCAoIiVzOiBpbnZhbGlkIEVMRiBmaWxlICglczolZClcbiIpLAorCQkgICAgICAgZmlsZWluZm8tPnJmbmFtZSwgX19GSUxFX18sIF9fTElORV9fKTsKKwkgICAgICBmaWxlaW5mby0+c3RhdHVzID0gY2xvc2VkOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisKKwkgIGlmIChGSUxFSU5GT19FSERSIChmaWxlaW5mby0+ZWhkcikuZV90eXBlICE9IEVUX1JFTAorCSAgICAgICYmIHVubGlrZWx5IChGSUxFSU5GT19FSERSIChmaWxlaW5mby0+ZWhkcikuZV90eXBlICE9IEVUX0RZTikpCisJICAgIC8qIFhYWCBBZGQgZWJsKiBmdW5jdGlvbiB0byBxdWVyeSB0eXBlcyB3aGljaCBhcmUgYWxsb3dlZAorCSAgICAgICB0byBsaW5rIGluLiAgKi8KKwkgICAgeworCSAgICAgIGNoYXIgYnVmWzY0XTsKKworCSAgICAgIHByaW50X2ZpbGVfbmFtZSAoc3RkZXJyLCBmaWxlaW5mbywgMSwgMCk7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLAorCQkgICAgICAgZ2V0dGV4dCAoImZpbGUgb2YgdHlwZSAlcyBjYW5ub3QgYmUgbGlua2VkIGluXG4iKSwKKwkJICAgICAgIGVibF9vYmplY3RfdHlwZV9uYW1lIChsZF9zdGF0ZS5lYmwsCisJCQkJCSAgICAgRklMRUlORk9fRUhEUiAoZmlsZWluZm8tPmVoZHIpLmVfdHlwZSwKKwkJCQkJICAgICBidWYsIHNpemVvZiAoYnVmKSkpOworCSAgICAgIGZpbGVpbmZvLT5zdGF0dXMgPSBjbG9zZWQ7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKworCSAgLyogRGV0ZXJtaW5lIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgc2VjdGlvbiBpbmRleC4gICovCisJICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaHN0cm5keCAoZmlsZWluZm8tPmVsZiwgJmZpbGVpbmZvLT5zaHN0cm5keCkKKwkJCTwgMCkpCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsIGdldHRleHQgKCJcCislczogY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICVzXG4iKSwKKwkJICAgICAgIGZpbGVpbmZvLT5yZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7CisJICAgICAgZmlsZWluZm8tPnN0YXR1cyA9IGNsb3NlZDsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKworICAgICAgLyogTm93IGhhbmRsZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGZpbGVzLiAgKi8KKyAgICAgIGlmIChGSUxFSU5GT19FSERSIChmaWxlaW5mby0+ZWhkcikuZV90eXBlID09IEVUX1JFTCkKKwl7CisJICAvKiBBZGQgYWxsIHRoZSBzeW1ib2wuICBSZWxvY2F0YWJsZSBmaWxlcyBoYXZlIHN5bWJvbAorCSAgICAgdGFibGVzLiAgKi8KKwkgIHJlcyA9IGFkZF9yZWxvY2F0YWJsZV9maWxlIChmaWxlaW5mbywgU0hUX1NZTVRBQik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJvb2wgaGFzX2xfbmFtZSA9IGZpbGVpbmZvLT5maWxlX3R5cGUgPT0gYXJjaGl2ZV9maWxlX3R5cGU7CisKKwkgIGFzc2VydCAoRklMRUlORk9fRUhEUiAoZmlsZWluZm8tPmVoZHIpLmVfdHlwZSA9PSBFVF9EWU4pOworCisJICAvKiBJZiB0aGUgZmlsZSBpcyBhIERUX05FRURFRCBkZXBlbmRlbmN5IHRoZW4gdGhlIHR5cGUgaXMKKwkgICAgIGFscmVhZHkgY29ycmVjdGx5IHNwZWNpZmllZC4gICovCisJICBpZiAoZmlsZWluZm8tPmZpbGVfdHlwZSAhPSBkc29fbmVlZGVkX2ZpbGVfdHlwZSkKKwkgICAgZmlsZWluZm8tPmZpbGVfdHlwZSA9IGRzb19maWxlX3R5cGU7CisKKwkgIC8qIFdlIGNhbm5vdCB1c2UgRFNPcyB3aGVuIGdlbmVyYXRpbmcgcmVsb2NhdGFibGUgb2JqZWN0cy4gICovCisJICBpZiAobGRfc3RhdGUuZmlsZV90eXBlID09IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZSkKKwkgICAgeworCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiXAorY2Fubm90IHVzZSBEU08gJyVzJyB3aGVuIGdlbmVyYXRpbmcgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUiKSwKKwkJICAgICBmaWxlaW5mby0+Zm5hbWUpOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisKKwkgIC8qIEFkZCBhbGwgdGhlIHN5bWJvbHMuICBGb3IgRFNPcyB3ZSBhcmUgbG9va2luZyBhdCB0aGUKKwkgICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KKwkgIHJlcyA9IGFkZF9yZWxvY2F0YWJsZV9maWxlIChmaWxlaW5mbywgU0hUX0RZTlNZTSk7CisKKwkgIC8qIFdlIGFsd2F5cyBoYXZlIHRvIGhhdmUgYSBkeW5hbWljIHNlY3Rpb24uICAqLworCSAgYXNzZXJ0IChmaWxlaW5mby0+ZHluc2NuICE9IE5VTEwpOworCisJICAvKiBXZSBoYXZlIHRvIHJlbWVtYmVyIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgb2JqZWN0LiAgSXQKKwkgICAgIGlzIG5lY2Vzc2FyeSB0byBsb29rIHRoZW0gdXAuICAqLworCSAgWEVsZl9TaGRyX3ZhcmRlZiAoZHluc2hkcik7CisJICB4ZWxmX2dldHNoZHIgKGZpbGVpbmZvLT5keW5zY24sIGR5bnNoZHIpOworCisJICBFbGZfRGF0YSAqZHluZGF0YSA9IGVsZl9nZXRkYXRhIChmaWxlaW5mby0+ZHluc2NuLCBOVUxMKTsKKwkgIC8qIFhYWCBTaG91bGQgd2UgZmxhZyB0aGUgZmFpbHVyZSB0byBnZXQgdGhlIGR5bmFtaWMgc2VjdGlvbj8gICovCisJICBpZiAoZHluc2hkciAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaW50IGNudCA9IGR5bnNoZHItPnNoX3NpemUgLyBkeW5zaGRyLT5zaF9lbnRzaXplOworCSAgICAgIFhFbGZfRHluX3ZhcmRlZiAoZHluKTsKKworCSAgICAgIHdoaWxlICgtLWNudCA+PSAwKQorCQl7CisJCSAgeGVsZl9nZXRkeW4gKGR5bmRhdGEsIGNudCwgZHluKTsKKwkJICBpZiAoZHluICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGlmKGR5bi0+ZF90YWcgPT0gRFRfTkVFREVEKQorCQkJeworCQkJICBzdHJ1Y3QgdXNlZGZpbGVzICpuZXdwOworCisJCQkgIG5ld3AgPSBsZF9uZXdfaW5wdXRmaWxlIChlbGZfc3RycHRyIChmaWxlaW5mby0+ZWxmLAorCQkJCQkJCSAgICAgICBkeW5zaGRyLT5zaF9saW5rLAorCQkJCQkJCSAgICAgICBkeW4tPmRfdW4uZF92YWwpLAorCQkJCQkJICAgZHNvX25lZWRlZF9maWxlX3R5cGUpOworCisJCQkgIC8qIEVucXVldWUgdGhlIG5ld2x5IGZvdW5kIGRlcGVuZGVuY2llcy4gICovCisJCQkgIC8vIFhYWCBDaGVjayB0aGF0IHRoZXJlIG5vdCBhbHJlYWR5IGEgZmlsZSB3aXRoIHRoZQorCQkJICAvLyBzYW1lIG5hbWUuCisJCQkgIENTTkdMX0xJU1RfQUREX1JFQVIgKGxkX3N0YXRlLm5lZWRlZCwgbmV3cCk7CisJCQl9CisJCSAgICAgIGVsc2UgaWYgKGR5bi0+ZF90YWcgPT0gRFRfU09OQU1FKQorCQkJeworCQkJICAvKiBXZSB1c2UgdGhlIERUX1NPTkFNRSAodGhpcyBpcyB3aGF0J3MgdGhlcmUKKwkJCSAgICAgZm9yKS4gICovCisJCQkgIGZpbGVpbmZvLT5zb25hbWUgPSBlbGZfc3RycHRyIChmaWxlaW5mby0+ZWxmLAorCQkJCQkJCSBkeW5zaGRyLT5zaF9saW5rLAorCQkJCQkJCSBkeW4tPmRfdW4uZF92YWwpOworCQkJICBoYXNfbF9uYW1lID0gZmFsc2U7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICAvKiBDb25zdHJ1Y3QgdGhlIGZpbGUgbmFtZSBpZiB0aGUgRFNPIGhhcyBubyBTT05BTUUgYW5kIHRoZQorCSAgICAgZmlsZSBuYW1lIGNvbWVzIGZyb20gYSAtbFhYIHBhcmFtZXRlciBvbiB0aGUgY29tbWVudAorCSAgICAgbGluZS4gICovCisJICBpZiAodW5saWtlbHkgKGhhc19sX25hbWUpKQorCSAgICB7CisJICAgICAgLyogVGhlIEZOQU1FIGlzIHRoZSBwYXJhbWV0ZXIgdGhlIHVzZXIgc3BlY2lmaWVkIG9uIHRoZQorCQkgY29tbWFuZCBsaW5lLiAgV2UgcHJlcGVuZCAibGliIiBhbmQgYXBwZW5kICIuc28iLiAgKi8KKwkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChmaWxlaW5mby0+Zm5hbWUpICsgNzsKKwkgICAgICBjaGFyICpuZXdwOworCisJICAgICAgbmV3cCA9IChjaGFyICopIG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBsZW4pOworCSAgICAgIHN0cmNweSAoc3RwY3B5IChzdHBjcHkgKG5ld3AsICJsaWIiKSwgZmlsZWluZm8tPmZuYW1lKSwgIi5zbyIpOworCisJICAgICAgZmlsZWluZm8tPnNvbmFtZSA9IG5ld3A7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmIChsaWtlbHkgKGVsZl9raW5kIChmaWxlaW5mby0+ZWxmKSA9PSBFTEZfS19BUikpCisgICAgeworICAgICAgaWYgKHVubGlrZWx5IChsZF9zdGF0ZS5leHRyYWN0X3J1bGUgPT0gYWxsZXh0cmFjdCkpCisJLyogV2hpY2ggdGhpcyBvcHRpb24gZW5hYmxlZCB3ZSBoYXZlIHRvIGFkZCBhbGwgdGhlIG9iamVjdAorCSAgIGZpbGVzIGluIHRoZSBhcmNoaXZlLiAgKi8KKwlyZXMgPSBhZGRfd2hvbGVfYXJjaGl2ZSAoZmlsZWluZm8pOworICAgICAgZWxzZSBpZiAobGRfc3RhdGUuZmlsZV90eXBlID09IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZSkKKwl7CisJICAvKiBXaGVuIGdlbmVyYXRpbmcgYSByZWxvY2F0YWJsZSBvYmplY3Qgd2UgZG9uJ3QgZmluZCBmaWxlcworCSAgICAgaW4gYXJjaGl2ZXMuICAqLworCSAgaWYgKHZlcmJvc2UpCisJICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiaW5wdXQgZmlsZSAnJXMnIGlnbm9yZWQiKSwgZmlsZWluZm8tPmZuYW1lKTsKKworCSAgcmVzID0gMDsKKwl9CisgICAgICBlbHNlCisJLyogRXh0cmFjdCBvbmx5IHRoZSBtZW1iZXJzIGZyb20gdGhlIGFyY2hpdmUgd2hpY2ggYXJlCisJICAgY3VycmVudGx5IHJlZmVyZW5jZWQgYnkgdW5yZXNvbHZlZCBzeW1ib2xzLiAgKi8KKwlyZXMgPSBleHRyYWN0X2Zyb21fYXJjaGl2ZSAoZmlsZWluZm8pOworICAgIH0KKyAgZWxzZQorICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgd2Uga25vdyBhYm91dCBubyBvdGhlciB0eXBlcy4gICovCisgICAgYWJvcnQgKCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworCisvKiBQcm9jZXNzIGEgZ2l2ZW4gZmlsZS4gIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBmaWxlIGRlc2NyaXB0b3IgZm9yCisgICB0aGUgZmlsZSB3aGljaCBjYW4gYmUgLTEgdG8gaW5kaWNhdGUgdGhlIGZpbGUgaGFzIG5vdCB5ZXQgYmVlbgorICAgZm91bmQuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBkZXNjcmliZXMgdGhlIGZpbGUgdG8gYmUgb3BlbmVkLCB0aGUKKyAgIGxhc3Qgb25lIGlzIHRoZSBzdGF0ZSBvZiB0aGUgbGlua2VyIHdoaWNoIGFtb25nIG90aGVyIGluZm9ybWF0aW9uCisgICBjb250YWluIHRoZSBwYXRocyB3ZSBsb29rIGF0LiAgKi8KK3N0YXRpYyBpbnQKK2xkX2dlbmVyaWNfZmlsZV9wcm9jZXNzIChpbnQgZmQsIHN0cnVjdCB1c2VkZmlsZXMgKmZpbGVpbmZvLAorCQkJIHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwLCBzdHJ1Y3QgdXNlZGZpbGVzICoqbmV4dHApCit7CisgIGludCByZXMgPSAwOworCisgIC8qIEJ5IGRlZmF1bHQgd2UgZ28gdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUgbGlzdC4gICovCisgICpuZXh0cCA9IGZpbGVpbmZvLT5uZXh0OworCisgIC8qIFNldCB0aGUgZmxhZyB0byBzaWduYWwgd2UgYXJlIGxvb2tpbmcgZm9yIGEgZ3JvdXAgc3RhcnQuICAqLworICBpZiAodW5saWtlbHkgKGZpbGVpbmZvLT5ncm91cF9zdGFydCkpCisgICAgeworICAgICAgbGRfc3RhdGUuZ3JvdXBfc3RhcnRfcmVxdWVzdGVkID0gdHJ1ZTsKKyAgICAgIGZpbGVpbmZvLT5ncm91cF9zdGFydCA9IGZhbHNlOworICAgIH0KKworICAvKiBJZiB0aGUgZmlsZSBpc24ndCBvcGVuIHlldCwgb3BlbiBpdCBub3cuICAqLworICBpZiAobGlrZWx5IChmaWxlaW5mby0+c3RhdHVzID09IG5vdF9vcGVuZWQpKQorICAgIHsKKyAgICAgIGJvb2wgZmRfcGFzc2VkID0gdHJ1ZTsKKworICAgICAgaWYgKGxpa2VseSAoZmQgPT0gLTEpKQorCXsKKwkgIC8qIEZpbmQgdGhlIGZpbGUgb3Vyc2VsdmVzLiAgKi8KKwkgIGludCBlcnIgPSBvcGVuX2Fsb25nX3BhdGggKGZpbGVpbmZvKTsKKwkgIGlmICh1bmxpa2VseSAoZXJyICE9IDApKQorCSAgICAvKiBXZSBhbGxvdyBsaWJyYXJpZXMgYW5kIERTT3MgdG8gYmUgbmFtZWQgbW9yZSB0aGFuIG9uY2UuCisJICAgICAgIERvbid0IHJlcG9ydCBhbiBlcnJvciB0byB0aGUgY2FsbGVyLiAgKi8KKwkgICAgcmV0dXJuIGVyciA9PSBFQUdBSU4gPyAwIDogZXJyOworCisJICBmZF9wYXNzZWQgPSBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJZmlsZWluZm8tPmZkID0gZmQ7CisKKyAgICAgIC8qIFJlbWVtYmVyIHdoZXJlIHdlIGdvdCB0aGUgZGVzY3JpcHRvciBmcm9tLiAgKi8KKyAgICAgIGZpbGVpbmZvLT5mZF9wYXNzZWQgPSBmZF9wYXNzZWQ7CisKKyAgICAgIC8qIFdlIGZvdW5kIHRoZSBmaWxlLiAgTm93IHRlc3Qgd2hldGhlciBpdCBpcyBhIGZpbGUgdHlwZSB3ZSBjYW4KKwkgaGFuZGxlLgorCisJIFhYWCBEbyB3ZSBoYXZlIHRvIGhhdmUgdGhlIGFiaWxpdHkgdG8gc3RhcnQgZnJvbSBhIGdpdmVuCisJIHBvc2l0aW9uIGluIHRoZSBzZWFyY2ggcGF0aCBhZ2FpbiB0byBsb29rIGZvciBhbm90aGVyIGZpbGUgaWYKKwkgdGhlIG9uZSBmb3VuZCBoYXMgbm90IHRoZSByaWdodCB0eXBlPyAgKi8KKyAgICAgIHJlcyA9IG9wZW5fZWxmIChmaWxlaW5mbywgZWxmX2JlZ2luIChmaWxlaW5mby0+ZmQsCisJCQkJCSAgIGlzX2Rzb19wIChmaWxlaW5mby0+ZmQpCisJCQkJCSAgID8gRUxGX0NfUkVBRF9NTUFQCisJCQkJCSAgIDogRUxGX0NfUkVBRF9NTUFQX1BSSVZBVEUsIE5VTEwpKTsKKyAgICAgIGlmICh1bmxpa2VseSAocmVzICE9IDApKQorCXJldHVybiByZXM7CisgICAgfQorCisgIC8qIE5vdyB0aGF0IHdlIGhhdmUgb3BlbmVkIHRoZSBmaWxlIHN0YXJ0IHByb2Nlc3NpbmcgaXQuICAqLworICBpZiAobGlrZWx5IChmaWxlaW5mby0+c3RhdHVzICE9IGNsb3NlZCkpCisgICAgcmVzID0gZmlsZV9wcm9jZXNzMiAoZmlsZWluZm8pOworCisgIC8qIERldGVybWluZSB3aGljaCBmaWxlIHRvIGxvb2sgYXQgbmV4dC4gICovCisgIGlmICh1bmxpa2VseSAoZmlsZWluZm8tPmdyb3VwX2JhY2tyZWYgIT0gTlVMTCkpCisgICAgeworICAgICAgLyogV2Ugb25seSBnbyBiYWNrIGlmIGFuIGFyY2hpdmUgb3RoZXIgdGhhbiB0aGUgb25lIHdlIHdvdWxkIGdvCisJIGJhY2sgdG8gaGFzIGJlZW4gdXNlZCBpbiB0aGUgbGFzdCByb3VuZC4gICovCisgICAgICBpZiAobGRfc3RhdGUubGFzdF9hcmNoaXZlX3VzZWQgPiBmaWxlaW5mby0+Z3JvdXBfYmFja3JlZi0+YXJjaGl2ZV9zZXEpCisJeworCSAgKm5leHRwID0gZmlsZWluZm8tPmdyb3VwX2JhY2tyZWY7CisJICBsZF9zdGF0ZS5sYXN0X2FyY2hpdmVfdXNlZCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIElmIHdlIGNvbWUgaGVyZSB0aGlzIG1lYW5zIHRoYXQgdGhlIGFyY2hpdmVzIHdlIHJlYWQgc28KKwkgICAgIGZhciBhcmUgbm90IG5lZWRlZCBhbnltb3JlLiAgV2UgY2FuIGZyZWUgc29tZSBvZiB0aGUgZGF0YQorCSAgICAgbm93LiAgKi8KKwkgIHN0cnVjdCB1c2VkZmlsZXMgKnJ1bnAgPSBsZF9zdGF0ZS5hcmNoaXZlczsKKworCSAgZG8KKwkgICAgeworCSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIEVMRiBkZXNjcmlwdG9yIGFueW1vcmUuICBVbmxlc3MgdGhlcmUKKwkJIGFyZSBubyBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHVzZWQgdGhpcyB3aWxsIG5vdCBmcmVlCisJCSB0aGUgd2hvbGUgZmlsZSBidXQgb25seSBzb21lIGRhdGEgc3RydWN0dXJlcy4gICovCisJICAgICAgZWxmX2VuZCAocnVucC0+ZWxmKTsKKwkgICAgICBydW5wLT5lbGYgPSBOVUxMOworCisJICAgICAgcnVucCA9IHJ1bnAtPm5leHQ7CisJICAgIH0KKwkgIHdoaWxlIChydW5wICE9IGZpbGVpbmZvLT5uZXh0KTsKKwl9CisgICAgfQorICBlbHNlIGlmICh1bmxpa2VseSAoZmlsZWluZm8tPmdyb3VwX2VuZCkpCisgICAgeworICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIGEgZ3JvdXAuICBXZSBwb3NzaWJseSBvZiB0byBnbyBiYWNrLgorCSBEZXRlcm1pbmUgd2hpY2ggZmlsZSB3ZSB3b3VsZCBnbyBiYWNrIHRvIGFuZCBzZWUgd2hldGhlciBpdAorCSBtYWtlcyBzZW5zZS4gIElmIHRoZXJlIGhhcyBub3QgYmVlbiBhbiBhcmNoaXZlIHdlIGRvbid0IGhhdmUKKwkgdG8gZG8gYW55dGhpbmcuICAqLworICAgICAgaWYgKCFsZF9zdGF0ZS5ncm91cF9zdGFydF9yZXF1ZXN0ZWQpCisJeworCSAgaWYgKGxkX3N0YXRlLmdyb3VwX3N0YXJ0X2FyY2hpdmUgIT0gbGRfc3RhdGUudGFpbGFyY2hpdmVzKQorCSAgICAvKiBUaGUgbG9vcCB3b3VsZCBpbmNsdWRlIG1vcmUgdGhhbiBvbmUgYXJjaGl2ZSwgYWRkIHRoZQorCSAgICAgICBwb2ludGVyLiAgKi8KKwkgICAgeworCSAgICAgICpuZXh0cCA9IGxkX3N0YXRlLnRhaWxhcmNoaXZlcy0+Z3JvdXBfYmFja3JlZiA9CisJCWxkX3N0YXRlLmdyb3VwX3N0YXJ0X2FyY2hpdmU7CisJICAgICAgbGRfc3RhdGUubGFzdF9hcmNoaXZlX3VzZWQgPSAwOworCSAgICB9CisJICBlbHNlCisJICAgIC8qIFdlIG1pZ2h0IHN0aWxsIGhhdmUgdG8gZ28gYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCSAgICAgICBncm91cCBpZiBzaW5jZSB0aGUgbGFzdCBhcmNoaXZlIG90aGVyIGZpbGVzIGhhdmUgYmVlbgorCSAgICAgICBhZGRlZC4gIEJ1dCB3ZSBnbyBiYWNrIGV4YWN0bHkgb25jZS4gICovCisJICAgIGlmIChsZF9zdGF0ZS50YWlsYXJjaGl2ZXMgIT0gZmlsZWluZm8pCisJICAgICAgeworCQkqbmV4dHAgPSBsZF9zdGF0ZS5ncm91cF9zdGFydF9hcmNoaXZlOworCQlsZF9zdGF0ZS5sYXN0X2FyY2hpdmVfdXNlZCA9IDA7CisJICAgICAgfQorCX0KKworICAgICAgLyogQ2xlYXIgdGhlIGZsYWdzLiAgKi8KKyAgICAgIGxkX3N0YXRlLmdyb3VwX3N0YXJ0X3JlcXVlc3RlZCA9IGZhbHNlOworICAgICAgZmlsZWluZm8tPmdyb3VwX2VuZCA9IGZhbHNlOworICAgIH0KKworICByZXR1cm4gcmVzOworfQorCisKKy8qIExpYnJhcnkgbmFtZXMgcGFzc2VkIHRvIHRoZSBsaW5rZXIgYXMgLWxYWCByZXByZXNlbnQgZmlsZXMgbmFtZWQKKyAgIGxpYlhYLllZLiAgVGhlIFlZIHBhcnQgY2FuIGhhdmUgZGlmZmVyZW50IGZvcm1zLCBkZXBlbmRpbmcgb24gdGhlCisgICBwbGF0Zm9ybS4gIFRoZSBnZW5lcmljIHNldCBpcyAuc28gYW5kIC5hIChpbiB0aGlzIG9yZGVyKS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqKgorbGRfZ2VuZXJpY19saWJfZXh0ZW5zaW9ucyAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmV4dHNbXSA9CisgICAgeworICAgICAgIi5zbyIsICIuYSIsIE5VTEwKKyAgICB9OworCisgIHJldHVybiBleHRzOworfQorCisKKy8qIEZsYWcgdW5yZXNvbHZlZCBzeW1ib2xzLiAgKi8KK3N0YXRpYyBpbnQKK2xkX2dlbmVyaWNfZmxhZ191bnJlc29sdmVkIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCkKK3sKKyAgaW50IHJldHZhbCA9IDA7CisKKyAgaWYgKGxkX3N0YXRlLm51bnJlc29sdmVkX25vbndlYWsgPiAwKQorICAgIHsKKyAgICAgIC8qIEdvIHRocm91Z2ggdGhlIGxpc3QgYW5kIGRldGVybWluZSB0aGUgdW5yZXNvbHZlZCBzeW1ib2xzLiAgKi8KKyAgICAgIHN0cnVjdCBzeW1ib2wgKmZpcnN0OworICAgICAgc3RydWN0IHN5bWJvbCAqczsKKworICAgICAgcyA9IGZpcnN0ID0gbGRfc3RhdGUudW5yZXNvbHZlZC0+bmV4dDsKKyAgICAgIGRvCisJeworCSAgaWYgKCEgcy0+ZGVmaW5lZCAmJiAhIHMtPndlYWspCisJICAgIHsKKwkgICAgICAvKiBUd28gc3BlY2lhbCBzeW1ib2wgd2UgcmVjb2duaXplOiB0aGUgc3ltYm9sIGZvciB0aGUKKwkJIEdPVCBhbmQgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCisJICAgICAgaWYgKHN0cmNtcCAocy0+bmFtZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKKwkJICB8fCBzdHJjbXAgKHMtPm5hbWUsICJfRFlOQU1JQyIpID09IDApCisJCXsKKwkJICAvKiBXZSB3aWxsIGhhdmUgdG8gZmlsbCBpbiBtb3JlIGluZm9ybWF0aW9uIGxhdGVyLiAgKi8KKwkJICBsZF9zdGF0ZS5uZWVkX2dvdCA9IHRydWU7CisKKwkJICAvKiBSZW1lbWJlciB0aGF0IHdlIGZvdW5kIGl0LiAgKi8KKwkJICBpZiAocy0+bmFtZVsxXSA9PSAnRycpCisJCSAgICBsZF9zdGF0ZS5nb3Rfc3ltYm9sID0gczsKKwkJICBlbHNlCisJCSAgICBsZF9zdGF0ZS5keW5fc3ltYm9sID0gczsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGxkX3N0YXRlLmZpbGVfdHlwZSAhPSBkc29fZmlsZV90eXBlIHx8ICFsZF9zdGF0ZS5ub2RlZnMpCisJCXsKKwkJICAvKiBYWFggVGhlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGdldCBiZXR0ZXIuICBJdCBzaG91bGQgdXNlCisJCSAgICAgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpZiBwcmVzZW50IHRvIHRlbGwgd2hlcmUgaW4gdGhlCisJCSAgICAgc291cmNlcyB0aGUgdW5kZWZpbmVkIHJlZmVyZW5jZSBpcy4gICovCisJCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJ1bmRlZmluZWQgc3ltYm9sIGAlcycgaW4gJXMiKSwKKwkJCSBzLT5uYW1lLCBzLT5maWxlLT5mbmFtZSk7CisKKwkJICByZXR2YWwgPSAxOworCQl9CisJICAgIH0KKworCSAgLyogV2UgY2Fubm90IGRlY2lkZSBoZXJlIHdoYXQgdG8gZG8gd2l0aCB1bmRlZmluZWQKKwkgICAgIHJlZmVyZW5jZXMgd2hpY2ggd2lsbCBjb21lIGZyb20gRFNPIHNpbmNlIHdlIGRvIG5vdCBrbm93CisJICAgICB3aGF0IGtpbmQgb2Ygc3ltYm9sIHdlIGV4cGVjdC4gIE9ubHkgd2hlbiBsb29raW5nIGF0IHRoZQorCSAgICAgcmVsb2NhdGlvbnMgd2UgY2FuIHNlZSB3aGV0aGVyIHdlIG5lZWQgYSBQTFQgZW50cnkgb3IKKwkgICAgIG9ubHkgYSBHT1QgZW50cnkuICAqLworCisJICBzID0gcy0+bmV4dDsKKwl9CisgICAgICB3aGlsZSAocyAhPSBmaXJzdCk7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyogQ2xvc2UgdGhlIGdpdmVuIGZpbGUuICAqLworc3RhdGljIGludAorbGRfZ2VuZXJpY19maWxlX2Nsb3NlIChzdHJ1Y3QgdXNlZGZpbGVzICpmaWxlaW5mbywgc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApCit7CisgIC8qIENsb3NlIHRoZSBFTEYgZGVzY3JpcHRvci4gICovCisgIGVsZl9lbmQgKGZpbGVpbmZvLT5lbGYpOworCisgIC8qIElmIHdlIGhhdmUgb3BlbmVkIHRoZSBmaWxlIGRlc2NyaXB0b3IgY2xvc2UgaXQuICBCdXQgd2UgbWlnaHQKKyAgICAgaGF2ZSBkb25lIHRoaXMgYWxyZWFkeSBpbiB3aGljaCBjYXNlIEZEIGlzIC0xLiAgKi8KKyAgaWYgKCFmaWxlaW5mby0+ZmRfcGFzc2VkICYmIGZpbGVpbmZvLT5mZCAhPSAtMSkKKyAgICBjbG9zZSAoZmlsZWluZm8tPmZkKTsKKworICAvKiBXZSBhbGxvY2F0ZWQgdGhlIHJlc29sdmVkIGZpbGUgbmFtZS4gICovCisgIGlmIChmaWxlaW5mby0+Zm5hbWUgIT0gZmlsZWluZm8tPnJmbmFtZSkKKyAgICBmcmVlICgoY2hhciAqKSBmaWxlaW5mby0+cmZuYW1lKTsKKworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorbmV3X2dlbmVyYXRlZF9zY24gKGVudW0gc2NuX2tpbmQga2luZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUsIGludCBmbGFncywKKwkJICAgaW50IGVudHNpemUsIGludCBhbGlnbikKK3sKKyAgc3RydWN0IHNjbmhlYWQgKm5ld3A7CisKKyAgbmV3cCA9IChzdHJ1Y3Qgc2NuaGVhZCAqKSBvYnN0YWNrX2NhbGxvYyAoJmxkX3N0YXRlLnNtZW0sCisJCQkJCSAgICBzaXplb2YgKHN0cnVjdCBzY25oZWFkKSk7CisgIG5ld3AtPmtpbmQgPSBraW5kOworICBuZXdwLT5uYW1lID0gbmFtZTsKKyAgbmV3cC0+bmFtZWVudCA9IGVibF9zdHJ0YWJhZGQgKGxkX3N0YXRlLnNoc3RydGFiLCBuYW1lLCAwKTsKKyAgbmV3cC0+dHlwZSA9IHR5cGU7CisgIG5ld3AtPmZsYWdzID0gZmxhZ3M7CisgIG5ld3AtPmVudHNpemUgPSBlbnRzaXplOworICBuZXdwLT5hbGlnbiA9IGFsaWduOworICBuZXdwLT5ncnBfc2lnbmF0dXJlID0gTlVMTDsKKyAgbmV3cC0+dXNlZCA9IHRydWU7CisKKyAgLyogQWxsIGlzIHdlbGwuICBDcmVhdGUgbm93IHRoZSBkYXRhIGZvciB0aGUgc2VjdGlvbiBhbmQgaW5zZXJ0IGl0CisgICAgIGludG8gdGhlIHNlY3Rpb24gdGFibGUuICAqLworICBsZF9zZWN0aW9uX3RhYl9pbnNlcnQgKCZsZF9zdGF0ZS5zZWN0aW9uX3RhYiwgZWxmX2hhc2ggKG5hbWUpLCBuZXdwKTsKK30KKworCisvKiBDcmVhdGUgdGhlIHNlY3Rpb25zIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGxpbmtlciBhbmQgYXJlIG5vdAorICAgcHJlc2VudCBpbiB0aGUgaW5wdXQgZmlsZS4gICovCitzdGF0aWMgdm9pZAorbGRfZ2VuZXJpY19nZW5lcmF0ZV9zZWN0aW9ucyAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApCit7CisgIC8qIFRoZSByZWxvY2F0aW9uIHNlY3Rpb24gdHlwZS4gICovCisgIGludCByZWxfdHlwZSA9IFJFTF9UWVBFICgmbGRfc3RhdGUpID09IERUX1JFTCA/IFNIVF9SRUwgOiBTSFRfUkVMQTsKKworICAvKiBXaGVuIGJ1aWxkaW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBvYmplY3Qgd2UgaGF2ZSB0byBpbmNsdWRlIGEKKyAgICAgc2VjdGlvbiBjb250YWluaW5nIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGludGVycHJldGVyLiAgVGhpcworICAgICBzaG91bGQgYmUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRvZ2V0aGVyIHdpdGggdGhlCisgICAgIG90aGVyIGluZm9ybWF0aW9uIHRoZSBFTEYgbG9hZGVyIChrZXJuZWwgb3Igd2hlcmV2ZXIpIGhhcyB0byBsb29rCisgICAgIGF0LiAgV2UgcHV0IGl0IGFzIHRoZSBmaXJzdCBzZWN0aW9uIGluIHRoZSBmaWxlLgorCisgICAgIFdlIGFsc28gaGF2ZSB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VnbWVudCB3aGljaCBpcyBhIHNwZWNpYWwKKyAgICAgc2VjdGlvbiB0aGUgZHluYW1pYyBsaW5rZXIgbG9jYXRlcyB0aHJvdWdoIGFuIGVudHJ5IGluIHRoZQorICAgICBwcm9ncmFtIGhlYWRlci4gICovCisgIGlmIChkeW5hbWljYWxseV9saW5rZWRfcCAoKSkKKyAgICB7CisgICAgICBpbnQgbmR0X25lZWRlZDsKKyAgICAgIC8qIFVzZSBhbnkgdmVyc2lvbmluZyAoZGVmaW5lZCBvciByZXF1aXJlZCk/ICAqLworICAgICAgYm9vbCB1c2VfdmVyc2lvbmluZyA9IGZhbHNlOworICAgICAgLyogVXNlIHZlcnNpb24gcmVxdWlyZW1lbnRzPyAgKi8KKyAgICAgIGJvb2wgbmVlZF92ZXJzaW9uID0gZmFsc2U7CisKKyAgICAgIC8qIEZpcnN0IHRoZSAuaW50ZXJwIHNlY3Rpb24uICAqLworICAgICAgbmV3X2dlbmVyYXRlZF9zY24gKHNjbl9kb3RfaW50ZXJwLCAiLmludGVycCIsIFNIVF9QUk9HQklUUywgU0hGX0FMTE9DLAorCQkJIDAsIDEpOworCisgICAgICAvKiBOb3cgdGhlIC5keW5hbWljIHNlY3Rpb24uICAqLworICAgICAgbmV3X2dlbmVyYXRlZF9zY24gKHNjbl9kb3RfZHluYW1pYywgIi5keW5hbWljIiwgU0hUX0RZTkFNSUMsCisJCQkgRFlOQU1JQ19TRUNUSU9OX0ZMQUdTICgmbGRfc3RhdGUpLAorCQkJIHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfRFlOLCAxKSwKKwkJCSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX0FERFIsIDEpKTsKKworICAgICAgLyogV2Ugd2lsbCBuZWVkIGluIGFueSBjYXNlIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSAoZXZlbiBpbgorCSB0aGUgdW5saWtlbHkgY2FzZSB0aGF0IG5vIHN5bWJvbCBpcyBleHBvcnRlZCBvciByZWZlcmVuY2VkCisJIGZyb20gYSBEU08pLiAgKi8KKyAgICAgIGxkX3N0YXRlLm5lZWRfZHluc3ltID0gdHJ1ZTsKKyAgICAgIG5ld19nZW5lcmF0ZWRfc2NuIChzY25fZG90X2R5bnN5bSwgIi5keW5zeW0iLCBTSFRfRFlOU1lNLCBTSEZfQUxMT0MsCisJCQkgeGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9TWU0sIDEpLAorCQkJIHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfQUREUiwgMSkpOworICAgICAgLyogSXQgY29tZXMgd2l0aCBhIHN0cmluZyB0YWJsZS4gICovCisgICAgICBuZXdfZ2VuZXJhdGVkX3NjbiAoc2NuX2RvdF9keW5zdHIsICIuZHluc3RyIiwgU0hUX1NUUlRBQiwgU0hGX0FMTE9DLAorCQkJIDAsIDEpOworICAgICAgLyogQW5kIGEgaGFzaGluZyB0YWJsZS4gICovCisgICAgICAvLyBYWFggRm9yIExpbnV4L0FscGhhIHdlIG5lZWQgb3RoZXIgc2l6ZXMgdW5sZXNzIHRoZXkgY2hhbmdlLi4uCisgICAgICBuZXdfZ2VuZXJhdGVkX3NjbiAoc2NuX2RvdF9oYXNoLCAiLmhhc2giLCBTSFRfSEFTSCwgU0hGX0FMTE9DLAorCQkJIHNpemVvZiAoRWxmMzJfV29yZCksIHNpemVvZiAoRWxmMzJfV29yZCkpOworCisgICAgICAvKiBCeSBkZWZhdWx0IHdlIGFkZCBhbGwgRFNPcyBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWYKKwkgdGhlIHVzZXIgYWRkZWQgJy16IGlnbm9yZScgdG8gdGhlIGNvbW1hbmQgbGluZSB3ZSBvbmx5IGFkZAorCSB0aG9zZSB3aGljaCBhcmUgYWN0dWFsbHkgdXNlZC4gICovCisgICAgICBuZHRfbmVlZGVkID0gbGRfc3RhdGUuaWdub3JlX3VudXNlZF9kc29zID8gMCA6IGxkX3N0YXRlLm5kc29maWxlczsKKworICAgICAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgUExUIGlmIG5lY2Vzc2FyeS4gICovCisgICAgICBpZiAobGRfc3RhdGUubnBsdCA+IDApCisJeworCSAgLyogQ3JlYXRlIHRoZSAucGx0IHNlY3Rpb24uICAqLworCSAgLyogWFhYIFdlIG1pZ2h0IG5lZWQgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIHRoZSBzZWN0aW9uIGZsYWdzLiAgKi8KKwkgIG5ld19nZW5lcmF0ZWRfc2NuIChzY25fZG90X3BsdCwgIi5wbHQiLCBTSFRfUFJPR0JJVFMsCisJCQkgICAgIFNIRl9BTExPQyB8IFNIRl9FWEVDSU5TVFIsCisJCQkgICAgIC8qIFhYWCBJcyB0aGUgc2l6ZSBjb3JyZWN0PyAgKi8KKwkJCSAgICAgeGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9BRERSLCAxKSwKKwkJCSAgICAgeGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9BRERSLCAxKSk7CisKKwkgIC8qIENyZWF0ZSB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIGZvciB0aGUgLnBsdC4gIFRoaXMgaXMgYWx3YXlzCisJICAgICBzZXBhcmF0ZSBldmVuIGlmIHRoZSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zIGFyZSBjb21iaW5lZC4gICovCisJICBuZXdfZ2VuZXJhdGVkX3NjbiAoc2NuX2RvdF9wbHRyZWwsICIucmVsLnBsdCIsIHJlbF90eXBlLCBTSEZfQUxMT0MsCisJCQkgICAgIHJlbF90eXBlID09IFNIVF9SRUwKKwkJCSAgICAgPyB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1JFTCwgMSkKKwkJCSAgICAgOiB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1JFTEEsIDEpLAorCQkJICAgICB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX0FERFIsIDEpKTsKKworCSAgLyogVGhpcyBtZWFucyB3ZSB3aWxsIGFsc28gbmVlZCB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KKwkgIGxkX3N0YXRlLm5lZWRfZ290ID0gdHJ1ZTsKKworCSAgLyogTWFyayBhbGwgdXNlZCBEU09zIGFzIHVzZWQuICBEZXRlcm1pbmUgd2hldGhlciBhbnkgcmVmZXJlbmNlZAorCSAgICAgb2JqZWN0IHVzZXMgc3ltYm9sIHZlcnNpb25pbmcuICAqLworCSAgaWYgKGxkX3N0YXRlLmZyb21fZHNvICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3ltYm9sICpzcnVucCA9IGxkX3N0YXRlLmZyb21fZHNvOworCisJICAgICAgZG8KKwkJeworCQkgIHNydW5wLT5maWxlLT51c2VkID0gdHJ1ZTsKKworCQkgIGlmIChzcnVucC0+ZmlsZS0+dmVyZGVmZGF0YSAhPSBOVUxMKQorCQkgICAgeworCQkgICAgICBYRWxmX1ZlcnN5bSB2ZXJzeW07CisKKwkJICAgICAgLyogVGhlIGlucHV0IERTTyB1c2VzIHZlcnNpb25pbmcuICAqLworCQkgICAgICB1c2VfdmVyc2lvbmluZyA9IHRydWU7CisJCSAgICAgIC8qIFdlIHJlZmVyZW5jZSB2ZXJzaW9ucy4gICovCisJCSAgICAgIG5lZWRfdmVyc2lvbiA9IHRydWU7CisKKwkJICAgICAgaWYgKHhlbGZfZ2V0dmVyc3ltX2NvcHkgKHNydW5wLT5maWxlLT52ZXJzeW1kYXRhLAorCQkJCQkgICAgICAgc3J1bnAtPnN5bWlkeCwgdmVyc3ltKSA9PSBOVUxMKQorCQkJYXNzZXJ0ICghICJ4ZWxmX2dldHZlcnN5bSBmYWlsZWQiKTsKKworCQkgICAgICAvKiBXZSBjYW5ub3QgbGluayBleHBsaWNpdGx5IHdpdGggYW4gb2xkZXIKKwkJCSB2ZXJzaW9uIG9mIGEgc3ltYm9sLiAgKi8KKwkJICAgICAgYXNzZXJ0ICgodmVyc3ltICYgMHg4MDAwKSA9PSAwKTsKKwkJICAgICAgLyogV2UgY2Fubm90IHJlZmVyZW5jZSBsb2NhbCAoaW5kZXggMCkgb3IgcGxhaW4KKwkJCSBnbG9iYWwgKGluZGV4IDEpIHZlcnNpb25zLiAgKi8KKwkJICAgICAgYXNzZXJ0ICh2ZXJzeW0gPiAxKTsKKworCQkgICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBzZWVuIHRoZQorCQkJIHZlcnNpb24gYW5kIGlmIG5vdCBhZGQgaXQgdG8gdGhlIHJlZmVyZW5jZWQKKwkJCSB2ZXJzaW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLworCQkgICAgICBpZiAoISBzcnVucC0+ZmlsZS0+dmVyZGVmdXNlZFt2ZXJzeW1dKQorCQkJeworCQkJICBzcnVucC0+ZmlsZS0+dmVyZGVmdXNlZFt2ZXJzeW1dID0gMTsKKworCQkJICBpZiAoKytzcnVucC0+ZmlsZS0+bnZlcmRlZnVzZWQgPT0gMSkKKwkJCSAgICAvKiBDb3VudCB0aGUgZmlsZSBpZiBpdCBpcyB1c2luZyB2ZXJzaW9uaW5nLiAgKi8KKwkJCSAgICArK2xkX3N0YXRlLm52ZXJkZWZmaWxlOworCQkJICArK2xkX3N0YXRlLm52ZXJkZWZ1c2VkOworCQkJfQorCQkgICAgfQorCQl9CisJICAgICAgd2hpbGUgKChzcnVucCA9IHNydW5wLT5uZXh0KSAhPSBsZF9zdGF0ZS5mcm9tX2Rzbyk7CisJICAgIH0KKworCSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9ucyB1c2VkIHRvIHJlY29yZCB2ZXJzaW9uIGRlcGVuZGVuY2llcy4gICovCisJICBpZiAobmVlZF92ZXJzaW9uKQorCSAgICBuZXdfZ2VuZXJhdGVkX3NjbiAoc2NuX2RvdF92ZXJzaW9uX3IsICIuZ251LnZlcnNpb25fciIsCisJCQkgICAgICAgU0hUX0dOVV92ZXJuZWVkLCBTSEZfQUxMT0MsIDAsCisJCQkgICAgICAgeGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9XT1JELCAxKSk7CisKKwkgIC8qIE5vdyBjb3VudCB0aGUgdXNlZCBEU09zIHNpbmNlIHRoaXMgaXMgd2hhdCB0aGUgdXNlcgorCSAgICAgd2FudHMuICAqLworCSAgbmR0X25lZWRlZCA9IDA7CisJICBpZiAobGRfc3RhdGUubmRzb2ZpbGVzID4gMCkKKwkgICAgeworCSAgICAgIHN0cnVjdCB1c2VkZmlsZXMgKmZydW5wID0gbGRfc3RhdGUuZHNvZmlsZXM7CisKKwkgICAgICBkbworCQlpZiAoISBsZF9zdGF0ZS5pZ25vcmVfdW51c2VkX2Rzb3MgfHwgZnJ1bnAtPnVzZWQpCisJCSAgeworCQkgICAgKytuZHRfbmVlZGVkOworCQkgICAgaWYgKGZydW5wLT5sYXp5bG9hZCkKKwkJICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYW5vdGhlciBkeW5hbWljIHNlY3Rpb24KKwkJCSBlbnRyeSBmb3IgdGhlIERUX1BPU0ZMQUdfMSBlbnRyeS4KKworCQkJIFhYWCBPbmNlIG1vcmUgZnVuY3Rpb25hbGl0eSB0aGFuIHRoZQorCQkJIGxhenlsb2FkaW5nIGZsYWcgYXJlIHN1cHBwb3J0ZWQgdGhlIHRlc3QKKwkJCSBtdXN0IGJlIGV4dGVuZGVkLiAgKi8KKwkJICAgICAgKytuZHRfbmVlZGVkOworCQkgIH0KKwkgICAgICB3aGlsZSAoKGZydW5wID0gZnJ1bnAtPm5leHQpICE9IGxkX3N0YXRlLmRzb2ZpbGVzKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKHVzZV92ZXJzaW9uaW5nKQorCW5ld19nZW5lcmF0ZWRfc2NuIChzY25fZG90X3ZlcnNpb24sICIuZ251LnZlcnNpb24iLCBTSFRfR05VX3ZlcnN5bSwKKwkJCSAgIFNIRl9BTExPQywKKwkJCSAgIHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfSEFMRiwgMSksCisJCQkgICB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX0hBTEYsIDEpKTsKKworICAgICAgLyogV2UgbmVlZCBzb21lIGVudHJpZXMgYWxsIHRoZSB0aW1lLiAgKi8KKyAgICAgIGxkX3N0YXRlLm5keW5hbWljID0gKDcgKyAobGRfc3RhdGUucnVucGF0aCAhPSBOVUxMCisJCQkJfHwgbGRfc3RhdGUucnBhdGggIT0gTlVMTCkKKwkJCSAgICsgbmR0X25lZWRlZAorCQkJICAgKyAobGRfc3RhdGUuaW5pdF9zeW1ib2wgIT0gTlVMTCA/IDEgOiAwKQorCQkJICAgKyAobGRfc3RhdGUuZmluaV9zeW1ib2wgIT0gTlVMTCA/IDEgOiAwKQorCQkJICAgKyAodXNlX3ZlcnNpb25pbmcgPyAxIDogMCkKKwkJCSAgICsgKG5lZWRfdmVyc2lvbiA/IDIgOiAwKQorCQkJICAgKyAobGRfc3RhdGUubnBsdCA+IDAgPyA0IDogMCkKKwkJCSAgICsgKGxkX3N0YXRlLnJlbHNpemVfdG90YWwgPiAwID8gMyA6IDApKTsKKyAgICB9CisKKyAgLyogV2hlbiBjcmVhdGluZyBhIHJlbG9jYXRhYmxlIGZpbGUgb3Igd2hlbiB3ZSBhcmUgbm90IHN0cmlwcGluZyB0aGUKKyAgICAgb3V0cHV0IGZpbGUgd2UgY3JlYXRlIGEgc3ltYm9sIHRhYmxlLiAgKi8KKyAgbGRfc3RhdGUubmVlZF9zeW10YWIgPSAobGRfc3RhdGUuZmlsZV90eXBlID09IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZQorCQkJICB8fCBsZF9zdGF0ZS5zdHJpcCA9PSBzdHJpcF9ub25lKTsKKworICAvKiBBZGQgdGhlIC5nb3Qgc2VjdGlvbiBpZiBuZWVkZWQuICAqLworICBpZiAobGRfc3RhdGUubmVlZF9nb3QpCisgICAgLyogWFhYIFdlIG1pZ2h0IG5lZWQgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIHRoZSBzZWN0aW9uIGZsYWdzLiAgKi8KKyAgICBuZXdfZ2VuZXJhdGVkX3NjbiAoc2NuX2RvdF9nb3QsICIuZ290IiwgU0hUX1BST0dCSVRTLAorCQkgICAgICAgU0hGX0FMTE9DIHwgU0hGX1dSSVRFLAorCQkgICAgICAgeGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9BRERSLCAxKSwKKwkJICAgICAgIHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfQUREUiwgMSkpOworCisgIC8qIEFkZCB0aGUgLnJlbC5keW4gc2VjdGlvbi4gICovCisgIGlmIChsZF9zdGF0ZS5yZWxzaXplX3RvdGFsID4gMCkKKyAgICBuZXdfZ2VuZXJhdGVkX3NjbiAoc2NuX2RvdF9keW5yZWwsICIucmVsLmR5biIsIHJlbF90eXBlLCBTSEZfQUxMT0MsCisJCSAgICAgICByZWxfdHlwZSA9PSBTSFRfUkVMCisJCSAgICAgICA/IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfUkVMLCAxKQorCQkgICAgICAgOiB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1JFTEEsIDEpLAorCQkgICAgICAgeGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9BRERSLCAxKSk7Cit9CisKKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIG9uX2V4aXQgdG8gbWFrZSBzdXJlIHRoZSB0ZW1wb3JhcnkKKyAgIGZpbGVzIGdldHMgcmVtb3ZlZCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4gICovCitzdGF0aWMgdm9pZAorcmVtb3ZlX3RlbXBmaWxlIChpbnQgc3RhdHVzLCB2b2lkICphcmcpCit7CisgIGlmIChzdGF0dXMgIT0gMCAmJiBsZF9zdGF0ZS50ZW1wZm5hbWUgIT0gTlVMTCkKKyAgICB1bmxpbmsgKGxkX3N0YXRlLnRlbXBmbmFtZSk7Cit9CisKKworLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gIFRoZSBmaWxlIG5hbWUgaXMgZ2l2ZW4gb3IgImEub3V0Ii4gIFdlCisgICBjcmVhdGUgYXMgbXVjaCBvZiB0aGUgRUxGIHN0cnVjdHVyZSBhcyBwb3NzaWJsZS4gICovCitzdGF0aWMgaW50CitsZF9nZW5lcmljX29wZW5fb3V0ZmlsZSAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsIGludCBtYWNoaW5lLCBpbnQga2xhc3MsCisJCQkgaW50IGRhdGEpCit7CisgIC8qIFdlIGRvIG5vdCBjcmVhdGUgdGhlIG5ldyBmaWxlIHJpZ2h0IGF3YXkgd2l0aCB0aGUgZmluYWwgbmFtZS4KKyAgICAgVGhpcyB3b3VsZCBkZXN0cm95IGFuIGV4aXN0aW5nIGZpbGUgd2l0aCB0aGlzIG5hbWUgYmVmb3JlIGEKKyAgICAgcmVwbGFjZW1lbnQgaXMgZmluYWxpemVkLiAgV2UgY3JlYXRlIGluc3RlYWQgYSB0ZW1wb3JhcnkgZmlsZSBpbgorICAgICB0aGUgc2FtZSBkaXJlY3RvcnkuICAqLworICBpZiAobGRfc3RhdGUub3V0Zm5hbWUgPT0gTlVMTCkKKyAgICBsZF9zdGF0ZS5vdXRmbmFtZSA9ICJhLm91dCI7CisKKyAgc2l6ZV90IG91dGZuYW1lX2xlbiA9IHN0cmxlbiAobGRfc3RhdGUub3V0Zm5hbWUpOworICBjaGFyICp0ZW1wZm5hbWUgPSAoY2hhciAqKSBvYnN0YWNrX2FsbG9jICgmbGRfc3RhdGUuc21lbSwKKwkJCQkJICAgIG91dGZuYW1lX2xlbiArIHNpemVvZiAoIi5YWFhYWFgiKSk7CisgIGxkX3N0YXRlLnRlbXBmbmFtZSA9IHRlbXBmbmFtZTsKKworICBpbnQgZmQ7CisgIGludCB0cnkgPSAwOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBzdHJjcHkgKG1lbXBjcHkgKHRlbXBmbmFtZSwgbGRfc3RhdGUub3V0Zm5hbWUsIG91dGZuYW1lX2xlbiksICIuWFhYWFhYIik7CisKKyAgICAgIC8qIFRoZSB1c2VvZiBta3RlbXAoKSBoZXJlIGlzIGZpbmUuICBXZSBkbyBub3Qgd2FudCB0byB1c2UKKwkgbWtzdGVtcCgpIHNpbmNlIHRoZW4gdGhlIHVtYXNrIGlzbid0IHVzZWQuICBBbmQgdGhlIG91dHB1dAorCSBmaWxlIHdpbGwgaGF2ZSB0aGVzZSBwZXJtaXNzaW9ucyBhbnlob3cuICBBbnkgaW50cnVkZXIgY291bGQKKwkgY2hhbmdlIHRoZSBmaWxlIGxhdGVyIGlmIGl0IHdvdWxkIGJlIHBvc3NpYmxlIG5vdy4gICovCisgICAgICBpZiAobWt0ZW1wICh0ZW1wZm5hbWUpICE9IE5VTEwKKwkgICYmIChmZCA9IG9wZW4gKHRlbXBmbmFtZSwgT19SRFdSIHwgT19FWENMIHwgT19DUkVBVCB8IE9fTk9GT0xMT1csCisJCQkgbGRfc3RhdGUuZmlsZV90eXBlID09IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZQorCQkJID8gREVGRklMRU1PREUgOiBBQ0NFU1NQRVJNUykpICE9IC0xKQorCWJyZWFrOworCisgICAgICAvKiBGYWlsZWQgdGhpcyByb3VuZC4gIFdlIGtlZXAgdHJ5aW5nIGEgbnVtYmVyIG9mIHRpbWVzLiAgKi8KKyAgICAgIGlmICgrK3RyeSA+PSAxMCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGUiKSk7CisgICAgfQorICBsZF9zdGF0ZS5vdXRmZCA9IGZkOworCisgIC8qIE1ha2Ugc3VyZSB3ZSByZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMKKyAgICAgd3JvbmcuICAqLworICBvbl9leGl0IChyZW1vdmVfdGVtcGZpbGUsIE5VTEwpOworCisgIC8qIENyZWF0ZSB0aGUgRUxGIGZpbGUgZGF0YSBmb3IgdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgRWxmICplbGYgPSBsZF9zdGF0ZS5vdXRlbGYgPSBlbGZfYmVnaW4gKGZkLAorCQkJCQkgIGNvbnNlcnZlX21lbW9yeQorCQkJCQkgID8gRUxGX0NfV1JJVEUgOiBFTEZfQ19XUklURV9NTUFQLAorCQkJCQkgIE5VTEwpOworICBpZiAoZWxmID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3Igb3V0cHV0IGZpbGU6ICVzIiksCisJICAgZWxmX2Vycm1zZyAoLTEpKTsKKworICAvKiBDcmVhdGUgdGhlIGJhc2ljIGRhdGEgc3RydWN0dXJlcy4gICovCisgIGlmICghIHhlbGZfbmV3ZWhkciAoZWxmLCBrbGFzcykpCisgICAgLyogQ291bGRuJ3QgY3JlYXRlIHRoZSBFTEYgaGVhZGVyLiAgVmVyeSBiYWQuICAqLworICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNvdWxkIG5vdCBjcmVhdGUgRUxGIGhlYWRlciBmb3Igb3V0cHV0IGZpbGU6ICVzIiksCisJICAgZWxmX2Vycm1zZyAoLTEpKTsKKworICAvKiBBbmQgZ2V0IHRoZSBjdXJyZW50IGhlYWRlciBzbyB0aGF0IHdlIGNhbiBtb2RpZnkgaXQuICAqLworICBYRWxmX0VoZHJfdmFyZGVmIChlaGRyKTsKKyAgeGVsZl9nZXRlaGRyIChlbGYsIGVoZHIpOworICBhc3NlcnQgKGVoZHIgIT0gTlVMTCk7CisKKyAgLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUuICAqLworICBlaGRyLT5lX21hY2hpbmUgPSBtYWNoaW5lOworCisgIC8qIE1vZGlmeSBpdCBhY2NvcmRpbmcgdG8gdGhlIGluZm8gd2UgaGF2ZSBoZXJlIGFuZCBub3cuICAqLworICBpZiAobGRfc3RhdGUuZmlsZV90eXBlID09IGV4ZWN1dGFibGVfZmlsZV90eXBlKQorICAgIGVoZHItPmVfdHlwZSA9IEVUX0VYRUM7CisgIGVsc2UgaWYgKGxkX3N0YXRlLmZpbGVfdHlwZSA9PSBkc29fZmlsZV90eXBlKQorICAgIGVoZHItPmVfdHlwZSA9IEVUX0RZTjsKKyAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydCAobGRfc3RhdGUuZmlsZV90eXBlID09IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZSk7CisgICAgICBlaGRyLT5lX3R5cGUgPSBFVF9SRUw7CisgICAgfQorCisgIC8qIFNldCB0aGUgRUxGIHZlcnNpb24uICAqLworICBlaGRyLT5lX3ZlcnNpb24gPSBFVl9DVVJSRU5UOworCisgIC8qIFNldCB0aGUgZW5kaWFubmVzcy4gICovCisgIGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPSBkYXRhOworCisgIC8qIFdyaXRlIHRoZSBFTEYgaGVhZGVyIGluZm9ybWF0aW9uIGJhY2suICAqLworICAodm9pZCkgeGVsZl91cGRhdGVfZWhkciAoZWxmLCBlaGRyKTsKKworICByZXR1cm4gMDsKK30KKworCisvKiBXZSBjb21wdXRlIHRoZSBvZmZzZXRzIG9mIHRoZSB2YXJpb3VzIGNvcGllZCBvYmplY3RzIGFuZCB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIG1lbW9yeSBuZWVkZWQuICAqLworLy8gWFhYIFRoZSBtZXRob2QgdXNlZCBoZXJlIGlzIHNpbXBsZTogZ28gZnJvbSBmcm9udCB0byBiYWNrIGFuZCBwYWNrCisvLyB0aGUgb2JqZWN0cyBpbiB0aGlzIG9yZGVyLiAgQSBtb3JlIHNwYWNlIGVmZmljaWVudCB3YXkgd291bGQKKy8vIGFjdHVhbGx5IHRyeWluZyB0byBwYWNrIHRoZSBvYmplY3RzIGFzIGRlbnNlIGFzIHBvc3NpYmxlLiAgQnV0IHRoaXMKKy8vIGlzIG1vcmUgZXhwZW5zaXZlLgorc3RhdGljIHZvaWQKK2NvbXB1dGVfY29weV9yZWxvY19vZmZzZXQgKFhFbGZfU2hkciAqc2hkcikKK3sKKyAgc3RydWN0IHN5bWJvbCAqcnVucCA9IGxkX3N0YXRlLmZyb21fZHNvOworICBhc3NlcnQgKHJ1bnAgIT0gTlVMTCk7CisKKyAgWEVsZl9PZmYgbWF4YWxpZ24gPSAxOworICBYRWxmX09mZiBvZmZzZXQgPSAwOworCisgIGRvCisgICAgaWYgKHJ1bnAtPm5lZWRfY29weSkKKyAgICAgIHsKKwkvKiBEZXRlcm1pbmUgYWxpZ25tZW50IGZvciB0aGUgc3ltYm9sLiAgKi8KKwkvLyBYWFggVGhlIHF1ZXN0aW9uIGlzIGhvdz8gIFRoZSBzeW1ib2wgcmVjb3JkIGl0c2VsZiBkb2VzIG5vdAorCS8vIGhhdmUgdGhlIGluZm9ybWF0aW9uLiAgU28gd2UgaGF2ZSB0byBiZSBjb25zZXJ2YXRpdmUgYW5kCisJLy8gYXNzdW1lIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHNlY3Rpb24gdGhlIHN5bWJvbCBpcyBpbi4KKworCS8vIFhYWCBXZSBjYW4gYmUgbW9yZSBwcmVjaXNlLiAgVXNlIHRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nCisJLy8gb2YgdGhlIHNlY3Rpb24gYW5kIGRldGVybWluZSB0aGUgbGFyZ2VzdCBwb3dlciBvZiB0d28gd2l0aAorCS8vIG1vZHVsZSB6ZXJvLgorCVhFbGZfT2ZmIHN5bWFsaWduID0gTUFYIChTQ05JTkZPX1NIRFIgKHJ1bnAtPmZpbGUtPnNjbmluZm9bcnVucC0+c2NuZHhdLnNoZHIpLnNoX2FkZHJhbGlnbiwgMSk7CisJLyogS2VlcCB0cmFjayBvZiB0aGUgbWF4aW11bSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQuICAqLworCW1heGFsaWduID0gTUFYIChtYXhhbGlnbiwgc3ltYWxpZ24pOworCisJLyogQWxpZ24gY3VycmVudCBwb3NpdGlvbi4gICovCisJb2Zmc2V0ID0gKG9mZnNldCArIHN5bWFsaWduIC0gMSkgJiB+KHN5bWFsaWduIC0gMSk7CisKKwlydW5wLT5tZXJnZS52YWx1ZSA9IG9mZnNldDsKKworCW9mZnNldCArPSBydW5wLT5zaXplOworICAgICAgfQorICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBsZF9zdGF0ZS5mcm9tX2Rzbyk7CisKKyAgc2hkci0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7CisgIHNoZHItPnNoX3NpemUgPSBvZmZzZXQ7CisgIHNoZHItPnNoX2FkZHJhbGlnbiA9IG1heGFsaWduOworfQorCisKK3N0YXRpYyB2b2lkCitjb21wdXRlX2NvbW1vbl9zeW1ib2xfb2Zmc2V0IChYRWxmX1NoZHIgKnNoZHIpCit7CisgIHN0cnVjdCBzeW1ib2wgKnJ1bnAgPSBsZF9zdGF0ZS5jb21tb25fc3ltczsKKyAgYXNzZXJ0IChydW5wICE9IE5VTEwpOworCisgIFhFbGZfT2ZmIG1heGFsaWduID0gMTsKKyAgWEVsZl9PZmYgb2Zmc2V0ID0gMDsKKworICBkbworICAgIHsKKyAgICAgIC8qIERldGVybWluZSBhbGlnbm1lbnQgZm9yIHRoZSBzeW1ib2wuICAqLworICAgICAgWEVsZl9PZmYgc3ltYWxpZ24gPSBydW5wLT5tZXJnZS52YWx1ZTsKKworICAgICAgLyogS2VlcCB0cmFjayBvZiB0aGUgbWF4aW11bSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQuICAqLworICAgICAgbWF4YWxpZ24gPSBNQVggKG1heGFsaWduLCBzeW1hbGlnbik7CisKKyAgICAgIC8qIEFsaWduIGN1cnJlbnQgcG9zaXRpb24uICAqLworICAgICAgb2Zmc2V0ID0gKG9mZnNldCArIHN5bWFsaWduIC0gMSkgJiB+KHN5bWFsaWduIC0gMSk7CisKKyAgICAgIHJ1bnAtPm1lcmdlLnZhbHVlID0gb2Zmc2V0OworCisgICAgICBvZmZzZXQgKz0gcnVucC0+c2l6ZTsKKyAgICB9CisgIHdoaWxlICgocnVucCA9IHJ1bnAtPm5leHQpICE9IGxkX3N0YXRlLmNvbW1vbl9zeW1zKTsKKworICBzaGRyLT5zaF90eXBlID0gU0hUX05PQklUUzsKKyAgc2hkci0+c2hfc2l6ZSA9IG9mZnNldDsKKyAgc2hkci0+c2hfYWRkcmFsaWduID0gbWF4YWxpZ247Cit9CisKKworc3RhdGljIHZvaWQKK3NvcnRfc2VjdGlvbnNfZ2VuZXJpYyAodm9pZCkKK3sKKyAgLyogWFhYIFRCSSAqLworICBhYm9ydCAoKTsKK30KKworCitzdGF0aWMgaW50CittYXRjaF9zZWN0aW9uIChjb25zdCBjaGFyICpvc2VjdG5hbWUsIHN0cnVjdCBmaWxlbWFza19zZWN0aW9uX25hbWUgKnNlY3RtYXNrLAorCSAgICAgICBzdHJ1Y3Qgc2NuaGVhZCAqKnNjbmhlYWQsIGJvb2wgbmV3X3NlY3Rpb24sIHNpemVfdCBzZWdtZW50X25yKQoreworICBzdHJ1Y3Qgc2NuaW5mbyAqcHJldnA7CisgIHN0cnVjdCBzY25pbmZvICpydW5wOworICBzdHJ1Y3Qgc2NuaW5mbyAqbm90dXNlZDsKKworICBpZiAoZm5tYXRjaCAoc2VjdG1hc2stPnNlY3Rpb25fbmFtZS0+bmFtZSwgKCpzY25oZWFkKS0+bmFtZSwgMCkgIT0gMCkKKyAgICAvKiBUaGUgc2VjdGlvbiBuYW1lIGRvZXMgbm90IG1hdGNoLiAgKi8KKyAgICByZXR1cm4gbmV3X3NlY3Rpb247CisKKyAgLyogSWYgdGhpcyBpcyBhIHNlY3Rpb24gZ2VuZXJhdGVkIGJ5IHRoZSBsaW5rZXIgaXQgZG9lc24ndCBjb250YWluCisgICAgIHRoZSByZWd1bGFyIGluZm9ybWF0aW9uIChpLmUuLCBpbnB1dCBzZWN0aW9uIGRhdGEgZXRjKSBhbmQgbXVzdAorICAgICBiZSBoYW5kbGUgc3BlY2lhbC4gICovCisgIGlmICgoKnNjbmhlYWQpLT5raW5kICE9IHNjbl9ub3JtYWwpCisgICAgeworICAgICAgKCpzY25oZWFkKS0+bmFtZSA9IG9zZWN0bmFtZTsKKyAgICAgICgqc2NuaGVhZCktPnNlZ21lbnRfbnIgPSBzZWdtZW50X25yOworCisgICAgICAvKiBXZSBoYXZlIHRvIGNvdW50IG5vdGUgc2VjdGlvbiBzaW5jZSB0aGV5IGdldCB0aGVpciBvd24KKwkgcHJvZ3JhbSBoZWFkZXIgZW50cnkuICAqLworICAgICAgaWYgKCgqc2NuaGVhZCktPnR5cGUgPT0gU0hUX05PVEUpCisJKytsZF9zdGF0ZS5ubm90ZXNlY3Rpb25zOworCisgICAgICBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsZF9zdGF0ZS5uYWxsc2VjdGlvbnMrK10gPSAoKnNjbmhlYWQpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIE5vdyB3ZSBoYXZlIHRvIG1hdGNoIHRoZSBmaWxlIG5hbWVzIG9mIHRoZSBpbnB1dCBmaWxlcy4gIFNvbWUgb2YKKyAgICAgdGhlIHNlY3Rpb25zIGhlcmUgbWlnaHQgbm90IG1hdGNoLiAgICAqLworICBydW5wID0gKCpzY25oZWFkKS0+bGFzdC0+bmV4dDsKKyAgcHJldnAgPSAoKnNjbmhlYWQpLT5sYXN0OworICBub3R1c2VkID0gTlVMTDsKKworICBkbworICAgIHsKKyAgICAgIC8qIEJhc2Ugb2YgdGhlIGZpbGUgbmFtZSB0aGUgc2VjdGlvbiBjb21lcyBmcm9tLiAgKi8KKyAgICAgIGNvbnN0IGNoYXIgKmJyZm5hbWUgPSBiYXNlbmFtZSAocnVucC0+ZmlsZWluZm8tPnJmbmFtZSk7CisKKyAgICAgIC8qIElmIHRoZSBzZWN0aW9uIGlzbid0IHVzZWQsIHRoZSBuYW1lIGRvZXNuJ3QgbWF0Y2ggdGhlIHBvc2l0aXZlCisJIGluY2x1c2lvbiBsaXN0IG9yIHRoZSBuYW1lIGRvZXMgbWF0Y2ggdGhlIG5lZ2F0aXZlIGluY2x1c2lvbgorCSBsaXN0LCBpZ25vcmUgdGhlIHNlY3Rpb24uICAqLworICAgICAgaWYgKCFydW5wLT51c2VkCisJICB8fCAoc2VjdG1hc2stPmZpbGVtYXNrICE9IE5VTEwKKwkgICAgICAmJiBmbm1hdGNoIChzZWN0bWFzay0+ZmlsZW1hc2ssIGJyZm5hbWUsIDApICE9IDApCisJICB8fCAoc2VjdG1hc2stPmV4Y2x1ZGVtYXNrICE9IE5VTEwKKwkgICAgICAmJiBmbm1hdGNoIChzZWN0bWFzay0+ZXhjbHVkZW1hc2ssIGJyZm5hbWUsIDApID09IDApKQorCXsKKwkgIC8qIFRoaXMgZmlsZSBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZSBuYW1lIG1hc2tzLiAgKi8KKwkgIGlmIChub3R1c2VkID09IE5VTEwpCisJICAgIG5vdHVzZWQgPSBydW5wOworCisJICBwcmV2cCA9IHJ1bnA7CisJICBydW5wID0gcnVucC0+bmV4dDsKKwkgIGlmIChydW5wID09IG5vdHVzZWQpCisJICAgIHJ1bnAgPSBOVUxMOworCX0KKyAgICAgIC8qIFRoZSBzZWN0aW9uIGZ1bGZpbGxzIGFsbCByZXF1aXJlbWVudHMsIGFkZCBpdCB0byB0aGUgb3V0cHV0CisJIGZpbGUgd2l0aCB0aGUgY29ycmVjdCBzZWN0aW9uIG5hbWUgZXRjLiAgKi8KKyAgICAgIGVsc2UKKwl7CisJICBzdHJ1Y3Qgc2NuaW5mbyAqZm91bmQgPSBydW5wOworCisJICAvKiBSZW1vdmUgdGhpcyBpbnB1dCBzZWN0aW9uIGRhdGEgYnVmZmVyIGZyb20gdGhlIGxpc3QuICAqLworCSAgaWYgKHByZXZwICE9IHJ1bnApCisJICAgIHJ1bnAgPSBwcmV2cC0+bmV4dCA9IHJ1bnAtPm5leHQ7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmcmVlICgqc2NuaGVhZCk7CisJICAgICAgKnNjbmhlYWQgPSBOVUxMOworCSAgICAgIHJ1bnAgPSBOVUxMOworCSAgICB9CisKKwkgIC8qIENyZWF0ZSBhIG5ldyBzZWN0aW9uIGZvciB0aGUgb3V0cHV0IGZpbGUgaWYgdGhlICduZXdfc2VjdGlvbicKKwkgICAgIGZsYWcgc2F5cyBzby4gIE90aGVyd2lzZSBhcHBlbmQgdGhlIGJ1ZmZlciB0byB0aGUgbGFzdAorCSAgICAgc2VjdGlvbiB3aGljaCB3ZSBjcmVhdGVkIGluIG9uZSBvZiB0aGUgbGFzdCBjYWxscy4gICovCisJICBpZiAobmV3X3NlY3Rpb24pCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc2NuaGVhZCAqbmV3cDsKKworCSAgICAgIG5ld3AgPSAoc3RydWN0IHNjbmhlYWQgKikgb2JzdGFja19jYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLAorCQkJCQkJCXNpemVvZiAoKm5ld3ApKTsKKwkgICAgICBuZXdwLT5raW5kID0gc2NuX25vcm1hbDsKKwkgICAgICBuZXdwLT5uYW1lID0gb3NlY3RuYW1lOworCSAgICAgIG5ld3AtPnR5cGUgPSBTQ05JTkZPX1NIRFIgKGZvdW5kLT5zaGRyKS5zaF90eXBlOworCSAgICAgIG5ld3AtPmZsYWdzID0gU0NOSU5GT19TSERSIChmb3VuZC0+c2hkcikuc2hfZmxhZ3M7CisJICAgICAgbmV3cC0+c2VnbWVudF9uciA9IHNlZ21lbnRfbnI7CisJICAgICAgbmV3cC0+bGFzdCA9IGZvdW5kLT5uZXh0ID0gZm91bmQ7CisJICAgICAgbmV3cC0+dXNlZCA9IHRydWU7CisJICAgICAgbmV3cC0+cmVsc2l6ZSA9IGZvdW5kLT5yZWxzaXplOworCSAgICAgIG5ld3AtPmVudHNpemUgPSBTQ05JTkZPX1NIRFIgKGZvdW5kLT5zaGRyKS5zaF9lbnRzaXplOworCisJICAgICAgLyogV2UgaGF2ZSB0byBjb3VudCBub3RlIHNlY3Rpb24gc2luY2UgdGhleSBnZXQgdGhlaXIgb3duCisJCSBwcm9ncmFtIGhlYWRlciBlbnRyeS4gICovCisJICAgICAgaWYgKG5ld3AtPnR5cGUgPT0gU0hUX05PVEUpCisJCSsrbGRfc3RhdGUubm5vdGVzZWN0aW9uczsKKworCSAgICAgIGxkX3N0YXRlLmFsbHNlY3Rpb25zW2xkX3N0YXRlLm5hbGxzZWN0aW9ucysrXSA9IG5ld3A7CisJICAgICAgbmV3X3NlY3Rpb24gPSBmYWxzZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3RydWN0IHNjbmhlYWQgKnF1ZXVlZDsKKworCSAgICAgIHF1ZXVlZCA9IGxkX3N0YXRlLmFsbHNlY3Rpb25zW2xkX3N0YXRlLm5hbGxzZWN0aW9ucyAtIDFdOworCisJICAgICAgZm91bmQtPm5leHQgPSBxdWV1ZWQtPmxhc3QtPm5leHQ7CisJICAgICAgcXVldWVkLT5sYXN0ID0gcXVldWVkLT5sYXN0LT5uZXh0ID0gZm91bmQ7CisKKwkgICAgICAvKiBJZiB0aGUgbGlua2VyIHNjcmlwdCBmb3JjZXMgdXMgdG8gYWRkIGluY29tcGF0aWJsZQorCQkgc2VjdGlvbnMgdG9nZXRoZXIgZG8gc28uICBCdXQgcmVmbGVjdCB0aGlzIGluIHRoZQorCQkgdHlwZSBhbmQgZmxhZ3Mgb2YgdGhlIHJlc3VsdGluZyBmaWxlLiAgKi8KKwkgICAgICBpZiAocXVldWVkLT50eXBlICE9IFNDTklORk9fU0hEUiAoZm91bmQtPnNoZHIpLnNoX3R5cGUpCisJCS8qIFhYWCBBbnkgYmV0dGVyIGNob2ljZT8gICovCisJCXF1ZXVlZC0+dHlwZSA9IFNIVF9QUk9HQklUUzsKKwkgICAgICBpZiAocXVldWVkLT5mbGFncyAhPSBTQ05JTkZPX1NIRFIgKGZvdW5kLT5zaGRyKS5zaF9mbGFncykKKwkJcXVldWVkLT5mbGFncyA9IGVibF9zaF9mbGFnc19jb21iaW5lIChsZF9zdGF0ZS5lYmwsCisJCQkJCQkgICAgICBxdWV1ZWQtPmZsYWdzLAorCQkJCQkJICAgICAgU0NOSU5GT19TSERSIChmb3VuZC0+c2hkcikuc2hfZmxhZ3MpOworCisJICAgICAgLyogQWNjdW11bGF0ZSB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIHNpemUuICAqLworCSAgICAgIHF1ZXVlZC0+cmVsc2l6ZSArPSBmb3VuZC0+cmVsc2l6ZTsKKwkgICAgfQorCX0KKyAgICB9CisgIHdoaWxlIChydW5wICE9IE5VTEwpOworCisgIHJldHVybiBuZXdfc2VjdGlvbjsKK30KKworCitzdGF0aWMgdm9pZAorc29ydF9zZWN0aW9uc19sc2NyaXB0ICh2b2lkKQoreworICBzdHJ1Y3Qgc2NuaGVhZCAqdGVtcFtsZF9zdGF0ZS5uYWxsc2VjdGlvbnNdOworCisgIC8qIE1ha2UgYSBjb3B5IG9mIHRoZSBzZWN0aW9uIGhlYWQgcG9pbnRlciBhcnJheS4gICovCisgIG1lbWNweSAodGVtcCwgbGRfc3RhdGUuYWxsc2VjdGlvbnMsCisJICBsZF9zdGF0ZS5uYWxsc2VjdGlvbnMgKiBzaXplb2YgKHRlbXBbMF0pKTsKKyAgc2l6ZV90IG5hbGxzZWN0aW9ucyA9IGxkX3N0YXRlLm5hbGxzZWN0aW9uczsKKworICAvKiBDb252ZXJ0IHRoZSBvdXRwdXQgc2VnbWVudCBsaXN0IGluIGEgc2luZ2xlLWxpbmtlZCBsaXN0LiAgKi8KKyAgc3RydWN0IG91dHB1dF9zZWdtZW50ICpzZWdtZW50ID0gbGRfc3RhdGUub3V0cHV0X3NlZ21lbnRzLT5uZXh0OworICBsZF9zdGF0ZS5vdXRwdXRfc2VnbWVudHMtPm5leHQgPSBOVUxMOworICBsZF9zdGF0ZS5vdXRwdXRfc2VnbWVudHMgPSBzZWdtZW50OworCisgIC8qIFB1dCB0aGUgc2VjdGlvbnMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhlIGFycmF5IGluIHRoZSBzdGF0ZQorICAgICBzdHJ1Y3R1cmUuICBUaGlzIG1pZ2h0IGludm9sdmUgbWVyZ2luZyBvZiBzZWN0aW9ucyBhbmQgYWxzbworICAgICByZW5hbWluZyB0aGUgY29udGFpbmluZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGxkX3N0YXRlLm5hbGxzZWN0aW9ucyA9IDA7CisgIHNpemVfdCBzZWdtZW50X25yOworICBzaXplX3QgbGFzdF93cml0YWJsZSA9IH4wdWw7CisgIGZvciAoc2VnbWVudF9uciA9IDA7IHNlZ21lbnQgIT0gTlVMTDsgc2VnbWVudCA9IHNlZ21lbnQtPm5leHQsICsrc2VnbWVudF9ucikKKyAgICB7CisgICAgICBzdHJ1Y3Qgb3V0cHV0X3J1bGUgKm9ydWxlOworCisgICAgICBmb3IgKG9ydWxlID0gc2VnbWVudC0+b3V0cHV0X3J1bGVzOyBvcnVsZSAhPSBOVUxMOyBvcnVsZSA9IG9ydWxlLT5uZXh0KQorCWlmIChvcnVsZS0+dGFnID09IG91dHB1dF9zZWN0aW9uKQorCSAgeworCSAgICBzdHJ1Y3QgaW5wdXRfcnVsZSAqaXJ1bGU7CisJICAgIGJvb2wgbmV3X3NlY3Rpb24gPSB0cnVlOworCisJICAgIGZvciAoaXJ1bGUgPSBvcnVsZS0+dmFsLnNlY3Rpb24uaW5wdXQ7IGlydWxlICE9IE5VTEw7CisJCSBpcnVsZSA9IGlydWxlLT5uZXh0KQorCSAgICAgIGlmIChpcnVsZS0+dGFnID09IGlucHV0X3NlY3Rpb24pCisJCXsKKwkJICBzaXplX3QgY250OworCisJCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYWxsc2VjdGlvbnM7ICsrY250KQorCQkgICAgaWYgKHRlbXBbY250XSAhPSBOVUxMKQorCQkgICAgICBuZXdfc2VjdGlvbiA9CisJCQltYXRjaF9zZWN0aW9uIChvcnVsZS0+dmFsLnNlY3Rpb24ubmFtZSwKKwkJCQkgICAgICAgaXJ1bGUtPnZhbC5zZWN0aW9uLCAmdGVtcFtjbnRdLAorCQkJCSAgICAgICBuZXdfc2VjdGlvbiwgc2VnbWVudF9ucik7CisJCX0KKwkgIH0KKworICAgICAgaWYgKChzZWdtZW50LT5tb2RlICYgUEZfVykgIT0gMCkKKwlsYXN0X3dyaXRhYmxlID0gbGRfc3RhdGUubmFsbHNlY3Rpb25zIC0gMTsKKyAgICB9CisKKyAgLyogSW4gY2FzZSB3ZSBoYXZlIHRvIGNyZWF0ZSBjb3B5IHJlbG9jYXRpb25zIG9yIHdlIGhhdmUgY29tbW9uCisgICAgIHN5bWJvbHMsIGZpbmQgdGhlIGxhc3Qgd3JpdGFibGUgc2VnbWVudCBhbmQgYWRkIG9uZSBtb3JlIGRhdGEKKyAgICAgYmxvY2suICBJdCB3aWxsIGJlIGEgTk9CSVRTIGJsb2NrIGFuZCB0YWtlIHVwIG5vIGRpc2sgc3BhY2UuCisgICAgIFRoaXMgaXMgd2h5IGl0IGlzIGltcG9ydGFudCB0byBnZXQgdGhlIGxhc3QgYmxvY2suICAqLworICBpZiAobGRfc3RhdGUubmNvcHkgPiAwIHx8IGxkX3N0YXRlLmNvbW1vbl9zeW1zICE9ICBOVUxMKQorICAgIHsKKyAgICAgIGlmIChsYXN0X3dyaXRhYmxlID09IH4wdWwpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgIm5vIHdyaXRhYmxlIHNlZ21lbnQiKTsKKworICAgICAgaWYgKGxkX3N0YXRlLmFsbHNlY3Rpb25zW2xhc3Rfd3JpdGFibGVdLT50eXBlICE9IFNIVF9OT0JJVFMpCisJeworCSAgLyogTWFrZSByb29tIGluIHRoZSBBTExTRUNUSU9OUyBhcnJheSBmb3IgYSBuZXcgc2VjdGlvbi4KKwkgICAgIFRoZXJlIGlzIGd1YXJhbnRlZWQgcm9vbSBpbiB0aGUgYXJyYXkuICBXZSBhZGQgdGhlIG5ldworCSAgICAgZW50cnkgYWZ0ZXIgdGhlIGxhc3Qgd3JpdGFibGUgc2VjdGlvbi4gICovCisJICArK2xhc3Rfd3JpdGFibGU7CisJICBtZW1tb3ZlICgmbGRfc3RhdGUuYWxsc2VjdGlvbnNbbGFzdF93cml0YWJsZSArIDFdLAorCQkgICAmbGRfc3RhdGUuYWxsc2VjdGlvbnNbbGFzdF93cml0YWJsZV0sCisJCSAgIChsZF9zdGF0ZS5uYWxsc2VjdGlvbnMgLSBsYXN0X3dyaXRhYmxlKQorCQkgICAqIHNpemVvZiAobGRfc3RhdGUuYWxsc2VjdGlvbnNbMF0pKTsKKworCSAgbGRfc3RhdGUuYWxsc2VjdGlvbnNbbGFzdF93cml0YWJsZV0gPSAoc3RydWN0IHNjbmhlYWQgKikKKwkgICAgb2JzdGFja19jYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBzaXplb2YgKHN0cnVjdCBzY25oZWFkKSk7CisKKwkgIC8qIE5hbWUgZm9yIHRoZSBuZXcgc2VjdGlvbi4gICovCisJICBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsYXN0X3dyaXRhYmxlXS0+bmFtZSA9ICIuYnNzIjsKKwkgIC8qIFR5cGU6IE5PQklUUy4gICovCisJICBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsYXN0X3dyaXRhYmxlXS0+dHlwZSA9IFNIVF9OT0JJVFM7CisJICAvKiBTYW1lIHNlZ21lbnQgYXMgdGhlIGxhc3Qgd3JpdGFibGUgc2VjdGlvbi4gICovCisJICBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsYXN0X3dyaXRhYmxlXS0+c2VnbWVudF9ucgorCSAgICA9IGxkX3N0YXRlLmFsbHNlY3Rpb25zW2xhc3Rfd3JpdGFibGUgLSAxXS0+c2VnbWVudF9ucjsKKwl9CisgICAgfQorCisgIC8qIENyZWF0ZSBjb21tb24gc3ltYm9sIGRhdGEgYmxvY2suICAqLworICBpZiAobGRfc3RhdGUubmNvcHkgPiAwKQorICAgIHsKKyNpZiBOQVRJVkVfRUxGCisgICAgICBzdHJ1Y3Qgc2NuaW5mbyAqc2kgPSAoc3RydWN0IHNjbmluZm8gKikKKwlvYnN0YWNrX2NhbGxvYyAoJmxkX3N0YXRlLnNtZW0sIHNpemVvZiAoKnNpKSArIHNpemVvZiAoWEVsZl9TaGRyKSk7CisgICAgICBzaS0+c2hkciA9IChYRWxmX1NoZHIgKikgKHNpICsgMSk7CisjZWxzZQorICAgICAgc3RydWN0IHNjbmluZm8gKnNpID0gKHN0cnVjdCBzY25pbmZvICopIG9ic3RhY2tfY2FsbG9jICgmbGRfc3RhdGUuc21lbSwKKwkJCQkJCQkgICAgICBzaXplb2YgKCpzaSkpOworI2VuZGlmCisKKyAgICAgIC8qIEdldCB0aGUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBzeW1ib2xzIHdpdGggY29weSByZWxvY2F0aW9ucy4gICovCisgICAgICBjb21wdXRlX2NvcHlfcmVsb2Nfb2Zmc2V0ICgmU0NOSU5GT19TSERSIChzaS0+c2hkcikpOworCisgICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgbmVlZGVkLiAgKi8KKyAgICAgIHNpLT51c2VkID0gdHJ1ZTsKKyAgICAgIC8qIFJlbWVtYmVyIGZvciBsYXRlciB0aGUgc2VjdGlvbiBkYXRhIHN0cnVjdHVyZS4gICovCisgICAgICBsZF9zdGF0ZS5jb3B5X3NlY3Rpb24gPSBzaTsKKworICAgICAgaWYgKGxpa2VseSAobGRfc3RhdGUuYWxsc2VjdGlvbnNbbGFzdF93cml0YWJsZV0tPmxhc3QgIT0gTlVMTCkpCisJeworCSAgc2ktPm5leHQgPSBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsYXN0X3dyaXRhYmxlXS0+bGFzdC0+bmV4dDsKKwkgIGxkX3N0YXRlLmFsbHNlY3Rpb25zW2xhc3Rfd3JpdGFibGVdLT5sYXN0LT5uZXh0ID0gc2k7CisJICBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsYXN0X3dyaXRhYmxlXS0+bGFzdCA9IHNpOworCX0KKyAgICAgIGVsc2UKKwlsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsYXN0X3dyaXRhYmxlXS0+bGFzdCA9IHNpLT5uZXh0ID0gc2k7CisgICAgfQorCisgIC8qIENyZWF0ZSBjb21tb24gc3ltYm9sIGRhdGEgYmxvY2suICAqLworICBpZiAobGRfc3RhdGUuY29tbW9uX3N5bXMgIT0gTlVMTCkKKyAgICB7CisjaWYgTkFUSVZFX0VMRgorICAgICAgc3RydWN0IHNjbmluZm8gKnNpID0gKHN0cnVjdCBzY25pbmZvICopCisJb2JzdGFja19jYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBzaXplb2YgKCpzaSkgKyBzaXplb2YgKFhFbGZfU2hkcikpOworICAgICAgc2ktPnNoZHIgPSAoWEVsZl9TaGRyICopIChzaSArIDEpOworI2Vsc2UKKyAgICAgIHN0cnVjdCBzY25pbmZvICpzaSA9IChzdHJ1Y3Qgc2NuaW5mbyAqKSBvYnN0YWNrX2NhbGxvYyAoJmxkX3N0YXRlLnNtZW0sCisJCQkJCQkJICAgICAgc2l6ZW9mICgqc2kpKTsKKyNlbmRpZgorCisgICAgICAvKiBHZXQgdGhlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgc3ltYm9scyB3aXRoIGNvcHkgcmVsb2NhdGlvbnMuICAqLworICAgICAgY29tcHV0ZV9jb21tb25fc3ltYm9sX29mZnNldCAoJlNDTklORk9fU0hEUiAoc2ktPnNoZHIpKTsKKworICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIG5lZWRlZC4gICovCisgICAgICBzaS0+dXNlZCA9IHRydWU7CisgICAgICAvKiBSZW1lbWJlciBmb3IgbGF0ZXIgdGhlIHNlY3Rpb24gZGF0YSBzdHJ1Y3R1cmUuICAqLworICAgICAgbGRfc3RhdGUuY29tbW9uX3NlY3Rpb24gPSBzaTsKKworICAgICAgaWYgKGxpa2VseSAobGRfc3RhdGUuYWxsc2VjdGlvbnNbbGFzdF93cml0YWJsZV0tPmxhc3QgIT0gTlVMTCkpCisJeworCSAgc2ktPm5leHQgPSBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsYXN0X3dyaXRhYmxlXS0+bGFzdC0+bmV4dDsKKwkgIGxkX3N0YXRlLmFsbHNlY3Rpb25zW2xhc3Rfd3JpdGFibGVdLT5sYXN0LT5uZXh0ID0gc2k7CisJICBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsYXN0X3dyaXRhYmxlXS0+bGFzdCA9IHNpOworCX0KKyAgICAgIGVsc2UKKwlsZF9zdGF0ZS5hbGxzZWN0aW9uc1tsYXN0X3dyaXRhYmxlXS0+bGFzdCA9IHNpLT5uZXh0ID0gc2k7CisgICAgfQorfQorCisKKy8qIENyZWF0ZSB0aGUgb3V0cHV0IHNlY3Rpb25zIG5vdy4gIFRoaXMgcmVxdWlyZXMga25vd2xlZGdlIGFib3V0IGFsbAorICAgdGhlIHNlY3Rpb25zIHdlIHdpbGwgbmVlZC4gIEl0IG1heSBiZSBuZWNlc3NhcnkgdG8gc29ydCBzZWN0aW9ucyBpbgorICAgdGhlIG9yZGVyIHRoZXkgYXJlIHN1cHBvc2VkIHRvIGFwcGVhciBpbiB0aGUgZXhlY3V0YWJsZS4gIFRoZQorICAgc29ydGluZyB1c2UgbWFueSBkaWZmZXJlbnQga2luZHMgb2YgaW5mb3JtYXRpb24gdG8gb3B0aW1pemUgdGhlCisgICByZXN1bHRpbmcgYmluYXJ5LiAgSW1wb3J0YW50IGlzIHRvIHJlc3BlY3Qgc2VnbWVudCBib3VuZGFyaWVzIGFuZAorICAgdGhlIG5lZWRlZCBhbGlnbm1lbnQuICBUaGUgbW9kZSBvZiB0aGUgc2VnbWVudHMgd2lsbCBiZSBkZXRlcm1pbmVkCisgICBhZnRlcndhcmRzIGF1dG9tYXRpY2FsbHkgYnkgdGhlIG91dHB1dCByb3V0aW5lcy4KKworICAgVGhlIGdlbmVyaWMgc29ydGluZyByb3V0aW5lcyB3b3JrIGluIG9uZSBvZiB0d28gcG9zc2libGUgd2F5czoKKworICAgLSBpZiBhIGxpbmtlciBzY3JpcHQgc3BlY2lmaWVzIHRoZSBzZWN0aW9ucyB0byBiZSB1c2VkIGluIHRoZQorICAgICBvdXRwdXQgYW5kIGFzc2lnbnMgdGhlbSB0byBhIHNlZ21lbnQgdGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkOworCisgICAtIG90aGVyd2lzZSB0aGUgbGlua2VyIHdpbGwgb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHBlcm1pc3Npb25zCisgICAgIGFuZCBzb21lIHNwZWNpYWwga25vd2xlZGdlIGFib3V0IHNlY3Rpb24gbmFtZXMuKi8KK3N0YXRpYyB2b2lkCitsZF9nZW5lcmljX2NyZWF0ZV9zZWN0aW9ucyAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApCit7CisgIHN0cnVjdCBzY25ncm91cCAqZ3JvdXBzOworICBzaXplX3QgY250OworCisgIC8qIEZvciByZWxvY2F0YWJsZSBvYmplY3Qgd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgc29ydGluZyB0aGUKKyAgICAgc2VjdGlvbnMgYW5kIHdlIGRvIHdhbnQgdG8gcHJlc2VydmUgdGhlIHJlbG9jYXRpb24gc2VjdGlvbnMgYXMKKyAgICAgdGhleSBhcHBlYXIgaW4gdGhlIGlucHV0IGZpbGVzLiAgKi8KKyAgaWYgKGxkX3N0YXRlLmZpbGVfdHlwZSAhPSByZWxvY2F0YWJsZV9maWxlX3R5cGUpCisgICAgeworICAgICAgLyogQ29sbGVjdCBhbGwgdGhlIHJlbG9jYXRpb24gc2VjdGlvbnMuICBUaGV5IGFyZSBoYW5kbGVkCisJIHNlcGFyYXRlbHkuICAqLworICAgICAgc3RydWN0IHNjbmluZm8gKmxpc3QgPSBOVUxMOworICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBsZF9zdGF0ZS5uYWxsc2VjdGlvbnM7ICsrY250KQorCWlmICgobGRfc3RhdGUuYWxsc2VjdGlvbnNbY250XS0+dHlwZSA9PSBTSFRfUkVMCisJICAgICB8fCBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tjbnRdLT50eXBlID09IFNIVF9SRUxBKQorCSAgICAvKiBUaGUgZ2VuZXJhdGVkIHJlbG9jYXRpb24gc2VjdGlvbnMgYXJlIG5vdCBvZiBhbnkKKwkgICAgICAgaW50ZXJlc3QgaGVyZS4gICovCisJICAgICYmIGxkX3N0YXRlLmFsbHNlY3Rpb25zW2NudF0tPmxhc3QgIT0gTlVMTCkKKwkgIHsKKwkgICAgaWYgKGxpc3QgPT0gTlVMTCkKKwkgICAgICBsaXN0ID0gbGRfc3RhdGUuYWxsc2VjdGlvbnNbY250XS0+bGFzdDsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLyogTWVyZ2UgdGhlIHNlY3Rpb25zIGxpc3QuICAqLworCQlzdHJ1Y3Qgc2NuaW5mbyAqZmlyc3QgPSBsaXN0LT5uZXh0OworCQlsaXN0LT5uZXh0ID0gbGRfc3RhdGUuYWxsc2VjdGlvbnNbY250XS0+bGFzdC0+bmV4dDsKKwkJbGRfc3RhdGUuYWxsc2VjdGlvbnNbY250XS0+bGFzdC0+bmV4dCA9IGZpcnN0OworCQlsaXN0ID0gbGRfc3RhdGUuYWxsc2VjdGlvbnNbY250XS0+bGFzdDsKKwkgICAgICB9CisKKwkgICAgLyogUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBzZWN0aW9uIGxpc3QuICAqLworCSAgICBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tjbnRdID0gTlVMTDsKKwkgIH0KKyAgICAgIGxkX3N0YXRlLnJlbGxpc3QgPSBsaXN0OworCisgICAgICBpZiAobGRfc3RhdGUub3V0cHV0X3NlZ21lbnRzID09IE5VTEwpCisJLyogU29ydCB1c2luZyBidWlsdGluIHJ1bGVzLiAgKi8KKwlzb3J0X3NlY3Rpb25zX2dlbmVyaWMgKCk7CisgICAgICBlbHNlCisJc29ydF9zZWN0aW9uc19sc2NyaXB0ICgpOworICAgIH0KKworICAvKiBOb3cgaXRlcmF0ZSBvdmVyIHRoZSBpbnB1dCBzZWN0aW9ucyBhbmQgY3JlYXRlIHRoZSBzZWN0aW9ucyBpbiB0aGUKKyAgICAgb3JkZXIgdGhleSBhcmUgcmVxdWlyZWQgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBsZF9zdGF0ZS5uYWxsc2VjdGlvbnM7ICsrY250KQorICAgIHsKKyAgICAgIHN0cnVjdCBzY25oZWFkICpoZWFkID0gbGRfc3RhdGUuYWxsc2VjdGlvbnNbY250XTsKKyAgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgIFhFbGZfU2hkcl92YXJkZWYgKHNoZHIpOworCisgICAgICAvKiBEb24ndCBoYW5kbGUgdW51c2VkIHNlY3Rpb25zLiAgKi8KKyAgICAgIGlmICghaGVhZC0+dXNlZCkKKwljb250aW51ZTsKKworICAgICAgLyogV2UgZmlyc3QgaGF2ZSB0byBjcmVhdGUgdGhlIHNlY3Rpb24gZ3JvdXAgaWYgbmVjZXNzYXJ5LgorCSBTZWN0aW9uIGdyb3VwIHNlY3Rpb25zIG11c3QgY29tZSAoaW4gc2VjdGlvbiBpbmRleCBvcmRlcikKKwkgYmVmb3JlIGFueSBvZiB0aGUgc2VjdGlvbiBjb250YWluZWQuICBUaGlzIGFsbCBpcyBuZWNlc3NhcnkKKwkgb25seSBmb3IgcmVsb2NhdGFibGUgb2JqZWN0IGFzIG90aGVyIG9iamVjdCB0eXBlcyBhcmUgbm90CisJIGFsbG93ZWQgdG8gY29udGFpbiBzZWN0aW9uIGdyb3Vwcy4gICovCisgICAgICBpZiAobGRfc3RhdGUuZmlsZV90eXBlID09IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZQorCSAgJiYgdW5saWtlbHkgKGhlYWQtPmZsYWdzICYgU0hGX0dST1VQKSkKKwl7CisJICAvKiBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgc2VjdGlvbiB3aGljaCBpcyBjb250YWluZWQgaW4gYQorCSAgICAgc2VjdGlvbiBncm91cCBpbiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgbWVhbnMgd2UgbXVzdAorCSAgICAgY3JlYXRlIGEgc2VjdGlvbiBncm91cCBoZXJlIGFzIHdlbGwuICBUaGUgb25seSBwcm9ibGVtIGlzCisJICAgICB0aGF0IG5vdCBhbGwgaW5wdXQgZmlsZXMgaGF2ZSB0byBoYXZlIHRvIHNhbWUga2luZCBvZgorCSAgICAgcGFydGl0aW9uaW5nIG9mIHRoZSBzZWN0aW9ucy4gIEkuZS4sIHNlY3Rpb25zIEEgYW5kIEIgaW4KKwkgICAgIG9uZSBpbnB1dCBmaWxlIGFuZCBzZWN0aW9ucyBCIGFuZCBDIGluIGFub3RoZXIgaW5wdXQgZmlsZQorCSAgICAgY2FuIGJlIGluIG9uZSBncm91cC4gIFRoYXQgd2lsbCByZXN1bHQgaW4gYSBncm91cAorCSAgICAgY29udGFpbmluZyB0aGUgc2VjdGlvbnMgQSwgQiwgYW5kIEMgaW4gdGhlIG91dHB1dAorCSAgICAgZmlsZS4gICovCisJICBzdHJ1Y3Qgc2NuaW5mbyAqcnVucDsKKwkgIEVsZjMyX1dvcmQgaGVyZV9ncm91cGlkeCA9IDA7CisJICBzdHJ1Y3Qgc2NuZ3JvdXAgKmhlcmVfZ3JvdXA7CisJICBzdHJ1Y3QgbWVtYmVyICpuZXdwOworCisJICAvKiBGaXJzdCBjaGVjayB3aGV0aGVyIGFueSBzZWN0aW9uIGlzIGFscmVhZHkgaW4gYSBncm91cC4KKwkgICAgIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGFkZCB0aGlzIG91dHB1dCBzZWN0aW9uLCB0b28uICAqLworCSAgcnVucCA9IGhlYWQtPmxhc3Q7CisJICBkbworCSAgICB7CisJICAgICAgYXNzZXJ0IChydW5wLT5ncnBpZCAhPSAwKTsKKworCSAgICAgIGhlcmVfZ3JvdXBpZHggPSBydW5wLT5maWxlaW5mby0+c2NuaW5mb1tydW5wLT5ncnBpZF0ub3V0c2NubmR4OworCSAgICAgIGlmIChoZXJlX2dyb3VwaWR4ICE9IDApCisJCWJyZWFrOworCSAgICB9CisJICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBoZWFkLT5sYXN0KTsKKworCSAgaWYgKGhlcmVfZ3JvdXBpZHggPT0gMCkKKwkgICAgeworCSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgc2VjdGlvbiBncm91cCBzZWN0aW9uLiAgKi8KKwkgICAgICBzY24gPSBlbGZfbmV3c2NuIChsZF9zdGF0ZS5vdXRlbGYpOworCSAgICAgIHhlbGZfZ2V0c2hkciAoc2NuLCBzaGRyKTsKKwkgICAgICBpZiAoc2hkciA9PSBOVUxMKQorCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIiksCisJCSAgICAgICBlbGZfZXJybXNnICgtMSkpOworCisJICAgICAgaGVyZV9ncm91cCA9IChzdHJ1Y3Qgc2NuZ3JvdXAgKikgeG1hbGxvYyAoc2l6ZW9mICgqaGVyZV9ncm91cCkpOworCSAgICAgIGhlcmVfZ3JvdXAtPm91dHNjbmlkeCA9IGhlcmVfZ3JvdXBpZHggPSBlbGZfbmR4c2NuIChzY24pOworCSAgICAgIGhlcmVfZ3JvdXAtPm5zY25zID0gMDsKKwkgICAgICBoZXJlX2dyb3VwLT5tZW1iZXIgPSBOVUxMOworCSAgICAgIGhlcmVfZ3JvdXAtPm5leHQgPSBsZF9zdGF0ZS5ncm91cHM7CisJICAgICAgLyogUGljayBhIG5hbWUgZm9yIHRoZSBzZWN0aW9uLiAgVG8ga2VlcCBpdCBtZWFuaW5nZnVsCisJCSB3ZSB1c2UgYSBuYW1lIHVzZWQgaW4gdGhlIGlucHV0IGZpbGVzLiAgSWYgdGhlCisJCSBzZWN0aW9uIGdyb3VwIGluIHRoZSBvdXRwdXQgZmlsZSBzaG91bGQgY29udGFpbgorCQkgc2VjdGlvbiB3aGljaCB3ZXJlIGluIHNlY3Rpb24gZ3JvdXBzIG9mIGRpZmZlcmVudAorCQkgbmFtZXMgaW4gdGhlIGlucHV0IGZpbGVzIHRoaXMgaXMgdGhlIHVzZXJzCisJCSBwcm9ibGVtLiAgKi8KKwkgICAgICBoZXJlX2dyb3VwLT5uYW1lZW50CisJCT0gZWJsX3N0cnRhYmFkZCAobGRfc3RhdGUuc2hzdHJ0YWIsCisJCQkJIGVsZl9zdHJwdHIgKHJ1bnAtPmZpbGVpbmZvLT5lbGYsCisJCQkJCSAgICAgcnVucC0+ZmlsZWluZm8tPnNoc3RybmR4LAorCQkJCQkgICAgIFNDTklORk9fU0hEUiAocnVucC0+c2hkcikuc2hfbmFtZSksCisJCQkJIDApOworCSAgICAgIC8qIFNpZ25hdHVyZSBzeW1ib2wuICAqLworCSAgICAgIGhlcmVfZ3JvdXAtPnN5bWJvbAorCQk9IHJ1bnAtPmZpbGVpbmZvLT5zY25pbmZvW3J1bnAtPmdycGlkXS5zeW1ib2xzOworCisJICAgICAgbGRfc3RhdGUuZ3JvdXBzID0gaGVyZV9ncm91cDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogU2VhcmNoIGZvciB0aGUgZ3JvdXAgd2l0aCB0aGlzIGluZGV4LiAgKi8KKwkgICAgICBoZXJlX2dyb3VwID0gbGRfc3RhdGUuZ3JvdXBzOworCSAgICAgIHdoaWxlIChoZXJlX2dyb3VwLT5vdXRzY25pZHggIT0gaGVyZV9ncm91cGlkeCkKKwkJaGVyZV9ncm91cCA9IGhlcmVfZ3JvdXAtPm5leHQ7CisJICAgIH0KKworCSAgLyogQWRkIHRoZSBuZXcgb3V0cHV0IHNlY3Rpb24uICAqLworCSAgbmV3cCA9IChzdHJ1Y3QgbWVtYmVyICopIGFsbG9jYSAoc2l6ZW9mICgqbmV3cCkpOworCSAgbmV3cC0+c2NuID0gaGVhZDsKKyNpZm5kZWYgTkRUX05FRURFRAorCSAgbmV3cC0+bmV4dCA9IE5VTEw7CisjZW5kaWYKKwkgIENTTkdMX0xJU1RfQUREX1JFQVIgKGhlcmVfZ3JvdXAtPm1lbWJlciwgbmV3cCk7CisJICArK2hlcmVfZ3JvdXAtPm5zY25zOworCisJICAvKiBTdG9yZSB0aGUgc2VjdGlvbiBncm91cCBpbmRleCBpbiBhbGwgaW5wdXQgZmlsZXMuICAqLworCSAgcnVucCA9IGhlYWQtPmxhc3Q7CisJICBkbworCSAgICB7CisJICAgICAgYXNzZXJ0IChydW5wLT5ncnBpZCAhPSAwKTsKKworCSAgICAgIGlmIChydW5wLT5maWxlaW5mby0+c2NuaW5mb1tydW5wLT5ncnBpZF0ub3V0c2NubmR4ID09IDApCisJCXJ1bnAtPmZpbGVpbmZvLT5zY25pbmZvW3J1bnAtPmdycGlkXS5vdXRzY25uZHggPSBoZXJlX2dyb3VwaWR4OworCSAgICAgIGVsc2UKKwkJYXNzZXJ0IChydW5wLT5maWxlaW5mby0+c2NuaW5mb1tydW5wLT5ncnBpZF0ub3V0c2NubmR4CisJCQk9PSBoZXJlX2dyb3VwaWR4KTsKKwkgICAgfQorCSAgd2hpbGUgKChydW5wID0gcnVucC0+bmV4dCkgIT0gaGVhZC0+bGFzdCk7CisJfQorCisgICAgICAvKiBXZSdsbCB1c2UgdGhpcyBzZWN0aW9uIHNvIGdldCBpdCdzIG5hbWUgaW4gdGhlIHNlY3Rpb24gaGVhZGVyCisJIHN0cmluZyB0YWJsZS4gICovCisgICAgICBpZiAoaGVhZC0+a2luZCA9PSBzY25fbm9ybWFsKQorCWhlYWQtPm5hbWVlbnQgPSBlYmxfc3RydGFiYWRkIChsZF9zdGF0ZS5zaHN0cnRhYiwgaGVhZC0+bmFtZSwgMCk7CisKKyAgICAgIC8qIENyZWF0ZSBhIG5ldyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSBhbmQgYWRkIGFsbCBkYXRhCisJIGZyb20gYWxsIHRoZSBzZWN0aW9ucyB3ZSByZWFkLiAgKi8KKyAgICAgIHNjbiA9IGVsZl9uZXdzY24gKGxkX3N0YXRlLm91dGVsZik7CisgICAgICBoZWFkLT5zY25pZHggPSBlbGZfbmR4c2NuIChzY24pOworICAgICAgeGVsZl9nZXRzaGRyIChzY24sIHNoZHIpOworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiKSwKKwkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgYXNzZXJ0IChoZWFkLT50eXBlICE9IFNIVF9OVUxMKTsKKyAgICAgIGFzc2VydCAoaGVhZC0+dHlwZSAhPSBTSFRfU1lNVEFCKTsKKyAgICAgIGFzc2VydCAoaGVhZC0+dHlwZSAhPSBTSFRfRFlOU1lNIHx8IGhlYWQtPmtpbmQgIT0gc2NuX25vcm1hbCk7CisgICAgICBhc3NlcnQgKGhlYWQtPnR5cGUgIT0gU0hUX1NUUlRBQiB8fCBoZWFkLT5raW5kICE9IHNjbl9ub3JtYWwpOworICAgICAgYXNzZXJ0IChoZWFkLT50eXBlICE9IFNIVF9HUk9VUCk7CisgICAgICBzaGRyLT5zaF90eXBlID0gaGVhZC0+dHlwZTsKKyAgICAgIHNoZHItPnNoX2ZsYWdzID0gaGVhZC0+ZmxhZ3M7CisgICAgICBzaGRyLT5zaF9hZGRyYWxpZ24gPSBoZWFkLT5hbGlnbjsKKyAgICAgIHNoZHItPnNoX2VudHNpemUgPSBoZWFkLT5lbnRzaXplOworICAgICAgYXNzZXJ0IChzaGRyLT5zaF9lbnRzaXplICE9IDAgfHwgKHNoZHItPnNoX2ZsYWdzICYgU0hGX01FUkdFKSA9PSAwKTsKKyAgICAgICh2b2lkKSB4ZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpOworCisgICAgICAvKiBXZSBoYXZlIHRvIGtub3cgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlCisJIHJpZ2h0IGF3YXkuICAqLworICAgICAgaWYgKGhlYWQtPmtpbmQgPT0gc2NuX2RvdF9keW5zeW0pCisJbGRfc3RhdGUuZHluc3ltc2NuaWR4ID0gZWxmX25keHNjbiAoc2NuKTsKKyAgICB9CisKKyAgLyogQWN0dWFsbHkgY3JlYXRlIHRoZSBzZWN0aW9uIGdyb3VwIHNlY3Rpb25zLiAgKi8KKyAgZ3JvdXBzID0gbGRfc3RhdGUuZ3JvdXBzOworICB3aGlsZSAoZ3JvdXBzICE9IE5VTEwpCisgICAgeworICAgICAgRWxmX1NjbiAqc2NuOworICAgICAgRWxmX0RhdGEgKmRhdGE7CisgICAgICBFbGYzMl9Xb3JkICpncnBkYXRhOworICAgICAgc3RydWN0IG1lbWJlciAqcnVucDsKKworICAgICAgc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBncm91cHMtPm91dHNjbmlkeCk7CisgICAgICBhc3NlcnQgKHNjbiAhPSBOVUxMKTsKKworICAgICAgZGF0YSA9IGVsZl9uZXdkYXRhIChzY24pOworICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiKSwKKwkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgZGF0YS0+ZF9zaXplID0gKGdyb3Vwcy0+bnNjbnMgKyAxKSAqIHNpemVvZiAoRWxmMzJfV29yZCk7CisgICAgICBkYXRhLT5kX2J1ZiA9IGdycGRhdGEgPSAoRWxmMzJfV29yZCAqKSB4bWFsbG9jIChkYXRhLT5kX3NpemUpOworICAgICAgZGF0YS0+ZF90eXBlID0gRUxGX1RfV09SRDsKKyAgICAgIGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7CisgICAgICBkYXRhLT5kX29mZiA9IDA7CisgICAgICAvKiBYWFggV2hhdCBiZXR0ZXIgdG8gdXNlPyAgKi8KKyAgICAgIGRhdGEtPmRfYWxpZ24gPSBzaXplb2YgKEVsZjMyX1dvcmQpOworCisgICAgICAvKiBUaGUgZmlyc3Qgd29yZCBpbiB0aGUgc2VjdGlvbiBpcyB0aGUgZmxhZyB3b3JkLiAgKi8KKyAgICAgIC8qIFhYWCBTZXQgQ09NREFUQSBmbGFnIGlzIG5lY2Vzc2FyeS4gICovCisgICAgICBncnBkYXRhWzBdID0gMDsKKworICAgICAgcnVucCA9IGdyb3Vwcy0+bWVtYmVyLT5uZXh0OworICAgICAgY250ID0gMTsKKyAgICAgIGRvCisJLyogRmlsbCBpbiB0aGUgaW5kZXggb2YgdGhlIHNlY3Rpb24uICAqLworCWdycGRhdGFbY250KytdID0gcnVucC0+c2NuLT5zY25pZHg7CisgICAgICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBncm91cHMtPm1lbWJlci0+bmV4dCk7CisKKyAgICAgIGdyb3VwcyA9IGdyb3Vwcy0+bmV4dDsKKyAgICB9Cit9CisKKworc3RhdGljIGJvb2wKK3JlZHVjZV9zeW1ib2xfcCAoWEVsZl9TeW0gKnN5bSwgc3RydWN0IEVibF9TdHJlbnQgKnN0cmVudCkKK3sKKyAgY29uc3QgY2hhciAqc3RyOworICBjb25zdCBjaGFyICp2ZXJzaW9uOworICBzdHJ1Y3QgaWRfbGlzdCBzZWFyY2g7CisgIHN0cnVjdCBpZF9saXN0ICp2ZXJwOworICBib29sIHJlc3VsdCA9IGxkX3N0YXRlLmRlZmF1bHRfYmluZF9sb2NhbDsKKworICBpZiAoWEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTCB8fCBzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRikKKyAgICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHRvIGxvY2FsIHN5bWJvbHMgaGVyZS4gICovCisgICAgLyogWFhYIEFueSBzZWN0aW9uIHZhbHVlIGluIFtTSE5fTE9SRVNFUlZFUixTSE5fWElOREVYKSBuZWVkCisgICAgICAgc3BlY2lhbCB0cmVhdG1lbnQ/ICAqLworICAgIHJldHVybiBmYWxzZTsKKworICAvKiBYWFggSGFuZGxlIG90aGVyIHN5bWJvbCBiaW5kaW5ncy4gICovCisgIGFzc2VydCAoWEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pID09IFNUQl9HTE9CQUwKKwkgIHx8IFhFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfV0VBSyk7CisKKyAgc3RyID0gZWJsX3N0cmluZyAoc3RyZW50KTsKKyAgdmVyc2lvbiA9IHN0cmNociAoc3RyLCBWRVJfQ0hSKTsKKyAgaWYgKHZlcnNpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBzZWFyY2guaWQgPSBzdHJuZHVwYSAoc3RyLCB2ZXJzaW9uIC0gc3RyKTsKKyAgICAgIGlmICgqKyt2ZXJzaW9uID09IFZFUl9DSFIpCisJLyogU2tpcCB0aGUgc2Vjb25kICdAJyBzaWduYWxsaW5nIGEgZGVmYXVsdCBkZWZpbml0aW9uLiAgKi8KKwkrK3ZlcnNpb247CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2VhcmNoLmlkID0gc3RyOworICAgICAgdmVyc2lvbiA9ICIiOworICAgIH0KKworICB2ZXJwID0gbGRfdmVyc2lvbl9zdHJfdGFiX2ZpbmQgKCZsZF9zdGF0ZS52ZXJzaW9uX3N0cl90YWIsCisJCQkJICBlbGZfaGFzaCAoc2VhcmNoLmlkKSwgJnNlYXJjaCk7CisgIHdoaWxlICh2ZXJwICE9IE5VTEwpCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0aGlzIHN5bWJvbCBpbiB0aGUgdmVyc2lvbiBoYXNoIHRhYmxlLiAgTm93IG1hdGNoIHRoZQorCSB2ZXJzaW9uIG5hbWUuICAqLworICAgICAgaWYgKHN0cmNtcCAodmVycC0+dS5zLnZlcnNpb25uYW1lLCB2ZXJzaW9uKSA9PSAwKQorCS8qIE1hdGNoISAgKi8KKwlyZXR1cm4gdmVycC0+dS5zLmxvY2FsOworCisgICAgICB2ZXJwID0gdmVycC0+bmV4dDsKKyAgICB9CisKKyAgLyogWFhYIEFkZCB0ZXN0IGZvciB3aWxkY2FyZCB2ZXJzaW9uIHN5bWJvbHMuICAqLworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIFhFbGZfQWRkcgorZXZhbF9leHByZXNzaW9uIChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwciwgWEVsZl9BZGRyIGFkZHIpCit7CisgIFhFbGZfQWRkciB2YWwgPSB+KChYRWxmX0FkZHIpIDApOworCisgIHN3aXRjaCAoZXhwci0+dGFnKQorICAgIHsKKyAgICBjYXNlIGV4cF9udW06CisgICAgICB2YWwgPSBleHByLT52YWwubnVtOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV4cF9zaXplb2ZfaGVhZGVyczoKKyAgICAgIHsKKwkvKiBUaGUgJ2VsZl91cGRhdGUnIGNhbGwgZGV0ZXJtaW5lIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0CisJICAgc2VjdGlvbi4gIFRoZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyLiAgKi8KKwlYRWxmX1NoZHJfdmFyZGVmIChzaGRyKTsKKworCXhlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCAxKSwgc2hkcik7CisJYXNzZXJ0IChzaGRyICE9IE5VTEwpOworCisJdmFsID0gc2hkci0+c2hfb2Zmc2V0OworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV4cF9wYWdlc2l6ZToKKyAgICAgIHZhbCA9IGxkX3N0YXRlLnBhZ2VzaXplOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV4cF9pZDoKKyAgICAgIC8qIFdlIGFyZSBoZXJlIGNvbXB1dGluZyBvbmx5IGFkZHJlc3MgZXhwcmVzc2lvbnMuICBJdCBzZWVtcyBub3QKKwkgdG8gYmUgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhbnkgdmFyaWFibGUgYnV0ICIuIi4gIExldCdzIGF2b2lkCisJIHRoZSBjb21wbGljYXRpb24uICBJZiBpdCB0dXJucyB1cCB0byBiZSBuZWVkZWQgd2UgY2FuIGFkZAorCSBpdC4gICovCisgICAgICBpZiAoc3RyY21wIChleHByLT52YWwuc3RyLCAiLiIpICE9IDApCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIlwKK2FkZHJlc3MgY29tcHV0YXRpb24gZXhwcmVzc2lvbiBjb250YWlucyB2YXJpYWJsZSAnJXMnIiksCisJICAgICAgIGV4cHItPnZhbC5zdHIpOworCisgICAgICB2YWwgPSBhZGRyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV4cF9tdWx0OgorICAgICAgdmFsID0gKGV2YWxfZXhwcmVzc2lvbiAoZXhwci0+dmFsLmJpbmFyeS5sZWZ0LCBhZGRyKQorCSAgICAgKiBldmFsX2V4cHJlc3Npb24gKGV4cHItPnZhbC5iaW5hcnkucmlnaHQsIGFkZHIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBleHBfZGl2OgorICAgICAgdmFsID0gKGV2YWxfZXhwcmVzc2lvbiAoZXhwci0+dmFsLmJpbmFyeS5sZWZ0LCBhZGRyKQorCSAgICAgLyBldmFsX2V4cHJlc3Npb24gKGV4cHItPnZhbC5iaW5hcnkucmlnaHQsIGFkZHIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBleHBfbW9kOgorICAgICAgdmFsID0gKGV2YWxfZXhwcmVzc2lvbiAoZXhwci0+dmFsLmJpbmFyeS5sZWZ0LCBhZGRyKQorCSAgICAgJSBldmFsX2V4cHJlc3Npb24gKGV4cHItPnZhbC5iaW5hcnkucmlnaHQsIGFkZHIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBleHBfcGx1czoKKyAgICAgIHZhbCA9IChldmFsX2V4cHJlc3Npb24gKGV4cHItPnZhbC5iaW5hcnkubGVmdCwgYWRkcikKKwkgICAgICsgZXZhbF9leHByZXNzaW9uIChleHByLT52YWwuYmluYXJ5LnJpZ2h0LCBhZGRyKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXhwX21pbnVzOgorICAgICAgdmFsID0gKGV2YWxfZXhwcmVzc2lvbiAoZXhwci0+dmFsLmJpbmFyeS5sZWZ0LCBhZGRyKQorCSAgICAgLSBldmFsX2V4cHJlc3Npb24gKGV4cHItPnZhbC5iaW5hcnkucmlnaHQsIGFkZHIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBleHBfYW5kOgorICAgICAgdmFsID0gKGV2YWxfZXhwcmVzc2lvbiAoZXhwci0+dmFsLmJpbmFyeS5sZWZ0LCBhZGRyKQorCSAgICAgJiBldmFsX2V4cHJlc3Npb24gKGV4cHItPnZhbC5iaW5hcnkucmlnaHQsIGFkZHIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBleHBfb3I6CisgICAgICB2YWwgPSAoZXZhbF9leHByZXNzaW9uIChleHByLT52YWwuYmluYXJ5LmxlZnQsIGFkZHIpCisJICAgICB8IGV2YWxfZXhwcmVzc2lvbiAoZXhwci0+dmFsLmJpbmFyeS5yaWdodCwgYWRkcikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV4cF9hbGlnbjoKKyAgICAgIHZhbCA9IGV2YWxfZXhwcmVzc2lvbiAoZXhwci0+dmFsLmNoaWxkLCBhZGRyKTsKKyAgICAgIGlmICgodmFsICYgKHZhbCAtIDEpKSAhPSAwKQorCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJhcmd1bWVudCAnJSIgUFJJdU1BWCAiJyBvZiBBTElHTiBpbiBhZGRyZXNzIGNvbXB1dGF0aW9uIGV4cHJlc3Npb24gaXMgbm8gcG93ZXIgb2YgdHdvIiksCisJICAgICAgICh1aW50bWF4X3QpIHZhbCk7CisgICAgICB2YWwgPSAoYWRkciArIHZhbCAtIDEpICYgfih2YWwgLSAxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdmFsOworfQorCisKKy8qIEZpbmQgYSBnb29kIGFzIHBvc3NpYmxlIHNpemUgZm9yIHRoZSBoYXNoIHRhYmxlIHNvIHRoYXQgYWxsIHRoZQorICAgbm9uLXplcm8gZW50cmllcyBpbiBIQVNIQ09ERVMgZG9uJ3QgY29sbGlkZSB0b28gbXVjaCBhbmQgdGhlIHRhYmxlCisgICBpc24ndCB0b28gbGFyZ2UuICBUaGVyZSBpcyBubyBleGFjdCBmb3JtdWxhciBmb3IgdGhpcyBzbyB3ZSB1c2UgYQorICAgaGV1cmlzdGljLiAgRGVwZW5kaW5nIG9uIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwgdGhlIHNlYXJjaCBpcworICAgbG9uZ2VyIG9yIHNob3J0ZXIuICAqLworc3RhdGljIHNpemVfdAorb3B0aW1hbF9idWNrZXRfc2l6ZSAoRWxmMzJfV29yZCAqaGFzaGNvZGVzLCBzaXplX3QgbWF4Y250LCBpbnQgb3B0bGV2ZWwpCit7CisgIHNpemVfdCBtaW5zaXplOworICBzaXplX3QgbWF4c2l6ZTsKKyAgc2l6ZV90IGJlc3RzaXplOworICB1aW50NjRfdCBiZXN0Y29zdDsKKyAgc2l6ZV90IHNpemU7CisgIHVpbnQzMl90ICpjb3VudHM7CisgIHVpbnQzMl90ICpsZW5ndGhzOworCisgIGlmIChtYXhjbnQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICAvKiBXaGVuIHdlIGFyZSBub3Qgb3B0aW1pemluZyB3ZSBydW4gb25seSB2ZXJ5IGZldyB0ZXN0cy4gICovCisgIGlmIChvcHRsZXZlbCA8PSAwKQorICAgIHsKKyAgICAgIG1pbnNpemUgPSBtYXhjbnQ7CisgICAgICBtYXhzaXplID0gbWF4Y250ICsgMTAwMDAgLyBtYXhjbnQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIHRvIHN0YXJ0IHdpdGggYSBzbWFsbGVyIHRhYmxlIHRoYW4KKwkgb25lIHdoaWNoIGhhcyBhdCBsZWFzdCBmb3VyIGNvbGxpc2lvbnMuICAqLworICAgICAgbWluc2l6ZSA9IE1BWCAoMSwgbWF4Y250IC8gNCk7CisgICAgICAvKiBXZSBsb29rIGZvciBhIGJlc3QgZml0IGluIHRoZSByYW5nZSBvZiB1cCB0byBlaWd0aCB0aW1lcyB0aGUKKwkgbnVtYmVyIG9mIGVsZW1lbnRzLiAgKi8KKyAgICAgIG1heHNpemUgPSAyICogbWF4Y250ICsgKDYgKiBNSU4gKG9wdGxldmVsLCAxMDApICogbWF4Y250KSAvIDEwMDsKKyAgICB9CisgIGJlc3RzaXplID0gbWF4Y250OworICBiZXN0Y29zdCA9IFVJTlRfTUFYOworCisgIC8qIEFycmF5IGZvciBjb3VudGluZyB0aGUgY29sbGlzaW9ucyBhbmQgY2hhaW4gbGVuZ3Rocy4gICovCisgIGNvdW50cyA9ICh1aW50MzJfdCAqKSB4bWFsbG9jICgobWF4Y250ICsgMSArIG1heHNpemUpICogc2l6ZW9mICh1aW50MzJfdCkpOworICBsZW5ndGhzID0gJmNvdW50c1ttYXhjbnQgKyAxXTsKKworICBmb3IgKHNpemUgPSBtaW5zaXplOyBzaXplIDw9IG1heHNpemU7ICsrc2l6ZSkKKyAgICB7CisgICAgICBzaXplX3QgaW5uZXI7CisgICAgICB1aW50NjRfdCBjb3N0OworICAgICAgdWludDMyX3QgbWF4bGVuZ3RoOworICAgICAgdWludDY0X3Qgc3VjY2VzczsKKyAgICAgIHVpbnQzMl90IGFjYzsKKyAgICAgIGRvdWJsZSBmYWN0b3I7CisKKyAgICAgIG1lbXNldCAobGVuZ3RocywgJ1wwJywgc2l6ZSAqIHNpemVvZiAodWludDMyX3QpKTsKKyAgICAgIG1lbXNldCAoY291bnRzLCAnXDAnLCAobWF4Y250ICsgMSkgKiBzaXplb2YgKHVpbnQzMl90KSk7CisKKyAgICAgIC8qIERldGVybWluZSBob3cgb2Z0ZW4gZWFjaCBoYXNoIGJ1Y2tldCBpcyB1c2VkLiAgKi8KKyAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IG1heGNudDsgKytpbm5lcikKKwkrK2xlbmd0aHNbaGFzaGNvZGVzW2lubmVyXSAlIHNpemVdOworCisgICAgICAvKiBEZXRlcm1pbmUgdGhlIGxlbmd0aHMuICAqLworICAgICAgbWF4bGVuZ3RoID0gMDsKKyAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IHNpemU7ICsraW5uZXIpCisJeworCSAgKytjb3VudHNbbGVuZ3Roc1tpbm5lcl1dOworCisJICBpZiAobGVuZ3Roc1tpbm5lcl0gPiBtYXhsZW5ndGgpCisJICAgIG1heGxlbmd0aCA9IGxlbmd0aHNbaW5uZXJdOworCX0KKworICAgICAgLyogRGV0ZXJtaW5lIHN1Y2Nlc3NmdWwgbG9va3VwIGxlbmd0aC4gICovCisgICAgICBhY2MgPSAwOworICAgICAgc3VjY2VzcyA9IDA7CisgICAgICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPD0gbWF4bGVuZ3RoOyArK2lubmVyKQorCXsKKwkgIGFjYyArPSBpbm5lcjsKKwkgIHN1Y2Nlc3MgKz0gY291bnRzW2lubmVyXSAqIGFjYzsKKwl9CisKKyAgICAgIC8qIFdlIGNhbiBjb21wdXRlIHR3byBmYWN0b3JzIG5vdzogdGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIGEKKwkgcG9zaXRpdmUgc2VhcmNoIGFuZCB0aGUgYXZlcmFnZSBsZW5ndGggb2YgYSBuZWdhdGl2ZSBzZWFyY2guCisJIFdlIGNvdW50IHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgd2hpY2ggaGF2ZSB0byBsb29rIGF0IHRoZQorCSBuYW1lcyB0aGVtc2VsdmVzLiAgUmVjb2duaXppbmcgdGhhdCB0aGUgY2hhaW4gZW5kZWQgaXMgbm90CisJIGFjY291bnRlZCBmb3Igc2luY2UgaXQncyBhbG1vc3QgZm9yIGZyZWUuCisKKwkgV2hpY2ggbG9va3VwIGlzIG1vcmUgaW1wb3J0YW50IGRlcGVuZHMgb24gdGhlIGtpbmQgb2YgRFNPLgorCSBJZiBpdCBpcyBhIHN5c3RlbSBEU08gbGlrZSBsaWJjIGl0IGlzIGV4cGVjdGVkIHRoYXQgbW9zdAorCSBsb29rdXBzIHN1Y2NlZWQuICBPdGhlcndpc2UgbW9zdCBsb29rdXBzIGZhaWwuICAqLworICAgICAgaWYgKGxkX3N0YXRlLmlzX3N5c3RlbV9saWJyYXJ5KQorCWZhY3RvciA9ICgxLjAgKiAoZG91YmxlKSBzdWNjZXNzIC8gKGRvdWJsZSkgbWF4Y250CisJCSAgKyAwLjMgKiAoZG91YmxlKSBtYXhjbnQgLyAoZG91YmxlKSBzaXplKTsKKyAgICAgIGVsc2UKKwlmYWN0b3IgPSAoMC4zICogKGRvdWJsZSkgc3VjY2VzcyAvIChkb3VibGUpIG1heGNudAorCQkgICsgMS4wICogKGRvdWJsZSkgbWF4Y250IC8gKGRvdWJsZSkgc2l6ZSk7CisKKyAgICAgIC8qIENvbWJpbmUgdGhlIGxvb2t1cCBjb3N0IGZhY3Rvci4gIFRoZSAxLzE2dGggYWRkZW5kIGFkZHMKKwkgcGVuYWx0aWVzIGZvciB0b28gbGFyZ2UgdGFibGUgc2l6ZXMuICAqLworICAgICAgY29zdCA9ICgyICsgbWF4Y250ICsgc2l6ZSkgKiAoZmFjdG9yICsgMS4wIC8gMTYuMCk7CisKKyNpZiAwCisgICAgICBwcmludGYgKCJtYXhjbnQgPSAlZCwgc2l6ZSA9ICVkLCBjb3N0ID0gJUxkLCBzdWNjZXNzID0gJWcsIGZhaWwgPSAlZywgZmFjdG9yID0gJWdcbiIsCisJICAgICAgbWF4Y250LCBzaXplLCBjb3N0LCAoZG91YmxlKSBzdWNjZXNzIC8gKGRvdWJsZSkgbWF4Y250LCAoZG91YmxlKSBtYXhjbnQgLyAoZG91YmxlKSBzaXplLCBmYWN0b3IpOworI2VuZGlmCisKKyAgICAgIC8qIENvbXBhcmUgd2l0aCBjdXJyZW50IGJlc3QgcmVzdWx0cy4gICovCisgICAgICBpZiAoY29zdCA8IGJlc3Rjb3N0KQorCXsKKwkgIGJlc3Rjb3N0ID0gY29zdDsKKwkgIGJlc3RzaXplID0gc2l6ZTsKKwl9CisgICAgfQorCisgIGZyZWUgKGNvdW50cyk7CisKKyAgcmV0dXJuIGJlc3RzaXplOworfQorCisKK3N0YXRpYyBYRWxmX0FkZHIKK2ZpbmRfZW50cnlfcG9pbnQgKHZvaWQpCit7CisgIFhFbGZfQWRkciByZXN1bHQ7CisKKyAgaWYgKGxkX3N0YXRlLmVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IHN5bWJvbCBzZWFyY2ggPSB7IC5uYW1lID0gbGRfc3RhdGUuZW50cnkgfTsKKyAgICAgIHN0cnVjdCBzeW1ib2wgKnN5bWVudDsKKworICAgICAgc3ltZW50ID0gbGRfc3ltYm9sX3RhYl9maW5kICgmbGRfc3RhdGUuc3ltYm9sX3RhYiwKKwkJCQkgICBlbGZfaGFzaCAobGRfc3RhdGUuZW50cnkpLCAmc2VhcmNoKTsKKyAgICAgIGlmIChzeW1lbnQgIT0gTlVMTCAmJiBzeW1lbnQtPmRlZmluZWQpCisJeworCSAgLyogV2UgZm91bmQgdGhlIHN5bWJvbC4gICovCisJICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChlbGZfZ2V0c2NuIChsZF9zdGF0ZS5vdXRlbGYsCisJCQkJCQkgICAgbGRfc3RhdGUuc3ltc2NuaWR4KSwgTlVMTCk7CisKKwkgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKworCSAgc3ltID0gTlVMTDsKKwkgIGlmIChkYXRhICE9IE5VTEwpCisJICAgIHhlbGZfZ2V0c3ltIChkYXRhLCBsZF9zdGF0ZS5kYmxpbmRpcmVjdFtzeW1lbnQtPm91dHN5bWlkeF0sIHN5bSk7CisKKwkgIGlmIChzeW0gPT0gTlVMTCAmJiBsZF9zdGF0ZS5uZWVkX2R5bnN5bSAmJiBzeW1lbnQtPm91dGR5bnN5bWlkeCAhPSAwKQorCSAgICB7CisJICAgICAgLyogVXNlIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZiBhdmFpbGFibGUuICAqLworCSAgICAgIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLAorCQkJCQkgICAgICBsZF9zdGF0ZS5keW5zeW1zY25pZHgpLCBOVUxMKTsKKworCSAgICAgIHN5bSA9IE5VTEw7CisJICAgICAgaWYgKGRhdGEgIT0gTlVMTCkKKwkJeGVsZl9nZXRzeW0gKGRhdGEsIHN5bWVudC0+b3V0ZHluc3ltaWR4LCBzeW0pOworCSAgICB9CisKKwkgIGlmIChzeW0gIT0gTlVMTCkKKwkgICAgcmV0dXJuIHN5bS0+c3RfdmFsdWU7CisKKwkgIC8qIFhYWCBXaGF0IHRvIGRvIGlmIHRoZSBvdXRwdXQgaGFzIG5vIG5vbi1keW5hbWljIHN5bWJvbAorCSAgICAgdGFibGUgYW5kIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBkb2VzIG5vdCBjb250YWluIHRoZQorCSAgICAgc3ltYm9sPyAgKi8KKwkgIGFzc2VydCAobGRfc3RhdGUubmVlZF9zeW10YWIpOworCSAgYXNzZXJ0IChsZF9zdGF0ZS5zeW1zY25pZHggIT0gMCk7CisJfQorICAgIH0KKworICAvKiBXZSBjb3VsZG4ndCBmaW5kIHRoZSBzeW1ib2wgb3Igbm9uZSB3YXMgZ2l2ZW4uICBVc2UgdGhlIGZpcnN0CisgICAgIGFkZHJlc3Mgb2YgdGhlICIudGV4dCIgc2VjdGlvbiB0aGVuLiAgKi8KKworCisgIHJlc3VsdCA9IDA7CisKKyAgLyogSW4gRFNPcyB0aGlzIGlzIG5vIGZhdGFsIGVycm9yLiAgVGhleSB1c3VhbGx5IGhhdmUgbm8gZW50cnkKKyAgICAgcG9pbnRzLiAgSW4gdGhpcyBjYXNlIHdlIHNldCB0aGUgZW50cnkgcG9pbnQgdG8gemVybywgd2hpY2ggbWFrZXMKKyAgICAgc3VyZSBpdCB3aWxsIGFsd2F5cyBmYWlsLiAgKi8KKyAgaWYgKGxkX3N0YXRlLmZpbGVfdHlwZSA9PSBleGVjdXRhYmxlX2ZpbGVfdHlwZSkKKyAgICB7CisgICAgICBpZiAobGRfc3RhdGUuZW50cnkgIT0gTlVMTCkKKwllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKK2Nhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCBcIiVzXCI6IGRlZmF1bHRpbmcgdG8gJSMwKiIgUFJJeDY0KSwKKwkgICAgICAgbGRfc3RhdGUuZW50cnksCisJICAgICAgIHhlbGZfZ2V0Y2xhc3MgKGxkX3N0YXRlLm91dGVsZikgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsCisJICAgICAgICh1aW50NjRfdCkgcmVzdWx0KTsKKyAgICAgIGVsc2UKKwllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKK25vIGVudHJ5IHN5bWJvbCBzcGVjaWZpZWQ6IGRlZmF1bHRpbmcgdG8gJSMwKiIgUFJJeDY0KSwKKwkgICAgICAgeGVsZl9nZXRjbGFzcyAobGRfc3RhdGUub3V0ZWxmKSA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwKKwkgICAgICAgKHVpbnQ2NF90KSByZXN1bHQpOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkCitmaWxsaW5fc3BlY2lhbF9zeW1ib2wgKHN0cnVjdCBzeW1ib2wgKnN5bXN0LCBzaXplX3Qgc2NuaWR4LCBzaXplX3QgbnN5bSwKKwkJICAgICAgIEVsZl9EYXRhICpzeW1kYXRhLCBzdHJ1Y3QgRWJsX1N0cnRhYiAqc3RydGFiKQoreworICBhc3NlcnQgKGxkX3N0YXRlLmZpbGVfdHlwZSAhPSByZWxvY2F0YWJsZV9maWxlX3R5cGUpOworCisgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKyAgeGVsZl9nZXRzeW1fcHRyIChzeW1kYXRhLCBuc3ltLCBzeW0pOworCisgIC8qIFRoZSBuYW1lIG9mZnNldCB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlci4gICovCisgIHN5bS0+c3RfbmFtZSA9IDA7CisgIC8qIFRyYWRpdGlvbmFsbHk6IGdsb2JhbGx5IHZpc2libGUuICAqLworICBzeW0tPnN0X2luZm8gPSBYRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIHN5bXN0LT50eXBlKTsKKyAgLyogTm8gc3BlY2lhbCB2aXNpYmlsaXR5IG9yIHNvLiAgKi8KKyAgc3ltLT5zdF9vdGhlciA9IDA7CisgIC8qIFJlZmVyZW5jZSB0byB0aGUgR09UIG9yIGR5bmFtaWMgc2VjdGlvbi4gIFNpbmNlIHRoZSBHT1QgYW5kCisgICAgIGR5bmFtaWMgc2VjdGlvbiBhcmUgb25seSBjcmVhdGVkIGZvciBleGVjdXRhYmxlcyBhbmQgRFNPcyBpdAorICAgICBjYW5ub3QgYmUgdGhhdCB0aGUgc2VjdGlvbiBpbmRleCBpcyB0b28gbGFyZ2UuICAqLworICBhc3NlcnQgKHNjbmlkeCAhPSAwKTsKKyAgYXNzZXJ0IChzY25pZHggPCBTSE5fTE9SRVNFUlZFIHx8IHNjbmlkeCA9PSBTSE5fQUJTKTsKKyAgc3ltLT5zdF9zaG5keCA9IHNjbmlkeDsKKyAgLyogV2Ugd2FudCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uLiAgKi8KKyAgc3ltLT5zdF92YWx1ZSA9IDA7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KKyAgaWYgKHNjbmlkeCAhPSBTSE5fQUJTKQorICAgIHsKKyAgICAgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwgc2NuaWR4KSwKKwkJCQkgICAgTlVMTCk7CisgICAgICBhc3NlcnQgKGRhdGEgIT0gTlVMTCk7CisgICAgICBzeW0tPnN0X3NpemUgPSBkYXRhLT5kX3NpemU7CisgICAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgbm8gc2Vjb25kIGRhdGEgYmxvY2suICAqLworICAgICAgYXNzZXJ0IChlbGZfZ2V0ZGF0YSAoZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBzY25pZHgpLCBkYXRhKQorCSAgICAgID09IE5VTEwpOworICAgIH0KKworICAvKiBJbnNlcnQgc3ltYm9sIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gIE5vdGUgdGhhdCB3ZSBkbyBub3QgaGF2ZSB0bworICAgICB1c2UgeGVsZl91cGRhdGVfc3ltc2hkeC4gICovCisgICh2b2lkKSB4ZWxmX3VwZGF0ZV9zeW0gKHN5bWRhdGEsIG5zeW0sIHN5bSk7CisKKyAgLyogQ3Jvc3MtcmVmZXJlbmNlcy4gICovCisgIG5keHRvc3ltW25zeW1dID0gc3ltc3Q7CisgIHN5bXN0LT5vdXRzeW1pZHggPSBuc3ltOworCisgIC8qIEFkZCB0aGUgbmFtZSB0byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KKyAgc3ltc3RyZW50W25zeW1dID0gZWJsX3N0cnRhYmFkZCAoc3RydGFiLCBzeW1zdC0+bmFtZSwgMCk7Cit9CisKKworc3RhdGljIHZvaWQKK25ld19keW5hbWljX2VudHJ5IChFbGZfRGF0YSAqZGF0YSwgaW50IGlkeCwgWEVsZl9TeHdvcmQgdGFnLCBYRWxmX0FkZHIgdmFsKQoreworICBYRWxmX0R5bl92YXJkZWYgKGR5bik7CisgIHhlbGZfZ2V0ZHluX3B0ciAoZGF0YSwgaWR4LCBkeW4pOworICBkeW4tPmRfdGFnID0gdGFnOworICBkeW4tPmRfdW4uZF9wdHIgPSB2YWw7CisgICh2b2lkKSB4ZWxmX3VwZGF0ZV9keW4gKGRhdGEsIGlkeCwgZHluKTsKK30KKworCitzdGF0aWMgdm9pZAorYWxsb2NhdGVfdmVyc2lvbl9uYW1lcyAoc3RydWN0IHVzZWRmaWxlcyAqcnVucCwgc3RydWN0IEVibF9TdHJ0YWIgKmR5bnN0cnRhYikKK3sKKyAgLyogSWYgdGhpcyBEU08gaGFzIG5vIHZlcnNpb25zIHNraXAgaXQuICAqLworICBpZiAocnVucC0+c3RhdHVzICE9IG9wZW5lZCB8fCBydW5wLT52ZXJkZWZkYXRhID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIEFkZCB0aGUgb2JqZWN0IG5hbWUuICAqLworICBpbnQgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgWEVsZl9WZXJkZWZfdmFyZGVmIChkZWYpOworICAgICAgWEVsZl9WZXJkYXV4X3ZhcmRlZiAoYXV4KTsKKworICAgICAgLyogR2V0IGRhdGEgYXQgdGhlIG5leHQgb2Zmc2V0LiAgKi8KKyAgICAgIHhlbGZfZ2V0dmVyZGVmIChydW5wLT52ZXJkZWZkYXRhLCBvZmZzZXQsIGRlZik7CisgICAgICBhc3NlcnQgKGRlZiAhPSBOVUxMKTsKKyAgICAgIHhlbGZfZ2V0dmVyZGF1eCAocnVucC0+dmVyZGVmZGF0YSwgb2Zmc2V0ICsgZGVmLT52ZF9hdXgsIGF1eCk7CisgICAgICBhc3NlcnQgKGF1eCAhPSBOVUxMKTsKKworICAgICAgYXNzZXJ0IChkZWYtPnZkX25keCA8PSBydW5wLT5udmVyZGVmKTsKKyAgICAgIGlmIChkZWYtPnZkX25keCA9PSAxIHx8IHJ1bnAtPnZlcmRlZnVzZWRbZGVmLT52ZF9uZHhdICE9IDApCisJeworCSAgcnVucC0+dmVyZGVmZW50W2RlZi0+dmRfbmR4XQorCSAgICA9IGVibF9zdHJ0YWJhZGQgKGR5bnN0cnRhYiwgZWxmX3N0cnB0ciAocnVucC0+ZWxmLAorCQkJCQkJICAgIHJ1bnAtPmR5bnN5bXN0cmlkeCwKKwkJCQkJCSAgICBhdXgtPnZkYV9uYW1lKSwgMCk7CisKKwkgIGlmIChkZWYtPnZkX25keCA+IDEpCisJICAgIHJ1bnAtPnZlcmRlZnVzZWRbZGVmLT52ZF9uZHhdID0gbGRfc3RhdGUubmV4dHZlcmlkeCsrOworCX0KKworICAgICAgaWYgKGRlZi0+dmRfbmV4dCA9PSAwKQorCS8qIFRoYXQgd2VyZSBhbGwgdmVyc2lvbnMuICAqLworCWJyZWFrOworCisgICAgICBvZmZzZXQgKz0gZGVmLT52ZF9uZXh0OworICAgIH0KK30KKworCitYRWxmX09mZgorY3JlYXRlX3Zlcm5lZWRfZGF0YSAoWEVsZl9PZmYgb2Zmc2V0LCBFbGZfRGF0YSAqdmVybmVlZGRhdGEsCisJCSAgICAgc3RydWN0IHVzZWRmaWxlcyAqcnVucCwgaW50ICpudG90YWwpCit7CisJICBzaXplX3QgdmVybmVlZF9zaXplID0geGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9WTkVFRCwgMSk7CisJICBzaXplX3QgdmVybmF1eF9zaXplID0geGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9WTkFVWCwgMSk7CisJICAgICAgaW50IG5lZWRfb2Zmc2V0OworCSAgICAgIGJvb2wgZmlsbGVkID0gZmFsc2U7CisJICAgICAgR0VsZl9WZXJuZWVkIHZlcm5lZWQ7CisJICAgICAgR0VsZl9WZXJuYXV4IHZlcm5hdXg7CisJICAgICAgaW50IG5kZWYgPSAwOworc2l6ZV90IGNudDsKKworCSAgICAgIC8qIElmIHRoaXMgRFNPIGhhcyBubyB2ZXJzaW9ucyBza2lwIGl0LiAgKi8KKwkgICAgICBpZiAocnVucC0+bnZlcmRlZnVzZWQgPT0gMCkKKwkJcmV0dXJuIG9mZnNldDsKKworCSAgICAgIC8qIFdlIGZpbGwgaW4gdGhlIFZlcm5lZWQgcmVjb3JkIGxhc3QuICBSZW1lbWJlciB0aGUKKwkJIG9mZnNldC4gICovCisJICAgICAgbmVlZF9vZmZzZXQgPSBvZmZzZXQ7CisJICAgICAgb2Zmc2V0ICs9IHZlcm5lZWRfc2l6ZTsKKworCSAgICAgIGZvciAoY250ID0gMjsgY250IDw9IHJ1bnAtPm52ZXJkZWY7ICsrY250KQorCQlpZiAocnVucC0+dmVyZGVmdXNlZFtjbnRdICE9IDApCisJCSAgeworCQkgICAgYXNzZXJ0IChydW5wLT52ZXJkZWZlbnRbY250XSAhPSBOVUxMKTsKKworCQkgICAgaWYgKGZpbGxlZCkKKwkJICAgICAgeworCQkJdmVybmF1eC52bmFfbmV4dCA9IHZlcm5hdXhfc2l6ZTsKKwkJCSh2b2lkKSBnZWxmX3VwZGF0ZV92ZXJuYXV4ICh2ZXJuZWVkZGF0YSwgb2Zmc2V0LAorCQkJCQkJICAgICZ2ZXJuYXV4KTsKKwkJCW9mZnNldCArPSB2ZXJuYXV4X3NpemU7CisJCSAgICAgIH0KKworCQkgICAgdmVybmF1eC52bmFfaGFzaAorCQkgICAgICA9IGVsZl9oYXNoIChlYmxfc3RyaW5nIChydW5wLT52ZXJkZWZlbnRbY250XSkpOworCQkgICAgdmVybmF1eC52bmFfZmxhZ3MgPSAwOworCQkgICAgdmVybmF1eC52bmFfb3RoZXIgPSBydW5wLT52ZXJkZWZ1c2VkW2NudF07CisJCSAgICB2ZXJuYXV4LnZuYV9uYW1lID0gZWJsX3N0cnRhYm9mZnNldCAocnVucC0+dmVyZGVmZW50W2NudF0pOworCQkgICAgZmlsbGVkID0gdHJ1ZTsKKwkJICAgICsrbmRlZjsKKwkJICB9CisKKwkgICAgICBhc3NlcnQgKGZpbGxlZCk7CisJICAgICAgdmVybmF1eC52bmFfbmV4dCA9IDA7CisJICAgICAgKHZvaWQpIGdlbGZfdXBkYXRlX3Zlcm5hdXggKHZlcm5lZWRkYXRhLCBvZmZzZXQsICZ2ZXJuYXV4KTsKKwkgICAgICBvZmZzZXQgKz0gdmVybmF1eF9zaXplOworCisJICAgICAgdmVybmVlZC52bl92ZXJzaW9uID0gVkVSX05FRURfQ1VSUkVOVDsKKwkgICAgICB2ZXJuZWVkLnZuX2NudCA9IG5kZWY7CisJICAgICAgdmVybmVlZC52bl9maWxlID0gZWJsX3N0cnRhYm9mZnNldCAocnVucC0+dmVyZGVmZW50WzFdKTsKKwkgICAgICAvKiBUaGUgZmlyc3QgYXV4aWxpYXJ5IGVudHJ5IGlzIGFsd2F5cyBmb3VuZCBkaXJlY3RseQorCQkgYWZ0ZXIgdGhlIHZlcm5lZWQgZW50cnkuICAqLworCSAgICAgIHZlcm5lZWQudm5fYXV4ID0gdmVybmVlZF9zaXplOworCSAgICAgIHZlcm5lZWQudm5fbmV4dCA9IC0tKm50b3RhbCA+IDAgPyBvZmZzZXQgLSBuZWVkX29mZnNldCA6IDA7CisJICAgICAgKHZvaWQpIGdlbGZfdXBkYXRlX3Zlcm5lZWQgKHZlcm5lZWRkYXRhLCBuZWVkX29mZnNldCwKKwkJCQkJICAmdmVybmVlZCk7CisKKwkgICAgICByZXR1cm4gb2Zmc2V0OworfQorCisKKy8qIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuCisKKyAgIEZvciByZWxvY2F0YWJsZSBmaWxlcyB3aGF0IGJhc2ljYWxseSBoYXMgdG8gaGFwcGVuIGlzIHRoYXQgYWxsCisgICBzZWN0aW9ucyBmcm9tIGFsbCBpbnB1dCBmaWxlcyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgIFNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgY29tYmluZWQgKG9mZnNldHMgYWRqdXN0ZWQKKyAgIGFjY29yZGluZ2x5KS4gIFRoZSBzeW1ib2wgdGFibGVzIGFyZSBjb21iaW5lZCBpbiBvbmUgc2luZ2xlIHRhYmxlLgorICAgV2hlbiBzdHJpcHBpbmcgY2VydGFpbiBzeW1ib2wgdGFibGUgZW50cmllcyBhcmUgb21pdHRlZC4KKworICAgRm9yIGV4ZWN1dGFibGVzIChzaGFyZWQgb3Igbm90KSB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGUgcHJvZ3JhbSBoZWFkZXIsCisgICBhZGRpdGlvbmFsIHNlY3Rpb25zIGxpa2UgdGhlIC5pbnRlcnAsIGV2ZW50dWFsbHkgKGluIGFkZGl0aW9uKSBjcmVhdGUKKyAgIGEgZHluYW1pYyBzeW1ib2wgdGFibGUgYW5kIGEgZHluYW1pYyBzZWN0aW9uLiAgQWxzbyB0aGUgcmVsb2NhdGlvbnMKK2hhdmUgdG8gYmUgcHJvY2Vzc2VkIGRpZmZlcmVudGx5LiAgKi8KK3N0YXRpYyBpbnQKK2xkX2dlbmVyaWNfY3JlYXRlX291dGZpbGUgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwKQoreworICBzdHJ1Y3Qgc2NubGlzdAorICB7CisgICAgc2l6ZV90IHNjbmlkeDsKKyAgICBzdHJ1Y3Qgc2NuaW5mbyAqc2NuaW5mbzsKKyAgICBzdHJ1Y3Qgc2NubGlzdCAqbmV4dDsKKyAgfTsKKyAgc3RydWN0IHNjbmxpc3QgKnJlbGxpc3QgPSBOVUxMOworICBzaXplX3QgY250OworICBFbGZfU2NuICpzeW1zY24gPSBOVUxMOworICBFbGZfU2NuICp4bmR4c2NuID0gTlVMTDsKKyAgRWxmX1NjbiAqc3Ryc2NuID0gTlVMTDsKKyAgc3RydWN0IEVibF9TdHJ0YWIgKnN0cnRhYiA9IE5VTEw7CisgIHN0cnVjdCBFYmxfU3RydGFiICpkeW5zdHJ0YWIgPSBOVUxMOworICBYRWxmX1NoZHJfdmFyZGVmIChzaGRyKTsKKyAgRWxmX0RhdGEgKmRhdGE7CisgIEVsZl9EYXRhICpzeW1kYXRhID0gTlVMTDsKKyAgRWxmX0RhdGEgKnhuZHhkYXRhID0gTlVMTDsKKyAgc3RydWN0IHVzZWRmaWxlcyAqZmlsZTsKKyAgc2l6ZV90IG5zeW07CisgIHNpemVfdCBuc3ltX2xvY2FsOworICBzaXplX3QgbnN5bV9hbGxvY2F0ZWQ7CisgIHNpemVfdCBuc3ltX2R5biA9IDA7CisgIEVsZjMyX1dvcmQgKmRibGluZGlyZWN0ID0gTlVMTDsKKyNpZm5kZWYgTkRFQlVHCisgIGJvb2wgbmVlZF94bmR4OworI2VuZGlmCisgIEVsZl9TY24gKnNoc3RydGFiX3NjbjsKKyAgc2l6ZV90IHNoc3RydGFiX25keDsKKyAgWEVsZl9FaGRyX3ZhcmRlZiAoZWhkcik7CisgIHN0cnVjdCBFYmxfU3RyZW50ICpzeW10YWJfZW50ID0gTlVMTDsKKyAgc3RydWN0IEVibF9TdHJlbnQgKnhuZHhfZW50ID0gTlVMTDsKKyAgc3RydWN0IEVibF9TdHJlbnQgKnN0cnRhYl9lbnQgPSBOVUxMOworICBzdHJ1Y3QgRWJsX1N0cmVudCAqc2hzdHJ0YWJfZW50OworICBzdHJ1Y3Qgc2NuZ3JvdXAgKmdyb3VwczsKKyAgRWxmX1NjbiAqZHluc3ltc2NuID0gTlVMTDsKKyAgRWxmX0RhdGEgKmR5bnN5bWRhdGEgPSBOVUxMOworICBFbGZfRGF0YSAqZHluc3RyZGF0YSA9IE5VTEw7CisgIEVsZjMyX1dvcmQgKmhhc2hjb2RlcyA9IE5VTEw7CisgIHNpemVfdCBuc3ltX2R5bl9hbGxvY2F0ZWQgPSAwOworICBFbGZfU2NuICp2ZXJzeW1zY24gPSBOVUxMOworICBFbGZfRGF0YSAqdmVyc3ltZGF0YSA9IE5VTEw7CisKKyAgaWYgKGxkX3N0YXRlLm5lZWRfc3ltdGFiKQorICAgIHsKKyAgICAgIC8qIEZpcnN0IGNyZWF0ZSB0aGUgc3ltYm9sIHRhYmxlLiAgV2UgbmVlZCB0aGUgc3ltYm9sIHNlY3Rpb24gaXRzZWxmCisJIGFuZCB0aGUgc3RyaW5nIHRhYmxlIGZvciBpdC4gICovCisgICAgICBzeW1zY24gPSBlbGZfbmV3c2NuIChsZF9zdGF0ZS5vdXRlbGYpOworICAgICAgbGRfc3RhdGUuc3ltc2NuaWR4ID0gZWxmX25keHNjbiAoc3ltc2NuKTsKKyAgICAgIHN5bWRhdGEgPSBlbGZfbmV3ZGF0YSAoc3ltc2NuKTsKKyAgICAgIGlmIChzeW1kYXRhID09IE5VTEwpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgc3ltYm9sIHRhYmxlIGZvciBvdXRwdXQgZmlsZTogJXMiKSwKKwkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgc3ltZGF0YS0+ZF90eXBlID0gRUxGX1RfU1lNOworICAgICAgLyogVGhpcyBpcyBhbiBlc3RpbWF0ZWQgc2l6ZSwgYnV0IGl0IHdpbGwgZGVmaW5pdGVseSBjYXAgdGhlIHJlYWwgdmFsdWUuCisJIFdlIG1pZ2h0IGhhdmUgdG8gYWRqdXN0IHRoZSBudW1iZXIgbGF0ZXIuICAqLworICAgICAgbnN5bV9hbGxvY2F0ZWQgPSAoMSArIGxkX3N0YXRlLm5zeW10YWIgKyBsZF9zdGF0ZS5ucGx0ICsgbGRfc3RhdGUubmdvdAorCQkJKyBsZF9zdGF0ZS5udXNlZHNlY3Rpb25zICsgbGRfc3RhdGUubmxzY3JpcHRfc3ltcyk7CisgICAgICBzeW1kYXRhLT5kX3NpemUgPSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1NZTSwKKwkJCQkgICAgbnN5bV9hbGxvY2F0ZWQpOworCisgICAgICAvKiBPcHRpb25hbGx5IHRoZSBleHRlbmRlZCBzZWN0aW9uIHRhYmxlLiAgKi8KKyAgICAgIC8qIFhYWCBJcyBTSE5fTE9SRVNFUlZFIGNvcnJlY3Q/ICBEbyB3ZSBuZWVkIHNvbWUgb3RoZXIgc2VjdGlvbnM/ICAqLworICAgICAgaWYgKHVubGlrZWx5IChsZF9zdGF0ZS5udXNlZHNlY3Rpb25zID49IFNITl9MT1JFU0VSVkUpKQorCXsKKwkgIHhuZHhzY24gPSBlbGZfbmV3c2NuIChsZF9zdGF0ZS5vdXRlbGYpOworCSAgbGRfc3RhdGUueG5keHNjbmlkeCA9IGVsZl9uZHhzY24gKHhuZHhzY24pOworCisJICB4bmR4ZGF0YSA9IGVsZl9uZXdkYXRhICh4bmR4c2NuKTsKKwkgIGlmICh4bmR4ZGF0YSA9PSBOVUxMKQorCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCQkgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIpLAorCQkgICBlbGZfZXJybXNnICgtMSkpOworCisJICAvKiBUaGUgZm9sbG93aW5nIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IEVsZjMyX1dvcmQgYW5kIEVsZjY0X1dvcmQKKwkgICAgIGhhdmUgdGhlIHNhbWUgc2l6ZS4gICovCisJICB4bmR4ZGF0YS0+ZF90eXBlID0gRUxGX1RfV09SRDsKKwkgIC8qIFRoaXMgaXMgYW4gZXN0aW1hdGVkIHNpemUsIGJ1dCBpdCB3aWxsIGRlZmluaXRlbHkgY2FwIHRoZQorCSAgICAgcmVhbCB2YWx1ZS4gIHdlIG1pZ2h0IGhhdmUgdG8gYWRqdXN0IHRoZSBudW1iZXIgbGF0ZXIuICAqLworCSAgeG5keGRhdGEtPmRfc2l6ZSA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfV09SRCwKKwkJCQkJIG5zeW1fYWxsb2NhdGVkKTsKKwkgIC8qIFRoZSBmaXJzdCBlbnRyeSBpcyBsZWZ0IGVtcHR5LCBjbGVhciBpdCBoZXJlIGFuZCBub3cuICAqLworCSAgeG5keGRhdGEtPmRfYnVmID0gbWVtc2V0ICh4bWFsbG9jICh4bmR4ZGF0YS0+ZF9zaXplKSwgJ1wwJywKKwkJCQkgICAgeGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9XT1JELAorCQkJCQkJMSkpOworCSAgeG5keGRhdGEtPmRfb2ZmID0gMDsKKwkgIC8qIFhYWCBTaG91bGQgdXNlIGFuIGVibCBmdW5jdGlvbi4gICovCisJICB4bmR4ZGF0YS0+ZF9hbGlnbiA9IHNpemVvZiAoRWxmMzJfV29yZCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydCAobGRfc3RhdGUubmVlZF9keW5zeW0pOworCisgICAgICAvKiBGaXJzdCBjcmVhdGUgdGhlIHN5bWJvbCB0YWJsZS4gIFdlIG5lZWQgdGhlIHN5bWJvbCBzZWN0aW9uIGl0c2VsZgorCSBhbmQgdGhlIHN0cmluZyB0YWJsZSBmb3IgaXQuICAqLworICAgICAgc3ltc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS5keW5zeW1zY25pZHgpOworICAgICAgc3ltZGF0YSA9IGVsZl9uZXdkYXRhIChzeW1zY24pOworICAgICAgaWYgKHN5bWRhdGEgPT0gTlVMTCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIpLAorCSAgICAgICBlbGZfZXJybXNnICgtMSkpOworCisgICAgICBzeW1kYXRhLT5kX3ZlcnNpb24gPSBFVl9DVVJSRU5UOworICAgICAgc3ltZGF0YS0+ZF90eXBlID0gRUxGX1RfU1lNOworICAgICAgLyogVGhpcyBpcyBhbiBlc3RpbWF0ZWQgc2l6ZSwgYnV0IGl0IHdpbGwgZGVmaW5pdGVseSBjYXAgdGhlIHJlYWwgdmFsdWUuCisJIFdlIG1pZ2h0IGhhdmUgdG8gYWRqdXN0IHRoZSBudW1iZXIgbGF0ZXIuICAqLworICAgICAgbnN5bV9hbGxvY2F0ZWQgPSAoMSArIGxkX3N0YXRlLm5zeW10YWIgKyBsZF9zdGF0ZS5ucGx0ICsgbGRfc3RhdGUubmdvdAorCQkJLSBsZF9zdGF0ZS5ubG9jYWxzeW1ib2xzICsgbGRfc3RhdGUubmxzY3JpcHRfc3ltcyk7CisgICAgICBzeW1kYXRhLT5kX3NpemUgPSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1NZTSwKKwkJCQkgICAgbnN5bV9hbGxvY2F0ZWQpOworICAgIH0KKworICAvKiBUaGUgZmlyc3QgZW50cnkgaXMgbGVmdCBlbXB0eSwgY2xlYXIgaXQgaGVyZSBhbmQgbm93LiAgKi8KKyAgc3ltZGF0YS0+ZF9idWYgPSBtZW1zZXQgKHhtYWxsb2MgKHN5bWRhdGEtPmRfc2l6ZSksICdcMCcsCisJCQkgICB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1NZTSwgMSkpOworICBzeW1kYXRhLT5kX29mZiA9IDA7CisgIC8qIFhYWCBUaGlzIGlzIHVnbHkgYnV0IGhvdyBlbHNlIGNhbiBpdCBiZSBkb25lLiAgKi8KKyAgc3ltZGF0YS0+ZF9hbGlnbiA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfQUREUiwgMSk7CisKKyAgLyogQWxsb2NhdGUgYW5vdGhlciBhcnJheSB0byBrZWVwIHRyYWNrIG9mIHRoZSBoYW5kbGVzIGZvciB0aGUgc3ltYm9sCisgICAgIG5hbWVzLiAgKi8KKyAgc3ltc3RyZW50ID0gKHN0cnVjdCBFYmxfU3RyZW50ICoqKSB4Y2FsbG9jIChuc3ltX2FsbG9jYXRlZCwKKwkJCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgRWJsX1N0cmVudCAqKSk7CisKKyAgLyogQnkgc3RhcnRpbmcgYXQgMSB3ZSBlZmZlY3RpdmVseSBhZGQgYSBudWxsIGVudHJ5LiAgKi8KKyAgbnN5bSA9IDE7CisKKyAgLyogSXRlcmF0aW9uIG92ZXIgYWxsIHNlY3Rpb25zLiAgKi8KKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBsZF9zdGF0ZS5uYWxsc2VjdGlvbnM7ICsrY250KQorICAgIHsKKyAgICAgIHN0cnVjdCBzY25oZWFkICpoZWFkID0gbGRfc3RhdGUuYWxsc2VjdGlvbnNbY250XTsKKyAgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgIHN0cnVjdCBzY25pbmZvICpydW5wOworICAgICAgWEVsZl9PZmYgb2Zmc2V0OworICAgICAgRWxmMzJfV29yZCB4bmR4OworCisgICAgICAvKiBEb24ndCBoYW5kbGUgdW51c2VkIHNlY3Rpb25zIGF0IGFsbC4gICovCisgICAgICBpZiAoIWhlYWQtPnVzZWQpCisJY29udGludWU7CisKKyAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBoYW5kbGUuICAqLworICAgICAgc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBoZWFkLT5zY25pZHgpOworCisgICAgICBpZiAodW5saWtlbHkgKGhlYWQtPmtpbmQgPT0gc2NuX2RvdF9pbnRlcnApKQorCXsKKwkgIEVsZl9EYXRhICpvdXRkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7CisJICBpZiAob3V0ZGF0YSA9PSBOVUxMKQorCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCQkgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiKSwKKwkJICAgZWxmX2Vycm1zZyAoLTEpKTsKKworCSAgLyogVGhpcyBpcyB0aGUgc3RyaW5nIHdlJ2xsIHB1dCBpbiB0aGUgc2VjdGlvbi4gICovCisJICBjb25zdCBjaGFyICppbnRlcnAgPSBsZF9zdGF0ZS5pbnRlcnAgPzogIi9saWIvbGQuc28uMSI7CisKKwkgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBkYXRhLiAgKi8KKwkgIG91dGRhdGEtPmRfYnVmID0gKHZvaWQgKikgaW50ZXJwOworCSAgb3V0ZGF0YS0+ZF9zaXplID0gc3RybGVuIChpbnRlcnApICsgMTsKKwkgIG91dGRhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7CisJICBvdXRkYXRhLT5kX29mZiA9IDA7CisJICBvdXRkYXRhLT5kX2FsaWduID0gMTsKKwkgIG91dGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7CisKKwkgIC8qIFJlbWVtYmVyIHRoZSBpbmRleCBvZiB0aGlzIHNlY3Rpb24uICAqLworCSAgbGRfc3RhdGUuaW50ZXJwc2NuaWR4ID0gaGVhZC0+c2NuaWR4OworCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmICh1bmxpa2VseSAoaGVhZC0+a2luZCA9PSBzY25fZG90X2dvdCkpCisJeworCSAgLyogUmVtZW1iZXIgdGhlIGluZGV4IG9mIHRoaXMgc2VjdGlvbi4gICovCisJICBsZF9zdGF0ZS5nb3RzY25pZHggPSBlbGZfbmR4c2NuIChzY24pOworCisJICAvKiBHaXZlIHRoZSBiYWNrZW5kIHRoZSBjaGFuZ2UgdG8gaW5pdGlhbGl6ZSB0aGUgc2VjdGlvbi4gICovCisJICBJTklUSUFMSVpFX0dPVCAoJmxkX3N0YXRlLCBzY24pOworCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmICh1bmxpa2VseSAoaGVhZC0+a2luZCA9PSBzY25fZG90X2R5bnJlbCkpCisJeworCSAgRWxmX0RhdGEgKm91dGRhdGE7CisKKwkgIG91dGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKKwkgIGlmIChvdXRkYXRhID09IE5VTEwpCisJICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJCSAgIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gZm9yIG91dHB1dCBmaWxlOiAlcyIpLAorCQkgICBlbGZfZXJybXNnICgtMSkpOworCisJICBvdXRkYXRhLT5kX3NpemUgPSBsZF9zdGF0ZS5yZWxzaXplX3RvdGFsOworCSAgb3V0ZGF0YS0+ZF9idWYgPSB4bWFsbG9jIChvdXRkYXRhLT5kX3NpemUpOworCSAgb3V0ZGF0YS0+ZF90eXBlID0gKFJFTF9UWVBFICgmbGRfc3RhdGUpID09IERUX1JFTAorCQkJICAgICA/IEVMRl9UX1JFTCA6IEVMRl9UX1JFTEEpOworCSAgb3V0ZGF0YS0+ZF9vZmYgPSAwOworCSAgb3V0ZGF0YS0+ZF9hbGlnbiA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfQUREUiwgMSk7CisKKwkgIC8qIFJlbWVtYmVyIHRoZSBpbmRleCBvZiB0aGlzIHNlY3Rpb24uICAqLworCSAgbGRfc3RhdGUucmVsZHluc2NuaWR4ID0gZWxmX25keHNjbiAoc2NuKTsKKworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAodW5saWtlbHkgKGhlYWQtPmtpbmQgPT0gc2NuX2RvdF9keW5hbWljKSkKKwl7CisJICAvKiBPbmx5IGNyZWF0ZSB0aGUgZGF0YSBmb3Igbm93LiAgKi8KKwkgIEVsZl9EYXRhICpvdXRkYXRhOworCisJICAvKiBBY2NvdW50IGZvciBhIGZldyBtb3JlIGVudHJpZXMgd2UgaGF2ZSB0byBhZGQuICAqLworCSAgaWYgKGxkX3N0YXRlLmR0X2ZsYWdzICE9IDApCisJICAgICsrbGRfc3RhdGUubmR5bmFtaWM7CisJICBpZiAobGRfc3RhdGUuZHRfZmxhZ3NfMSAhPSAwKQorCSAgICArK2xkX3N0YXRlLm5keW5hbWljOworCSAgaWYgKGxkX3N0YXRlLmR0X2ZlYXR1cmVfMSAhPSAwKQorCSAgICArK2xkX3N0YXRlLm5keW5hbWljOworCisJICBvdXRkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7CisJICBpZiAob3V0ZGF0YSA9PSBOVUxMKQorCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCQkgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiKSwKKwkJICAgZWxmX2Vycm1zZyAoLTEpKTsKKworCSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uIGRhdGEuICAqLworCSAgb3V0ZGF0YS0+ZF9zaXplID0geGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9EWU4sCisJCQkJCWxkX3N0YXRlLm5keW5hbWljKTsKKwkgIG91dGRhdGEtPmRfYnVmID0geGNhbGxvYyAoMSwgb3V0ZGF0YS0+ZF9zaXplKTsKKwkgIG91dGRhdGEtPmRfdHlwZSA9IEVMRl9UX0RZTjsKKwkgIG91dGRhdGEtPmRfb2ZmID0gMDsKKwkgIG91dGRhdGEtPmRfYWxpZ24gPSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX0FERFIsIDEpOworCisJICAvKiBSZW1lbWJlciB0aGUgaW5kZXggb2YgdGhpcyBzZWN0aW9uLiAgKi8KKwkgIGxkX3N0YXRlLmR5bmFtaWNzY25pZHggPSBlbGZfbmR4c2NuIChzY24pOworCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmICh1bmxpa2VseSAoaGVhZC0+a2luZCA9PSBzY25fZG90X2R5bnN5bSkpCisJeworCSAgLyogV2UgYWxyZWFkeSBrbm93IHRoZSBzZWN0aW9uIGluZGV4LiAgKi8KKwkgIGFzc2VydCAobGRfc3RhdGUuZHluc3ltc2NuaWR4ID09IGVsZl9uZHhzY24gKHNjbikpOworCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmICh1bmxpa2VseSAoaGVhZC0+a2luZCA9PSBzY25fZG90X2R5bnN0cikpCisJeworCSAgLyogUmVtZW1iZXIgdGhlIGluZGV4IG9mIHRoaXMgc2VjdGlvbi4gICovCisJICBsZF9zdGF0ZS5keW5zdHJzY25pZHggPSBlbGZfbmR4c2NuIChzY24pOworCisJICAvKiBDcmVhdGUgdGhlIHN0cmluZyB0YWJsZS4gICovCisJICBkeW5zdHJ0YWIgPSBlYmxfc3RydGFiaW5pdCAodHJ1ZSk7CisKKwkgIC8qIFhYWCBUQkkKKwkgICAgIFdlIGhhdmUgdG8gYWRkIGFsbCB0aGUgc3RyaW5ncyB3aGljaCBhcmUgbmVlZGVkIGluIHRoZQorCSAgICAgZHluYW1pYyBzZWN0aW9uIGhlcmUuICBUaGlzIG1lYW5zIERUX0ZJTFRFUiwKKwkgICAgIERUX0FVWElMSUFSWSwgLi4uIGVudHJpZXMuICAqLworCSAgaWYgKGxkX3N0YXRlLm5kc29maWxlcyA+IDApCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgdXNlZGZpbGVzICpmcnVucCA9IGxkX3N0YXRlLmRzb2ZpbGVzOworCisJICAgICAgZG8KKwkJaWYgKCEgbGRfc3RhdGUuaWdub3JlX3VudXNlZF9kc29zIHx8IGZydW5wLT51c2VkKQorCQkgIGZydW5wLT5zb25hbWVlbnQgPSBlYmxfc3RydGFiYWRkIChkeW5zdHJ0YWIsIGZydW5wLT5zb25hbWUsCisJCQkJCQkgICAgMCk7CisJICAgICAgd2hpbGUgKChmcnVucCA9IGZydW5wLT5uZXh0KSAhPSBsZF9zdGF0ZS5kc29maWxlcyk7CisJICAgIH0KKworCisJICAvKiBBZGQgdGhlIHJ1bnRpbWUgcGF0aCBpbmZvcm1hdGlvbi4gIFRoZSBzdHJpbmdzIGFyZSBzdG9yZWQKKwkgICAgIGluIHRoZSAuZHluc3RyIHNlY3Rpb24uICBJZiBib3RoIHJwYXRoIGFuZCBydW5wYXRoIGFyZSBkZWZpbmVkCisJICAgICB0aGUgcnVucGF0aCBpbmZvcm1hdGlvbiBpcyB1c2VkLiAgKi8KKwkgIGlmIChsZF9zdGF0ZS5ydW5wYXRoICE9IE5VTEwgfHwgbGRfc3RhdGUucnBhdGggIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHN0cnVjdCBwYXRoZWxlbWVudCAqc3RhcnRwOworCSAgICAgIHN0cnVjdCBwYXRoZWxlbWVudCAqcHJ1bnA7CisJICAgICAgaW50IHRhZzsKKwkgICAgICBzaXplX3QgbGVuOworCSAgICAgIGNoYXIgKnN0cjsKKwkgICAgICBjaGFyICpjcDsKKworCSAgICAgIGlmIChsZF9zdGF0ZS5ydW5wYXRoICE9IE5VTEwpCisJCXsKKwkJICBzdGFydHAgPSBsZF9zdGF0ZS5ydW5wYXRoOworCQkgIHRhZyA9IERUX1JVTlBBVEg7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzdGFydHAgPSBsZF9zdGF0ZS5ycGF0aDsKKwkJICB0YWcgPSBEVF9SUEFUSDsKKwkJfQorCisJICAgICAgLyogRGV0ZXJtaW5lIGhvdyBsb25nIHRoZSBzdHJpbmcgd2lsbCBiZS4gICovCisJICAgICAgZm9yIChsZW4gPSAwLCBwcnVucCA9IHN0YXJ0cDsgcHJ1bnAgIT0gTlVMTDsgcHJ1bnAgPSBwcnVucC0+bmV4dCkKKwkJbGVuICs9IHN0cmxlbiAocHJ1bnAtPnBuYW1lKSArIDE7CisKKwkgICAgICBjcCA9IHN0ciA9IChjaGFyICopIG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBsZW4pOworCSAgICAgIC8qIENvcHkgdGhlIHN0cmluZy4gICovCisJICAgICAgZm9yIChwcnVucCA9IHN0YXJ0cDsgcHJ1bnAgIT0gTlVMTDsgcHJ1bnAgPSBwcnVucC0+bmV4dCkKKwkJeworCQkgIGNwID0gc3RwY3B5IChjcCwgcHJ1bnAtPnBuYW1lKTsKKwkJICAqY3ArKyA9ICc6JzsKKwkJfQorCSAgICAgIC8qIFJlbW92ZSB0aGUgbGFzdCBjb2xvbi4gICovCisJICAgICAgY3BbLTFdID0gJ1wwJzsKKworCSAgICAgIC8qIFJlbWVtYmVyIHRoZSB2YWx1ZXMgdW50aWwgd2UgY2FuIGdlbmVyYXRlIHRoZSBkeW5hbWljCisJCSBzZWN0aW9uLiAgKi8KKwkgICAgICBsZF9zdGF0ZS5yeHhwYXRoX3N0cmVudCA9IGVibF9zdHJ0YWJhZGQgKGR5bnN0cnRhYiwgc3RyLCBsZW4pOworCSAgICAgIGxkX3N0YXRlLnJ4eHBhdGhfdGFnID0gdGFnOworCSAgICB9CisKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHVubGlrZWx5IChoZWFkLT5raW5kID09IHNjbl9kb3RfaGFzaCkpCisJeworCSAgLyogUmVtZW1iZXIgdGhlIGluZGV4IG9mIHRoaXMgc2VjdGlvbi4gICovCisJICBsZF9zdGF0ZS5oYXNoc2NuaWR4ID0gZWxmX25keHNjbiAoc2NuKTsKKworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAodW5saWtlbHkgKGhlYWQtPmtpbmQgPT0gc2NuX2RvdF9wbHQpKQorCXsKKwkgIC8qIFJlbWVtYmVyIHRoZSBpbmRleCBvZiB0aGlzIHNlY3Rpb24uICAqLworCSAgbGRfc3RhdGUucGx0c2NuaWR4ID0gZWxmX25keHNjbiAoc2NuKTsKKworCSAgLyogR2l2ZSB0aGUgYmFja2VuZCB0aGUgY2hhbmdlIHRvIGluaXRpYWxpemUgdGhlIHNlY3Rpb24uICAqLworCSAgSU5JVElBTElaRV9QTFQgKCZsZF9zdGF0ZSwgc2NuKTsKKworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAodW5saWtlbHkgKGhlYWQtPmtpbmQgPT0gc2NuX2RvdF9wbHRyZWwpKQorCXsKKwkgIC8qIFJlbWVtYmVyIHRoZSBpbmRleCBvZiB0aGlzIHNlY3Rpb24uICAqLworCSAgbGRfc3RhdGUucGx0cmVsc2NuaWR4ID0gZWxmX25keHNjbiAoc2NuKTsKKworCSAgLyogR2l2ZSB0aGUgYmFja2VuZCB0aGUgY2hhbmdlIHRvIGluaXRpYWxpemUgdGhlIHNlY3Rpb24uICAqLworCSAgSU5JVElBTElaRV9QTFRSRUwgKCZsZF9zdGF0ZSwgc2NuKTsKKworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAodW5saWtlbHkgKGhlYWQtPmtpbmQgPT0gc2NuX2RvdF92ZXJzaW9uKSkKKwl7CisJICAvKiBSZW1lbWJlciB0aGUgaW5kZXggb2YgdGhpcyBzZWN0aW9uLiAgKi8KKwkgIGxkX3N0YXRlLnZlcnN5bXNjbmlkeCA9IGVsZl9uZHhzY24gKHNjbik7CisKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHVubGlrZWx5IChoZWFkLT5raW5kID09IHNjbl9kb3RfdmVyc2lvbl9yKSkKKwl7CisJICAvKiBSZW1lbWJlciB0aGUgaW5kZXggb2YgdGhpcyBzZWN0aW9uLiAgKi8KKwkgIGxkX3N0YXRlLnZlcm5lZWRzY25pZHggPSBlbGZfbmR4c2NuIChzY24pOworCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIElmIHdlIGNvbWUgaGVyZSB3ZSBtdXN0IGJlIGhhbmRsaW5nIGEgbm9ybWFsIHNlY3Rpb24uICAqLworICAgICAgYXNzZXJ0IChoZWFkLT5raW5kID09IHNjbl9ub3JtYWwpOworCisgICAgICAvKiBDcmVhdGUgYW4gU1RUX1NFQ1RJT04gZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEJ1dCBub3QgZm9yCisJIHRoZSBzeW1ib2xpYyBzeW1ib2wgdGFibGUuICAqLworICAgICAgaWYgKGxkX3N0YXRlLm5lZWRfc3ltdGFiKQorCXsKKwkgIC8qIFhYWCBDYW4gd2UgYmUgY2xldmVyZXIgYW5kIGRvIHRoaXMgb25seSBpZiBuZWVkZWQ/ICAqLworCSAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCisJICAvKiBPcHRpbWl6YXRpb24gYWhlYWQ6IGluIHRoZSBuYXRpdmUgbGlua2VyIHdlIGdldCBhIHBvaW50ZXIKKwkgICAgIHRvIHRoZSBmaW5hbCBsb2NhdGlvbiBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3cml0ZXMKKwkgICAgIGRpcmVjdGx5IGluIHRoZSBjb3JyZWN0IHBsYWNlLiAgT3RoZXJ3aXNlIHdlIHdyaXRlIGludG8KKwkgICAgIHRoZSBsb2NhbCB2YXJpYWJsZSBmaXJzdC4gICovCisJICB4ZWxmX2dldHN5bV9wdHIgKHN5bWRhdGEsIG5zeW0sIHN5bSk7CisKKwkgIC8qIFVzdWFsIHNlY3Rpb24gc3ltYm9sOiBsb2NhbCwgbm8gc3BlY2lmaWMgaW5mb3JtYXRpb24sCisJICAgICBleGNlcHQgdGhlIHNlY3Rpb24gaW5kZXguICBUaGUgb2Zmc2V0IGhlcmUgaXMgemVybywgdGhlCisJICAgICBzdGFydCBhZGRyZXNzIHdpbGwgbGF0ZXIgYmUgYWRkZWQuICAqLworCSAgc3ltLT5zdF9uYW1lID0gMDsKKwkgIHN5bS0+c3RfaW5mbyA9IFhFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7CisJICBzeW0tPnN0X290aGVyID0gMDsKKwkgIHN5bS0+c3RfdmFsdWUgPSAwOworCSAgc3ltLT5zdF9zaXplID0gMDsKKwkgIC8qIEluIHJlbG9jYXRhYmxlIGZpbGVzIHRoZSBzZWN0aW9uIGluZGV4IGNhbiBiZSB0b28gYmlnIGZvcgorCSAgICAgdGhlIEVsZlhYX1N5bSBzdHJ1Y3QuICB3ZSBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgZXh0ZW5kZWQKKwkgICAgIHN5bWJvbCB0YWJsZS4gICovCisJICBpZiAobGlrZWx5IChoZWFkLT5zY25pZHggPCBTSE5fTE9SRVNFUlZFKSkKKwkgICAgeworCSAgICAgIHN5bS0+c3Rfc2huZHggPSBoZWFkLT5zY25pZHg7CisJICAgICAgeG5keCA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fWElOREVYOworCSAgICAgIHhuZHggPSBoZWFkLT5zY25pZHg7CisJICAgIH0KKwkgIC8qIENvbW1pdCB0aGUgY2hhbmdlLiAgU2VlIHRoZSBvcHRpbWl6YXRpb24gYWJvdmUsIHRoaXMgZG9lcworCSAgICAgbm90IGNoYW5nZSB0aGUgc3ltYm9sIHRhYmxlIGVudHJ5LiAgQnV0IHRoZSBleHRlbmRlZAorCSAgICAgc2VjdGlvbiBpbmRleCB0YWJsZSBlbnRyeSBpcyBhbHdheXMgd3JpdHRlbiwgaWYgdGhlcmUgaXMKKwkgICAgIHN1Y2ggYSB0YWJsZS4gICovCisJICBhc3NlcnQgKG5zeW0gPCBuc3ltX2FsbG9jYXRlZCk7CisJICB4ZWxmX3VwZGF0ZV9zeW1zaG5keCAoc3ltZGF0YSwgeG5keGRhdGEsIG5zeW0sIHN5bSwgeG5keCwgMCk7CisKKwkgIC8qIFJlbWVtYmVyIHRoZSBzeW1ib2wncyBpbmRleCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKwkgIGhlYWQtPnNjbnN5bWlkeCA9IG5zeW0rKzsKKwl9CisKKyAgICAgIGlmIChoZWFkLT50eXBlID09IFNIVF9SRUwgfHwgaGVhZC0+dHlwZSA9PSBTSFRfUkVMQSkKKwl7CisJICAvKiBSZW1lbWJlciB0aGF0IHdlIGhhdmUgdG8gZmlsbCBpbiB0aGUgc3ltYm9sIHRhYmxlIHNlY3Rpb24KKwkgICAgIGluZGV4LiAgKi8KKwkgIGlmIChsZF9zdGF0ZS5maWxlX3R5cGUgPT0gcmVsb2NhdGFibGVfZmlsZV90eXBlKQorCSAgICB7CisJICAgICAgc3RydWN0IHNjbmxpc3QgKm5ld3A7CisKKwkgICAgICBuZXdwID0gKHN0cnVjdCBzY25saXN0ICopIGFsbG9jYSAoc2l6ZW9mICgqbmV3cCkpOworCSAgICAgIG5ld3AtPnNjbmlkeCA9IGhlYWQtPnNjbmlkeDsKKwkgICAgICBuZXdwLT5zY25pbmZvID0gaGVhZC0+bGFzdC0+bmV4dDsKKyNpZm5kZWYgTkRFQlVHCisJICAgICAgbmV3cC0+bmV4dCA9IE5VTEw7CisjZW5kaWYKKwkgICAgICBTTkdMX0xJU1RfUFVTSCAocmVsbGlzdCwgbmV3cCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFdoZW4gd2UgY3JlYXRlIGFuIGV4ZWN1dGFibGUgb3IgYSBEU08gd2UgZG9uJ3Qgc2ltcGx5CisJCSBjb3B5IHRoZSBleGlzdGluZyByZWxvY2F0aW9ucy4gIEluc3RlYWQgbWFueSB3aWxsIGJlCisJCSByZXNvbHZlZCwgb3RoZXJzIHdpbGwgYmUgY29udmVydGVkLiAgQ3JlYXRlIGEgZGF0YSBidWZmZXIKKwkJIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSBjb250ZW50cyB3aGljaCB3ZSB3aWxsIGZpbGwKKwkJIGluIGxhdGVyLiAgKi8KKwkgICAgICBpbnQgdHlwZSA9IGhlYWQtPnR5cGUgPT0gU0hUX1JFTCA/IEVMRl9UX1JFTCA6IEVMRl9UX1JFTEE7CisKKwkgICAgICBkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7CisJICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKKwkJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkJICAgICAgIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gZm9yIG91dHB1dCBmaWxlOiAlcyIpLAorCQkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworCSAgICAgIGRhdGEtPmRfc2l6ZSA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgdHlwZSwgaGVhZC0+cmVsc2l6ZSk7CisJICAgICAgZGF0YS0+ZF9idWYgPSB4Y2FsbG9jIChkYXRhLT5kX3NpemUsIDEpOworCSAgICAgIGRhdGEtPmRfdHlwZSA9IHR5cGU7CisJICAgICAgZGF0YS0+ZF9hbGlnbiA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfQUREUiwgMSk7CisJICAgICAgZGF0YS0+ZF9vZmYgPSAwOworCisJICAgICAgY29udGludWU7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFJlY29nbml6ZSBzdHJpbmcgYW5kIG1lcmdlIGZsYWcgYW5kIGhhbmRsZSB0aGVtLiAgKi8KKyAgICAgIGlmIChoZWFkLT5mbGFncyAmIFNIRl9NRVJHRSkKKwl7CisJICAvKiBXZSBtZXJnZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb25zLiAgRm9yIHRoaXMgd2UgZG8KKwkgICAgIG5vdCBsb29rIGF0IHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIGRpcmVjdGx5LiAgSW5zdGVhZCB3ZQorCSAgICAgbG9vayBhdCB0aGUgc3ltYm9scyBvZiB0aGUgc2VjdGlvbi4gICovCisJICBFbGZfRGF0YSAqb3V0ZGF0YTsKKworCSAgLyogQ29uY2F0ZW5hdGUgdGhlIGxpc3RzIG9mIHN5bWJvbHMgZm9yIGFsbCBzZWN0aW9ucy4KKworCSAgICAgWFhYIEluIGNhc2UgYW55IGlucHV0IHNlY3Rpb24gaGFzIG5vIHN5bWJvbHMgYXNzb2NpYXRlZAorCSAgICAgKHRoaXMgaGFwcGVucyBmb3IgZGVidWcgc2VjdGlvbnMpIHdlIGNhbm5vdCB1c2UgdGhpcworCSAgICAgbWV0aG9kLiAgSW1wbGVtZW50IHBhcnNpbmcgdGhlIG90aGVyIGRlYnVnIHNlY3Rpb25zIGFuZAorCSAgICAgZmluZCB0aGUgc3RyaW5nIHBvaW50ZXJzLiAgRm9yIG5vdyB3ZSBkb24ndCBtZXJnZS4gICovCisJICBydW5wID0gaGVhZC0+bGFzdC0+bmV4dDsKKwkgIGlmIChydW5wLT5zeW1ib2xzID09IE5VTEwpCisJICAgIHsKKwkgICAgICBoZWFkLT5mbGFncyAmPSB+U0hGX01FUkdFOworCSAgICAgIGdvdG8gbm9fbWVyZ2U7CisJICAgIH0KKwkgIGhlYWQtPnN5bWJvbHMgPSBydW5wLT5zeW1ib2xzOworCisJICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBoZWFkLT5sYXN0LT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKHJ1bnAtPnN5bWJvbHMgPT0gTlVMTCkKKwkJeworCQkgIGhlYWQtPmZsYWdzICY9IH5TSEZfTUVSR0U7CisJCSAgaGVhZC0+c3ltYm9scyA9IE5VTEw7CisJCSAgZ290byBub19tZXJnZTsKKwkJfQorCisJICAgICAgc3RydWN0IHN5bWJvbCAqb2xkaGVhZCA9IGhlYWQtPnN5bWJvbHMtPm5leHRfaW5fc2NuOworCisJICAgICAgaGVhZC0+c3ltYm9scy0+bmV4dF9pbl9zY24gPSBydW5wLT5zeW1ib2xzLT5uZXh0X2luX3NjbjsKKwkgICAgICBydW5wLT5zeW1ib2xzLT5uZXh0X2luX3NjbiA9IG9sZGhlYWQ7CisJICAgICAgaGVhZC0+c3ltYm9scyA9IHJ1bnAtPnN5bWJvbHM7CisJICAgIH0KKworCSAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICBvdXRkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7CisJICBpZiAob3V0ZGF0YSA9PSBOVUxMKQorCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCQkgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiKSwKKwkJICAgZWxmX2Vycm1zZyAoLTEpKTsKKworCSAgLyogV2UgdXNlIGRpZmZlcmVudCBtZXJnaW5nIGFsZ29yaXRobXMgZm9yIHBlcmZvcm1hbmNlCisJICAgICByZWFzb25zLiAgV2UgY2FuIGVhc2lseSBoYW5kbGUgc2luZ2xlLWJ5dGUgYW5kCisJICAgICB3Y2hhcl90LXdpZGUgY2hhcmFjdGVyIHN0cmluZ3MuICBBbGwgb3RoZXIgY2FzZXMgKHdoaWNoCisJICAgICByZWFsbHkgc2hvdWxkIGhhcHBlbiBpbiByZWFsIGxpZmUpIGFyZSBoYW5kbGVkIGJ5IHRoZQorCSAgICAgZ2VuZXJpYyBjb2RlLiAgKi8KKwkgIGlmIChTQ05JTkZPX1NIRFIgKGhlYWQtPmxhc3QtPnNoZHIpLnNoX2VudHNpemUgPT0gMQorCSAgICAgICYmIChoZWFkLT5mbGFncyAmIFNIRl9TVFJJTkdTKSkKKwkgICAgeworCSAgICAgIC8qIFNpbXBsZSwgc2luZ2xlLWJ5dGUgc3RyaW5nIG1hdGNoaW5nLiAgKi8KKwkgICAgICBzdHJ1Y3QgRWJsX1N0cnRhYiAqbWVyZ2VzdHJ0YWI7CisJICAgICAgc3RydWN0IHN5bWJvbCAqc3ltcnVucDsKKwkgICAgICBFbGZfRGF0YSAqbG9jc3ltZGF0YSA9IE5VTEw7CisJICAgICAgRWxmX0RhdGEgKmxvY2RhdGEgPSBOVUxMOworCisJICAgICAgbWVyZ2VzdHJ0YWIgPSBlYmxfc3RydGFiaW5pdCAoZmFsc2UpOworCisJICAgICAgc3ltcnVucCA9IGhlYWQtPnN5bWJvbHMtPm5leHRfaW5fc2NuOworCSAgICAgIGZpbGUgPSBOVUxMOworCSAgICAgIGRvCisJCXsKKwkJICAvKiBBY2NlbGFyYXRlIHRoZSBsb29wLiAgV2UgY2FjaGUgdGhlIGZpbGUKKwkJICAgICBpbmZvcm1hdGlvbiBzaW5jZSBpdCBtaWdodCB2ZXJ5IHdlbGwgYmUgdGhlIGNhc2UKKwkJICAgICB0aGF0IHRoZSBwcmV2aW91cyBlbnRyeSB3YXMgZnJvbSB0aGUgc2FtZQorCQkgICAgIGZpbGUuICAqLworCQkgIGlmIChzeW1ydW5wLT5maWxlICE9IGZpbGUpCisJCSAgICB7CisJCSAgICAgIC8qIFJlbWVtYmVyIHRoZSBmaWxlLiAgKi8KKwkJICAgICAgZmlsZSA9IHN5bXJ1bnAtPmZpbGU7CisJCSAgICAgIC8qIFN5bWJvbCB0YWJsZSBkYXRhIGZyb20gdGhhdCBmaWxlLiAgKi8KKwkJICAgICAgbG9jc3ltZGF0YSA9IGZpbGUtPnN5bXRhYmRhdGE7CisJCSAgICAgIC8qIFN0cmluZyBzZWN0aW9uIGRhdGEuICAqLworCQkgICAgICBsb2NkYXRhID0gZWxmX3Jhd2RhdGEgKGZpbGUtPnNjbmluZm9bc3ltcnVucC0+c2NuZHhdLnNjbiwKKwkJCQkJICAgICBOVUxMKTsKKwkJICAgICAgYXNzZXJ0IChsb2NkYXRhICE9IE5VTEwpOworCQkgICAgICAvKiBXaGlsZSB3ZSBhcmUgYXQgaXQsIHJlbWVtYmVyIHRoZSBvdXRwdXQKKwkJCSBzZWN0aW9uLiAgSWYgd2UgZG9uJ3QgYWNjZXNzIHRoZSBzdHJpbmcgZGF0YQorCQkJIHNlY3Rpb24gdGhlIHNlY3Rpb24gd29uJ3QgYmUgaW4gdGhlIG91dHB1dAorCQkJIGZpbGUuICBTbyBpdCBpcyBzdWZmaWNpZW50IHRvIGRvIHRoZSB3b3JrCisJCQkgaGVyZS4gICovCisJCSAgICAgIGZpbGUtPnNjbmluZm9bc3ltcnVucC0+c2NuZHhdLm91dHNjbm5keCA9IGhlYWQtPnNjbmlkeDsKKwkJICAgIH0KKworCQkgIC8qIEdldCB0aGUgc3ltYm9sIGluZm9ybWF0aW9uLiAgVGhpcyBwcm92aWRlcyB1cyB0aGUKKwkJICAgICBvZmZzZXQgaW50byB0aGUgc3RyaW5nIGRhdGEgc2VjdGlvbi4gICovCisJCSAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCQkgIHhlbGZfZ2V0c3ltIChsb2NzeW1kYXRhLCBzeW1ydW5wLT5zeW1pZHgsIHN5bSk7CisJCSAgYXNzZXJ0IChzeW0gIT0gTlVMTCk7CisKKwkJICAvKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4gIE5vdGUgdGhhdCB3ZSBhY2Nlc3MKKwkJICAgICB0aGUgcmF3IHNlY3Rpb24gZGF0YTsgbm8gZW5kaWFuLW5lc3MgaXNzdWVzIHdpdGgKKwkJICAgICBzaW5nbGUtYnl0ZSBzdHJpbmdzLiAgKi8KKwkJICBzeW1ydW5wLT5tZXJnZS5oYW5kbGUKKwkJICAgID0gZWJsX3N0cnRhYmFkZCAobWVyZ2VzdHJ0YWIsCisJCQkJICAgICAoY2hhciAqKSBsb2NkYXRhLT5kX2J1ZiArIHN5bS0+c3RfdmFsdWUsCisJCQkJICAgICAwKTsKKwkJfQorCSAgICAgIHdoaWxlICgoc3ltcnVucCA9IHN5bXJ1bnAtPm5leHRfaW5fc2NuKQorCQkgICAgICE9IGhlYWQtPnN5bWJvbHMtPm5leHRfaW5fc2NuKTsKKworCSAgICAgIC8qIEFsbCBzdHJpbmdzIGhhdmUgYmVlbiBhZGRlZC4gIENyZWF0ZSB0aGUgZmluYWwgdGFibGUuICAqLworCSAgICAgIGVibF9zdHJ0YWJmaW5hbGl6ZSAobWVyZ2VzdHJ0YWIsIG91dGRhdGEpOworCisJICAgICAgLyogQ29tcHV0ZSB0aGUgZmluYWwgb2Zmc2V0cyBpbiB0aGUgc2VjdGlvbi4gICovCisJICAgICAgc3ltcnVucCA9IHJ1bnAtPnN5bWJvbHM7CisJICAgICAgZG8KKwkJeworCQkgIHN5bXJ1bnAtPm1lcmdlLnZhbHVlCisJCSAgICA9IGVibF9zdHJ0YWJvZmZzZXQgKHN5bXJ1bnAtPm1lcmdlLmhhbmRsZSk7CisJCSAgc3ltcnVucC0+bWVyZ2VkID0gMTsKKwkJfQorCSAgICAgIHdoaWxlICgoc3ltcnVucCA9IHN5bXJ1bnAtPm5leHRfaW5fc2NuKSAhPSBydW5wLT5zeW1ib2xzKTsKKworCSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIHN0cmluZyB0YWJsZSBhbnltb3JlLiAgKi8KKwkgICAgICBlYmxfc3RydGFiZnJlZSAobWVyZ2VzdHJ0YWIpOworCSAgICB9CisJICBlbHNlIGlmIChsaWtlbHkgKFNDTklORk9fU0hEUiAoaGVhZC0+bGFzdC0+c2hkcikuc2hfZW50c2l6ZQorCQkJICAgPT0gc2l6ZW9mICh3Y2hhcl90KSkKKwkJICAgJiYgbGlrZWx5IChoZWFkLT5mbGFncyAmIFNIRl9TVFJJTkdTKSkKKwkgICAgeworCSAgICAgIC8qIFNpbXBsZSwgd2NoYXJfdCBzdHJpbmcgbWVyZ2luZy4gICovCisJICAgICAgc3RydWN0IEVibF9XU3RydGFiICptZXJnZXN0cnRhYjsKKwkgICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW1ydW5wOworCSAgICAgIEVsZl9EYXRhICpsb2NzeW1kYXRhID0gTlVMTDsKKwkgICAgICBFbGZfRGF0YSAqbG9jZGF0YSA9IE5VTEw7CisKKwkgICAgICBtZXJnZXN0cnRhYiA9IGVibF93c3RydGFiaW5pdCAoZmFsc2UpOworCisJICAgICAgc3ltcnVucCA9IHJ1bnAtPnN5bWJvbHM7CisJICAgICAgZmlsZSA9IE5VTEw7CisJICAgICAgZG8KKwkJeworCQkgIC8qIEFjY2VsYXJhdGUgdGhlIGxvb3AuICBXZSBjYWNoZSB0aGUgZmlsZQorCQkgICAgIGluZm9ybWF0aW9uIHNpbmNlIGl0IG1pZ2h0IHZlcnkgd2VsbCBiZSB0aGUgY2FzZQorCQkgICAgIHRoYXQgdGhlIHByZXZpb3VzIGVudHJ5IHdhcyBmcm9tIHRoZSBzYW1lCisJCSAgICAgZmlsZS4gICovCisJCSAgaWYgKHN5bXJ1bnAtPmZpbGUgIT0gZmlsZSkKKwkJICAgIHsKKwkJICAgICAgLyogUmVtZW1iZXIgdGhlIGZpbGUuICAqLworCQkgICAgICBmaWxlID0gc3ltcnVucC0+ZmlsZTsKKwkJICAgICAgLyogU3ltYm9sIHRhYmxlIGRhdGEgZnJvbSB0aGF0IGZpbGUuICAqLworCQkgICAgICBsb2NzeW1kYXRhID0gZmlsZS0+c3ltdGFiZGF0YTsKKwkJICAgICAgLyogU3RyaW5nIHNlY3Rpb24gZGF0YS4gICovCisJCSAgICAgIGxvY2RhdGEgPSBlbGZfcmF3ZGF0YSAoZmlsZS0+c2NuaW5mb1tzeW1ydW5wLT5zY25keF0uc2NuLAorCQkJCQkgICAgIE5VTEwpOworCQkgICAgICBhc3NlcnQgKGxvY2RhdGEgIT0gTlVMTCk7CisKKwkJICAgICAgLyogV2hpbGUgd2UgYXJlIGF0IGl0LCByZW1lbWJlciB0aGUgb3V0cHV0CisJCQkgc2VjdGlvbi4gIElmIHdlIGRvbid0IGFjY2VzcyB0aGUgc3RyaW5nIGRhdGEKKwkJCSBzZWN0aW9uIHRoZSBzZWN0aW9uIHdvbid0IGJlIGluIHRoZSBvdXRwdXQKKwkJCSBmaWxlLiAgU28gaXQgaXMgc3VmZmljaWVudCB0byBkbyB0aGUgd29yaworCQkJIGhlcmUuICAqLworCQkgICAgICBmaWxlLT5zY25pbmZvW3N5bXJ1bnAtPnNjbmR4XS5vdXRzY25uZHggPSBoZWFkLT5zY25pZHg7CisJCSAgICB9CisKKwkJICAvKiBHZXQgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbi4gIFRoaXMgcHJvdmlkZXMgdXMgdGhlCisJCSAgICAgb2Zmc2V0IGludG8gdGhlIHN0cmluZyBkYXRhIHNlY3Rpb24uICAqLworCQkgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKwkJICB4ZWxmX2dldHN5bSAobG9jc3ltZGF0YSwgc3ltcnVucC0+c3ltaWR4LCBzeW0pOworCQkgIGFzc2VydCAoc3ltICE9IE5VTEwpOworCisJCSAgLyogR2V0IHRoZSBkYXRhIGZyb20gdGhlIGZpbGUuICBVc2luZyB0aGUgcmF3CisJCSAgICAgc2VjdGlvbiBkYXRhIGhlcmUgaXMgcG9zc2libGUgc2luY2Ugd2UgZG9uJ3QKKwkJICAgICBpbnRlcnByZXQgdGhlIHN0cmluZyB0aGVtc2VsdmVzIGV4Y2VwdCBmb3IKKwkJICAgICBsb29raW5nIGZvciB0aGUgd2lkZSBOVUwgY2hhcmFjdGVyLiAgVGhlIE5VTAorCQkgICAgIGNoYXJhY3RlciBoYXMgZm9ydHVuYXRlbHkgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24KKwkJICAgICByZWdhcmRsZXNzIG9mIHRoZSBieXRlIG9yZGVyLiAgKi8KKwkJICBzeW1ydW5wLT5tZXJnZS5oYW5kbGUKKwkJICAgID0gZWJsX3dzdHJ0YWJhZGQgKG1lcmdlc3RydGFiLAorCQkJCSAgICAgICh3Y2hhcl90ICopICgoY2hhciAqKSBsb2NkYXRhLT5kX2J1ZgorCQkJCQkJICAgKyBzeW0tPnN0X3ZhbHVlKSwgMCk7CisJCX0KKwkgICAgICB3aGlsZSAoKHN5bXJ1bnAgPSBzeW1ydW5wLT5uZXh0X2luX3NjbikgIT0gcnVucC0+c3ltYm9scyk7CisKKwkgICAgICAvKiBBbGwgc3RyaW5ncyBoYXZlIGJlZW4gYWRkZWQuICBDcmVhdGUgdGhlIGZpbmFsIHRhYmxlLiAgKi8KKwkgICAgICBlYmxfd3N0cnRhYmZpbmFsaXplIChtZXJnZXN0cnRhYiwgb3V0ZGF0YSk7CisKKwkgICAgICAvKiBDb21wdXRlIHRoZSBmaW5hbCBvZmZzZXRzIGluIHRoZSBzZWN0aW9uLiAgKi8KKwkgICAgICBzeW1ydW5wID0gcnVucC0+c3ltYm9sczsKKwkgICAgICBkbworCQl7CisJCSAgc3ltcnVucC0+bWVyZ2UudmFsdWUKKwkJICAgID0gZWJsX3dzdHJ0YWJvZmZzZXQgKHN5bXJ1bnAtPm1lcmdlLmhhbmRsZSk7CisJCSAgc3ltcnVucC0+bWVyZ2VkID0gMTsKKwkJfQorCSAgICAgIHdoaWxlICgoc3ltcnVucCA9IHN5bXJ1bnAtPm5leHRfaW5fc2NuKSAhPSBydW5wLT5zeW1ib2xzKTsKKworCSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIHN0cmluZyB0YWJsZSBhbnltb3JlLiAgKi8KKwkgICAgICBlYmxfd3N0cnRhYmZyZWUgKG1lcmdlc3RydGFiKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTm9uLXN0YW5kYXJkIG1lcmdpbmcuICAqLworCSAgICAgIHN0cnVjdCBFYmxfR1N0cnRhYiAqbWVyZ2VzdHJ0YWI7CisJICAgICAgc3RydWN0IHN5bWJvbCAqc3ltcnVucDsKKwkgICAgICBFbGZfRGF0YSAqbG9jc3ltZGF0YSA9IE5VTEw7CisJICAgICAgRWxmX0RhdGEgKmxvY2RhdGEgPSBOVUxMOworCSAgICAgIC8qIElmIHRoaXMgaXMgbm8gc3RyaW5nIHNlY3Rpb24gdGhlIGxlbmd0aCBvZiBlYWNoICJzdHJpbmciCisJCSBpcyBhbHdheXMgb25lLiAgKi8KKwkgICAgICB1bnNpZ25lZCBpbnQgbGVuID0gKGhlYWQtPmZsYWdzICYgU0hGX1NUUklOR1MpID8gMCA6IDE7CisKKwkgICAgICAvKiBUaGlzIGlzIHRoZSBnZW5lcmljIHN0cmluZyB0YWJsZSBmdW5jdGlvbmFsaXR5LiAgTXVjaAorCQkgc2xvd2VyIHRoYW4gdGhlIHNwZWNpYWxpemVkIGNvZGUuICAqLworCSAgICAgIG1lcmdlc3RydGFiCisJCT0gZWJsX2dzdHJ0YWJpbml0IChTQ05JTkZPX1NIRFIgKGhlYWQtPmxhc3QtPnNoZHIpLnNoX2VudHNpemUsCisJCQkJICAgZmFsc2UpOworCisJICAgICAgc3ltcnVucCA9IHJ1bnAtPnN5bWJvbHM7CisJICAgICAgZmlsZSA9IE5VTEw7CisJICAgICAgZG8KKwkJeworCQkgIC8qIEFjY2VsYXJhdGUgdGhlIGxvb3AuICBXZSBjYWNoZSB0aGUgZmlsZQorCQkgICAgIGluZm9ybWF0aW9uIHNpbmNlIGl0IG1pZ2h0IHZlcnkgd2VsbCBiZSB0aGUgY2FzZQorCQkgICAgIHRoYXQgdGhlIHByZXZpb3VzIGVudHJ5IHdhcyBmcm9tIHRoZSBzYW1lCisJCSAgICAgZmlsZS4gICovCisJCSAgaWYgKHN5bXJ1bnAtPmZpbGUgIT0gZmlsZSkKKwkJICAgIHsKKwkJICAgICAgLyogUmVtZW1iZXIgdGhlIGZpbGUuICAqLworCQkgICAgICBmaWxlID0gc3ltcnVucC0+ZmlsZTsKKwkJICAgICAgLyogU3ltYm9sIHRhYmxlIGRhdGEgZnJvbSB0aGF0IGZpbGUuICAqLworCQkgICAgICBsb2NzeW1kYXRhID0gZmlsZS0+c3ltdGFiZGF0YTsKKwkJICAgICAgLyogU3RyaW5nIHNlY3Rpb24gZGF0YS4gICovCisJCSAgICAgIGxvY2RhdGEgPSBlbGZfcmF3ZGF0YSAoZmlsZS0+c2NuaW5mb1tzeW1ydW5wLT5zY25keF0uc2NuLAorCQkJCQkgICAgIE5VTEwpOworCQkgICAgICBhc3NlcnQgKGxvY2RhdGEgIT0gTlVMTCk7CisKKwkJICAgICAgLyogV2hpbGUgd2UgYXJlIGF0IGl0LCByZW1lbWJlciB0aGUgb3V0cHV0CisJCQkgc2VjdGlvbi4gIElmIHdlIGRvbid0IGFjY2VzcyB0aGUgc3RyaW5nIGRhdGEKKwkJCSBzZWN0aW9uIHRoZSBzZWN0aW9uIHdvbid0IGJlIGluIHRoZSBvdXRwdXQKKwkJCSBmaWxlLiAgU28gaXQgaXMgc3VmZmljaWVudCB0byBkbyB0aGUgd29yaworCQkJIGhlcmUuICAqLworCQkgICAgICBmaWxlLT5zY25pbmZvW3N5bXJ1bnAtPnNjbmR4XS5vdXRzY25uZHggPSBoZWFkLT5zY25pZHg7CisJCSAgICB9CisKKwkJICAvKiBHZXQgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbi4gIFRoaXMgcHJvdmlkZXMgdXMgdGhlCisJCSAgICAgb2Zmc2V0IGludG8gdGhlIHN0cmluZyBkYXRhIHNlY3Rpb24uICAqLworCQkgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKwkJICB4ZWxmX2dldHN5bSAobG9jc3ltZGF0YSwgc3ltcnVucC0+c3ltaWR4LCBzeW0pOworCQkgIGFzc2VydCAoc3ltICE9IE5VTEwpOworCisJCSAgLyogR2V0IHRoZSBkYXRhIGZyb20gdGhlIGZpbGUuICBVc2luZyB0aGUgcmF3CisJCSAgICAgc2VjdGlvbiBkYXRhIGhlcmUgaXMgcG9zc2libGUgc2luY2Ugd2UgZG9uJ3QKKwkJICAgICBpbnRlcnByZXQgdGhlIHN0cmluZyB0aGVtc2VsdmVzIGV4Y2VwdCBmb3IKKwkJICAgICBsb29raW5nIGZvciB0aGUgd2lkZSBOVUwgY2hhcmFjdGVyLiAgVGhlIE5VTAorCQkgICAgIGNoYXJhY3RlciBoYXMgZm9ydHVuYXRlbHkgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24KKwkJICAgICByZWdhcmRsZXNzIG9mIHRoZSBieXRlIG9yZGVyLiAgKi8KKwkJICBzeW1ydW5wLT5tZXJnZS5oYW5kbGUKKwkJICAgID0gZWJsX2dzdHJ0YWJhZGQgKG1lcmdlc3RydGFiLAorCQkJCSAgICAgIChjaGFyICopIGxvY2RhdGEtPmRfYnVmICsgc3ltLT5zdF92YWx1ZSwKKwkJCQkgICAgICBsZW4pOworCQl9CisJICAgICAgd2hpbGUgKChzeW1ydW5wID0gc3ltcnVucC0+bmV4dF9pbl9zY24pICE9IHJ1bnAtPnN5bWJvbHMpOworCisJICAgICAgLyogQ3JlYXRlIHRoZSBmaW5hbCB0YWJsZS4gICovCisJICAgICAgZWJsX2dzdHJ0YWJmaW5hbGl6ZSAobWVyZ2VzdHJ0YWIsIG91dGRhdGEpOworCisJICAgICAgLyogQ29tcHV0ZSB0aGUgZmluYWwgb2Zmc2V0cyBpbiB0aGUgc2VjdGlvbi4gICovCisJICAgICAgc3ltcnVucCA9IHJ1bnAtPnN5bWJvbHM7CisJICAgICAgZG8KKwkJeworCQkgIHN5bXJ1bnAtPm1lcmdlLnZhbHVlCisJCSAgICA9IGVibF9nc3RydGFib2Zmc2V0IChzeW1ydW5wLT5tZXJnZS5oYW5kbGUpOworCQkgIHN5bXJ1bnAtPm1lcmdlZCA9IDE7CisJCX0KKwkgICAgICB3aGlsZSAoKHN5bXJ1bnAgPSBzeW1ydW5wLT5uZXh0X2luX3NjbikgIT0gcnVucC0+c3ltYm9scyk7CisKKwkgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBzdHJpbmcgdGFibGUgYW55bW9yZS4gICovCisJICAgICAgZWJsX2dzdHJ0YWJmcmVlIChtZXJnZXN0cnRhYik7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCW5vX21lcmdlOgorCSAgYXNzZXJ0IChoZWFkLT5zY25pZHggPT0gZWxmX25keHNjbiAoc2NuKSk7CisKKwkgIC8qIEl0IGlzIGltcG9ydGFudCB0byBzdGFydCB3aXRoIHRoZSBmaXJzdCBsaXN0IGVudHJ5IChhbmQKKwkgICAgIG5vdCBqdXN0IGFueSBvbmUpIHRvIGFkZCB0aGUgc2VjdGlvbnMgaW4gdGhlIGNvcnJlY3QKKwkgICAgIG9yZGVyLiAgKi8KKwkgIHJ1bnAgPSBoZWFkLT5sYXN0LT5uZXh0OworCSAgb2Zmc2V0ID0gMDsKKwkgIGRvCisJICAgIHsKKwkgICAgICBFbGZfRGF0YSAqb3V0ZGF0YSA9IGVsZl9uZXdkYXRhIChzY24pOworCSAgICAgIGlmIChvdXRkYXRhID09IE5VTEwpCisJCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiKSwKKwkJICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKwkgICAgICAvKiBFeGNlcHRpb25hbCBjYXNlOiBpZiB3ZSBzeW50aGVzaXplIGEgZGF0YSBibG9jayBTQ04KKwkJIGlzIE5VTEwgYW5kIHRoZSBzZWN0aW8gaGVhZGVyIGluZm8gbXVzdCBiZSBmb3IgYQorCQkgU0hUX05PQklUUyBibG9jayBhbmQgdGhlIHNpemUgYW5kIGFsaWdubWVudCBhcmUKKwkJIGZpbGxlZCBpbi4gICovCisJICAgICAgaWYgKGxpa2VseSAocnVucC0+c2NuICE9IE5VTEwpKQorCQl7CisJCSAgZGF0YSA9IGVsZl9nZXRkYXRhIChydW5wLT5zY24sIE5VTEwpOworCQkgIGFzc2VydCAoZGF0YSAhPSBOVUxMKTsKKworCQkgIC8qIFdlIHJldXNlIHRoZSBkYXRhIGJ1ZmZlciBpbiB0aGUgaW5wdXQgZmlsZS4gICovCisJCSAgKm91dGRhdGEgPSAqZGF0YTsKKworCQkgIC8qIEdpdmVuIHRoYXQgd2UgcmVhZCB0aGUgaW5wdXQgZmlsZSBmcm9tIGRpc2sgd2Uga25vdyB0aGVyZQorCQkgICAgIGNhbm5vdCBiZSBhbm90aGVyIGRhdGEgcGFydC4gICovCisJCSAgYXNzZXJ0IChlbGZfZ2V0ZGF0YSAocnVucC0+c2NuLCBkYXRhKSA9PSBOVUxMKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIE11c3QgYmUgYSBOT0JJVFMgc2VjdGlvbi4gICovCisJCSAgYXNzZXJ0ICAoU0NOSU5GT19TSERSIChydW5wLT5zaGRyKS5zaF90eXBlID09IFNIVF9OT0JJVFMpOworCisJCSAgb3V0ZGF0YS0+ZF9idWYgPSBOVUxMOwkvKiBOb3QgbmVlZGVkLiAgKi8KKwkJICBvdXRkYXRhLT5kX3R5cGUgPSBFTEZfVF9CWVRFOworCQkgIG91dGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7CisJCSAgb3V0ZGF0YS0+ZF9zaXplID0gU0NOSU5GT19TSERSIChydW5wLT5zaGRyKS5zaF9zaXplOworCQkgIG91dGRhdGEtPmRfYWxpZ24gPSBTQ05JTkZPX1NIRFIgKHJ1bnAtPnNoZHIpLnNoX2FkZHJhbGlnbjsKKwkJfQorCisJICAgICAgWEVsZl9PZmYgYWxpZ24gPSAgTUFYICgxLCBvdXRkYXRhLT5kX2FsaWduKTsKKwkgICAgICBhc3NlcnQgKHBvd2Vyb2YyIChhbGlnbikpOworCSAgICAgIG9mZnNldCA9ICgob2Zmc2V0ICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKSk7CisKKwkgICAgICBydW5wLT5vZmZzZXQgPSBvZmZzZXQ7CisJICAgICAgcnVucC0+b3V0c2NubmR4ID0gaGVhZC0+c2NuaWR4OworCSAgICAgIHJ1bnAtPmFsbHNlY3Rpb25zaWR4ID0gY250OworCisJICAgICAgb3V0ZGF0YS0+ZF9vZmYgPSBvZmZzZXQ7CisKKwkgICAgICBvZmZzZXQgKz0gb3V0ZGF0YS0+ZF9zaXplOworCSAgICB9CisJICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBoZWFkLT5sYXN0LT5uZXh0KTsKKworCSAgLyogSWYgbmVjZXNzYXJ5IGFkZCB0aGUgYWRkaXRpb25hbCBsaW5lIHRvIHRoZSAuY29tbWVudCBzZWN0aW9uLiAgKi8KKwkgIGlmIChsZF9zdGF0ZS5hZGRfbGRfY29tbWVudAorCSAgICAgICYmIGhlYWQtPmZsYWdzID09IDAKKwkgICAgICAmJiBoZWFkLT50eXBlID09IFNIVF9QUk9HQklUUworCSAgICAgICYmIHN0cmNtcCAoaGVhZC0+bmFtZSwgIi5jb21tZW50IikgPT0gMAorCSAgICAgICYmIGhlYWQtPmVudHNpemUgPT0gMCkKKwkgICAgeworCSAgICAgIEVsZl9EYXRhICpvdXRkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7CisKKwkgICAgICBpZiAob3V0ZGF0YSA9PSBOVUxMKQorCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIiksCisJCSAgICAgICBlbGZfZXJybXNnICgtMSkpOworCisJICAgICAgb3V0ZGF0YS0+ZF9idWYgPSAodm9pZCAqKSAiXDBsZCAoUmVkIEhhdCAiIFBBQ0tBR0UgIikgIiBWRVJTSU9OOworCSAgICAgIG91dGRhdGEtPmRfc2l6ZSA9IHN0cmxlbiAoKGNoYXIgKikgb3V0ZGF0YS0+ZF9idWYgKyAxKSArIDI7CisJICAgICAgb3V0ZGF0YS0+ZF9vZmYgPSBvZmZzZXQ7CisJICAgICAgb3V0ZGF0YS0+ZF90eXBlID0gRUxGX1RfQllURTsKKwkgICAgICBvdXRkYXRhLT5kX2FsaWduID0gMTsKKwkgICAgfQorCSAgLyogWFhYIFdlIHNob3VsZCBjcmVhdGUgYSAuY29tbWVudCBzZWN0aW9uIGlmIG5vbmUgZXhpc3RzLgorCSAgICAgVGhpcyByZXF1aXJlcyB0aGF0IHdlIGVhcmx5IG9uIGRldGVjdCB0aGF0IG5vIHN1Y2gKKwkgICAgIHNlY3Rpb24gZXhpc3RzLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgaW1wbGVtZW50ZWQKKwkgICAgIHRvZ2V0aGVyIHdpdGggc29tZSBtZXJnaW5nIG9mIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgorCSAgICAgQ3VycmVudGx5IGlkZW50aWNhbCBlbnRyaWVzIGFyZSBub3QgbWVyZ2VkLiAgKi8KKwl9CisgICAgfQorCisgIC8qIFRoZSB0YWJsZSB3ZSBjb2xsZWN0IHRoZSBzdHJpbmdzIGluLiAgKi8KKyAgc3RydGFiID0gZWJsX3N0cnRhYmluaXQgKHRydWUpOworICBpZiAoc3RydGFiID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHN0cmluZyB0YWJsZSIpKTsKKworCisjaWZuZGVmIE5ERUJVRworICAvKiBLZWVwIHRyYWNrIG9mIHRoZSB1c2Ugb2YgdGhlIFhJTkRFWC4gICovCisgIG5lZWRfeG5keCA9IGZhbHNlOworI2VuZGlmCisKKyAgLyogV2Ugd2UgZ2VuZXJhdGUgYSBub3JtYWwgc3ltYm9sIHRhYmxlIGZvciBhbiBleGVjdXRhYmxlIGFuZCB0aGUKKyAgICAgLS1leHBvcnQtZHluYW1pYyBvcHRpb24gaXMgbm90IGdpdmVuLCB3ZSBuZWVkIGFuIGV4dHJhIHRhYmxlCisgICAgIHdoaWNoIGtlZXBzIHRyYWNrIG9mIHRoZSBzeW1ib2wgZW50cnkgYmVsb25naW5nIHRvIHRoZSBzeW1ib2wKKyAgICAgdGFibGUgZW50cnkuICBOb3RlIHRoYXQgRVhQT1JUX0FMTF9EWU5BTUlDIGlzIGFsd2F5cyBzZXQgaWYgd2UKKyAgICAgZ2VuZXJhdGUgYSBEU08gc28gd2UgZG8gbm90IGhhdmUgdG8gdGVzdCB0aGlzIHNlcGFyYXRlbHkuICAqLworICBuZHh0b3N5bSA9IChzdHJ1Y3Qgc3ltYm9sICoqKSB4Y2FsbG9jIChuc3ltX2FsbG9jYXRlZCwKKwkJCQkJIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworCisgIC8qIENyZWF0ZSB0aGUgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHT1Qgc2VjdGlvbi4gICovCisgIGlmIChsZF9zdGF0ZS5nb3Rfc3ltYm9sICE9IE5VTEwpCisgICAgeworICAgICAgYXNzZXJ0IChuc3ltIDwgbnN5bV9hbGxvY2F0ZWQpOworICAgICAgZmlsbGluX3NwZWNpYWxfc3ltYm9sIChsZF9zdGF0ZS5nb3Rfc3ltYm9sLCBsZF9zdGF0ZS5nb3RzY25pZHgsCisJCQkgICAgIG5zeW0rKywgc3ltZGF0YSwgc3RydGFiKTsKKyAgICB9CisKKyAgLyogU2ltaWxhcmx5IGZvciB0aGUgZHluYW1pYyBzZWN0aW9uIHN5bWJvbC4gICovCisgIGlmIChsZF9zdGF0ZS5keW5fc3ltYm9sICE9IE5VTEwpCisgICAgeworICAgICAgYXNzZXJ0IChuc3ltIDwgbnN5bV9hbGxvY2F0ZWQpOworICAgICAgZmlsbGluX3NwZWNpYWxfc3ltYm9sIChsZF9zdGF0ZS5keW5fc3ltYm9sLCBsZF9zdGF0ZS5keW5hbWljc2NuaWR4LAorCQkJICAgICBuc3ltKyssIHN5bWRhdGEsIHN0cnRhYik7CisgICAgfQorCisgIC8qIENyZWF0ZSBzeW1ib2wgdGFibGUgZW50cmllcyBmb3IgdGhlIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGUgbGlua2VyCisgICAgIHNjcmlwdC4gICovCisgIGlmIChsZF9zdGF0ZS5sc2NyaXB0X3N5bXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc3ltYm9sICpyc3ltID0gbGRfc3RhdGUubHNjcmlwdF9zeW1zOworICAgICAgZG8KKwl7CisJICBhc3NlcnQgKG5zeW0gPCBuc3ltX2FsbG9jYXRlZCk7CisJICBmaWxsaW5fc3BlY2lhbF9zeW1ib2wgKHJzeW0sIFNITl9BQlMsIG5zeW0rKywgc3ltZGF0YSwgc3RydGFiKTsKKwl9CisgICAgICB3aGlsZSAoKHJzeW0gPSByc3ltLT5uZXh0KSAhPSBOVUxMKTsKKyAgICB9CisKKyAgLyogSXRlcmF0ZSBvdmVyIGFsbCBpbnB1dCBmaWxlcyB0byBjb2xsZWN0IHRoZSBzeW1ib2xzLiAgKi8KKyAgZmlsZSA9IGxkX3N0YXRlLnJlbGZpbGVzLT5uZXh0OworICBzeW1kYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwgbGRfc3RhdGUuc3ltc2NuaWR4KSwKKwkJCSBOVUxMKTsKKyAgZG8KKyAgICB7CisgICAgICBzaXplX3QgbWF4Y250OworICAgICAgRWxmX0RhdGEgKmluc3ltZGF0YTsKKyAgICAgIEVsZl9EYXRhICppbnhuZHhkYXRhOworCisgICAgICAvKiBUaGVyZSBtdXN0IGJlIG5vIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHdoZW4gY3JlYXRpbmcKKwkgcmVsb2NhdGFibGUgZmlsZXMuICAqLworICAgICAgYXNzZXJ0IChsZF9zdGF0ZS5maWxlX3R5cGUgIT0gcmVsb2NhdGFibGVfZmlsZV90eXBlCisJICAgICAgfHwgZmlsZS0+ZHluc3ltdGFiZGF0YSA9PSBOVUxMKTsKKworICAgICAgaW5zeW1kYXRhID0gZmlsZS0+c3ltdGFiZGF0YTsKKyAgICAgIGFzc2VydCAoaW5zeW1kYXRhICE9IE5VTEwpOworICAgICAgaW54bmR4ZGF0YSA9IGZpbGUtPnhuZHhkYXRhOworCisgICAgICBtYXhjbnQgPSBmaWxlLT5uc3ltdGFiOworCisgICAgICBmaWxlLT5zeW1pbmRpcmVjdCA9IChFbGYzMl9Xb3JkICopIHhjYWxsb2MgKG1heGNudCwgc2l6ZW9mIChFbGYzMl9Xb3JkKSk7CisKKyAgICAgIC8qIFRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBkb2VzIG5vdCBjb250YWluIGxvY2FsIHN5bWJvbHMuICBTbworICAgICAgICAgd2Ugc2tpcCB0aG9zZSBlbnRyaWVzLiAgKi8KKyAgICAgIGZvciAoY250ID0gbGRfc3RhdGUubmVlZF9zeW10YWIgPyAxIDogZmlsZS0+bmxvY2Fsc3ltYm9sczsgY250IDwgbWF4Y250OworCSAgICsrY250KQorCXsKKwkgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKwkgIEVsZjMyX1dvcmQgeG5keDsKKwkgIHN0cnVjdCBzeW1ib2wgKmRlZnAgPSBOVUxMOworCisJICB4ZWxmX2dldHN5bXNobmR4IChpbnN5bWRhdGEsIGlueG5keGRhdGEsIGNudCwgc3ltLCB4bmR4KTsKKwkgIGFzc2VydCAoc3ltICE9IE5VTEwpOworCisJICBpZiAodW5saWtlbHkgKFhFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikpCisJICAgIHsKKwkgICAgICAvKiBTZWN0aW9uIHN5bWJvbHMgc2hvdWxkIGFsd2F5cyBiZSBsb2NhbCBidXQgd2hvIGtub3dzLi4uICAqLworCSAgICAgIGlmIChsZF9zdGF0ZS5uZWVkX3N5bXRhYikKKwkJeworCQkgIC8qIERldGVybWluZSB0aGUgcmVhbCBzZWN0aW9uIGluZGV4IGluIHRoZSBzb3VyY2UgZmlsZS4KKwkJICAgICBVc2UgdGhlIFhJTkRFWCBzZWN0aW9uIGNvbnRlbnQgaWYgbmVjZXNzYXJ5LiAgV2UgZG9uJ3QKKwkJICAgICBhZGQgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLworCQkgIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9YSU5ERVgpCisJCSAgICB4bmR4ID0gc3ltLT5zdF9zaG5keDsKKworCQkgIGFzc2VydCAoZmlsZS0+c2NuaW5mb1t4bmR4XS5hbGxzZWN0aW9uc2lkeAorCQkJICA8IGxkX3N0YXRlLm5hbGxzZWN0aW9ucyk7CisJCSAgZmlsZS0+c3ltaW5kaXJlY3RbY250XSA9IGxkX3N0YXRlLmFsbHNlY3Rpb25zW2ZpbGUtPnNjbmluZm9beG5keF0uYWxsc2VjdGlvbnNpZHhdLT5zY25zeW1pZHg7CisJCSAgLyogTm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgaW5kZXggY2FuIGJlIHplcm8gaGVyZS4gIFRoZXJlIGlzCisJCSAgICAgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIG91dHB1dCBmaWxlIHdpbGwgY29udGFpbiBhbGwgdGhlCisJCSAgICAgc2VjdGlvbnMgdGhlIGlucHV0IGZpbGUgZGlkLiAgKi8KKwkJfQorCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGlmICgobGRfc3RhdGUuc3RyaXAgPj0gc3RyaXBfYWxsIHx8ICFsZF9zdGF0ZS5uZWVkX3N5bXRhYikKKwkgICAgICAvKiBYWFggRG8gd2UgbmVlZCB0aGVzZSBlbnRyaWVzPyAgKi8KKwkgICAgICAmJiBYRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX0ZJTEUpCisJICAgIGNvbnRpbnVlOworCisjaWYgTkFUSVZFX0VMRiAhPSAwCisJICAvKiBDb3B5IG9sZCBkYXRhLiAgKi8KKwkgIFhFbGZfU3ltICpzeW0yID0gc3ltOworCSAgYXNzZXJ0IChuc3ltIDwgbnN5bV9hbGxvY2F0ZWQpOworCSAgeGVsZl9nZXRzeW0gKHN5bWRhdGEsIG5zeW0sIHN5bSk7CisJICAqc3ltID0gKnN5bTI7CisjZW5kaWYKKworCSAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGCisJICAgICAgJiYgKHN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFCisJCSAgfHwgc3ltLT5zdF9zaG5keCA9PSBTSE5fWElOREVYKSkKKwkgICAgeworCSAgICAgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhbiBleGVjdXRhYmxlIHdpdGggbm8gbm9ybWFsCisJCSBzeW1ib2wgdGFibGUgYW5kIHdlIGRvIG5vdCBleHBvcnQgYWxsIHN5bWJvbHMgYW5kCisJCSB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIERTTyBhcyB3ZWxsLCBpZ25vcmUKKwkJIGl0LiAgKi8KKwkgICAgICBpZiAoIWxkX3N0YXRlLmV4cG9ydF9hbGxfZHluYW1pYyAmJiAhbGRfc3RhdGUubmVlZF9zeW10YWIpCisJCXsKKwkJICBhc3NlcnQgKGNudCA+PSBmaWxlLT5ubG9jYWxzeW1ib2xzKTsKKwkJICBkZWZwID0gZmlsZS0+c3ltcmVmW2NudF07CisJCSAgYXNzZXJ0IChkZWZwICE9IE5VTEwpOworCisJCSAgaWYgKCFkZWZwLT5pbl9kc28pCisJCSAgICAvKiBJZ25vcmUgaXQuICAqLworCQkgICAgY29udGludWU7CisJCX0KKworCSAgICAgIC8qIERldGVybWluZSB0aGUgcmVhbCBzZWN0aW9uIGluZGV4IGluIHRoZSBzb3VyY2UgZmlsZS4gIFVzZQorCQkgdGhlIFhJTkRFWCBzZWN0aW9uIGNvbnRlbnQgaWYgbmVjZXNzYXJ5LiAgKi8KKwkgICAgICBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKQorCQl4bmR4ID0gc3ltLT5zdF9zaG5keDsKKworCSAgICAgIHN5bS0+c3RfdmFsdWUgKz0gZmlsZS0+c2NuaW5mb1t4bmR4XS5vZmZzZXQ7CisKKwkgICAgICBhc3NlcnQgKGZpbGUtPnNjbmluZm9beG5keF0ub3V0c2NubmR4IDwgU0hOX0xPUkVTRVJWRQorCQkgICAgICB8fCBmaWxlLT5zY25pbmZvW3huZHhdLm91dHNjbm5keCA+IFNITl9ISVJFU0VSVkUpOworCSAgICAgIGlmICh1bmxpa2VseSAoZmlsZS0+c2NuaW5mb1t4bmR4XS5vdXRzY25uZHggPiBTSE5fTE9SRVNFUlZFKSkKKwkJeworCQkgIC8qIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIGFuIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXgKKwkJICAgICB0YWJsZSBmb3IgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KKwkJICBpZiAoIWxkX3N0YXRlLm5lZWRfc3ltdGFiKQorCQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIlwKK3NlY3Rpb24gaW5kZXggdG9vIGxhcmdlIGluIGR5bmFtaWMgc3ltYm9sIHRhYmxlIikpOworCisJCSAgYXNzZXJ0ICh4bmR4ZGF0YSAhPSBOVUxMKTsKKwkJICBzeW0tPnN0X3NobmR4ID0gU0hOX1hJTkRFWDsKKwkJICB4bmR4ID0gZmlsZS0+c2NuaW5mb1t4bmR4XS5vdXRzY25uZHg7CisjaWZuZGVmIE5ERUJVRworCQkgIG5lZWRfeG5keCA9IHRydWU7CisjZW5kaWYKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHN5bS0+c3Rfc2huZHggPSBmaWxlLT5zY25pbmZvW3huZHhdLm91dHNjbm5keDsKKwkJICB4bmR4ID0gMDsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04gfHwgc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCisJICAgIHsKKwkgICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYSAocmVhbCkgZGVmaW5pdGlvbiBmb3IgdGhpcworCQkgc3ltYm9sLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSB3ZSBza2lwIHRoaXMgc3ltYm9sCisJCSB0YWJsZSBlbnRyeS4gICovCisJICAgICAgYXNzZXJ0IChjbnQgPj0gZmlsZS0+bmxvY2Fsc3ltYm9scyk7CisJICAgICAgZGVmcCA9IGZpbGUtPnN5bXJlZltjbnRdOworCSAgICAgIGFzc2VydCAoZGVmcCAhPSBOVUxMKTsKKworCSAgICAgIGFzc2VydCAoc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OIHx8IGRlZnAtPmRlZmluZWQpOworCisJICAgICAgaWYgKChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04gJiYgIWRlZnAtPmNvbW1vbikKKwkJICB8fCAoc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYgJiYgZGVmcC0+ZGVmaW5lZCkKKwkJICB8fCBkZWZwLT5hZGRlZCkKKwkJLyogSWdub3JlIHRoaXMgc3ltYm9sIHRhYmxlIGVudHJ5LCB0aGVyZSBpcyBhCisJCSAgICJiZXR0ZXIiIG9uZSBvciB3ZSBhbHJlYWR5IGFkZGVkIGl0LiAgKi8KKwkJY29udGludWU7CisKKwkgICAgICAvKiBSZW1lbWJlciB0aGF0IHdlIGFscmVhZHkgYWRkZWQgdGhpcyBzeW1ib2wuICAqLworCSAgICAgIGRlZnAtPmFkZGVkID0gMTsKKworCSAgICAgIC8qIEFkanVzdCB0aGUgc2VjdGlvbiBudW1iZXIgZm9yIGNvbW1vbiBzeW1ib2xzLiAgKi8KKwkgICAgICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQorCQl7CisJCSAgc3ltLT5zdF92YWx1ZSA9IChsZF9zdGF0ZS5jb21tb25fc2VjdGlvbi0+b2Zmc2V0CisJCQkJICAgKyBmaWxlLT5zeW1yZWZbY250XS0+bWVyZ2UudmFsdWUpOworCQkgIGFzc2VydCAobGRfc3RhdGUuY29tbW9uX3NlY3Rpb24tPm91dHNjbm5keCA8IFNITl9MT1JFU0VSVkUpOworCQkgIHN5bS0+c3Rfc2huZHggPSBsZF9zdGF0ZS5jb21tb25fc2VjdGlvbi0+b3V0c2NubmR4OworCQkgIHhuZHggPSAwOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHVubGlrZWx5IChzeW0tPnN0X3NobmR4ICE9IFNITl9BQlMpKQorCSAgICB7CisJICAgICAgaWYgKFNQRUNJQUxfU0VDVElPTl9OVU1CRVJfUCAoJmxkX3N0YXRlLCBzeW0tPnN0X3NobmR4KSkKKwkJLyogWFhYIEFkZCBjb2RlIHRvIGhhbmRsZSBtYWNoaW5lIHNwZWNpZmljIHNwZWNpYWwKKwkJICAgc2VjdGlvbnMuICAqLworCQlhYm9ydCAoKTsKKwkgICAgfQorCisJICAvKiBBZGQgdGhlIHN5bWJvbCBuYW1lIHRvIHRoZSBzdHJpbmcgdGFibGUuICBJZiB0aGUgdXNlcgorCSAgICAgY2hvb3NlcyB0aGUgaGlnaGVzdCBsZXZlbCBvZiBzdHJpcHBpbmcgYXZvaWQgYWRkaW5nIG5hbWVzCisJICAgICBmb3IgbG9jYWwgc3ltYm9scyBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KKwkgIGlmIChzeW0tPnN0X25hbWUgIT0gMAorCSAgICAgICYmIChsZF9zdGF0ZS5zdHJpcCA8IHN0cmlwX2V2ZXJ5dGhpbmcKKwkJICB8fCBYRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKSkKKwkgICAgc3ltc3RyZW50W25zeW1dID0gZWJsX3N0cnRhYmFkZCAoc3RydGFiLAorCQkJCQkgICAgIGVsZl9zdHJwdHIgKGZpbGUtPmVsZiwKKwkJCQkJCQkgZmlsZS0+c3ltc3RyaWR4LAorCQkJCQkJCSBzeW0tPnN0X25hbWUpLCAwKTsKKworCSAgLyogT25jZSB3ZSBrbm93IHRoZSBuYW1lIHRoaXMgZmllbGQgd2lsbCBnZXQgdGhlIGNvcnJlY3QKKwkgICAgIG9mZnNldC4gIEZvciBub3cgc2V0IGl0IHRvIHplcm8gd2hpY2ggbWVhbnMgbm8gbmFtZQorCSAgICAgYXNzb2NpYXRlZC4gICovCisJICBzeW0tPnN0X25hbWUgPSAwOworCisJICAvKiBJZiB3ZSBoYWQgdG8gbWVyZ2Ugc2VjdGlvbnMgd2UgaGF2ZSBhIGNvbXBsZXRlbHkgbmV3CisJICAgICBvZmZzZXQgZm9yIHRoZSBzeW1ib2wuICAqLworCSAgaWYgKGZpbGUtPmhhc19tZXJnZV9zZWN0aW9ucyAmJiBmaWxlLT5zeW1yZWZbY250XSAhPSBOVUxMCisJICAgICAgJiYgZmlsZS0+c3ltcmVmW2NudF0tPm1lcmdlZCkKKwkgICAgc3ltLT5zdF92YWx1ZSA9IGZpbGUtPnN5bXJlZltjbnRdLT5tZXJnZS52YWx1ZTsKKworCSAgLyogQ3JlYXRlIHRoZSByZWNvcmQgaW4gdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCisJICBhc3NlcnQgKG5zeW0gPCBuc3ltX2FsbG9jYXRlZCk7CisJICB4ZWxmX3VwZGF0ZV9zeW1zaG5keCAoc3ltZGF0YSwgeG5keGRhdGEsIG5zeW0sIHN5bSwgeG5keCwgMCk7CisKKwkgIC8qIEFkZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2wgcmVjb3JkIGluIGNhc2Ugd2UgbmVlZCBpdC4KKwkgICAgIEZpbmQgdGhlIHN5bWJvbCBpZiB0aGlzIGhhcyBub3QgaGFwcGVuZWQgeWV0LiAgV2UgZG8KKwkgICAgIG5vdCBuZWVkIHRoZSBpbmZvcm1hdGlvbiBmb3IgbG9jYWwgc3ltYm9scy4gICovCisJICBpZiAoZGVmcCA9PSBOVUxMICYmIGNudCA+PSBmaWxlLT5ubG9jYWxzeW1ib2xzKQorCSAgICB7CisJICAgICAgZGVmcCA9IGZpbGUtPnN5bXJlZltjbnRdOworCSAgICAgIGFzc2VydCAoZGVmcCAhPSBOVUxMKTsKKwkgICAgfQorCisJICAvKiBTdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2wgcmVjb3JkLiAgVGhlCisJICAgICBzb3J0aW5nIGNvZGUgd2lsbCBoYXZlIHRvIGtlZXAgdGhpcyBhcnJheSBpbiB0aGUKKwkgICAgIGNvcnJlY3Qgb3JkZXIsIHRvby4gICovCisJICBuZHh0b3N5bVtuc3ltXSA9IGRlZnA7CisKKwkgIC8qIE9uZSBtb3JlIGVudHJ5IGZpbmlzaGVkLiAgKi8KKwkgIGlmIChjbnQgPj0gZmlsZS0+bmxvY2Fsc3ltYm9scykKKwkgICAgeworCSAgICAgIGFzc2VydCAoZmlsZS0+c3ltcmVmW2NudF0tPm91dHN5bWlkeCA9PSAwKTsKKwkgICAgICBmaWxlLT5zeW1yZWZbY250XS0+b3V0c3ltaWR4ID0gbnN5bTsKKwkgICAgfQorCSAgZmlsZS0+c3ltaW5kaXJlY3RbY250XSA9IG5zeW0rKzsKKwl9CisgICAgfQorICB3aGlsZSAoKGZpbGUgPSBmaWxlLT5uZXh0KSAhPSBsZF9zdGF0ZS5yZWxmaWxlcy0+bmV4dCk7CisgIC8qIE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgY3JlYXRlIHRoZSBleHRlbmRlZCBzZWN0aW9uIGluZGV4IHRhYmxlIGZvcgorICAgICBub3RoaW5nLiAgKi8KKyAgYXNzZXJ0ICh4bmR4ZGF0YSA9PSBOVUxMIHx8IG5lZWRfeG5keCk7CisKKworICAvKiBDcmVhdGUgdGhlIHZlcnNpb24gcmVsYXRlZCBzZWN0aW9ucy4gICovCisgIGlmIChsZF9zdGF0ZS52ZXJuZWVkc2NuaWR4ICE9IDApCisgICAgeworICAgICAgLyogV2Uga25vdyB0aGUgbnVtYmVyIG9mIGlucHV0IGZpbGVzIGFuZCB0b3RhbCBudW1iZXIgb2YKKwkgcmVmZXJlbmNlZCB2ZXJzaW9ucy4gIFRoaXMgYWxsb3dzIHVzIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkKKwkgYW5kIHRoZW4gd2UgaXRlcmF0ZSBvdmVyIHRoZSBEU09zIHRvIGdldCB0aGUgdmVyc2lvbgorCSBpbmZvcm1hdGlvbi4gICovCisgICAgICBzdHJ1Y3QgdXNlZGZpbGVzICpydW5wOworCisgICAgICBydW5wID0gbGRfc3RhdGUuZHNvZmlsZXMtPm5leHQ7CisgICAgICBkbworCWFsbG9jYXRlX3ZlcnNpb25fbmFtZXMgKHJ1bnAsIGR5bnN0cnRhYik7CisgICAgICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBsZF9zdGF0ZS5kc29maWxlcy0+bmV4dCk7CisKKyAgICAgIGlmIChsZF9zdGF0ZS5uZWVkZWQgIT0gTlVMTCkKKwl7CisJICBydW5wID0gbGRfc3RhdGUubmVlZGVkLT5uZXh0OworCSAgZG8KKwkgICAgYWxsb2NhdGVfdmVyc2lvbl9uYW1lcyAocnVucCwgZHluc3RydGFiKTsKKwkgIHdoaWxlICgocnVucCA9IHJ1bnAtPm5leHQpICE9IGxkX3N0YXRlLm5lZWRlZC0+bmV4dCk7CisJfQorICAgIH0KKworICAvKiBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBoaWRlIHN5bWJvbHMgYW5kIHNvIG9uLiAgKi8KKyAgaWYgKGxkX3N0YXRlLmRlZmF1bHRfYmluZF9sb2NhbCB8fCBsZF9zdGF0ZS52ZXJzaW9uX3N0cl90YWIuZmlsbGVkID4gMCkKKyAgICAvKiBYWFggQWRkIG9uZSBtb3JlIHRlc3Qgd2hlbiBoYW5kbGluZyBvZiB3aWxkY2FyZCBzeW1ib2wgbmFtZXMKKyAgICAgICBpcyBzdXBwb3J0ZWQuICAqLworICAgIHsKKyAgICAvKiBDaGVjayBhbGwgbm9uLWxvY2FsIHN5bWJvbHMgd2hldGhlciB0aGV5IGFyZSBvbiB0aGUgZXhwb3J0IGxpc3QuICAqLworICAgICAgYm9vbCBhbnlfcmVkdWNlZCA9IGZhbHNlOworCisgICAgICBmb3IgKGNudCA9IDE7IGNudCA8IG5zeW07ICsrY250KQorCXsKKwkgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKworCSAgLyogTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gdXNlICd4ZWxmX2dldHN5bXNobmR4JyBzaW5jZSB3ZQorCSAgICAgb25seSBuZWVkIHRoZSBiaW5kaW5nIGFuZCB0aGUgc3ltYm9sIG5hbWUuICAqLworCSAgeGVsZl9nZXRzeW0gKHN5bWRhdGEsIGNudCwgc3ltKTsKKwkgIGFzc2VydCAoc3ltICE9IE5VTEwpOworCisJICBpZiAocmVkdWNlX3N5bWJvbF9wIChzeW0sIHN5bXN0cmVudFtjbnRdKSkKKwkgICAgeworCSAgICAgIHN5bS0+c3RfaW5mbyA9IFhFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLAorCQkJCQkgICBYRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykpOworCSAgICAgICh2b2lkKSB4ZWxmX3VwZGF0ZV9zeW0gKHN5bWRhdGEsIGNudCwgc3ltKTsKKworCSAgICAgIC8qIFNob3cgdGhhdCB3ZSBkb24ndCBuZWVkIHRoaXMgc3RyaW5nIGFueW1vcmUuICAqLworCSAgICAgIGlmIChsZF9zdGF0ZS5zdHJpcCA9PSBzdHJpcF9ldmVyeXRoaW5nKQorCQl7CisJCSAgc3ltc3RyZW50W2NudF0gPSBOVUxMOworCQkgIGFueV9yZWR1Y2VkID0gdHJ1ZTsKKwkJfQorCSAgICB9CisJfQorCisgICAgICBpZiAodW5saWtlbHkgKGFueV9yZWR1Y2VkKSkKKwl7CisJICAvKiBTaW5jZSB3ZSB3aWxsIG5vdCB3cml0ZSBuYW1lcyBvZiBsb2NhbCBzeW1ib2xzIGluIHRoZQorCSAgICAgb3V0cHV0IGZpbGUgYW5kIHdlIGhhdmUgcmVkdWNlZCB0aGUgYmluZGluZyBvZiBzb21lCisJICAgICBzeW1ib2xzIHRoZSBzdHJpbmcgdGFibGUgcHJldmlvdXNseSBjb25zdHJ1Y3RlZCBjb250YWlucworCSAgICAgdG9vIG1hbnkgc3RyaW5nLiAgQ29ycmVjdCBpdC4gICovCisJICBzdHJ1Y3QgRWJsX1N0cnRhYiAqbmV3cCA9IGVibF9zdHJ0YWJpbml0ICh0cnVlKTsKKworCSAgZm9yIChjbnQgPSAxOyBjbnQgPCBuc3ltOyArK2NudCkKKwkgICAgaWYgKHN5bXN0cmVudFtjbnRdICE9IE5VTEwpCisJICAgICAgc3ltc3RyZW50W2NudF0gPSBlYmxfc3RydGFiYWRkIChuZXdwLAorCQkJCQkgICAgICBlYmxfc3RyaW5nIChzeW1zdHJlbnRbY250XSksIDApOworCisJICBlYmxfc3RydGFiZnJlZSAoc3RydGFiKTsKKwkgIHN0cnRhYiA9IG5ld3A7CisJfQorICAgIH0KKworICAvKiBBZGQgdGhlIHJlZmVyZW5jZXMgdG8gRFNPcy4gIFdlIGNhbiBhZGQgdGhlc2UgZW50cmllcyB0aGlzIGxhdGUKKyAgICAgKGFmdGVyIHNvcnRpbmcgb3V0IHZlcnNpb25pbmcpIGJlY2F1c2UgcmVmZXJlbmNlcyB0byBEU09zIGFyZSBub3QKKyAgICAgZWZmZWN0ZWQuICAqLworICBpZiAobGRfc3RhdGUuZnJvbV9kc28gIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc3ltYm9sICpydW5wOworICAgICAgc2l6ZV90IHBsdF9iYXNlID0gbnN5bSArIGxkX3N0YXRlLm5mcm9tX2RzbyAtIGxkX3N0YXRlLm5wbHQ7CisgICAgICBzaXplX3QgcGx0X2lkeCA9IDA7CisgICAgICBzaXplX3Qgb2JqX2lkeCA9IDA7CisKKyAgICAgIGFzc2VydCAobGRfc3RhdGUubmZyb21fZHNvID49IGxkX3N0YXRlLm5wbHQpOworICAgICAgcnVucCA9IGxkX3N0YXRlLmZyb21fZHNvOworICAgICAgZG8KKwl7CisJICAvLyBYWFggV2hhdCBhYm91dCBmdW5jdGlvbnMgd2hpY2ggYXJlIG9ubHkgcmVmZXJlbmNlZCB2aWEKKwkgIC8vIHBvaW50ZXJzIGFuZCBub3QgUExUIGVudHJpZXM/ICBDYW4gd2UgZGlzdGluZ3Vpc2ggc3VjaCB1c2VzPworCSAgc2l6ZV90IGlkeDsKKwkgIGlmIChydW5wLT50eXBlID09IFNUVF9GVU5DKQorCSAgICB7CisJICAgICAgLyogU3RvcmUgdGhlIFBMVCBlbnRyeSBudW1iZXIuICAqLworCSAgICAgIHJ1bnAtPm1lcmdlLnZhbHVlID0gcGx0X2lkeCArIDE7CisJICAgICAgaWR4ID0gcGx0X2Jhc2UgKyBwbHRfaWR4Kys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgaWR4ID0gbnN5bSArIG9ial9pZHgrKzsKKworCSAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCSAgeGVsZl9nZXRzeW1fcHRyIChzeW1kYXRhLCBpZHgsIHN5bSk7CisKKwkgIHN5bS0+c3RfdmFsdWUgPSAwOworCSAgc3ltLT5zdF9zaXplID0gcnVucC0+c2l6ZTsKKwkgIHN5bS0+c3RfaW5mbyA9IFhFTEZfU1RfSU5GTyAocnVucC0+d2VhayA/IFNUQl9XRUFLIDogU1RCX0dMT0JBTCwKKwkJCQkgICAgICAgcnVucC0+dHlwZSk7CisJICBzeW0tPnN0X290aGVyID0gU1RWX0RFRkFVTFQ7CisJICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOworCisJICAvKiBDcmVhdGUgdGhlIHJlY29yZCBpbiB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KKwkgIHhlbGZfdXBkYXRlX3N5bXNobmR4IChzeW1kYXRhLCB4bmR4ZGF0YSwgaWR4LCBzeW0sIDAsIDApOworCisJICBjb25zdCBjaGFyICpuYW1lID0gcnVucC0+bmFtZTsKKwkgIHNpemVfdCBuYW1lbGVuID0gMDsKKworCSAgaWYgKHJ1bnAtPmZpbGUtPnZlcmRlZmRhdGEgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8vIFhYWCBJcyBpdCB1c2VmdWwgdG8gYWRkIHRoZSB2ZXJzeW0gdmFsdWUgdG8gc3RydWN0IHN5bWJvbD8KKwkgICAgICBYRWxmX1ZlcnN5bSB2ZXJzeW07CisKKwkgICAgICAodm9pZCkgeGVsZl9nZXR2ZXJzeW1fY29weSAocnVucC0+ZmlsZS0+dmVyc3ltZGF0YSwgcnVucC0+c3ltaWR4LAorCQkJCQkgIHZlcnN5bSk7CisKKwkgICAgICAvKiBPbmUgY2FuIG9ubHkgbGluayB3aXRoIHRoZSBkZWZhdWx0IHZlcnNpb24uICAqLworCSAgICAgIGFzc2VydCAoKHZlcnN5bSAmIDB4ODAwMCkgPT0gMCk7CisKKwkgICAgICBjb25zdCBjaGFyICp2ZXJzbmFtZQorCQk9IGVibF9zdHJpbmcgKHJ1bnAtPmZpbGUtPnZlcmRlZmVudFt2ZXJzeW1dKTsKKworCSAgICAgIHNpemVfdCB2ZXJzbmFtZV9sZW4gPSBzdHJsZW4gKHZlcnNuYW1lKSArIDE7CisJICAgICAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSkgKyB2ZXJzbmFtZV9sZW4gKyAyOworCSAgICAgIGNoYXIgKm5ld3AgPSAoY2hhciAqKSBvYnN0YWNrX2FsbG9jICgmbGRfc3RhdGUuc21lbSwgbmFtZWxlbik7CisJICAgICAgbWVtY3B5IChzdHBjcHkgKHN0cGNweSAobmV3cCwgbmFtZSksICJAQCIpLAorCQkgICAgICB2ZXJzbmFtZSwgdmVyc25hbWVfbGVuKTsKKwkgICAgICBuYW1lID0gbmV3cDsKKwkgICAgfQorCisJICBzeW1zdHJlbnRbaWR4XSA9IGVibF9zdHJ0YWJhZGQgKHN0cnRhYiwgbmFtZSwgbmFtZWxlbik7CisKKwkgIC8qIFJlY29yZCB0aGUgaW5pdGlhbCBpbmRleCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKwkgIHJ1bnAtPm91dHN5bWlkeCA9IGlkeDsKKworCSAgLyogUmVtZW1iZXIgdGhlIHN5bWJvbCByZWNvcmQgdGhpcyBFTEYgc3ltYm9sIGNhbWUgZnJvbS4gICovCisJICBuZHh0b3N5bVtpZHhdID0gcnVucDsKKwl9CisgICAgICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBsZF9zdGF0ZS5mcm9tX2Rzbyk7CisKKyAgICAgIGFzc2VydCAobnN5bSArIG9ial9pZHggPT0gcGx0X2Jhc2UpOworICAgICAgYXNzZXJ0IChwbHRfaWR4ID09IGxkX3N0YXRlLm5wbHQpOworICAgICAgbnN5bSA9IHBsdF9iYXNlICsgcGx0X2lkeDsKKyAgICB9CisKKyAgLyogTm93IHdlIGtub3cgaG93IG1hbnkgc3ltYm9scyB3aWxsIGJlIGluIHRoZSBvdXRwdXQgZmlsZS4gIEFkanVzdAorICAgICB0aGUgY291bnQgaW4gdGhlIHNlY3Rpb24gZGF0YS4gICovCisgIHN5bWRhdGEtPmRfc2l6ZSA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfU1lNLCBuc3ltKTsKKyAgaWYgKHVubGlrZWx5ICh4bmR4ZGF0YSAhPSBOVUxMKSkKKyAgICB4bmR4ZGF0YS0+ZF9zaXplID0geGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9XT1JELCBuc3ltKTsKKworICAvKiBDcmVhdGUgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgc2VjdGlvbi4gICovCisgIHN0cnNjbiA9IGVsZl9uZXdzY24gKGxkX3N0YXRlLm91dGVsZik7CisgIGxkX3N0YXRlLnN0cnNjbmlkeCA9IGVsZl9uZHhzY24gKHN0cnNjbik7CisgIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc3Ryc2NuKTsKKyAgeGVsZl9nZXRzaGRyIChzdHJzY24sIHNoZHIpOworICBpZiAoZGF0YSA9PSBOVUxMIHx8IHNoZHIgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gZm9yIG91dHB1dCBmaWxlOiAlcyIpLAorCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgLyogQ3JlYXRlIGEgY29tcGFjdCBzdHJpbmcgdGFibGUsIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIGl0LCBhbmQKKyAgICAgZmlsbCBpbiB0aGUgc2VjdGlvbiBkYXRhIGluZm9ybWF0aW9uLiAgKi8KKyAgZWJsX3N0cnRhYmZpbmFsaXplIChzdHJ0YWIsIGRhdGEpOworCisgIHNoZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOworICBhc3NlcnQgKHNoZHItPnNoX2VudHNpemUgPT0gMCk7CisKKyAgaWYgKHVubGlrZWx5ICh4ZWxmX3VwZGF0ZV9zaGRyIChzdHJzY24sIHNoZHIpID09IDApKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIiksCisJICAgZWxmX2Vycm1zZyAoLTEpKTsKKworICAvKiBGaWxsIGluIHRoZSBvZmZzZXRzIG9mIHRoZSBzeW1ib2wgbmFtZXMuICAqLworICBmb3IgKGNudCA9IDE7IGNudCA8IG5zeW07ICsrY250KQorICAgIGlmIChzeW1zdHJlbnRbY250XSAhPSBOVUxMKQorICAgICAgeworCVhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKworCS8qIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHVzZSAneGVsZl9nZXRzeW1zaG5keCcgc2luY2Ugd2UgZG9uJ3QKKwkgICBtb2RpZnkgdGhlIHNlY3Rpb24gaW5kZXguICAqLworCXhlbGZfZ2V0c3ltIChzeW1kYXRhLCBjbnQsIHN5bSk7CisJLyogVGhpcyBiZXR0ZXIgd29ya2VkLCB3ZSBkaWQgaXQgYmVmb3JlLiAgKi8KKwlhc3NlcnQgKHN5bSAhPSBOVUxMKTsKKwlzeW0tPnN0X25hbWUgPSBlYmxfc3RydGFib2Zmc2V0IChzeW1zdHJlbnRbY250XSk7CisJKHZvaWQpIHhlbGZfdXBkYXRlX3N5bSAoc3ltZGF0YSwgY250LCBzeW0pOworICAgICAgfQorCisgIC8qIFNpbmNlIHdlIGFyZSBnb2luZyB0byByZW9yZGVyIHRoZSBzeW1ib2wgdGFibGUgYnV0IHN0aWxsIGhhdmUgdG8KKyAgICAgYmUgYWJsZSB0byBmaW5kIHRoZSBuZXcgcG9zaXRpb24gYmFzZWQgb24gdGhlIG9sZCBvbmUgKHNpbmNlIHRoZQorICAgICBsYXR0ZXIgaXMgc3RvcmVkIGluICdzeW1pbmRpcmVjdCcgaW5mb3JtYXRpb24gb2YgdGhlIGlucHV0IGZpbGUKKyAgICAgZGF0YSBzdHJ1Y3R1cmUpIHdlIGhhdmUgdG8gY3JlYXRlIHlldCBhbm90aGVyIGluZGlyZWN0aW9uCisgICAgIHRhYmxlLiAgKi8KKyAgbGRfc3RhdGUuZGJsaW5kaXJlY3QgPSBkYmxpbmRpcmVjdAorICAgID0gKEVsZjMyX1dvcmQgKikgeG1hbGxvYyAobnN5bSAqIHNpemVvZiAoRWxmMzJfV29yZCkpOworCisgIC8qIFNvcnQgdGhlIHN5bWJvbCB0YWJsZSBzbyB0aGF0IHRoZSBsb2NhbCBzeW1ib2xzIGNvbWUgZmlyc3QuICAqLworICAvKiBYWFggV2UgZG9uJ3QgdXNlIHN0YWJsZSBzb3J0aW5nIGhlcmUuICBJdCBzZWVtcyBub3QgbmVjZXNzYXJ5IGFuZAorICAgICB3b3VsZCBiZSBtb3JlIGV4cGVuc2l2ZS4gIElmIGl0IHR1cm5zIG91dCB0byBiZSBuZWNlc3NhcnkgdGhpcyBjYW4KKyAgICAgYmUgZml4ZWQgZWFzaWx5LiAgKi8KKyAgbnN5bV9sb2NhbCA9IDE7CisgIGNudCA9IG5zeW0gLSAxOworICB3aGlsZSAobnN5bV9sb2NhbCA8IGNudCkKKyAgICB7CisgICAgICBYRWxmX1N5bV92YXJkZWYgKGxvY3N5bSk7CisgICAgICBFbGYzMl9Xb3JkIGxvY3huZHg7CisgICAgICBYRWxmX1N5bV92YXJkZWYgKGdsb2JzeW0pOworICAgICAgRWxmMzJfV29yZCBnbG9ieG5keDsKKworICAgICAgZG8KKwl7CisJICB4ZWxmX2dldHN5bXNobmR4IChzeW1kYXRhLCB4bmR4ZGF0YSwgbnN5bV9sb2NhbCwgbG9jc3ltLCBsb2N4bmR4KTsKKwkgIC8qIFRoaXMgYmV0dGVyIHdvcmtzLiAgKi8KKwkgIGFzc2VydCAobG9jc3ltICE9IE5VTEwpOworCisJICBpZiAoWEVMRl9TVF9CSU5EIChsb2NzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTAorCSAgICAgICYmIChsZF9zdGF0ZS5uZWVkX3N5bXRhYiB8fCBsZF9zdGF0ZS5leHBvcnRfYWxsX2R5bmFtaWMpKQorCSAgICB7CisJICAgICAgZG8KKwkJeworCQkgIHhlbGZfZ2V0c3ltc2huZHggKHN5bWRhdGEsIHhuZHhkYXRhLCBjbnQsIGdsb2JzeW0sIGdsb2J4bmR4KTsKKwkJICAvKiBUaGlzIGJldHRlciB3b3Jrcy4gICovCisJCSAgYXNzZXJ0IChnbG9ic3ltICE9IE5VTEwpOworCisJCSAgaWYgKHVubGlrZWx5IChYRUxGX1NUX0JJTkQgKGdsb2JzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTCkpCisJCSAgICB7CisJCSAgICAgIC8qIFdlIHN3YXAgdGhlIHR3byBlbnRyaWVzLiAgKi8KKyNpZiBOQVRJVkVfRUxGICE9IDAKKwkJICAgICAgLyogU2luY2Ugd2UgZGlyZWN0bHkgbW9kaWZ5IHRoZSBkYXRhIGluIHRoZSBFTEYKKwkJCSBkYXRhIHN0cnVjdHVyZSB3ZSBoYXZlIHRvIG1ha2UgYSBjb3B5IG9mIG9uZQorCQkJIG9mIHRoZSBlbnRyaWVzLiAgKi8KKwkJICAgICAgWEVsZl9TeW0gbG9jc3ltX2NvcHkgPSAqbG9jc3ltOworCQkgICAgICBsb2NzeW0gPSAmbG9jc3ltX2NvcHk7CisjZW5kaWYKKwkJICAgICAgeGVsZl91cGRhdGVfc3ltc2huZHggKHN5bWRhdGEsIHhuZHhkYXRhLCBuc3ltX2xvY2FsLAorCQkJCQkgICAgZ2xvYnN5bSwgZ2xvYnhuZHgsIDEpOworCQkgICAgICB4ZWxmX3VwZGF0ZV9zeW1zaG5keCAoc3ltZGF0YSwgeG5keGRhdGEsIGNudCwKKwkJCQkJICAgIGxvY3N5bSwgbG9jeG5keCwgMSk7CisKKwkJICAgICAgLyogQWxzbyBzd2FwIHRoZSBjcm9zcyByZWZlcmVuY2VzLiAgKi8KKwkJICAgICAgZGJsaW5kaXJlY3RbbnN5bV9sb2NhbF0gPSBjbnQ7CisJCSAgICAgIGRibGluZGlyZWN0W2NudF0gPSBuc3ltX2xvY2FsOworCisJCSAgICAgIC8qIEFuZCB0aGUgZW50cmllcyBmb3IgdGhlIHN5bWJvbCBuYW1lcy4gICovCisJCSAgICAgIHN0cnVjdCBFYmxfU3RyZW50ICpzdHJ0bXAgPSBzeW1zdHJlbnRbbnN5bV9sb2NhbF07CisJCSAgICAgIHN5bXN0cmVudFtuc3ltX2xvY2FsXSA9IHN5bXN0cmVudFtjbnRdOworCQkgICAgICBzeW1zdHJlbnRbY250XSA9IHN0cnRtcDsKKworCQkgICAgICAvKiBBbmQgdGhlIG1hcHBpbmcgZnJvbSBzeW1ib2wgdGFibGUgZW50cnkgdG8KKwkJCSBzdHJ1Y3Qgc3ltYm9sIHJlY29yZC4gICovCisJCSAgICAgIHN0cnVjdCBzeW1ib2wgKnN5bXRtcCA9IG5keHRvc3ltW25zeW1fbG9jYWxdOworCQkgICAgICBuZHh0b3N5bVtuc3ltX2xvY2FsXSA9IG5keHRvc3ltW2NudF07CisJCSAgICAgIG5keHRvc3ltW2NudF0gPSBzeW10bXA7CisKKwkJICAgICAgLyogR28gdG8gdGhlIG5leHQgZW50cnkuICAqLworCQkgICAgICArK25zeW1fbG9jYWw7CisJCSAgICAgIC0tY250OworCisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCisJCSAgZGJsaW5kaXJlY3RbY250XSA9IGNudDsKKwkJfQorCSAgICAgIHdoaWxlIChuc3ltX2xvY2FsIDwgLS1jbnQpOworCisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgZGJsaW5kaXJlY3RbbnN5bV9sb2NhbF0gPSBuc3ltX2xvY2FsOworCX0KKyAgICAgIHdoaWxlICgrK25zeW1fbG9jYWwgPCBjbnQpOworICAgIH0KKworICAvKiBUaGUgc3ltYm9sICduc3ltX2xvY2FsJyBpcyBjdXJyZW50bHkgcG9pbnRpbmcgdG8gbWlnaHQgYmUgbG9jYWwsCisgICAgIHRvby4gIENoZWNrIGFuZCBpbmNyZW1lbnQgdGhlIHZhcmlhYmxlIGlmIHRoaXMgaXMgdGhlIGNhc2UuICAqLworICBpZiAobGlrZWx5IChuc3ltX2xvY2FsIDwgbnN5bSkpCisgICAgeworICAgICAgWEVsZl9TeW1fdmFyZGVmIChsb2NzeW0pOworCisgICAgICAvKiBUaGlzIGVudHJ5IGlzbid0IG1vdmVkLiAgKi8KKyAgICAgIGRibGluZGlyZWN0W25zeW1fbG9jYWxdID0gbnN5bV9sb2NhbDsKKworICAgICAgLyogTm90ZSB0aGF0IGl0IGlzIE9LIHRvIG5vdCB1c2UgJ3hlbGZfZ2V0c3ltc2huZHgnIGhlcmUuICAqLworICAgICAgeGVsZl9nZXRzeW0gKHN5bWRhdGEsIG5zeW1fbG9jYWwsIGxvY3N5bSk7CisgICAgICAvKiBUaGlzIGJldHRlciB3b3Jrcy4gICovCisgICAgICBhc3NlcnQgKGxvY3N5bSAhPSBOVUxMKTsKKworICAgICAgaWYgKFhFTEZfU1RfQklORCAobG9jc3ltLT5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpCisJKytuc3ltX2xvY2FsOworICAgIH0KKworCisgIC8qIFdlIG5lZWQgdGhlIHZlcnN5bSBhcnJheSByaWdodCBhd2F5IHRvIGtlZXAgdHJhY2sgb2YgdGhlIHZlcnNpb24KKyAgICAgc3ltYm9scy4gICovCisgIGlmIChsZF9zdGF0ZS52ZXJzeW1zY25pZHggIT0gMCkKKyAgICB7CisgICAgICAvKiBXZSBhbGxvY2F0ZSBtb3JlIG1lbW9yeSB0aGFuIHdlIG5lZWQgc2luY2UgdGhlIGFycmF5IGlzIG1vcnJvcmluZworCSB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgYW5kIG5vdCB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZS4gIEkuZS4sCisJIG5vIGxvY2FsIHN5bWJvbHMgYXJlIHByZXNlbnQuICAqLworICAgICAgdmVyc3ltc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS52ZXJzeW1zY25pZHgpOworICAgICAgdmVyc3ltZGF0YSA9IGVsZl9uZXdkYXRhICh2ZXJzeW1zY24pOworICAgICAgaWYgKHZlcnN5bWRhdGEgPT0gTlVMTCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSB2ZXJzaW9uaW5nIHNlY3Rpb246ICVzIiksCisJICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgICAgIHZlcnN5bWRhdGEtPmRfc2l6ZSA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfSEFMRiwKKwkJCQkgICAgICAgbnN5bSAtIG5zeW1fbG9jYWwgKyAxKTsKKyAgICAgIHZlcnN5bWRhdGEtPmRfYnVmID0geGNhbGxvYyAoMSwgdmVyc3ltZGF0YS0+ZF9zaXplKTsKKyAgICAgIHZlcnN5bWRhdGEtPmRfYWxpZ24gPSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX0hBTEYsIDEpOworICAgICAgdmVyc3ltZGF0YS0+ZF9vZmYgPSAwOworICAgICAgdmVyc3ltZGF0YS0+ZF90eXBlID0gRUxGX1RfSEFMRjsKKyAgICB9CisKKworICAvKiBJZiB3ZSBoYXZlIHRvIGNvbnN0cnVjdCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgd2UgbXVzdCBub3QgaW5jbHVkZQorICAgICB0aGUgbG9jYWwgc3ltYm9scy4gIElmIHRoZSBub3JtYWwgc3ltYm9sIGhhcyB0byBiZSBlbWl0dGVkIGFzIHdlbGwKKyAgICAgd2UgaGF2ZW4ndCBkb25lIGFueXRoaW5nIGVsc2UgeWV0IGFuZCB3ZSBjYW4gY29uc3RydWN0IGl0IGZyb20KKyAgICAgc2NyYXRjaCBub3cuICAqLworICBpZiAodW5saWtlbHkgKCFsZF9zdGF0ZS5uZWVkX3N5bXRhYikpCisgICAgeworICAgICAgLyogTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3b3JrcyBldmVuIGlmIHRoZXJlIGlzIG5vIGVudHJ5CisJIHRvIHJlbW92ZSBzaW5jZSB0aGUgemVyb3RoIGVudHJ5IGlzIGFsd2F5cyBsb2NhbC4gICovCisgICAgICBzaXplX3QgcmVkdWNlID0geGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9TWU0sIG5zeW1fbG9jYWwgLSAxKTsKKworICAgICAgWEVsZl9TeW1fdmFyZGVmIChudWxsc3ltKTsKKyAgICAgIHhlbGZfZ2V0c3ltX3B0ciAoc3ltZGF0YSwgbnN5bV9sb2NhbCAtIDEsIG51bGxzeW0pOworCisgICAgICAvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB1c2UgJ3hlbGZfdXBkYXRlX3N5bXNobmR4JyBzaW5jZQorCSB0aGlzIGlzIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSB3ZSB3cml0ZS4gICovCisgICAgICAodm9pZCkgeGVsZl91cGRhdGVfc3ltIChzeW1kYXRhLCBuc3ltX2xvY2FsIC0gMSwKKwkJCSAgICAgIG1lbXNldCAobnVsbHN5bSwgJ1wwJywgc2l6ZW9mICgqbnVsbHN5bSkpKTsKKworICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgcG9pbnRlciBhbmQgc2l6ZSBpbiB0aGUgb3V0cHV0IGRhdGEuICAqLworICAgICAgc3ltZGF0YS0+ZF9idWYgPSAoY2hhciAqKSBzeW1kYXRhLT5kX2J1ZiArIHJlZHVjZTsKKyAgICAgIHN5bWRhdGEtPmRfc2l6ZSAtPSByZWR1Y2U7CisKKyAgICAgIC8qIEFkZCB0aGUgdmVyc2lvbiBzeW1ib2wgaW5mb3JtYXRpb24uICAqLworICAgICAgaWYgKHZlcnN5bWRhdGEgIT0gTlVMTCkKKwl7CisJICBuc3ltX2R5biA9IDE7CisJICBmb3IgKGNudCA9IG5zeW1fbG9jYWw7IGNudCA8IG5zeW07ICsrY250LCArK25zeW1fZHluKQorCSAgICB7CisJICAgICAgc3RydWN0IHN5bWJvbCAqc3ltcCA9IG5keHRvc3ltW2NudF07CisKKwkgICAgICBpZiAoc3ltcC0+ZmlsZS0+dmVyc3ltZGF0YSAhPSBOVUxMKQorCQl7CisJCSAgR0VsZl9WZXJzeW0gdmVyc3ltOworCisJCSAgZ2VsZl9nZXR2ZXJzeW0gKHN5bXAtPmZpbGUtPnZlcnN5bWRhdGEsIHN5bXAtPnN5bWlkeCwKKwkJCQkgICZ2ZXJzeW0pOworCisJCSAgKHZvaWQpIGdlbGZfdXBkYXRlX3ZlcnN5bSAodmVyc3ltZGF0YSwgbnN5bV9keW4sCisJCQkJCSAgICAgJnN5bXAtPmZpbGUtPnZlcmRlZnVzZWRbdmVyc3ltXSk7CisJCX0KKwkgICAgICB9CisJfQorCisgICAgICAvKiBTaW5jZSB3ZSBvbmx5IGNyZWF0ZWQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHRoZSBudW1iZXIgb2YKKwkgZHluYW1pYyBzeW1ib2xzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3ltYm9scy4gICovCisgICAgICBuc3ltX2R5biA9IG5zeW0gLSBuc3ltX2xvY2FsICsgMTsKKworICAgICAgLyogWFhYIFRCSS4gIENyZWF0ZSB3aGF0ZXZlciBkYXRhIHN0cnVjdHVyZSBpcyBtaXNzaW5nLiAgKi8KKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgZWxzZSBpZiAobGRfc3RhdGUubmVlZF9keW5zeW0pCisgICAgeworICAgICAgLyogQ3JlYXRlIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBzZWN0aW9uIGRhdGEgYWxvbmcgd2l0aCB0aGUKKwkgc3RyaW5nIHRhYmxlLiAgV2UgbG9vayBhdCBhbGwgbm9uLWxvY2FsIHN5bWJvbHMgd2UgZm91bmQgZm9yCisJIHRoZSBub3JtYWwgc3ltYm9sIHRhYmxlIGFuZCBhZGQgdGhvc2UuICAqLworICAgICAgZHluc3ltc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS5keW5zeW1zY25pZHgpOworICAgICAgZHluc3ltZGF0YSA9IGVsZl9uZXdkYXRhIChkeW5zeW1zY24pOworCisgICAgICBkeW5zdHJkYXRhID0gZWxmX25ld2RhdGEgKGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwKKwkJCQkJICAgIGxkX3N0YXRlLmR5bnN0cnNjbmlkeCkpOworICAgICAgaWYgKGR5bnN5bWRhdGEgPT0gTlVMTCB8fCBkeW5zdHJkYXRhID09IE5VTEwpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIlwKK2Nhbm5vdCBjcmVhdGUgZHluYW1pYyBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIpLAorCSAgICAgICBlbGZfZXJybXNnICgtMSkpOworCisgICAgICBuc3ltX2R5bl9hbGxvY2F0ZWQgPSBuc3ltIC0gbnN5bV9sb2NhbCArIDE7CisgICAgICBkeW5zeW1kYXRhLT5kX3NpemUgPSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1NZTSwKKwkJCQkgICAgICAgbnN5bV9keW5fYWxsb2NhdGVkKTsKKyAgICAgIGR5bnN5bWRhdGEtPmRfYnVmID0gbWVtc2V0ICh4bWFsbG9jIChkeW5zeW1kYXRhLT5kX3NpemUpLCAnXDAnLAorCQkJCSAgeGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9TWU0sIDEpKTsKKyAgICAgIGR5bnN5bWRhdGEtPmRfdHlwZSA9IEVMRl9UX1NZTTsKKyAgICAgIGR5bnN5bWRhdGEtPmRfb2ZmID0gMDsKKyAgICAgIGR5bnN5bWRhdGEtPmRfYWxpZ24gPSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX0FERFIsIDEpOworCisgICAgICAvKiBXZSBuZWVkIG9uZSBtb3JlIGFycmF5IHdoaWNoIGNvbnRhaW5zIHRoZSBoYXNoIGNvZGVzIG9mIHRoZQorCSBzeW1ib2wgbmFtZXMuICAqLworICAgICAgaGFzaGNvZGVzID0gKEVsZjMyX1dvcmQgKikgeGNhbGxvYyAobnN5bV9keW5fYWxsb2NhdGVkLAorCQkJCQkgIHNpemVvZiAoRWxmMzJfV29yZCkpOworCisgICAgICAvKiBXZSBoYXZlIGFuZCBlbXB0eSBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nLiAgKi8KKyAgICAgIG5zeW1fZHluID0gMTsKKworICAgICAgLyogV2UgZG9uJ3QgbWl4IFBMVCBzeW1ib2xzIGFuZCBvdGhlcnMuICAqLworICAgICAgc2l6ZV90IHBsdF9pZHggPSAxOworICAgICAgc2l6ZV90IG9ial9pZHggPSAxICsgbGRfc3RhdGUubnBsdDsKKworICAgICAgLyogUG9wdWxhdGUgdGhlIHRhYmxlLiAgKi8KKyAgICAgIGZvciAoY250ID0gbnN5bV9sb2NhbDsgY250IDwgbnN5bTsgKytjbnQpCisJeworCSAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCisJICB4ZWxmX2dldHN5bSAoc3ltZGF0YSwgY250LCBzeW0pOworCSAgYXNzZXJ0IChzeW0gIT0gTlVMTCk7CisKKwkgIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgpCisJICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJcCitzZWN0aW9uIGluZGV4IHRvbyBsYXJnZSBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSIpKTsKKworCSAgLyogV2UgZG8gbm90IGFkZCB0aGUgc3ltYm9sIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZgorCisJICAgICAtIHRoZSBzeW1ib2wgaXMgZm9yIGEgZmlsZQorCSAgICAgLSBpdCBpcyBub3QgZXh0ZXJuYWxseSB2aXNpYmxlIChpbnRlcm5hbCwgaGlkZGVuKQorCSAgICAgLSBpZiBleHBvcnRfYWxsX2R5bmFtaWMgaXMgbm90IHNldCBhbmQgaXMgb25seSBkZWZpbmVkIGluCisJICAgICAgIHRoZSBleGVjdXRhYmxlIChpLmUuLCBpdCBpcyBkZWZpbmVkLCBidXQgbm90IChhbHNvKSBpbgorCSAgICAgICBpbiBEU08pCisKKwkgICAgIFNldCBzeW1zdHJlbnRbY250XSB0byBOVUxMIGluIGNhc2UgYW4gZW50cnkgaXMgaWdub3JlZC4gICovCisJICBpZiAoWEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9GSUxFCisJICAgICAgfHwgWEVMRl9TVF9WSVNJQklMSVRZIChzeW0tPnN0X290aGVyKSA9PSBTVFZfSU5URVJOQUwKKwkgICAgICB8fCBYRUxGX1NUX1ZJU0lCSUxJVFkgKHN5bS0+c3Rfb3RoZXIpID09IFNUVl9ISURERU4KKwkgICAgICB8fCAoIW5keHRvc3ltW2NudF0tPmluX2RzbyAmJiBuZHh0b3N5bVtjbnRdLT5kZWZpbmVkKSkKKwkgICAgeworCSAgICAgIHN5bXN0cmVudFtjbnRdID0gTlVMTDsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICBzaXplX3QgaWR4OworCSAgaWYgKG5keHRvc3ltW2NudF0tPmluX2RzbyAmJiBuZHh0b3N5bVtjbnRdLT50eXBlID09IFNUVF9GVU5DKQorCSAgICB7CisJICAgICAgaWR4ID0gcGx0X2lkeCsrOworCSAgICAgIGFzc2VydCAoaWR4IDwgMSArIGxkX3N0YXRlLm5wbHQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZHggPSBvYmpfaWR4Kys7CisJICAgICAgYXNzZXJ0IChpZHggPCBuc3ltX2R5bl9hbGxvY2F0ZWQpOworCSAgICB9CisKKwkgIC8qIEFkZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCisJICBpZiAodmVyc3ltZGF0YSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgc3RydWN0IHN5bWJvbCAqc3ltcCA9IG5keHRvc3ltW2NudF07CisKKwkgICAgICBpZiAoc3ltcC0+ZmlsZS0+dmVyZGVmZGF0YSAhPSBOVUxMKQorCQl7CisJCSAgR0VsZl9WZXJzeW0gdmVyc3ltOworCisJCSAgZ2VsZl9nZXR2ZXJzeW0gKHN5bXAtPmZpbGUtPnZlcnN5bWRhdGEsIHN5bXAtPnN5bWlkeCwKKwkJCQkgICZ2ZXJzeW0pOworCisJCSAgKHZvaWQpIGdlbGZfdXBkYXRlX3ZlcnN5bSAodmVyc3ltZGF0YSwgaWR4LAorCQkJCQkgICAgICZzeW1wLT5maWxlLT52ZXJkZWZ1c2VkW3ZlcnN5bV0pOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogWFhYIEFkZCBzdXBwb3J0IGZvciB2ZXJzaW9uIGRlZmluaXRpb25zLiAgKi8KKwkJICBHRWxmX1ZlcnN5bSBnbG9iYWwgPSBWRVJfTkRYX0dMT0JBTDsKKwkJICAodm9pZCkgZ2VsZl91cGRhdGVfdmVyc3ltICh2ZXJzeW1kYXRhLCBpZHgsICZnbG9iYWwpOworCQl9CisJICAgIH0KKworCSAgLyogU3RvcmUgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KKwkgIG5keHRvc3ltW2NudF0tPm91dGR5bnN5bWlkeCA9IGlkeDsKKworCSAgLyogQ3JlYXRlIGEgbmV3IHN0cmluZyB0YWJsZSBlbnRyeS4gICovCisJICBjb25zdCBjaGFyICpzdHIgPSBuZHh0b3N5bVtjbnRdLT5uYW1lOworCSAgc3ltc3RyZW50W2NudF0gPSBlYmxfc3RydGFiYWRkIChkeW5zdHJ0YWIsIHN0ciwgMCk7CisJICBoYXNoY29kZXNbaWR4XSA9IGVsZl9oYXNoIChzdHIpOworCSAgKytuc3ltX2R5bjsKKwl9CisgICAgICBhc3NlcnQgKG5zeW1fZHluID09IG9ial9pZHgpOworICAgICAgYXNzZXJ0IChsZF9zdGF0ZS5ucGx0ICsgMSA9PSBwbHRfaWR4KTsKKworICAgICAgLyogVXBkYXRlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sIHNlY3Rpb24uICAqLworICAgICAgaWYgKHZlcnN5bWRhdGEgIT0gTlVMTCkKKwl7CisJICAvKiBDb3JyZWN0IHRoZSBzaXplIG5vdyB0aGF0IHdlIGtub3cgaG93IG1hbnkgZW50cmllcyB0aGUKKwkgICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGhhcy4gICovCisJICB2ZXJzeW1kYXRhLT5kX3NpemUgPSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX0hBTEYsCisJCQkJCSAgIG5zeW1fZHluKTsKKworCSAgLyogQWRkIHRoZSByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCisJICB4ZWxmX2dldHNoZHIgKHZlcnN5bXNjbiwgc2hkcik7CisJICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisKKwkgIHNoZHItPnNoX2xpbmsgPSBsZF9zdGF0ZS5keW5zeW1zY25pZHg7CisKKwkgICh2b2lkKSB4ZWxmX3VwZGF0ZV9zaGRyICh2ZXJzeW1zY24sIHNoZHIpOworCX0KKyAgICB9CisKKyAgaWYgKGxkX3N0YXRlLmZpbGVfdHlwZSAhPSByZWxvY2F0YWJsZV9maWxlX3R5cGUpCisgICAgeworICAgICAgc2l6ZV90IG5idWNrZXQ7CisgICAgICBFbGYzMl9Xb3JkICpidWNrZXQ7CisgICAgICBFbGYzMl9Xb3JkICpjaGFpbjsKKyAgICAgIHNpemVfdCBuY2hhaW47CisgICAgICBFbGZfU2NuICpoYXNoc2NuOworICAgICAgRWxmX0RhdGEgKmhhc2hkYXRhOworCisgICAgICAvKiBGaW5hbGl6ZSB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGUuICAqLworICAgICAgZWJsX3N0cnRhYmZpbmFsaXplIChkeW5zdHJ0YWIsIGR5bnN0cmRhdGEpOworCisgICAgICAvKiBEZXRlcm1pbmUgdGhlICJvcHRpbWFsIiBidWNrZXQgc2l6ZS4gICovCisgICAgICBuYnVja2V0ID0gb3B0aW1hbF9idWNrZXRfc2l6ZSAoaGFzaGNvZGVzLCBuc3ltX2R5biwgbGRfc3RhdGUub3B0bGV2ZWwpOworCisgICAgICAvKiBDcmVhdGUgdGhlIC5oYXNoIHNlY3Rpb24gZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KKyAgICAgIGFzc2VydCAobGRfc3RhdGUuaGFzaHNjbmlkeCAhPSAwKTsKKyAgICAgIGhhc2hzY24gPSBlbGZfZ2V0c2NuIChsZF9zdGF0ZS5vdXRlbGYsIGxkX3N0YXRlLmhhc2hzY25pZHgpOworICAgICAgeGVsZl9nZXRzaGRyIChoYXNoc2NuLCBzaGRyKTsKKyAgICAgIGhhc2hkYXRhID0gZWxmX25ld2RhdGEgKGhhc2hzY24pOworICAgICAgaWYgKHNoZHIgPT0gTlVMTCB8fCBoYXNoZGF0YSA9PSBOVUxMKQorCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJcCitjYW5ub3QgY3JlYXRlIGhhc2ggdGFibGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIiksCisJICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgICAgIHNoZHItPnNoX2xpbmsgPSBsZF9zdGF0ZS5keW5zeW1zY25pZHg7CisgICAgICAodm9pZCkgeGVsZl91cGRhdGVfc2hkciAoaGFzaHNjbiwgc2hkcik7CisKKyAgICAgIGhhc2hkYXRhLT5kX3NpemUgPSAoMiArIG5zeW1fZHluICsgbmJ1Y2tldCkgKiBzaXplb2YgKEVsZjMyX1dvcmQpOworICAgICAgaGFzaGRhdGEtPmRfYnVmID0geGNhbGxvYyAoMSwgaGFzaGRhdGEtPmRfc2l6ZSk7CisgICAgICBoYXNoZGF0YS0+ZF9hbGlnbiA9IHNpemVvZiAoRWxmMzJfV29yZCk7CisgICAgICBoYXNoZGF0YS0+ZF90eXBlID0gRUxGX1RfV09SRDsKKyAgICAgIGhhc2hkYXRhLT5kX29mZiA9IDA7CisKKyAgICAgICgoRWxmMzJfV29yZCAqKSBoYXNoZGF0YS0+ZF9idWYpWzBdID0gbmJ1Y2tldDsKKyAgICAgICgoRWxmMzJfV29yZCAqKSBoYXNoZGF0YS0+ZF9idWYpWzFdID0gbnN5bV9keW47CisgICAgICBidWNrZXQgPSAmKChFbGYzMl9Xb3JkICopIGhhc2hkYXRhLT5kX2J1ZilbMl07CisgICAgICBjaGFpbiA9ICYoKEVsZjMyX1dvcmQgKikgaGFzaGRhdGEtPmRfYnVmKVsyICsgbmJ1Y2tldF07CisKKyAgICAgIC8qIEhhdmVuJ3QgeWV0IGZpbGxlZCBpbiBhbnkgY2hhaW4gdmFsdWUuICAqLworICAgICAgbmNoYWluID0gMDsKKworICAgICAgLyogTm93IHB1dCB0aGUgbmFtZXMgaW4uICAqLworICAgICAgZm9yIChjbnQgPSBuc3ltX2xvY2FsOyBjbnQgPCBuc3ltOyArK2NudCkKKwlpZiAoc3ltc3RyZW50W2NudF0gIT0gTlVMTCkKKwkgIHsKKwkgICAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCSAgICBzaXplX3QgaGFzaGlkeDsKKwkgICAgc2l6ZV90IGR5bmlkeCA9IG5keHRvc3ltW2NudF0tPm91dGR5bnN5bWlkeDsKKworI2lmIE5BVElWRV9FTEYgIT0gMAorCSAgICBYRWxmX1N5bSAqb3N5bTsKKwkgICAgbWVtY3B5ICh4ZWxmX2dldHN5bSAoZHluc3ltZGF0YSwgZHluaWR4LCBzeW0pLAorCQkgICAgeGVsZl9nZXRzeW0gKHN5bWRhdGEsIGNudCwgb3N5bSksCisJCSAgICBzaXplb2YgKFhFbGZfU3ltKSk7CisjZWxzZQorCSAgICB4ZWxmX2dldHN5bSAoc3ltZGF0YSwgY250LCBzeW0pOworCSAgICBhc3NlcnQgKHN5bSAhPSBOVUxMKTsKKyNlbmRpZgorCisJICAgIHN5bS0+c3RfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKHN5bXN0cmVudFtjbnRdKTsKKworCSAgICAodm9pZCkgeGVsZl91cGRhdGVfc3ltIChkeW5zeW1kYXRhLCBkeW5pZHgsIHN5bSk7CisKKwkgICAgLyogQWRkIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KKwkgICAgaGFzaGlkeCA9IGhhc2hjb2Rlc1tkeW5pZHhdICUgbmJ1Y2tldDsKKwkgICAgaWYgKGJ1Y2tldFtoYXNoaWR4XSA9PSAwKQorCSAgICAgIGJ1Y2tldFtoYXNoaWR4XSA9IGR5bmlkeDsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaGFzaGlkeCA9IGJ1Y2tldFtoYXNoaWR4XTsKKwkJd2hpbGUgKGNoYWluW2hhc2hpZHhdICE9IDApCisJCSAgaGFzaGlkeCA9IGNoYWluW2hhc2hpZHhdOworCisJCWNoYWluW2hhc2hpZHhdID0gZHluaWR4OworCSAgICAgIH0KKwkgIH0KKworICAgICAgZnJlZSAoaGFzaGNvZGVzKTsKKworICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgbWFwIGZyb20gdGhlIHN5bWJvbCB0YWJsZSBpbmRleCB0byB0aGUgc3ltYm9sCisJIHN0cnVjdHVyZSBhbnltb3JlLiAgKi8KKyAgICAgIGZyZWUgKG5keHRvc3ltKTsKKworICAgICAgLyogQ3JlYXRlIHRoZSByZXF1aXJlZCB2ZXJzaW9uIHNlY3Rpb24uICAqLworICAgICAgaWYgKGxkX3N0YXRlLnZlcm5lZWRzY25pZHggIT0gMCkKKwl7CisJICBFbGZfU2NuICp2ZXJuZWVkc2NuOworCSAgRWxmX0RhdGEgKnZlcm5lZWRkYXRhOworCSAgc3RydWN0IHVzZWRmaWxlcyAqcnVucDsKKwkgIHNpemVfdCB2ZXJuZWVkX3NpemUgPSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1ZORUVELCAxKTsKKwkgIHNpemVfdCB2ZXJuYXV4X3NpemUgPSB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1ZOQVVYLCAxKTsKKwkgIHNpemVfdCBvZmZzZXQ7CisJICBpbnQgbnRvdGFsOworCisJICB2ZXJuZWVkc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS52ZXJuZWVkc2NuaWR4KTsKKwkgIHhlbGZfZ2V0c2hkciAodmVybmVlZHNjbiwgc2hkcik7CisJICB2ZXJuZWVkZGF0YSA9IGVsZl9uZXdkYXRhICh2ZXJuZWVkc2NuKTsKKwkgIGlmIChzaGRyID09IE5VTEwgfHwgdmVybmVlZGRhdGEgPT0gTlVMTCkKKwkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkJICAgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgdmVyc2lvbmluZyBkYXRhOiAlcyIpLAorCQkgICBlbGZfZXJybXNnICgtMSkpOworCisJICB2ZXJuZWVkZGF0YS0+ZF9zaXplID0gKGxkX3N0YXRlLm52ZXJkZWZmaWxlICogdmVybmVlZF9zaXplCisJCQkJICsgbGRfc3RhdGUubnZlcmRlZnVzZWQgKiB2ZXJuYXV4X3NpemUpOworCSAgdmVybmVlZGRhdGEtPmRfYnVmID0geG1hbGxvYyAodmVybmVlZGRhdGEtPmRfc2l6ZSk7CisJICB2ZXJuZWVkZGF0YS0+ZF90eXBlID0gRUxGX1RfVk5FRUQ7CisJICB2ZXJuZWVkZGF0YS0+ZF9hbGlnbiA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfV09SRCwgMSk7CisJICB2ZXJuZWVkZGF0YS0+ZF9vZmYgPSAwOworCisJICBvZmZzZXQgPSAwOworCSAgbnRvdGFsID0gbGRfc3RhdGUubnZlcmRlZmZpbGU7CisJICBydW5wID0gbGRfc3RhdGUuZHNvZmlsZXMtPm5leHQ7CisJICBkbworCSAgICB7CisJICAgICAgb2Zmc2V0ID0gY3JlYXRlX3Zlcm5lZWRfZGF0YSAob2Zmc2V0LCB2ZXJuZWVkZGF0YSwgcnVucCwKKwkJCQkJICAgICZudG90YWwpOworCSAgICAgIHJ1bnAgPSBydW5wLT5uZXh0OworCSAgICB9CisJICB3aGlsZSAobnRvdGFsID4gMCAmJiBydW5wICE9IGxkX3N0YXRlLmRzb2ZpbGVzLT5uZXh0KTsKKworCSAgaWYgKG50b3RhbCA+IDApCisJICAgIHsKKwkgICAgICBydW5wID0gbGRfc3RhdGUubmVlZGVkLT5uZXh0OworCSAgICAgIGRvCisJCXsKKwkJICBvZmZzZXQgPSBjcmVhdGVfdmVybmVlZF9kYXRhIChvZmZzZXQsIHZlcm5lZWRkYXRhLCBydW5wLAorCQkJCQkJJm50b3RhbCk7CisJCSAgcnVucCA9IHJ1bnAtPm5leHQ7CisJCX0KKwkgICAgICB3aGlsZSAobnRvdGFsID4gMCAmJiBydW5wICE9IGxkX3N0YXRlLm5lZWRlZC0+bmV4dCk7CisJICAgIH0KKworCSAgYXNzZXJ0IChvZmZzZXQgPT0gdmVybmVlZGRhdGEtPmRfc2l6ZSk7CisKKwkgIC8qIEFkZCB0aGUgbmVlZGVkIGluZm9ybWF0aW9uIHRvIHRoZSBzZWN0aW9uIGhlYWRlci4gICovCisJICBzaGRyLT5zaF9saW5rID0gbGRfc3RhdGUuZHluc3Ryc2NuaWR4OworCSAgc2hkci0+c2hfaW5mbyA9IGxkX3N0YXRlLm52ZXJkZWZmaWxlOworCSAgKHZvaWQpIHhlbGZfdXBkYXRlX3NoZHIgKHZlcm5lZWRzY24sIHNoZHIpOworCX0KKworICAgICAgLyogQWRqdXN0IHRoZSBzZWN0aW9uIHNpemUuICAqLworICAgICAgZHluc3ltZGF0YS0+ZF9zaXplID0geGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9TWU0sIG5zeW1fZHluKTsKKyAgICAgIGlmICh2ZXJzeW1kYXRhICE9IE5VTEwpCisJdmVyc3ltZGF0YS0+ZF9zaXplID0geGVsZl9mc2l6ZSAobGRfc3RhdGUub3V0ZWxmLCBFTEZfVF9IQUxGLAorCQkJCQkgbnN5bV9keW4pOworCisgICAgICAvKiBBZGQgdGhlIHJlbWFpbmluZyBpbmZvcm1hdGlvbiB0byB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLworICAgICAgeGVsZl9nZXRzaGRyIChkeW5zeW1zY24sIHNoZHIpOworICAgICAgLyogVGhlcmUgaXMgYWx3YXlzIGV4YWN0bHkgb25lIGxvY2FsIHN5bWJvbC4gICovCisgICAgICBzaGRyLT5zaF9pbmZvID0gMTsKKyAgICAgIC8qIFJlZmVyZW5jZSB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KKyAgICAgIHNoZHItPnNoX2xpbmsgPSBsZF9zdGF0ZS5keW5zdHJzY25pZHg7CisgICAgICAvKiBXcml0ZSB0aGUgdXBkYXRlZCBpbmZvIGJhY2suICAqLworICAgICAgKHZvaWQpIHhlbGZfdXBkYXRlX3NoZHIgKGR5bnN5bXNjbiwgc2hkcik7CisgICAgfQorICBlbHNlCisgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgbWFwIGZyb20gdGhlIHN5bWJvbCB0YWJsZSBpbmRleCB0byB0aGUgc3ltYm9sCisgICAgICAgc3RydWN0dXJlIGFueW1vcmUuICAqLworICAgIGZyZWUgKG5keHRvc3ltKTsKKworICAvKiBXZSBkb24ndCBuZWVkIHRoZSBzdHJpbmcgdGFibGUgYW55bW9yZS4gICovCisgIGZyZWUgKHN5bXN0cmVudCk7CisKKyAgLyogUmVtZW1iZXIgdGhlIHRvdGFsIG51bWJlciBvZiBzeW1ib2xzIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCisgIGxkX3N0YXRlLm5keW5zeW0gPSBuc3ltX2R5bjsKKworICAvKiBGaWxsIGluIHRoZSBzZWN0aW9uIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCisgIHN5bXNjbiA9IGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwgbGRfc3RhdGUuc3ltc2NuaWR4KTsKKyAgeGVsZl9nZXRzaGRyIChzeW1zY24sIHNoZHIpOworICBpZiAoc2hkciA9PSBOVUxMKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgc3ltYm9sIHRhYmxlIGZvciBvdXRwdXQgZmlsZTogJXMiKSwKKwkgICBlbGZfZXJybXNnICgtMSkpOworCisgIHNoZHItPnNoX3R5cGUgPSBTSFRfU1lNVEFCOworICBzaGRyLT5zaF9saW5rID0gbGRfc3RhdGUuc3Ryc2NuaWR4OworICBzaGRyLT5zaF9pbmZvID0gbnN5bV9sb2NhbDsKKyAgc2hkci0+c2hfZW50c2l6ZSA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfU1lNLCAxKTsKKworICAodm9pZCkgeGVsZl91cGRhdGVfc2hkciAoc3ltc2NuLCBzaGRyKTsKKworCisgIC8qIEFkZCBuYW1lcyBmb3IgdGhlIGdlbmVyYXRlZCBzZWN0aW9ucy4gICovCisgIGlmIChsZF9zdGF0ZS5zeW1zY25pZHggIT0gMCkKKyAgICAgIHN5bXRhYl9lbnQgPSBlYmxfc3RydGFiYWRkIChsZF9zdGF0ZS5zaHN0cnRhYiwgIi5zeW10YWIiLCA4KTsKKyAgaWYgKGxkX3N0YXRlLnhuZHhzY25pZHggIT0gMCkKKyAgICB4bmR4X2VudCA9IGVibF9zdHJ0YWJhZGQgKGxkX3N0YXRlLnNoc3RydGFiLCAiLnN5bXRhYl9zaG5keCIsIDE0KTsKKyAgaWYgKGxkX3N0YXRlLnN0cnNjbmlkeCAhPSAwKQorICAgIHN0cnRhYl9lbnQgPSBlYmxfc3RydGFiYWRkIChsZF9zdGF0ZS5zaHN0cnRhYiwgIi5zdHJ0YWIiLCA4KTsKKyAgLyogQXQgdGhpcyBwb2ludCB3ZSB3b3VsZCBoYXZlIHRvIHRlc3QgZm9yIGZhaWx1cmVzIGluIHRoZQorICAgICBhbGxvY2F0aW9uLiAgQnV0IHdlIHNraXAgdGhpcy4gIEZpcnN0LCB0aGUgcHJvYmxlbSB3aWxsIGJlIGNhdWdodAorICAgICBsYXR0ZXIgd2hlbiBkb2luZyBtb3JlIGFsbG9jYXRpb25zIGZvciB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUuCisgICAgIEV2ZW4gaWYgdGhpcyB3b3VsZCBub3QgYmUgdGhlIGNhc2UgYWxsIHRoYXQgd291bGQgaGFwcGVuIGlzIHRoYXQKKyAgICAgdGhlIHNlY3Rpb24gbmFtZXMgYXJlIGVtcHR5LiAgVGhlIGJpbmFyeSB3b3VsZCBzdGlsbCBiZSB1c2FibGUgaWYKKyAgICAgaXQgaXMgYW4gZXhlY3V0YWJsZSBvciBhIERTTy4gIE5vdCBhZGRpbmcgdGhlIHRlc3QgaGVyZSBzYXZlcworICAgICBxdWl0ZSBhIGJpdCBvZiBjb2RlLiAgKi8KKworCisgIC8qIEZpbmFsbHkgY3JlYXRlIHRoZSBzZWN0aW9uIGZvciB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlLiAgKi8KKyAgc2hzdHJ0YWJfc2NuID0gZWxmX25ld3NjbiAobGRfc3RhdGUub3V0ZWxmKTsKKyAgc2hzdHJ0YWJfbmR4ID0gZWxmX25keHNjbiAoc2hzdHJ0YWJfc2NuKTsKKyAgaWYgKHVubGlrZWx5IChzaHN0cnRhYl9uZHggPT0gU0hOX1VOREVGKSkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyBzZWN0aW9uOiAlcyIpLAorCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgLyogQWRkIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIHRvIHRoZSBzdHJpbmcgdGFibGUuICAqLworICBzaHN0cnRhYl9lbnQgPSBlYmxfc3RydGFiYWRkIChsZF9zdGF0ZS5zaHN0cnRhYiwgIi5zaHN0cnRhYiIsIDEwKTsKKyAgaWYgKHVubGlrZWx5IChzaHN0cnRhYl9lbnQgPT0gTlVMTCkpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sCisJICAgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHNlY3Rpb24iKSk7CisKKyAgLyogRmluYWxpemUgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCisgIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2hzdHJ0YWJfc2NuKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyBzZWN0aW9uOiAlcyIpLAorCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisgIGVibF9zdHJ0YWJmaW5hbGl6ZSAobGRfc3RhdGUuc2hzdHJ0YWIsIGRhdGEpOworCisgIC8qIE5vdyB3ZSBrbm93IHRoZSBzdHJpbmcgb2Zmc2V0cyBmb3IgYWxsIHNlY3Rpb24gbmFtZXMuICAqLworICBmb3IgKGNudCA9IDA7IGNudCA8IGxkX3N0YXRlLm5hbGxzZWN0aW9uczsgKytjbnQpCisgICAgaWYgKGxkX3N0YXRlLmFsbHNlY3Rpb25zW2NudF0tPnNjbmlkeCAhPSAwKQorICAgICAgeworCUVsZl9TY24gKnNjbjsKKworCXNjbiA9IGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwgbGRfc3RhdGUuYWxsc2VjdGlvbnNbY250XS0+c2NuaWR4KTsKKworCXhlbGZfZ2V0c2hkciAoc2NuLCBzaGRyKTsKKwlhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisKKwlzaGRyLT5zaF9uYW1lID0gZWJsX3N0cnRhYm9mZnNldCAobGRfc3RhdGUuYWxsc2VjdGlvbnNbY250XS0+bmFtZWVudCk7CisKKwlpZiAoeGVsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKSA9PSAwKQorCSAgYXNzZXJ0ICgwKTsKKyAgICAgIH0KKworICAvKiBBZGQgdGhlIG5hbWVzIGZvciB0aGUgZ2VuZXJhdGVkIHNlY3Rpb25zIHRvIHRoZSByZXNwZWN0aXZlCisgICAgIHNlY3Rpb24gaGVhZGVycy4gICovCisgIGlmIChzeW10YWJfZW50ICE9IE5VTEwpCisgICAgeworICAgICAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS5zeW1zY25pZHgpOworCisgICAgICB4ZWxmX2dldHNoZHIgKHNjbiwgc2hkcik7CisgICAgICAvKiBUaGlzIGNhbm5vdCBmYWlsLCB3ZSBhbHJlYWR5IGFjY2Vzc2VkIHRoZSBoZWFkZXIgYmVmb3JlLiAgKi8KKyAgICAgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworICAgICAgc2hkci0+c2hfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKHN5bXRhYl9lbnQpOworCisgICAgICAodm9pZCkgeGVsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKKyAgICB9CisgIGlmICh4bmR4X2VudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIEVsZl9TY24gKnNjbiA9IGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwgbGRfc3RhdGUueG5keHNjbmlkeCk7CisKKyAgICAgIHhlbGZfZ2V0c2hkciAoc2NuLCBzaGRyKTsKKyAgICAgIC8qIFRoaXMgY2Fubm90IGZhaWwsIHdlIGFscmVhZHkgYWNjZXNzZWQgdGhlIGhlYWRlciBiZWZvcmUuICAqLworICAgICAgYXNzZXJ0IChzaGRyICE9IE5VTEwpOworCisgICAgICBzaGRyLT5zaF9uYW1lID0gZWJsX3N0cnRhYm9mZnNldCAoeG5keF9lbnQpOworCisgICAgICAodm9pZCkgeGVsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKKyAgICB9CisgIGlmIChzdHJ0YWJfZW50ICE9IE5VTEwpCisgICAgeworICAgICAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS5zdHJzY25pZHgpOworCisgICAgICB4ZWxmX2dldHNoZHIgKHNjbiwgc2hkcik7CisgICAgICAvKiBUaGlzIGNhbm5vdCBmYWlsLCB3ZSBhbHJlYWR5IGFjY2Vzc2VkIHRoZSBoZWFkZXIgYmVmb3JlLiAgKi8KKyAgICAgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworICAgICAgc2hkci0+c2hfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKHN0cnRhYl9lbnQpOworCisgICAgICAodm9pZCkgeGVsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKKyAgICB9CisKKyAgLyogQW5kIHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSBzZWN0aW9uIGl0c2VsZi4gICovCisgIHhlbGZfZ2V0c2hkciAoc2hzdHJ0YWJfc2NuLCBzaGRyKTsKKyAgaWYgKHNoZHIgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyBzZWN0aW9uOiAlcyIpLAorCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgc2hkci0+c2hfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKHNoc3RydGFiX2VudCk7CisgIHNoZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOworCisgIGlmICh1bmxpa2VseSAoeGVsZl91cGRhdGVfc2hkciAoc2hzdHJ0YWJfc2NuLCBzaGRyKSA9PSAwKSkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyBzZWN0aW9uOiAlcyIpLAorCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKworICAvKiBBZGQgdGhlIGNvcnJlY3Qgc2VjdGlvbiBoZWFkZXIgaW5mbyB0byB0aGUgc2VjdGlvbiBncm91cCBzZWN0aW9ucy4gICovCisgIGdyb3VwcyA9IGxkX3N0YXRlLmdyb3VwczsKKyAgd2hpbGUgKGdyb3VwcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgIHN0cnVjdCBzY25ncm91cCAqb2xkcDsKKyAgICAgIEVsZjMyX1dvcmQgc2k7CisKKyAgICAgIHNjbiA9IGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwgZ3JvdXBzLT5vdXRzY25pZHgpOworICAgICAgeGVsZl9nZXRzaGRyIChzY24sIHNoZHIpOworICAgICAgYXNzZXJ0IChzaGRyICE9IE5VTEwpOworCisgICAgICBzaGRyLT5zaF9uYW1lID0gZWJsX3N0cnRhYm9mZnNldCAoZ3JvdXBzLT5uYW1lZW50KTsKKyAgICAgIHNoZHItPnNoX3R5cGUgPSBTSFRfR1JPVVA7CisgICAgICBzaGRyLT5zaF9mbGFncyA9IDA7CisgICAgICBzaGRyLT5zaF9saW5rID0gbGRfc3RhdGUuc3ltc2NuaWR4OworICAgICAgc2hkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmMzJfV29yZCk7CisKKyAgICAgIC8qIERldGVybWluZSB0aGUgaW5kZXggZm9yIHRoZSBzaWduYXR1cmUgc3ltYm9sLiAgKi8KKyAgICAgIHNpID0gZ3JvdXBzLT5zeW1ib2wtPmZpbGUtPnN5bWluZGlyZWN0W2dyb3Vwcy0+c3ltYm9sLT5zeW1pZHhdOworICAgICAgaWYgKHNpID09IDApCisJeworCSAgYXNzZXJ0IChncm91cHMtPnN5bWJvbC0+ZmlsZS0+c3ltcmVmW2dyb3Vwcy0+c3ltYm9sLT5zeW1pZHhdCisJCSAgIT0gTlVMTCk7CisJICBzaSA9IGdyb3Vwcy0+c3ltYm9sLT5maWxlLT5zeW1yZWZbZ3JvdXBzLT5zeW1ib2wtPnN5bWlkeF0tPm91dHN5bWlkeDsKKwkgIGFzc2VydCAoc2kgIT0gMCk7CisJfQorICAgICAgc2hkci0+c2hfaW5mbyA9IGxkX3N0YXRlLmRibGluZGlyZWN0W3NpXTsKKworICAgICAgKHZvaWQpIHhlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7CisKKyAgICAgIG9sZHAgPSBncm91cHM7CisgICAgICBncm91cHMgPSBncm91cHMtPm5leHQ7CisgICAgICBmcmVlIChvbGRwKTsKKyAgICB9CisKKworICBpZiAobGRfc3RhdGUuZmlsZV90eXBlICE9IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZSkKKyAgICB7CisgICAgICBzaXplX3QgbnBoZHI7CisgICAgICBYRWxmX0FkZHIgYWRkcjsKKyAgICAgIHN0cnVjdCBvdXRwdXRfc2VnbWVudCAqc2VnbWVudDsKKyAgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgIEVsZjMyX1dvcmQgbnNlYzsKKyAgICAgIFhFbGZfUGhkcl92YXJkZWYgKHBoZHIpOworCisgICAgICAvKiBFdmVyeSBleGVjdXRhYmxlIG5lZWRzIGEgcHJvZ3JhbSBoZWFkZXIuICBUaGUgbnVtYmVyIG9mIGVudHJpZXMKKwkgdmFyaWVzLiAgT25lIGV4aXN0cyBmb3IgZWFjaCBzZWdtZW50LiAgRWFjaCBTSFRfTk9URSBzZWN0aW9uIGdldHMKKwkgb25lLCB0b28uICBGb3IgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzIHdlIGhhdmUgdG8gY3JlYXRlCisJIG9uZSBmb3IgdGhlIHByb2dyYW0gaGVhZGVyLCB0aGUgaW50ZXJwcmV0ZXIsIGFuZCB0aGUgZHluYW1pYworCSBzZWN0aW9uLiAgRmlyc3QgY291bnQgdGhlIG51bWJlciBvZiBzZWdtZW50cy4KKworCSBYWFggRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlZ21lbnQgaXMgbm9uLWVtcHR5LiAgKi8KKyAgICAgIG5waGRyID0gMDsKKyAgICAgIHNlZ21lbnQgPSBsZF9zdGF0ZS5vdXRwdXRfc2VnbWVudHM7CisgICAgICB3aGlsZSAoc2VnbWVudCAhPSBOVUxMKQorCXsKKwkgICsrbnBoZHI7CisJICBzZWdtZW50ID0gc2VnbWVudC0+bmV4dDsKKwl9CisKKyAgICAgIC8qIEFkZCB0aGUgbnVtYmVyIG9mIFNIVF9OT1RFIHNlY3Rpb25zLiAgV2UgY291bnRlZCB0aGVtIGVhcmxpZXIuICAqLworICAgICAgbnBoZHIgKz0gbGRfc3RhdGUubm5vdGVzZWN0aW9uczsKKworICAgICAgLyogSWYgd2UgY3JlYXRlIGEgRFNPIG9yIHRoZSBmaWxlIGlzIGxpbmtlZCBhZ2FpbnN0IERTT3Mgd2UgaGF2ZSB0aHJlZQorCSBtb3JlIGVudHJpZXM6IElOVEVSUCwgUEhEUiwgRFlOQU1JQy4gICovCisgICAgICBpZiAoZHluYW1pY2FsbHlfbGlua2VkX3AgKCkpCisJbnBoZHIgKz0gMzsKKworICAgICAgLyogQ3JlYXRlIHRoZSBwcm9ncmFtIGhlYWRlciBzdHJ1Y3R1cmUuICAqLworICAgICAgaWYgKHhlbGZfbmV3cGhkciAobGRfc3RhdGUub3V0ZWxmLCBucGhkcikgPT0gMCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBwcm9ncmFtIGhlYWRlcjogJXMiKSwKKwkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworCisgICAgICAvKiBEZXRlcm1pbmUgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIG9mZnNldHMuICBXZSBoYXZlIHRvIGRvIHRoaXMKKwkgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIG1lbW9yeSBsYXlvdXQgKHdoaWNoIG5vcm1hbGx5CisJIGRpZmZlcnMgZnJvbSB0aGUgZmlsZSBsYXlvdXQpLiAgKi8KKyAgICAgIGlmIChlbGZfdXBkYXRlIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9DX05VTEwpID09IC0xKQorCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJ3aGlsZSBkZXRlcm1pbmluZyBmaWxlIGxheW91dDogJXMiKSwKKwkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworCisgICAgICAvKiBOb3cgZGV0ZXJtaW5lIHRoZSBtZW1vcnkgYWRkcmVzc2VzIG9mIGFsbCB0aGUgc2VjdGlvbnMgYW5kCisJIHNlZ21lbnRzLiAgKi8KKyAgICAgIG5zZWMgPSAwOworICAgICAgc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS5hbGxzZWN0aW9uc1tuc2VjXS0+c2NuaWR4KTsKKyAgICAgIHhlbGZfZ2V0c2hkciAoc2NuLCBzaGRyKTsKKyAgICAgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworICAgICAgLyogVGhlIGFkZHJlc3Mgd2Ugc3RhcnQgd2l0aCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCAobm90CisJIHplcm90aCkgc2VjdGlvbi4gICovCisgICAgICBhZGRyID0gc2hkci0+c2hfb2Zmc2V0OworCisgICAgICAvKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGxvYWRhYmxlIHNlZ21lbnQuICAqLworICAgICAgbnBoZHIgPSAxICsgKGR5bmFtaWNhbGx5X2xpbmtlZF9wICgpID09IHRydWUpICogMjsKKworICAgICAgc2VnbWVudCA9IGxkX3N0YXRlLm91dHB1dF9zZWdtZW50czsKKyAgICAgIHdoaWxlIChzZWdtZW50ICE9IE5VTEwpCisJeworCSAgc3RydWN0IG91dHB1dF9ydWxlICpvcnVsZTsKKwkgIGJvb2wgZmlyc3Rfc2VjdGlvbiA9IHRydWU7CisJICBYRWxmX09mZiBub2JpdHNfc2l6ZSA9IDA7CisJICBYRWxmX09mZiBtZW1zaXplID0gMDsKKworCSAgLyogdGhlIG1pbmltdW0gYWxpZ25tZW50IGlzIGEgcGFnZSBzaXplLiAgKi8KKwkgIHNlZ21lbnQtPmFsaWduID0gbGRfc3RhdGUucGFnZXNpemU7CisKKwkgIGZvciAob3J1bGUgPSBzZWdtZW50LT5vdXRwdXRfcnVsZXM7IG9ydWxlICE9IE5VTEw7CisJICAgICAgIG9ydWxlID0gb3J1bGUtPm5leHQpCisJICAgIGlmIChvcnVsZS0+dGFnID09IG91dHB1dF9zZWN0aW9uKQorCSAgICAgIHsKKwkJWEVsZl9PZmYgb2xkb2ZmOworCisJCS8qIFNlZSB3aGV0aGVyIHRoaXMgb3V0cHV0IHJ1bGUgY29ycmVzcG9uZHMgdG8gdGhlIG5leHQKKwkJICAgc2VjdGlvbi4gIFllcywgdGhpcyBpcyBhIHBvaW50ZXIgY29tcGFyaXNvbi4gICovCisJCWlmIChsZF9zdGF0ZS5hbGxzZWN0aW9uc1tuc2VjXS0+bmFtZQorCQkgICAgIT0gb3J1bGUtPnZhbC5zZWN0aW9uLm5hbWUpCisJCSAgLyogTm8sIGlnbm9yZSB0aGlzIG91dHB1dCBydWxlLiAgKi8KKwkJICBjb250aW51ZTsKKworCQkvKiBXZSBhc3NpZ24gYWRkcmVzc2VzIG9ubHkgaW4gc2VnbWVudHMgd2hpY2ggYXJlIGFjdHVhbGx5CisJCSAgIGxvYWRlZC4gICovCisJCWlmIChzZWdtZW50LT5tb2RlICE9IDApCisJCSAgeworCQkgICAgLyogQWRqdXN0IHRoZSBvZmZzZXQgb2YgdGhlIGlucHV0IHNlY3Rpb25zLiAgKi8KKwkJICAgIHN0cnVjdCBzY25pbmZvICppc2VjdDsKKwkJICAgIHN0cnVjdCBzY25pbmZvICpmaXJzdDsKKworCQkgICAgaXNlY3QgPSBmaXJzdCA9IGxkX3N0YXRlLmFsbHNlY3Rpb25zW25zZWNdLT5sYXN0OworCQkgICAgaWYgKGlzZWN0ICE9IE5VTEwpCisJCSAgICAgIGRvCisJCQlpc2VjdC0+b2Zmc2V0ICs9IGFkZHI7CisJCSAgICAgIHdoaWxlICgoaXNlY3QgPSBpc2VjdC0+bmV4dCkgIT0gZmlyc3QpOworCisJCSAgICAvKiBTZXQgdGhlIGFkZHJlc3Mgb2YgY3VycmVudCBzZWN0aW9uLiAgKi8KKwkJICAgIHNoZHItPnNoX2FkZHIgPSBhZGRyOworCisJCSAgICAvKiBXcml0ZSB0aGUgcmVzdWx0IGJhY2suICAqLworCQkgICAgKHZvaWQpIHhlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7CisKKwkJICAgIC8qIFJlbWVtYmVyIHRoZSBhZGRyZXNzLiAgKi8KKwkJICAgIGxkX3N0YXRlLmFsbHNlY3Rpb25zW25zZWNdLT5hZGRyID0gYWRkcjsKKwkJICB9CisKKwkJaWYgKGZpcnN0X3NlY3Rpb24pCisJCSAgeworCQkgICAgLyogVGhlIGZpcnN0IHNlZ21lbnQgc3RhcnRzIGF0IG9mZnNldCB6ZXJvLiAgKi8KKwkJICAgIGlmIChzZWdtZW50ID09IGxkX3N0YXRlLm91dHB1dF9zZWdtZW50cykKKwkJICAgICAgeworCQkJc2VnbWVudC0+b2Zmc2V0ID0gMDsKKwkJCXNlZ21lbnQtPmFkZHIgPSBhZGRyIC0gc2hkci0+c2hfb2Zmc2V0OworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCXNlZ21lbnQtPm9mZnNldCA9IHNoZHItPnNoX29mZnNldDsKKwkJCXNlZ21lbnQtPmFkZHIgPSBhZGRyOworCQkgICAgICB9CisKKwkJICAgIC8qIERldGVybWluZSB0aGUgbWF4aW11bSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQuICAqLworCQkgICAgc2VnbWVudC0+YWxpZ24gPSBNQVggKHNlZ21lbnQtPmFsaWduLCBzaGRyLT5zaF9hZGRyYWxpZ24pOworCisJCSAgICBmaXJzdF9zZWN0aW9uID0gZmFsc2U7CisJCSAgfQorCisJCW1lbXNpemUgPSBzaGRyLT5zaF9vZmZzZXQgLSBzZWdtZW50LT5vZmZzZXQgKyBzaGRyLT5zaF9zaXplOworCQlpZiAobm9iaXRzX3NpemUgIT0gMCAmJiBzaGRyLT5zaF90eXBlICE9IFNIVF9OT1RFKQorCQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJcCitpbnRlcm5hbCBlcnJvcjogbm9iaXRzIHNlY3Rpb24gZm9sbG93cyBub2JpdHMgc2VjdGlvbiIpKTsKKwkJaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUykKKwkJICBub2JpdHNfc2l6ZSArPSBzaGRyLT5zaF9zaXplOworCisJCS8qIERldGVybWluZSB0aGUgbmV3IGFkZHJlc3Mgd2hpY2ggaXMgY29tcHV0ZWQgdXNpbmcKKwkJICAgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIG9mZnNldHMgb24gdGhlIHNlY3Rpb25zLiAgTm90ZQorCQkgICB0aGF0IHRoaXMgYXNzdW1lcyB0aGF0IHRoZSBzZWN0aW9ucyBmb2xsb3dpbmcgZWFjaAorCQkgICBvdGhlciBpbiB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgYXJlIGFsc28KKwkJICAgY29uc2VjdXRpdmUgaW4gdGhlIGZpbGUuICBUaGlzIGlzIHRydWUgaGVyZSBiZWNhdXNlCisJCSAgIGxpYmVsZiBjb25zdHJ1Y3RzIGZpbGVzIHRoaXMgd2F5LiAgKi8KKwkJb2xkb2ZmID0gc2hkci0+c2hfb2Zmc2V0OworCisJCWlmICgrK25zZWMgPj0gbGRfc3RhdGUubmFsbHNlY3Rpb25zKQorCQkgIGJyZWFrOworCisJCXNjbiA9IGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwKKwkJCQkgIGxkX3N0YXRlLmFsbHNlY3Rpb25zW25zZWNdLT5zY25pZHgpOworCQl4ZWxmX2dldHNoZHIgKHNjbiwgc2hkcik7CisJCWFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworCQkvKiBUaGlzIGlzIHRoZSBuZXcgYWRkcmVzcyByZXN1bHRpbmcgZnJvbSB0aGUgb2Zmc2V0cworCQkgICBpbiB0aGUgZmlsZS4gICovCisJCWFzc2VydCAob2xkb2ZmIDw9IHNoZHItPnNoX29mZnNldCk7CisJCWFkZHIgKz0gc2hkci0+c2hfb2Zmc2V0IC0gb2xkb2ZmOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJYXNzZXJ0IChvcnVsZS0+dGFnID09IG91dHB1dF9hc3NpZ25tZW50KTsKKworCQlpZiAoc3RyY21wIChvcnVsZS0+dmFsLmFzc2lnbm1lbnQtPnZhcmlhYmxlLCAiLiIpID09IDApCisJCSAgLyogVGhpcyBpcyBhIGNoYW5nZSBvZiB0aGUgYWRkcmVzcy4gICovCisJCSAgYWRkciA9IGV2YWxfZXhwcmVzc2lvbiAob3J1bGUtPnZhbC5hc3NpZ25tZW50LT5leHByZXNzaW9uLAorCQkJCQkgIGFkZHIpOworCQllbHNlIGlmIChvcnVsZS0+dmFsLmFzc2lnbm1lbnQtPnN5bSAhPSBOVUxMKQorCQkgIHsKKwkJICAgIC8qIFRoaXMgc3ltYm9sIGlzIHVzZWQuICBVcGRhdGUgdGhlIHN5bWJvbCB0YWJsZQorCQkgICAgICAgZW50cnkuICAqLworCQkgICAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCQkgICAgc2l6ZV90IGlkeDsKKworCQkgICAgLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBoYXZlIHRvIHVzZQorCQkgICAgICAgeGVsZl9nZXRzeW1zaG5keCBzaW5jZSB3ZSBvbmx5IHVwZGF0ZSB0aGUKKwkJICAgICAgIHN5bWJvbCBhZGRyZXNzLCBub3QgdGhlIHNlY3Rpb24KKwkJICAgICAgIGluZm9ybWF0aW9uLiAgKi8KKwkJICAgIGlkeCA9IGRibGluZGlyZWN0W29ydWxlLT52YWwuYXNzaWdubWVudC0+c3ltLT5vdXRzeW1pZHhdOworCQkgICAgeGVsZl9nZXRzeW0gKHN5bWRhdGEsIGlkeCwgc3ltKTsKKwkJICAgIHN5bS0+c3RfdmFsdWUgPSBhZGRyOworCQkgICAgKHZvaWQpIHhlbGZfdXBkYXRlX3N5bSAoc3ltZGF0YSwgaWR4LCBzeW0pOworCisJCSAgICBpZHggPSBvcnVsZS0+dmFsLmFzc2lnbm1lbnQtPnN5bS0+b3V0ZHluc3ltaWR4OworCQkgICAgaWYgKGlkeCAhPSAwKQorCQkgICAgICB7CisJCQlhc3NlcnQgKGR5bnN5bWRhdGEgIT0gTlVMTCk7CisJCQl4ZWxmX2dldHN5bSAoZHluc3ltZGF0YSwgaWR4LCBzeW0pOworCQkJc3ltLT5zdF92YWx1ZSA9IGFkZHI7CisJCQkodm9pZCkgeGVsZl91cGRhdGVfc3ltIChkeW5zeW1kYXRhLCBpZHgsIHN5bSk7CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgfQorCisJICAvKiBTdG9yZSB0aGUgc2VnbWVudCBwYXJhbWV0ZXIgZm9yIGxvYWRhYmxlIHNlZ21lbnRzLiAgKi8KKwkgIGlmIChzZWdtZW50LT5tb2RlICE9IDApCisJICAgIHsKKwkgICAgICB4ZWxmX2dldHBoZHJfcHRyIChsZF9zdGF0ZS5vdXRlbGYsIG5waGRyLCBwaGRyKTsKKworCSAgICAgIHBoZHItPnBfdHlwZSA9IFBUX0xPQUQ7CisJICAgICAgcGhkci0+cF9vZmZzZXQgPSBzZWdtZW50LT5vZmZzZXQ7CisJICAgICAgcGhkci0+cF92YWRkciA9IHNlZ21lbnQtPmFkZHI7CisJICAgICAgcGhkci0+cF9wYWRkciA9IHBoZHItPnBfdmFkZHI7CisJICAgICAgcGhkci0+cF9maWxlc3ogPSBtZW1zaXplIC0gbm9iaXRzX3NpemU7CisJICAgICAgcGhkci0+cF9tZW1zeiA9IG1lbXNpemU7CisJICAgICAgcGhkci0+cF9mbGFncyA9IHNlZ21lbnQtPm1vZGU7CisJICAgICAgcGhkci0+cF9hbGlnbiA9IHNlZ21lbnQtPmFsaWduOworCisJICAgICAgKHZvaWQpIHhlbGZfdXBkYXRlX3BoZHIgKGxkX3N0YXRlLm91dGVsZiwgbnBoZHIsIHBoZHIpOworCSAgICAgICsrbnBoZHI7CisJICAgIH0KKworCSAgc2VnbWVudCA9IHNlZ21lbnQtPm5leHQ7CisJfQorCisgICAgICAvKiBDcmVhdGUgdGhlIG90aGVyIHByb2dyYW0gaGVhZGVyIGVudHJpZXMuICAqLworICAgICAgeGVsZl9nZXRlaGRyIChsZF9zdGF0ZS5vdXRlbGYsIGVoZHIpOworICAgICAgYXNzZXJ0IChlaGRyICE9IE5VTEwpOworCisgICAgICB4ZWxmX2dldHBoZHJfcHRyIChsZF9zdGF0ZS5vdXRlbGYsIDEsIHBoZHIpOworICAgICAgcGhkci0+cF90eXBlID0gUFRfUEhEUjsKKyAgICAgIHBoZHItPnBfb2Zmc2V0ID0gZWhkci0+ZV9waG9mZjsKKyAgICAgIHBoZHItPnBfdmFkZHIgPSBsZF9zdGF0ZS5vdXRwdXRfc2VnbWVudHMtPmFkZHIgKyBwaGRyLT5wX29mZnNldDsKKyAgICAgIHBoZHItPnBfcGFkZHIgPSBwaGRyLT5wX3ZhZGRyOworICAgICAgcGhkci0+cF9maWxlc3ogPSBlaGRyLT5lX3BobnVtICogZWhkci0+ZV9waGVudHNpemU7CisgICAgICBwaGRyLT5wX21lbXN6ID0gcGhkci0+cF9maWxlc3o7CisgICAgICBwaGRyLT5wX2ZsYWdzID0gMDsJCS8qIE5vIG5lZWQgdG8gc2V0IFBGX1Igb3Igc28uICAqLworICAgICAgcGhkci0+cF9hbGlnbiA9IHhlbGZfZnNpemUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX1RfQUREUiwgMSk7CisgICAgICAodm9pZCkgeGVsZl91cGRhdGVfcGhkciAobGRfc3RhdGUub3V0ZWxmLCAwLCBwaGRyKTsKKworCisgICAgICAvKiBBZGp1c3QgdGhlIGFkZHJlc3NlcyBpbiB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzeW1ib2wgYWNjb3JkaW5nCisJIHRvIHRoZSBsb2FkIGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMuICAqLworICAgICAgaWYgKGxkX3N0YXRlLm5lZWRfc3ltdGFiKQorCWZvciAoY250ID0gMTsgY250IDwgbnN5bTsgKytjbnQpCisJICB7CisJICAgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKwkgICAgRWxmMzJfV29yZCBzaG5keDsKKworCSAgICB4ZWxmX2dldHN5bXNobmR4IChzeW1kYXRhLCB4bmR4ZGF0YSwgY250LCBzeW0sIHNobmR4KTsKKwkgICAgYXNzZXJ0IChzeW0gIT0gTlVMTCk7CisKKwkgICAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1hJTkRFWCkKKwkgICAgICBzaG5keCA9IHN5bS0+c3Rfc2huZHg7CisKKwkgICAgaWYgKChzaG5keCA+IFNITl9VTkRFRiAmJiBzaG5keCA8IFNITl9MT1JFU0VSVkUpCisJCXx8IHNobmR4ID4gU0hOX0hJUkVTRVJWRSkKKwkgICAgICB7CisJCS8qIE5vdGUgd2Ugc3VidHJhY3QgMSBmcm9tIHRoZSBzZWN0aW9uIGluZGV4IHNpbmNlIEFMTFNFQ1RJT05TCisJCSAgIGRvZXMgbm90IHN0b3JlIHRoZSBkdW1teSBzZWN0aW9uIHdpdGggb2Zmc2V0IHplcm8uICAqLworCQlzeW0tPnN0X3ZhbHVlICs9IGxkX3N0YXRlLmFsbHNlY3Rpb25zW3NobmR4IC0gMV0tPmFkZHI7CisKKwkJLyogV2UgZG9uJ3QgaGF2ZSB0byB1c2UgJ3hlbGZfdXBkYXRlX3N5bXNobmR4JyBzaW5jZSB0aGUKKwkJICAgc2VjdGlvbiBudW1iZXIgZG9lc24ndCBjaGFuZ2UuICAqLworCQkodm9pZCkgeGVsZl91cGRhdGVfc3ltIChzeW1kYXRhLCBjbnQsIHN5bSk7CisJICAgICAgfQorCSAgfQorCisgICAgICBpZiAobGRfc3RhdGUubmVlZF9keW5zeW0pCisJZm9yIChjbnQgPSAxOyBjbnQgPCBuc3ltX2R5bjsgKytjbnQpCisJICB7CisJICAgIFhFbGZfU3ltX3ZhcmRlZiAoc3ltKTsKKworCSAgICB4ZWxmX2dldHN5bSAoZHluc3ltZGF0YSwgY250LCBzeW0pOworCSAgICBhc3NlcnQgKHN5bSAhPSBOVUxMKTsKKworCSAgICBpZiAoc3ltLT5zdF9zaG5keCA+IFNITl9VTkRFRiAmJiBzeW0tPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKKwkgICAgICB7CisJCS8qIE5vdGUgd2Ugc3VidHJhY3QgMSBmcm9tIHRoZSBzZWN0aW9uIGluZGV4IHNpbmNlIEFMTFNFQ1RJT05TCisJCSAgIGRvZXMgbm90IHN0b3JlIHRoZSBkdW1teSBzZWN0aW9uIHdpdGggb2Zmc2V0IHplcm8uICAqLworCQlzeW0tPnN0X3ZhbHVlICs9IGxkX3N0YXRlLmFsbHNlY3Rpb25zW3N5bS0+c3Rfc2huZHggLSAxXS0+YWRkcjsKKworCQkvKiBXZSBkb24ndCBoYXZlIHRvIHVzZSAneGVsZl91cGRhdGVfc3ltc2huZHgnIHNpbmNlIHRoZQorCQkgICBzZWN0aW9uIG51bWJlciBkb2Vzbid0IGNoYW5nZS4gICovCisJCSh2b2lkKSB4ZWxmX3VwZGF0ZV9zeW0gKGR5bnN5bWRhdGEsIGNudCwgc3ltKTsKKwkgICAgICB9CisJICB9CisKKworICAgICAgLyogTm93IGlzIGEgZ29vZCB0aW1lIHRvIGRldGVybWluZSB0aGUgdmFsdWVzIG9mIGFsbCB0aGUgc3ltYm9scworCSB3ZSBlbmNvdW50ZXJlZC4gICovCisgICAgICAvLyBYWFggVGhpcyBsb29wIGlzIHZlcnkgaW5lZmZpY2llbnQuICBUaGUgaGFzaCB0YWIgaXRlcmF0b3IgYWxzbworICAgICAgLy8gcmV0dXJucyBhbGwgc3ltYm9scyBpbiBEU09zLgorICAgICAgc3RydWN0IHN5bWJvbCAqc2U7CisgICAgICB2b2lkICpwID0gTlVMTDsKKyAgICAgIHdoaWxlICgoc2UgPSBsZF9zeW1ib2xfdGFiX2l0ZXJhdGUgKCZsZF9zdGF0ZS5zeW1ib2xfdGFiLCAmcCkpICE9IE5VTEwpCisJaWYgKCEgc2UtPmluX2RzbykKKwkgIHsKKwkgICAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCisJICAgIGFkZHIgPSAwOworCisJICAgIGlmIChzZS0+b3V0ZHluc3ltaWR4ICE9IDApCisJICAgICAgeworCQl4ZWxmX2dldHN5bSAoZHluc3ltZGF0YSwgc2UtPm91dGR5bnN5bWlkeCwgc3ltKTsKKwkJYXNzZXJ0IChzeW0gIT0gTlVMTCk7CisJCWFkZHIgPSBzeW0tPnN0X3ZhbHVlOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc2UtPm91dHN5bWlkeCAhPSAwKQorCSAgICAgIHsKKwkJYXNzZXJ0IChkYmxpbmRpcmVjdFtzZS0+b3V0c3ltaWR4XSAhPSAwKTsKKwkJeGVsZl9nZXRzeW0gKHN5bWRhdGEsIGRibGluZGlyZWN0W3NlLT5vdXRzeW1pZHhdLCBzeW0pOworCQlhc3NlcnQgKHN5bSAhPSBOVUxMKTsKKwkJYWRkciA9IHN5bS0+c3RfdmFsdWU7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgYWJvcnQgKCk7CisKKwkgICAgc2UtPm1lcmdlLnZhbHVlID0gYWRkcjsKKwkgIH0KKworICAgICAgLyogQ29tcGxldGUgdGhlIGhlYWRlciBvZiB0aGUgLnJlbC5keW4vLnJlbGEuZHluIHNlY3Rpb24uICBQb2ludAorCSB0byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIHNoX2luZm8gZmllbGQgaXMgbGVmdCB6ZXJvIHNpbmNlCisJIHRoZXJlIGlzIG5vIHNwZWNpZmljIHNlY3Rpb24gdGhlIGNvbnRhaW5lZCByZWxvY2F0aW9ucyBhcmUKKwkgZm9yLiAgKi8KKyAgICAgIGlmIChsZF9zdGF0ZS5yZWxkeW5zY25pZHggIT0gMCkKKwl7CisJICBhc3NlcnQgKGxkX3N0YXRlLmR5bnN5bXNjbmlkeCAhPSAwKTsKKwkgIHNjbiA9IGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwgbGRfc3RhdGUucmVsZHluc2NuaWR4KTsKKwkgIHhlbGZfZ2V0c2hkciAoc2NuLCBzaGRyKTsKKwkgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworCSAgc2hkci0+c2hfbGluayA9IGxkX3N0YXRlLmR5bnN5bXNjbmlkeDsKKworCSAgKHZvaWQpIHhlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7CisJfQorCisgICAgICAvKiBGaWxsIGluIHRoZSBkeW5hbWljIHNlZ21lbnQvc2VjdGlvbi4gICovCisgICAgICBpZiAoZHluYW1pY2FsbHlfbGlua2VkX3AgKCkpCisJeworCSAgRWxmX1NjbiAqb3V0c2NuOworCisJICBhc3NlcnQgKGxkX3N0YXRlLmludGVycHNjbmlkeCAhPSAwKTsKKwkgIHhlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS5pbnRlcnBzY25pZHgpLAorCQkJc2hkcik7CisJICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisKKwkgIC8qIFRoZSBpbnRlcnByZXRlciBzdHJpbmcuICAqLworCSAgLy8gWFhYIERvIHdlIG5lZWQgdG8gc3VwcG9ydCBmaWxlcyAoRFNPcykgd2l0aG91dCBpbnRlcnByZXRlcnM/CisJICB4ZWxmX2dldHBoZHJfcHRyIChsZF9zdGF0ZS5vdXRlbGYsIDEsIHBoZHIpOworCSAgcGhkci0+cF90eXBlID0gUFRfSU5URVJQOworCSAgcGhkci0+cF9vZmZzZXQgPSBzaGRyLT5zaF9vZmZzZXQ7CisJICBwaGRyLT5wX3ZhZGRyID0gc2hkci0+c2hfYWRkcjsKKwkgIHBoZHItPnBfcGFkZHIgPSBwaGRyLT5wX3ZhZGRyOworCSAgcGhkci0+cF9maWxlc3ogPSBzaGRyLT5zaF9zaXplOworCSAgcGhkci0+cF9tZW1zeiA9IHBoZHItPnBfZmlsZXN6OworCSAgcGhkci0+cF9mbGFncyA9IDA7CQkvKiBObyBuZWVkIHRvIHNldCBQRl9SIG9yIHNvLiAgKi8KKwkgIHBoZHItPnBfYWxpZ24gPSAxOwkJLyogSXQncyBhIHN0cmluZy4gICovCisKKwkgICh2b2lkKSB4ZWxmX3VwZGF0ZV9waGRyIChsZF9zdGF0ZS5vdXRlbGYsIDEsIHBoZHIpOworCisJICAvKiBUaGUgcG9pbnRlciB0byB0aGUgZHluYW1pYyBzZWN0aW9uLiAgV2UgdGhpcyB3ZSBuZWVkIHRvCisJICAgICBnZXQgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZHluYW1pYyBzZWN0aW9uIGZpcnN0LiAgKi8KKwkgIGFzc2VydCAobGRfc3RhdGUuZHluYW1pY3NjbmlkeCk7CisJICBvdXRzY24gPSBlbGZfZ2V0c2NuIChsZF9zdGF0ZS5vdXRlbGYsIGxkX3N0YXRlLmR5bmFtaWNzY25pZHgpOworCSAgeGVsZl9nZXRzaGRyIChvdXRzY24sIHNoZHIpOworCSAgYXNzZXJ0IChzaGRyICE9IE5VTEwpOworCisJICB4ZWxmX2dldHBoZHJfcHRyIChsZF9zdGF0ZS5vdXRlbGYsIDIsIHBoZHIpOworCSAgcGhkci0+cF90eXBlID0gUFRfRFlOQU1JQzsKKwkgIHBoZHItPnBfb2Zmc2V0ID0gc2hkci0+c2hfb2Zmc2V0OworCSAgcGhkci0+cF92YWRkciA9IHNoZHItPnNoX2FkZHI7CisJICBwaGRyLT5wX3BhZGRyID0gcGhkci0+cF92YWRkcjsKKwkgIHBoZHItPnBfZmlsZXN6ID0gc2hkci0+c2hfc2l6ZTsKKwkgIHBoZHItPnBfbWVtc3ogPSBwaGRyLT5wX2ZpbGVzejsKKwkgIHBoZHItPnBfZmxhZ3MgPSAwOwkJLyogTm8gbmVlZCB0byBzZXQgUEZfUiBvciBzby4gICovCisJICBwaGRyLT5wX2FsaWduID0gc2hkci0+c2hfYWRkcmFsaWduOworCisJICAodm9pZCkgeGVsZl91cGRhdGVfcGhkciAobGRfc3RhdGUub3V0ZWxmLCAyLCBwaGRyKTsKKworCSAgLyogRmlsbCBpbiB0aGUgcmVmZXJlbmNlIHRvIHRoZSAuZHluc3RyIHNlY3Rpb24uICAqLworCSAgYXNzZXJ0IChsZF9zdGF0ZS5keW5zdHJzY25pZHggIT0gMCk7CisJICBzaGRyLT5zaF9saW5rID0gbGRfc3RhdGUuZHluc3Ryc2NuaWR4OworCSAgKHZvaWQpIHhlbGZfdXBkYXRlX3NoZHIgKG91dHNjbiwgc2hkcik7CisKKwkgIC8qIEFuZCBmaWxsIHRoZSByZW1haW5pbmcgZW50cmllcy4gICovCisJICBFbGZfRGF0YSAqZHluZGF0YSA9IGVsZl9nZXRkYXRhIChvdXRzY24sIE5VTEwpOworCSAgYXNzZXJ0IChkeW5kYXRhICE9IE5VTEwpOworCisJICAvKiBBZGQgdGhlIERUX05FRURFRCBlbnRyaWVzLiAgKi8KKwkgIGlmIChsZF9zdGF0ZS5uZHNvZmlsZXMgPiAwKQorCSAgICB7CisJICAgICAgc3RydWN0IHVzZWRmaWxlcyAqcnVucCA9IGxkX3N0YXRlLmRzb2ZpbGVzLT5uZXh0OworCisJICAgICAgZG8KKwkJaWYgKCEgbGRfc3RhdGUuaWdub3JlX3VudXNlZF9kc29zIHx8IHJ1bnAtPnVzZWQpCisJCSAgeworCQkgICAgLyogQWRkIHRoZSBwb3NpdGlvbi1kZXBlbmRlbnQgZmxhZyBpZiBuZWNlc3NhcnkuICAqLworCQkgICAgaWYgKHJ1bnAtPmxhenlsb2FkKQorCQkgICAgICBuZXdfZHluYW1pY19lbnRyeSAoZHluZGF0YSwgbGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkKyssCisJCQkJCSBEVF9QT1NGTEFHXzEsIERGX1AxX0xBWllMT0FEKTsKKworCQkgICAgbmV3X2R5bmFtaWNfZW50cnkgKGR5bmRhdGEsIGxkX3N0YXRlLm5keW5hbWljX2ZpbGxlZCsrLAorCQkJCSAgICAgICBEVF9ORUVERUQsCisJCQkJICAgICAgIGVibF9zdHJ0YWJvZmZzZXQgKHJ1bnAtPnNvbmFtZWVudCkpOworCQkgIH0KKwkgICAgICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBsZF9zdGF0ZS5kc29maWxlcy0+bmV4dCk7CisJICAgIH0KKworCSAgLyogV2UgY2FuIGZpbmlzaCB0aGUgRFRfUlVOUEFUSC9EVF9SUEFUSCBlbnRyaWVzIG5vdy4gICovCisJICBpZiAobGRfc3RhdGUucnh4cGF0aF9zdHJlbnQgIT0gTlVMTCkKKwkgICAgbmV3X2R5bmFtaWNfZW50cnkgKGR5bmRhdGEsIGxkX3N0YXRlLm5keW5hbWljX2ZpbGxlZCsrLAorCQkJICAgICAgIGxkX3N0YXRlLnJ4eHBhdGhfdGFnLAorCQkJICAgICAgIGVibF9zdHJ0YWJvZmZzZXQgKGxkX3N0YXRlLnJ4eHBhdGhfc3RyZW50KSk7CisKKwkgIC8qIFJlZmVyZW5jZSB0byBpbml0aWFsaXphdGlvbiBhbmQgZmluYWxpemF0aW9uIGZ1bmN0aW9ucy4gICovCisJICAvLyBYWFggVGhpcyBjb2RlIGRlcGVuZHMgb24gc3ltYm9sIHRhYmxlIGJlaW5nIHJlbG9jYXRlZC4KKwkgIGlmIChsZF9zdGF0ZS5pbml0X3N5bWJvbCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCisJICAgICAgaWYgKGxkX3N0YXRlLm5lZWRfc3ltdGFiKQorCQl4ZWxmX2dldHN5bSAoc3ltZGF0YSwKKwkJCSAgICAgZGJsaW5kaXJlY3RbbGRfc3RhdGUuaW5pdF9zeW1ib2wtPm91dHN5bWlkeF0sCisJCQkgICAgIHN5bSk7CisJICAgICAgZWxzZQorCQl4ZWxmX2dldHN5bSAoZHluc3ltZGF0YSwgbGRfc3RhdGUuaW5pdF9zeW1ib2wtPm91dGR5bnN5bWlkeCwKKwkJCSAgICAgc3ltKTsKKwkgICAgICBhc3NlcnQgKHN5bSAhPSBOVUxMKTsKKworCSAgICAgIG5ld19keW5hbWljX2VudHJ5IChkeW5kYXRhLCBsZF9zdGF0ZS5uZHluYW1pY19maWxsZWQrKywKKwkJCQkgRFRfSU5JVCwgc3ltLT5zdF92YWx1ZSk7CisJICAgIH0KKwkgIGlmIChsZF9zdGF0ZS5maW5pX3N5bWJvbCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgWEVsZl9TeW1fdmFyZGVmIChzeW0pOworCisJICAgICAgaWYgKGxkX3N0YXRlLm5lZWRfc3ltdGFiKQorCQl4ZWxmX2dldHN5bSAoc3ltZGF0YSwKKwkJCSAgICAgZGJsaW5kaXJlY3RbbGRfc3RhdGUuZmluaV9zeW1ib2wtPm91dHN5bWlkeF0sCisJCQkgICAgIHN5bSk7CisJICAgICAgZWxzZQorCQl4ZWxmX2dldHN5bSAoZHluc3ltZGF0YSwgbGRfc3RhdGUuZmluaV9zeW1ib2wtPm91dGR5bnN5bWlkeCwKKwkJCSAgICAgc3ltKTsKKwkgICAgICBhc3NlcnQgKHN5bSAhPSBOVUxMKTsKKworCSAgICAgIG5ld19keW5hbWljX2VudHJ5IChkeW5kYXRhLCBsZF9zdGF0ZS5uZHluYW1pY19maWxsZWQrKywKKwkJCQkgRFRfRklOSSwgc3ltLT5zdF92YWx1ZSk7CisJICAgIH0KKwkgIC8vIFhYWCBTdXBwb3J0IGluaXQsZmluaSxwcmVpbml0IGFycmF5cworCisJICAvKiBUaGUgaGFzaCB0YWJsZSB3aGljaCBjb21lcyB3aXRoIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KKwkgIHhlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS5oYXNoc2NuaWR4KSwKKwkJCXNoZHIpOworCSAgYXNzZXJ0IChzaGRyICE9IE5VTEwpOworCSAgbmV3X2R5bmFtaWNfZW50cnkgKGR5bmRhdGEsIGxkX3N0YXRlLm5keW5hbWljX2ZpbGxlZCsrLCBEVF9IQVNILAorCQkJICAgICBzaGRyLT5zaF9hZGRyKTsKKworCSAgLyogUmVmZXJlbmNlIHRvIHRoZSBzeW1ib2wgdGFibGUgc2VjdGlvbi4gICovCisJICBhc3NlcnQgKGxkX3N0YXRlLmR5bnN5bXNjbmlkeCAhPSAwKTsKKwkgIHhlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS5keW5zeW1zY25pZHgpLAorCQkJc2hkcik7CisJICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisJICBuZXdfZHluYW1pY19lbnRyeSAoZHluZGF0YSwgbGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkKyssIERUX1NZTVRBQiwKKwkJCSAgICAgc2hkci0+c2hfYWRkcik7CisKKwkgIG5ld19keW5hbWljX2VudHJ5IChkeW5kYXRhLCBsZF9zdGF0ZS5uZHluYW1pY19maWxsZWQrKywgRFRfU1lNRU5ULAorCQkJICAgICB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1NZTSwgMSkpOworCisJICAvKiBBbmQgdGhlIHN0cmluZyB0YWJsZSB3aGljaCBjb21lcyB3aXRoIGl0LiAgKi8KKwkgIHhlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCBsZF9zdGF0ZS5keW5zdHJzY25pZHgpLAorCQkJc2hkcik7CisJICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisJICBuZXdfZHluYW1pY19lbnRyeSAoZHluZGF0YSwgbGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkKyssIERUX1NUUlRBQiwKKwkJCSAgICAgc2hkci0+c2hfYWRkcik7CisKKwkgIG5ld19keW5hbWljX2VudHJ5IChkeW5kYXRhLCBsZF9zdGF0ZS5uZHluYW1pY19maWxsZWQrKywgRFRfU1RSU1osCisJCQkgICAgIHNoZHItPnNoX3NpemUpOworCisJICAvKiBBZGQgdGhlIGVudHJpZXMgcmVsYXRlZCB0byB0aGUgLnBsdC4gICovCisJICBpZiAobGRfc3RhdGUubnBsdCA+IDApCisJICAgIHsKKwkgICAgICB4ZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwgbGRfc3RhdGUuZ290c2NuaWR4KSwKKwkJCSAgICBzaGRyKTsKKwkgICAgICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisJICAgICAgbmV3X2R5bmFtaWNfZW50cnkgKGR5bmRhdGEsIGxkX3N0YXRlLm5keW5hbWljX2ZpbGxlZCsrLAorCQkJCSAvLyBYWFggVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgbWFjaGluZQorCQkJCSAvLyBkZXBlbmRlbnQuCisJCQkJIERUX1BMVEdPVCwgc2hkci0+c2hfYWRkcik7CisKKwkgICAgICB4ZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwKKwkJCQkJbGRfc3RhdGUucGx0cmVsc2NuaWR4KSwgc2hkcik7CisJICAgICAgYXNzZXJ0IChzaGRyICE9IE5VTEwpOworCSAgICAgIG5ld19keW5hbWljX2VudHJ5IChkeW5kYXRhLCBsZF9zdGF0ZS5uZHluYW1pY19maWxsZWQrKywKKwkJCQkgRFRfUExUUkVMU1osIHNoZHItPnNoX3NpemUpOworCisJICAgICAgbmV3X2R5bmFtaWNfZW50cnkgKGR5bmRhdGEsIGxkX3N0YXRlLm5keW5hbWljX2ZpbGxlZCsrLAorCQkJCSBEVF9KTVBSRUwsIHNoZHItPnNoX2FkZHIpOworCisJICAgICAgbmV3X2R5bmFtaWNfZW50cnkgKGR5bmRhdGEsIGxkX3N0YXRlLm5keW5hbWljX2ZpbGxlZCsrLAorCQkJCSBEVF9QTFRSRUwsIFJFTF9UWVBFIChzdGF0ZXApKTsKKwkgICAgfQorCisJICBpZiAobGRfc3RhdGUucmVsc2l6ZV90b3RhbCA+IDApCisJICAgIHsKKwkgICAgICBpbnQgcmVsID0gUkVMX1RZUEUgKHN0YXRlcCk7CisJICAgICAgeGVsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChsZF9zdGF0ZS5vdXRlbGYsCisJCQkJCWxkX3N0YXRlLnJlbGR5bnNjbmlkeCksIHNoZHIpOworCSAgICAgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKwkgICAgICBuZXdfZHluYW1pY19lbnRyeSAoZHluZGF0YSwgbGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkKyssCisJCQkJIHJlbCwgc2hkci0+c2hfYWRkcik7CisKKwkgICAgICAvKiBUcmljayBhaGVhZC4gIFVzZSBhcml0aG1ldGljIHRvIGdldCB0aGUgcmlnaHQgdGFnLgorCQkgV2UgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoaXMgYXNzdW1wdGlvbiBpbiB0aGUgYXNzZXJ0cy4gICovCisJICAgICAgYXNzZXJ0IChEVF9SRUxBU1ogLSBEVF9SRUxBID09IDEpOworCSAgICAgIGFzc2VydCAoRFRfUkVMU1ogLSBEVF9SRUwgPT0gMSk7CisJICAgICAgbmV3X2R5bmFtaWNfZW50cnkgKGR5bmRhdGEsIGxkX3N0YXRlLm5keW5hbWljX2ZpbGxlZCsrLAorCQkJCSByZWwgKyAxLCBzaGRyLT5zaF9zaXplKTsKKworCSAgICAgIC8qIFNpbWlsYXIgZm9yIHRoZSBlbnRyeSBzaXplIHRhZy4gICovCisJICAgICAgYXNzZXJ0IChEVF9SRUxBRU5UIC0gRFRfUkVMQSA9PSAyKTsKKwkgICAgICBhc3NlcnQgKERUX1JFTEVOVCAtIERUX1JFTCA9PSAyKTsKKwkgICAgICBuZXdfZHluYW1pY19lbnRyeSAoZHluZGF0YSwgbGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkKyssCisJCQkJIHJlbCArIDIsCisJCQkJIHJlbCA9PSBEVF9SRUwKKwkJCQkgPyB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1JFTCwgMSkKKwkJCQkgOiB4ZWxmX2ZzaXplIChsZF9zdGF0ZS5vdXRlbGYsIEVMRl9UX1JFTEEsCisJCQkJCSAgICAgICAxKSk7CisJICAgIH0KKworCSAgaWYgKGxkX3N0YXRlLnZlcm5lZWRzY25pZHggIT0gMCkKKwkgICAgeworCSAgICAgIHhlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLAorCQkJCQlsZF9zdGF0ZS52ZXJuZWVkc2NuaWR4KSwgc2hkcik7CisJICAgICAgYXNzZXJ0IChzaGRyICE9IE5VTEwpOworCSAgICAgIG5ld19keW5hbWljX2VudHJ5IChkeW5kYXRhLCBsZF9zdGF0ZS5uZHluYW1pY19maWxsZWQrKywKKwkJCQkgRFRfVkVSTkVFRCwgc2hkci0+c2hfYWRkcik7CisKKwkgICAgICBuZXdfZHluYW1pY19lbnRyeSAoZHluZGF0YSwgbGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkKyssCisJCQkJIERUX1ZFUk5FRUROVU0sIGxkX3N0YXRlLm52ZXJkZWZmaWxlKTsKKwkgICAgfQorCisJICBpZiAobGRfc3RhdGUudmVyc3ltc2NuaWR4ICE9IDApCisJICAgIHsKKwkgICAgICB4ZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGxkX3N0YXRlLm91dGVsZiwKKwkJCQkJbGRfc3RhdGUudmVyc3ltc2NuaWR4KSwgc2hkcik7CisJICAgICAgYXNzZXJ0IChzaGRyICE9IE5VTEwpOworCSAgICAgIG5ld19keW5hbWljX2VudHJ5IChkeW5kYXRhLCBsZF9zdGF0ZS5uZHluYW1pY19maWxsZWQrKywKKwkJCQkgRFRfVkVSU1lNLCBzaGRyLT5zaF9hZGRyKTsKKwkgICAgfQorCisJICAvKiBXZSBhbHdheXMgY3JlYXRlIHRoZSBEVF9ERUJVRyBlbnRyeS4gICovCisJICBuZXdfZHluYW1pY19lbnRyeSAoZHluZGF0YSwgbGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkKyssIERUX0RFQlVHLCAwKTsKKwkgIGFzc2VydCAobGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkIDwgbGRfc3RhdGUubmR5bmFtaWMpOworCisJICAvKiBBZGQgdGhlIGZsYWcgd29yZHMgaWYgbmVjZXNzYXJ5LiAgKi8KKwkgIGlmIChsZF9zdGF0ZS5kdF9mbGFncyAhPSAwKQorCSAgICBuZXdfZHluYW1pY19lbnRyeSAoZHluZGF0YSwgbGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkKyssIERUX0ZMQUdTLAorCQkJICAgICAgIGxkX3N0YXRlLmR0X2ZsYWdzKTsKKworCSAgLyogQ3JlYXRlIGVudHJ5IGZvciB0aGUgRFRfRkxBR1NfMSBmbGFnLiAgKi8KKwkgIGlmIChsZF9zdGF0ZS5kdF9mbGFnc18xICE9IDApCisJICAgIG5ld19keW5hbWljX2VudHJ5IChkeW5kYXRhLCBsZF9zdGF0ZS5uZHluYW1pY19maWxsZWQrKywKKwkJCSAgICAgICBEVF9GTEFHU18xLCBsZF9zdGF0ZS5kdF9mbGFnc18xKTsKKworCSAgLyogQ3JlYXRlIGVudHJ5IGZvciB0aGUgRFRfRkVBVFVSRV8xIGZsYWcuICAqLworCSAgaWYgKGxkX3N0YXRlLmR0X2ZlYXR1cmVfMSAhPSAwKQorCSAgICBuZXdfZHluYW1pY19lbnRyeSAoZHluZGF0YSwgbGRfc3RhdGUubmR5bmFtaWNfZmlsbGVkKyssCisJCQkgICAgICAgRFRfRkVBVFVSRV8xLCBsZF9zdGF0ZS5kdF9mZWF0dXJlXzEpOworCisJICBhc3NlcnQgKGxkX3N0YXRlLm5keW5hbWljX2ZpbGxlZCA8PSBsZF9zdGF0ZS5uZHluYW1pYyk7CisJfQorICAgIH0KKworCisgIC8vIFhYWCBUaGUgZm9sbG93aW5nIGNvZGUgaXNuJ3QgbmljZS4gIFdlIHVzZSB0d28gZGlmZmVyZW50CisgIC8vIG1lY2hhbmlzbXMgdG8gaGFuZGxlIHJlbG9jYXRpb25zLCBvbmUgZm9yIHJlbG9jYXRhYmxlIGZpbGVzLCBvbmUKKyAgLy8gZm9yIGV4ZWN1dGFibGVzIGFuZCBEU09zLiAgTWF5YmUgdGhpcyBpcyB0aGUgYmVzdCBtZXRob2QgYnV0IGFsc28KKyAgLy8gbWF5YmUgaXQgY2FuIGJlIHNvbWV3aGF0IHVuaWZpZWQuCisKKyAgLyogTm93IHRoYXQgd2UgY3JlYXRlZCB0aGUgc3ltYm9sIHRhYmxlIHdlIGNhbiBhZGQgdGhlIHJlZmVyZW5jZSB0bworICAgICBpdCBpbiB0aGUgc2hfbGluayBmaWVsZCBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzIG9mIHRoZSByZWxvY2F0aW9uCisgICAgIHNlY3Rpb25zLiAgKi8KKyAgd2hpbGUgKHJlbGxpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc3NlcnQgKGxkX3N0YXRlLmZpbGVfdHlwZSA9PSByZWxvY2F0YWJsZV9maWxlX3R5cGUpOworICAgICAgRWxmX1NjbiAqb3V0c2NuOworCisgICAgICBvdXRzY24gPSBlbGZfZ2V0c2NuIChsZF9zdGF0ZS5vdXRlbGYsIHJlbGxpc3QtPnNjbmlkeCk7CisgICAgICB4ZWxmX2dldHNoZHIgKG91dHNjbiwgc2hkcik7CisgICAgICAvKiBUaGlzIG11c3Qgbm90IGZhaWwgc2luY2Ugd2UgZGlkIGl0IGJlZm9yZS4gICovCisgICAgICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7CisKKyAgICAgIC8qIFJlbWVtYmVyIHRoZSBzeW1ib2wgdGFibGUgd2hpY2ggYmVsb25ncyB0byB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KKyAgICAgIHNoZHItPnNoX2xpbmsgPSBsZF9zdGF0ZS5zeW1zY25pZHg7CisKKyAgICAgIC8qIEFuZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzZWN0aW9uIHdoaWNoIGlzIHJlbG9jYXRlZCBieSB0aGlzCisJIHJlbG9jYXRpb24gc2VjdGlvbi4gIFdlIHVzZSB0aGUgaW5mbyBmcm9tIHRoZSBmaXJzdCBpbnB1dAorCSBzZWN0aW9uIGJ1dCBhbGwgcmVjb3JkcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBpbmZvcm1hdGlvbi4gICovCisgICAgICBzaGRyLT5zaF9pbmZvID0KKwlyZWxsaXN0LT5zY25pbmZvLT5maWxlaW5mby0+c2NuaW5mb1tTQ05JTkZPX1NIRFIgKHJlbGxpc3QtPnNjbmluZm8tPnNoZHIpLnNoX2luZm9dLm91dHNjbm5keDsKKworCisgICAgICAvKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVsb2NhdGlvbnMuICBXZSBvbmx5IGhhdmUgdG8gYWRqdXN0CisJIG9mZnNldHMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KKyAgICAgIFJFTE9DQVRFX1NFQ1RJT04gKHN0YXRlcCwgb3V0c2NuLCByZWxsaXN0LT5zY25pbmZvLCBkYmxpbmRpcmVjdCk7CisKKyAgICAgIC8qIFN0b3JlIHRoZSBjaGFuZ2VzLiAgKi8KKyAgICAgICh2b2lkKSB4ZWxmX3VwZGF0ZV9zaGRyIChvdXRzY24sIHNoZHIpOworCisgICAgICAvKiBVcCB0byB0aGUgbmV4dCByZWxvY2F0aW9uIHNlY3Rpb24uICAqLworICAgICAgcmVsbGlzdCA9IHJlbGxpc3QtPm5leHQ7CisgICAgfQorCisgIGlmIChsZF9zdGF0ZS5yZWxsaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgYXNzZXJ0IChsZF9zdGF0ZS5maWxlX3R5cGUgIT0gcmVsb2NhdGFibGVfZmlsZV90eXBlKTsKKyAgICAgIC8qIENyZWF0ZSB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoZSBvdXRwdXQgZmlsZS4gICovCisgICAgICBDUkVBVEVfUkVMT0NBVElPTlMgKHN0YXRlcCwgZGJsaW5kaXJlY3QpOworICAgIH0KKworCisgIC8qIFdlIG5lZWQgdGhlIEVMRiBoZWFkZXIgb25jZSBtb3JlLiAgKi8KKyAgeGVsZl9nZXRlaGRyIChsZF9zdGF0ZS5vdXRlbGYsIGVoZHIpOworICBhc3NlcnQgKGVoZHIgIT0gTlVMTCk7CisKKyAgLyogU2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLworICBpZiAobGlrZWx5IChzaHN0cnRhYl9uZHggPCBTSE5fSElSRVNFUlZFKQorICAgICAgJiYgbGlrZWx5IChzaHN0cnRhYl9uZHggIT0gU0hOX1hJTkRFWCkpCisgICAgZWhkci0+ZV9zaHN0cm5keCA9IHNoc3RydGFiX25keDsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgdG8gcHV0IHRoZSBzZWN0aW9uIGluZGV4IGluIHRoZSBzaF9saW5rIGZpZWxkIG9mIHRoZQorCSB6ZXJvdGggc2VjdGlvbiBoZWFkZXIuICAqLworICAgICAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAobGRfc3RhdGUub3V0ZWxmLCAwKTsKKworICAgICAgeGVsZl9nZXRzaGRyIChzY24sIHNoZHIpOworICAgICAgaWYgKHVubGlrZWx5IChzaGRyID09IE5VTEwpKQorCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgICAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IGhlYWRlciBvZiAwdGggc2VjdGlvbjogJXMiKSwKKwkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgc2hkci0+c2hfbGluayA9IHNoc3RydGFiX25keDsKKworICAgICAgKHZvaWQpIHhlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7CisKKyAgICAgIGVoZHItPmVfc2hzdHJuZHggPSBTSE5fWElOREVYOworICAgIH0KKworICBpZiAobGRfc3RhdGUuZmlsZV90eXBlICE9IHJlbG9jYXRhYmxlX2ZpbGVfdHlwZSkKKyAgICAvKiBEU09zIGFuZCBleGVjdXRhYmxlcyBoYXZlIHRvIGRlZmluZSB0aGUgZW50cnkgcG9pbnQgc3ltYm9sLiAgKi8KKyAgICBlaGRyLT5lX2VudHJ5ID0gZmluZF9lbnRyeV9wb2ludCAoKTsKKworICBpZiAodW5saWtlbHkgKHhlbGZfdXBkYXRlX2VoZHIgKGxkX3N0YXRlLm91dGVsZiwgZWhkcikgPT0gMCkpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IHVwZGF0ZSBFTEYgaGVhZGVyOiAlcyIpLAorCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKworICAvKiBGcmVlIHRoZSBkYXRhIHdoaWNoIHdlIGRvbid0IG5lZWQgYW55bW9yZS4gICovCisgIGZyZWUgKGxkX3N0YXRlLmRibGluZGlyZWN0KTsKKworCisgIC8qIEZpbmFsaXplIHRoZSAucGx0IHNlY3Rpb24gdGhlIHdoYXQgYmVsb25ncyB0byB0aGVtLiAgKi8KKyAgRklOQUxJWkVfUExUIChzdGF0ZXAsIG5zeW0sIG5zeW1fZHluKTsKKworICByZXR1cm4gMDsKK30KKworCisvKiBUaGlzIGlzIGEgZnVuY3Rpb24gd2hpY2ggbXVzdCBiZSBzcGVjaWZpZWQgaW4gYWxsIGJhY2tlbmRzLiAgKi8KK3N0YXRpYyB2b2lkCitsZF9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24gKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwLCBFbGZfU2NuICpvdXRzY24sCisJCQkgICAgIHN0cnVjdCBzY25pbmZvICpmaXJzdHAsCisJCQkgICAgIGNvbnN0IEVsZjMyX1dvcmQgKmRibGluZGlyZWN0KQoreworICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiXAorbGlua2VyIGJhY2tlbmQgZGlkbid0IHNwZWNpZnkgZnVuY3Rpb24gdG8gcmVsb2NhdGUgc2VjdGlvbiIpKTsKKyAgLyogTk9UUkVBQ0hFRCAqLworfQorCisKKy8qIEZpbmFsaXplIHRoZSBvdXRwdXQgZmlsZS4gICovCitzdGF0aWMgaW50CitsZF9nZW5lcmljX2ZpbmFsaXplIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCkKK3sKKyAgLyogV3JpdGUgb3V0IHRoZSBFTEYgZmlsZSBkYXRhLiAgKi8KKyAgaWYgKGVsZl91cGRhdGUgKGxkX3N0YXRlLm91dGVsZiwgRUxGX0NfV1JJVEUpID09IC0xKQorICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIndoaWxlIHdyaXRpbmcgb3V0cHV0IGZpbGU6ICVzIiksCisJICAgICBlbGZfZXJybXNnICgtMSkpOworCisgIC8qIEZyZWUgdGhlIHJlc291cmNlcy4gICovCisgIGlmIChlbGZfZW5kIChsZF9zdGF0ZS5vdXRlbGYpICE9IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIndoaWxlIGZpbmlzaGluZyBvdXRwdXQgZmlsZTogJXMiKSwKKwkgICBlbGZfZXJybXNnICgtMSkpOworCisgIC8qIEdldCB0aGUgZmlsZSBzdGF0dXMgb2YgdGhlIHRlbXBvcmFyeSBmaWxlLiAgKi8KKyAgc3RydWN0IHN0YXQgdGVtcF9zdDsKKyAgaWYgKGZzdGF0IChsZF9zdGF0ZS5vdXRmZCwgJnRlbXBfc3QpICE9IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgc3RhdCBvdXRwdXQgZmlsZSIpKTsKKworICAvKiBOb3cgaXQncyB0aW1lIHRvIHJlbmFtZSB0aGUgZmlsZS4gIFJlbW92ZSBhbiBvbGQgZXhpc3RpbmcgZmlsZQorICAgICBmaXJzdC4gICovCisgIGlmIChyZW5hbWUgKGxkX3N0YXRlLnRlbXBmbmFtZSwgbGRfc3RhdGUub3V0Zm5hbWUpICE9IDApCisgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLworICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHJlbmFtZSBvdXRwdXQgZmlsZSIpKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIG91dHB1dCBmaWxlIGlzIHJlYWxseSB0aGUgb25lIHdlIGNyZWF0ZWQuICAqLworICBzdHJ1Y3Qgc3RhdCBuZXdfc3Q7CisgIGlmIChzdGF0IChsZF9zdGF0ZS5vdXRmbmFtZSwgJm5ld19zdCkgIT0gMAorICAgICAgfHwgbmV3X3N0LnN0X2lubyAhPSB0ZW1wX3N0LnN0X2lubworICAgICAgfHwgbmV3X3N0LnN0X2RldiAhPSB0ZW1wX3N0LnN0X2RldikKKyAgICB7CisgICAgICAvKiBXb3csIHNvbWVib2R5IG92ZXJ3cm90ZSB0aGUgb3V0cHV0IGZpbGUsIHByb2JhYmx5IHNvbWUgaW50cnVkZXIuICAqLworICAgICAgdW5saW5rIChsZF9zdGF0ZS5vdXRmbmFtZSk7CisgICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiXAorV0FSTklORzogdGVtcG9yYXJ5IG91dHB1dCBmaWxlIG92ZXJ3cml0dGVuIGJlZm9yZSBsaW5raW5nIGZpbmlzaGVkIikpOworICAgIH0KKworICAvKiBDbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKyAgKHZvaWQpIGNsb3NlIChsZF9zdGF0ZS5vdXRmZCk7CisKKyAgLyogU2lnbmFsIHRoZSBjbGVhbnVwIGhhbmRsZXIgdGhhdCB0aGUgZmlsZSBpcyBjb3JyZWN0bHkgY3JlYXRlZC4gICovCisgIGxkX3N0YXRlLnRlbXBmbmFtZSA9IE5VTEw7CisKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGJvb2wKK2xkX2dlbmVyaWNfc3BlY2lhbF9zZWN0aW9uX251bWJlcl9wIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCwgc2l6ZV90IG51bWJlcikKK3sKKyAgLyogVGhlcmUgYXJlIG5vIHNwZWNpYWwgc2VjdGlvbiBudW1iZXJzIGluIHRoZSBnQUJJLiAgKi8KKyAgcmV0dXJuIGZhbHNlOworfQorCisKK3N0YXRpYyBib29sCitsZF9nZW5lcmljX3NlY3Rpb25fdHlwZV9wIChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCwgR0VsZl9Xb3JkIHR5cGUpCit7CisgIGlmICh0eXBlIDwgU0hUX05VTQorICAgICAgLyogWFhYIEVuYWJsZSB0aGUgZm9sbG93aW5nIHR3byB3aGVuIGltcGxlbWVudGVkLiAgKi8KKyAgICAgIC8vIHx8IHR5cGUgPT0gU0hUX0dOVV9MSUJMSVNUCisgICAgICAvLyB8fCB0eXBlID09IFNIVF9DSEVDS1NVTQorICAgICAgLyogWFhYIEV2ZW50dWFsbHkgaW5jbHVkZSBTSFRfU1VOV19tb3ZlLCBTSFRfU1VOV19DT01EQVQsIGFuZAorCSBTSFRfU1VOV19zeW1pbmZvLiAgKi8KKyAgICAgIHx8ICh0eXBlID49IFNIVF9HTlVfdmVyZGVmICYmIHR5cGUgPD0gU0hUX0dOVV92ZXJzeW0pKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworCitzdGF0aWMgWEVsZl9Yd29yZAorbGRfZ2VuZXJpY19keW5hbWljX3NlY3Rpb25fZmxhZ3MgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwKQoreworICAvKiBCeSBkZWZhdWx0IHRoZSAuZHluYW1pYyBzZWN0aW9uIGlzIHdyaXRhYmxlIChhbmQgaXMgb2YgY291cnNlCisgICAgIGxvYWRlZCkuICBGZXcgYXJjaGl0ZWN0dXJlIGRpZmZlciBmcm9tIHRoaXMuICAqLworICByZXR1cm4gU0hGX0FMTE9DIHwgU0hGX1dSSVRFOworfQorCisKK3N0YXRpYyB2b2lkCitsZF9nZW5lcmljX2luaXRpYWxpemVfcGx0IChzdHJ1Y3QgbGRfc3RhdGUgKnN0YXRlcCwgRWxmX1NjbiAqc2NuKQoreworICAvKiBUaGlzIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBnZW5lcmFsbHkuICBUaGVyZSBzaG91bGQgaGF2ZSBiZWVuIGEKKyAgICAgbWFjaGluZSBkZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gYW5kIHdlIHNob3VsZCBuZXZlciBoYXZlIGFycml2ZWQKKyAgICAgaGVyZS4gICovCisgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJubyBtYWNoaW5lIHNwZWNpZmljICclcycgaW1wbGVtZW50YXRpb24iKSwKKwkgImluaXRpYWxpemVfcGx0Iik7Cit9CisKKworc3RhdGljIHZvaWQKK2xkX2dlbmVyaWNfaW5pdGlhbGl6ZV9wbHRyZWwgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwLCBFbGZfU2NuICpzY24pCit7CisgIC8qIFRoaXMgY2Fubm90IGJlIGltcGxlbWVudGVkIGdlbmVyYWxseS4gIFRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYQorICAgICBtYWNoaW5lIGRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBhbmQgd2Ugc2hvdWxkIG5ldmVyIGhhdmUgYXJyaXZlZAorICAgICBoZXJlLiAgKi8KKyAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIm5vIG1hY2hpbmUgc3BlY2lmaWMgJyVzJyBpbXBsZW1lbnRhdGlvbiIpLAorCSAiaW5pdGlhbGl6ZV9wbHRyZWwiKTsKK30KKworCitzdGF0aWMgdm9pZAorbGRfZ2VuZXJpY19pbml0aWFsaXplX2dvdCAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsIEVsZl9TY24gKnNjbikKK3sKKyAgLyogVGhpcyBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgZ2VuZXJhbGx5LiAgVGhlcmUgc2hvdWxkIGhhdmUgYmVlbiBhCisgICAgIG1hY2hpbmUgZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIGFuZCB3ZSBzaG91bGQgbmV2ZXIgaGF2ZSBhcnJpdmVkCisgICAgIGhlcmUuICAqLworICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgibm8gbWFjaGluZSBzcGVjaWZpYyAnJXMnIGltcGxlbWVudGF0aW9uIiksCisJICJpbml0aWFsaXplX2dvdCIpOworfQorCisKK3N0YXRpYyB2b2lkCitsZF9nZW5lcmljX2ZpbmFsaXplX3BsdCAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsIHNpemVfdCBuc3ltLCBzaXplX3QgbnN5bV9keW4pCit7CisgIC8qIEJ5IGRlZmF1bHQgd2UgYXNzdW1lIHRoYXQgbm90aGluZyBoYXMgdG8gYmUgZG9uZS4gICovCit9CisKKworc3RhdGljIGludAorbGRfZ2VuZXJpY19yZWxfdHlwZSAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXApCit7CisgIC8qIFRoaXMgY2Fubm90IGJlIGltcGxlbWVudGVkIGdlbmVyYWxseS4gIFRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYQorICAgICBtYWNoaW5lIGRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBhbmQgd2Ugc2hvdWxkIG5ldmVyIGhhdmUgYXJyaXZlZAorICAgICBoZXJlLiAgKi8KKyAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIm5vIG1hY2hpbmUgc3BlY2lmaWMgJyVzJyBpbXBsZW1lbnRhdGlvbiIpLAorCSAicmVsX3R5cGUiKTsKKyAgLyogSnVzdCB0byBrZWVwIHRoZSBjb21waWxlciBjYWxtLiAgKi8KKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2xkX2dlbmVyaWNfY291bnRfcmVsb2NhdGlvbnMgKHN0cnVjdCBsZF9zdGF0ZSAqc3RhdGVwLCBzdHJ1Y3Qgc2NuaW5mbyAqc2NuaW5mbykKK3sKKyAgLyogVGhpcyBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgZ2VuZXJhbGx5LiAgVGhlcmUgc2hvdWxkIGhhdmUgYmVlbiBhCisgICAgIG1hY2hpbmUgZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIGFuZCB3ZSBzaG91bGQgbmV2ZXIgaGF2ZSBhcnJpdmVkCisgICAgIGhlcmUuICAqLworICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgibm8gbWFjaGluZSBzcGVjaWZpYyAnJXMnIGltcGxlbWVudGF0aW9uIiksCisJICJjb3VudF9yZWxvY2F0aW9ucyIpOworfQorCisKK3N0YXRpYyB2b2lkCitsZF9nZW5lcmljX2NyZWF0ZV9yZWxvY2F0aW9ucyAoc3RydWN0IGxkX3N0YXRlICpzdGF0ZXAsCisJCQkgICAgICAgY29uc3QgRWxmMzJfV29yZCAqZGJsaW5kaXJlY3QpCit7CisgIC8qIFRoaXMgY2Fubm90IGJlIGltcGxlbWVudGVkIGdlbmVyYWxseS4gIFRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYQorICAgICBtYWNoaW5lIGRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBhbmQgd2Ugc2hvdWxkIG5ldmVyIGhhdmUgYXJyaXZlZAorICAgICBoZXJlLiAgKi8KKyAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIm5vIG1hY2hpbmUgc3BlY2lmaWMgJyVzJyBpbXBsZW1lbnRhdGlvbiIpLAorCSAiY3JlYXRlX3JlbG9jYXRpb25zIik7Cit9CmRpZmYgLS1naXQgYS9zcmMvbGRsZXgubCBiL3NyYy9sZGxleC5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzBhODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGRsZXgubApAQCAtMCwwICsxLDM0OSBAQAorJXsKKy8qIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmludGwuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHN5c3RlbS5oPgorI2luY2x1ZGUgPGxkLmg+CisjaW5jbHVkZSAibGRzY3JpcHQuaCIKKworLyogV2Ugc3VyZSB1c2Ugbm8gdGhyZWFkcyB0byByZWFkIHRoZSBzdHJlYW0sIHNvIHVzZSB0aGUgX3VubG9ja2VkCisgICB2YXJpYW50cyBvZiB0aGUgZnVuY3Rpb25zLiAgKi8KKyN1bmRlZiBnZXRjCisjZGVmaW5lIGdldGMocykgZ2V0Y191bmxvY2tlZCAocykKKyN1bmRlZiBmZXJyb3IKKyNkZWZpbmUgZmVycm9yKHMpIGZlcnJvcl91bmxvY2tlZCAocykKKyN1bmRlZiBmcmVhZAorI2RlZmluZSBmcmVhZChiLCBtLCBuLCBzKSBmcmVhZF91bmxvY2tlZCAoYiwgbSwgbiwgcykKKyN1bmRlZiBmd3JpdGUKKyNkZWZpbmUgZndyaXRlKGIsIG0sIG4sIHMpIGZ3cml0ZV91bmxvY2tlZCAoYiwgbSwgbiwgcykKKworLyogRUNITyBtdXN0IGJlIHJlZGVmaW5lZCBzaW5jZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzCisgICB0aGUgcmV0dXJuIHZhbHVlIG9mIGZ3cml0ZV91bmxvY2tlZC4gICovCisjZGVmaW5lIEVDSE8gZG8geyBzaXplX3Qgbl9fIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBcCisJCQkgICA9IGZ3cml0ZSAoeXl0ZXh0LCB5eWxlbmcsIDEsIHl5b3V0KTsgfSB3aGlsZSAoMCkKKworLyogRGVmaW5lZCBpbiBsZC5jLiAgKi8KK2V4dGVybiBpbnQgbGRfc2Nhbl92ZXJzaW9uX3NjcmlwdDsKKworI2RlZmluZSBNQVhfUFJFUERFUFRIIDIwCitzdGF0aWMgZW51bSBwcmVwc3RhdGUKK3sKKyAgcHJlcF9ub3JtYWwsCisgIHNraXBfaWYsCisgIHNraXBfdG9fZW5kaWYKK30gcHJlcHN0YXRlW01BWF9QUkVQREVQVEhdOworc3RhdGljIGludCBwcmVwZGVwdGg7CisKK3N0YXRpYyB2b2lkIGVhdF9jb21tZW50ICh2b2lkKTsKK3N0YXRpYyB2b2lkIGVhdF90b19lb2wgKGJvb2wgZW1wdHkpOworc3RhdGljIGludCBhdHRyaWJfY29udmVydCAoaW50IGMpOworc3RhdGljIHZvaWQgcHVzaF9zdGF0ZSAoZW51bSBwcmVwc3RhdGUpOworc3RhdGljIGludCBwb3Bfc3RhdGUgKHZvaWQpOworc3RhdGljIGludCBoYW5kbGVfaWZkZWYgKHZvaWQpOworc3RhdGljIHZvaWQgaW52YWxpZF9jaGFyIChpbnQgY2gpOworJX0KKworSUQJCVthLXpBLVowLTlfLio/XSsKK0ZJTEVOQU1FQ0hBUjEJW2EtekEtWjAtOV8vLlxcfl0KK0ZJTEVOQU1FQ0hBUglbXl1be31bOnNwYWNlOl0oKTo7XSsKK0hFWAkJMFt4WF1bMC05YS1mQS1GXStba0ttTV0/CitPQ1QJCTBbMC03XSpba0ttTV0/CitERUMJCVswLTldK1trS21NXT8KK1dISVRFCQlbWzpzcGFjZTpdXSsKKworJW9wdGlvbiB5eWxpbmVubworJW9wdGlvbiBuZXZlci1pbnRlcmFjdGl2ZQorJW9wdGlvbiBub3l5d3JhcAorCisleCBJR05PUkUKKworJSUKKwkJCQlpZiAodW5saWtlbHkgKGxkX3NjYW5fdmVyc2lvbl9zY3JpcHQpKQorCQkJCSAgeworCQkJCSAgICBsZF9zY2FuX3ZlcnNpb25fc2NyaXB0ID0gLTE7CisJCQkJICAgIHJldHVybiBrVkVSU0lPTl9TQ1JJUFQ7CisJCQkJICB9CisKK14iIyJpZmRlZi9bWzpzcGFjZTpdXQkJeyBCRUdJTiAoaGFuZGxlX2lmZGVmICgpKTsgfQorXiIjImVsc2UvW1s6c3BhY2U6XVxuXQkJeyBlYXRfdG9fZW9sICh0cnVlKTsKKwkJCQkgIHB1c2hfc3RhdGUgKHNraXBfdG9fZW5kaWYpOworCQkJCSAgQkVHSU4gKElHTk9SRSk7IH0KK14iIyJlbGlmZGVmL1tbOnNwYWNlOl1dCQl7IGVhdF90b19lb2wgKGZhbHNlKTsKKwkJCQkgIHB1c2hfc3RhdGUgKHNraXBfdG9fZW5kaWYpOworCQkJCSAgQkVHSU4gKElHTk9SRSk7IH0KK14iIyJlbmRpZi9bWzpzcGFjZTpdXG5dCQl7IGVhdF90b19lb2wgKHRydWUpIDsgfQorCis8SUdOT1JFPl4iIyJpZmRlZi9bWzpzcGFjZTpdXG5dIHsgZWF0X3RvX2VvbCAoZmFsc2UpOworCQkJCSAgcHVzaF9zdGF0ZSAoc2tpcF90b19lbmRpZik7IH0KKzxJR05PUkU+XiIjImVsc2UvW1s6c3BhY2U6XVxuXQl7IGVhdF90b19lb2wgKHRydWUpOworCQkJCSAgYXNzZXJ0IChwcmVwZGVwdGggPiAwKTsKKwkJCQkgIGlmIChwcmVwc3RhdGVbcHJlcGRlcHRoIC0gMV0gPT0gc2tpcF9pZikKKwkJCQkgICAgeworCQkJCSAgICAgIC8qIEJhY2sgdG8gbm9ybWFsIHByb2Nlc3NpbmcuICAqLworCQkJCSAgICAgIGFzc2VydCAocHJlcGRlcHRoID09IDEpOworCQkJCSAgICAgIEJFR0lOIChwb3Bfc3RhdGUgKCkpOworCQkJCSAgICB9CisJCQkJfQorPElHTk9SRT5eIiMiZWxpZmRlZi9bWzpzcGFjZTpdXQl7IGFzc2VydCAocHJlcGRlcHRoID4gMCk7CisJCQkJICBpZiAocHJlcHN0YXRlW3ByZXBkZXB0aCAtIDFdID09IHNraXBfaWYpCisJCQkJICAgIHsKKwkJCQkgICAgICAvKiBNYXliZSB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkLiAgKi8KKwkJCQkgICAgICBwb3Bfc3RhdGUgKCk7CisJCQkJICAgICAgQkVHSU4gKGhhbmRsZV9pZmRlZiAoKSk7CisJCQkJICAgIH0KKwkJCQl9Cis8SUdOT1JFPl4iIyJlbmRpZi9bWzpzcGFjZTpdXG5dIHsgZWF0X3RvX2VvbCAodHJ1ZSk7CisJCQkJICBCRUdJTiAocG9wX3N0YXRlICgpKTsgfQorPElHTk9SRT4ufFxuCQkJeyAvKiBub3RoaW5nICovIH0KKworCisiLyoiCQkJCXsgZWF0X2NvbW1lbnQgKCk7IH0KKworQUxJR04JCQkJeyByZXR1cm4ga0FMSUdOOyB9CitBU19ORUVERUQJCQl7IHJldHVybiBrQVNfTkVFREVEOyB9CitFTlRSWQkJCQl7IHJldHVybiBrRU5UUlk7IH0KK0VYQ0xVREVfRklMRQkJCXsgcmV0dXJuIGtFWENMVURFX0ZJTEU7IH0KKyJnbG9iYWw6IgkJCXsgcmV0dXJuIGtHTE9CQUw7IH0KK0dST1VQCQkJCXsgcmV0dXJuIGtHUk9VUDsgfQorSU5QVVQJCQkJeyByZXR1cm4ga0lOUFVUOyB9CitJTlRFUlAJCQkJeyByZXR1cm4ga0lOVEVSUDsgfQorS0VFUAkJCQl7IHJldHVybiBrS0VFUDsgfQorImxvY2FsOiIJCQl7IHJldHVybiBrTE9DQUw7IH0KK09VVFBVVF9GT1JNQVQJCQl7IHJldHVybiBrT1VUUFVUX0ZPUk1BVDsgfQorUEFHRVNJWkUJCQl7IHJldHVybiBrUEFHRVNJWkU7IH0KK1BST1ZJREUJCQkJeyByZXR1cm4ga1BST1ZJREU7IH0KK1NFQVJDSF9ESVIJCQl7IHJldHVybiBrU0VBUkNIX0RJUjsgfQorU0VHTUVOVAkJCQl7IHJldHVybiBrU0VHTUVOVDsgfQorU0laRU9GX0hFQURFUlMJCQl7IHJldHVybiBrU0laRU9GX0hFQURFUlM7IH0KK1NPUlQJCQkJeyByZXR1cm4ga1NPUlQ7IH0KK1ZFUlNJT04JCQkJeyByZXR1cm4ga1ZFUlNJT047IH0KKworIlsiKFtSV1hdKXswLDN9Il0iCQl7IGludCBjbnQgPSAxIDsKKwkJCQkgIGxkbHZhbC5udW0gPSAwOworCQkJCSAgd2hpbGUgKGNudCA8IHl5bGVuZyAtIDEpCisJCQkJICAgIGxkbHZhbC5udW0gfD0gYXR0cmliX2NvbnZlcnQgKHl5dGV4dFtjbnQrK10pOworCQkJCSAgcmV0dXJuIGtNT0RFOyB9CisKKyJ7IgkJCQl7IHJldHVybiAneyc7IH0KKyJ9IgkJCQl7IHJldHVybiAnfSc7IH0KKyIoIgkJCQl7IHJldHVybiAnKCc7IH0KKyIpIgkJCQl7IHJldHVybiAnKSc7IH0KKyI6IgkJCQl7IHJldHVybiAnOic7IH0KKyI7IgkJCQl7IHJldHVybiAnOyc7IH0KKyI9IgkJCQl7IHJldHVybiAnPSc7IH0KKyIrIgkJCQl7IGxkbHZhbC5vcCA9IGV4cF9wbHVzOyByZXR1cm4ga0FERF9PUDsgfQorIi0iCQkJCXsgbGRsdmFsLm9wID0gZXhwX21pbnVzOyByZXR1cm4ga0FERF9PUDsgfQorIioiCQkJCXsgcmV0dXJuICcqJzsgfQorIi8iCQkJCXsgbGRsdmFsLm9wID0gZXhwX2RpdjsgcmV0dXJuIGtNVUxfT1A7IH0KKyIlIgkJCQl7IGxkbHZhbC5vcCA9IGV4cF9tb2Q7IHJldHVybiBrTVVMX09QOyB9CisiJiIJCQkJeyByZXR1cm4gJyYnOyB9CisifCIJCQkJeyByZXR1cm4gJ3wnOyB9CisKKyIsIgkJCQl7IHJldHVybiAnLCc7IH0KKwore0hFWH18e09DVH18e0RFQ30JCXsgY2hhciAqZW5kcDsKKwkJCQkgIGxkbHZhbC5udW0gPSBzdHJ0b3VtYXggKHl5dGV4dCwgJmVuZHAsIDApOworCQkJCSAgaWYgKCplbmRwICE9ICdcMCcpCisJCQkJICAgIHsKKwkJCQkgICAgICBpZiAodG9sb3dlciAoKmVuZHApID09ICdrJykKKwkJCQkJbGRsdmFsLm51bSAqPSAxMDI0OworCQkJCSAgICAgIGVsc2UKKwkJCQkJeworCQkJCQkgIGFzc2VydCAodG9sb3dlciAoKmVuZHApID09ICdtJyk7CisJCQkJCSAgbGRsdmFsLm51bSAqPSAxMDI0ICogMTAyNDsKKwkJCQkJfQorCQkJCSAgICB9CisJCQkJICByZXR1cm4ga05VTTsgfQorCit7SUR9CQkJCXsgbGRsdmFsLnN0ciA9IG9ic3RhY2tfc3RybmR1cCAoJmxkX3N0YXRlLnNtZW0sCisJCQkJCQkJCXl5dGV4dCwgeXlsZW5nKTsKKwkJCQkgIHJldHVybiBrSUQ7IH0KKwore0ZJTEVOQU1FQ0hBUjF9e0ZJTEVOQU1FQ0hBUn0JeyBsZGx2YWwuc3RyID0gb2JzdGFja19zdHJuZHVwICgmbGRfc3RhdGUuc21lbSwKKwkJCQkJCQkJeXl0ZXh0LCB5eWxlbmcpOworCQkJCSAgcmV0dXJuIGtGSUxFTkFNRTsgfQorCit7V0hJVEV9CQkJCXsgLyogSUdOT1JFICovIH0KKworLgkJCQl7IGludmFsaWRfY2hhciAoKnl5dGV4dCk7IH0KKworJSUKKworc3RhdGljIHZvaWQKK2VhdF9jb21tZW50ICh2b2lkKQoreworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpbnQgYyA9IGlucHV0ICgpOworCisgICAgICB3aGlsZSAoYyAhPSAnKicgJiYgYyAhPSBFT0YpCisJYyA9IGlucHV0ICgpOworCisgICAgICBpZiAoYyA9PSAnKicpCisJeworCSAgYyA9IGlucHV0ICgpOworCSAgd2hpbGUgKGMgPT0gJyonKQorCSAgICBjID0gaW5wdXQgKCk7CisJICBpZiAoYyA9PSAnLycpCisJICAgIGJyZWFrOworCX0KKworICAgICAgaWYgKGMgPT0gRU9GKQorCXsKKwkgIC8qIFhYWCBVc2UgdGhlIHNldGptcCBidWZmZXIgYW5kIHNpZ25hbCBFT0YgaW4gY29tbWVudCAqLworCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJFT0YgaW4gY29tbWVudCIpKTsKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2VhdF90b19lb2wgKGJvb2wgZW1wdHkpCit7CisgIGJvb2wgd2FybmVkID0gZmFsc2U7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IGMgPSBpbnB1dCAoKTsKKworICAgICAgaWYgKGMgPT0gRU9GKQorCWJyZWFrOworICAgICAgaWYgKGMgPT0gJ1xuJykKKwl7CisJICArK3l5bGluZW5vOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoZW1wdHkgJiYgISBpc3NwYWNlIChjKSAmJiAhIHdhcm5lZCkKKwl7CisJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVkOiBnYXJiYWdlIGF0IGVuZCBvZiBsaW5lIiksIHl5bGluZW5vKTsKKwkgIHdhcm5lZCA9IHRydWU7CisJfQorICAgIH0KK30KKworCitzdGF0aWMgaW50CithdHRyaWJfY29udmVydCAoaW50IGMpCit7CisgIGlmIChjID09ICdYJykKKyAgICByZXR1cm4gUEZfWDsKKyAgaWYgKGMgPT0gJ1cnKQorICAgIHJldHVybiBQRl9XOworICBhc3NlcnQgKGMgPT0gJ1InKTsKKyAgcmV0dXJuIFBGX1I7Cit9CisKKworc3RhdGljIHZvaWQKK3B1c2hfc3RhdGUgKGVudW0gcHJlcHN0YXRlIHN0YXRlKQoreworICBpZiAocHJlcGRlcHRoID49IE1BWF9QUkVQREVQVEgpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIiVkOiBjb25kaXRpb25hbHMgbmVzdGVkIHRvbyBkZWVwIiksCisJICAgeXlsaW5lbm8pOworCisgIHByZXBzdGF0ZVtwcmVwZGVwdGgrK10gPSBzdGF0ZTsKK30KKworCitzdGF0aWMgaW50Citwb3Bfc3RhdGUgKHZvaWQpCit7CisgIGlmIChwcmVwZGVwdGggPT0gMCkKKyAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVkOiB1bmV4cGVjdGVkICNlbmRpZiIpLCB5eWxpbmVubyk7CisgIGVsc2UKKyAgICAtLXByZXBkZXB0aDsKKworICByZXR1cm4gcHJlcGRlcHRoID09IDAgPyBJTklUSUFMIDogSUdOT1JFOworfQorCisKK3N0YXRpYyBpbnQKK2hhbmRsZV9pZmRlZiAodm9pZCkKK3sKKyAgY2hhciBpZGJ1Zls1MF07CisgIGNoYXIgKmlkID0gaWRidWY7CisgIHNpemVfdCBpZGxlbiA9IDA7CisgIHNpemVfdCBpZG1heCA9IHNpemVvZiAoaWRidWYpOworICBib29sIGlnbm9yZV93cyA9IHRydWU7CisgIGJvb2wgZGVmaW5lZCA9IGZhbHNlOworICBpbnQgcmVzdWx0OworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCBjID0gaW5wdXQgKCk7CisKKyAgICAgIGlmIChpc3NwYWNlIChjKSAmJiBpZ25vcmVfd3MpCisJY29udGludWU7CisKKyAgICAgIGlmIChjICE9ICdfJyAmJiAoYyA8ICdhJyB8fCBjID4gJ3onKSAmJiAoYyA8ICdBJyB8fCBjID4gJ1onKQorCSAgJiYgKGlkbGVuID09IDAgfHwgYyA8ICcwJyB8fCBjID4gJzknKSkKKwl7CisJICB1bnB1dCAoYyk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChpZGxlbiA9PSBpZG1heCkKKwl7CisJICBjaGFyICpuZXdwID0gKGNoYXIgKikgYWxsb2NhIChpZG1heCAqPSAyKTsKKwkgIGlkID0gbWVtY3B5IChuZXdwLCBpZCwgaWRsZW4pOworCX0KKworICAgICAgaWRbaWRsZW4rK10gPSBjOworICAgICAgaWdub3JlX3dzID0gZmFsc2U7CisgICAgfQorCisgIC8qIFhYWCBDb21wYXJlIGluIGEgYmV0dGVyIHdheS4gICovCisgIGlmIChpZGxlbiA9PSA2ICYmIHN0cm5jbXAgKGlkLCAiU0hBUkVEIiwgNikgPT0gMCkKKyAgICBkZWZpbmVkID0gbGRfc3RhdGUuZmlsZV90eXBlID09IGRzb19maWxlX3R5cGU7CisKKyAgaWYgKGRlZmluZWQpCisgICAgcmVzdWx0ID0gSU5JVElBTDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHB1c2hfc3RhdGUgKHNraXBfaWYpOworICAgICAgcmVzdWx0ID0gSUdOT1JFOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkCitpbnZhbGlkX2NoYXIgKGludCBjaCkKK3sKKyAgZXJyb3IgKDAsIDAsIChpc2FzY2lpIChjaCkKKwkJPyBnZXR0ZXh0ICgiaW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBhdCBsaW5lICVkOyBpZ25vcmVkIikKKwkJOiBnZXR0ZXh0ICgiaW52YWxpZCBjaGFyYWN0ZXIgJ1xcJW8nIGF0IGxpbmUgJWQ7IGlnbm9yZWQiKSksCisJIGNoLCB5eWxpbmVubyk7Cit9CisKKworLy8gTG9jYWwgVmFyaWFibGVzOgorLy8gbW9kZTogQworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvc3JjL2xkc2NyaXB0LnkgYi9zcmMvbGRzY3JpcHQueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzc0MWI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xkc2NyaXB0LnkKQEAgLTAsMCArMSw3OTUgQEAKKyV7CisvKiBQYXJzZXIgZm9yIGxpbmtlciBzY3JpcHRzLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0uaD4KKyNpbmNsdWRlIDxsZC5oPgorCisvKiBUaGUgZXJyb3IgaGFuZGxlci4gICovCitzdGF0aWMgdm9pZCB5eWVycm9yIChjb25zdCBjaGFyICpzKTsKKworLyogU29tZSBoZWxwZXIgZnVuY3Rpb25zIHdlIG5lZWQgdG8gY29uc3RydWN0IHRoZSBkYXRhIHN0cnVjdHVyZXMKKyAgIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZS4gICovCitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKm5ld19leHByIChpbnQgdGFnKTsKK3N0YXRpYyBzdHJ1Y3QgaW5wdXRfc2VjdGlvbl9uYW1lICpuZXdfaW5wdXRfc2VjdGlvbl9uYW1lIChjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJCSAgYm9vbCBzb3J0X2ZsYWcpOworc3RhdGljIHN0cnVjdCBpbnB1dF9ydWxlICpuZXdfaW5wdXRfcnVsZSAoaW50IHRhZyk7CitzdGF0aWMgc3RydWN0IG91dHB1dF9ydWxlICpuZXdfb3V0cHV0X3J1bGUgKGludCB0YWcpOworc3RhdGljIHN0cnVjdCBhc3NpZ25tZW50ICpuZXdfYXNzaWdubWVudCAoY29uc3QgY2hhciAqdmFyaWFibGUsCisJCQkJCSAgc3RydWN0IGV4cHJlc3Npb24gKmV4cHJlc3Npb24sCisJCQkJCSAgYm9vbCBwcm92aWRlX2ZsYWcpOworc3RhdGljIHZvaWQgbmV3X3NlZ21lbnQgKGludCBtb2RlLCBzdHJ1Y3Qgb3V0cHV0X3J1bGUgKm91dHB1dF9ydWxlKTsKK3N0YXRpYyBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqbmV3X2ZpbGVuYW1lX2xpc3RlbGVtIChjb25zdCBjaGFyICpzdHJpbmcpOworc3RhdGljIHZvaWQgYWRkX2lucHV0ZmlsZXMgKHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmbmFtZXMpOworc3RhdGljIHN0cnVjdCBpZF9saXN0ICpuZXdfaWRfbGlzdGVsZW0gKGNvbnN0IGNoYXIgKnN0cik7Cisgc3RhdGljIHN0cnVjdCBmaWxlbmFtZV9saXN0ICptYXJrX2FzX25lZWRlZCAoc3RydWN0IGZpbGVuYW1lX2xpc3QgKmxpc3RwKTsKK3N0YXRpYyBzdHJ1Y3QgdmVyc2lvbiAqbmV3X3ZlcnNpb24gKHN0cnVjdCBpZF9saXN0ICpsb2NhbCwKKwkJCQkgICAgc3RydWN0IGlkX2xpc3QgKmdsb2JhbCk7CitzdGF0aWMgc3RydWN0IHZlcnNpb24gKm1lcmdlX3ZlcnNpb25zIChzdHJ1Y3QgdmVyc2lvbiAqb25lLAorCQkJCSAgICAgICBzdHJ1Y3QgdmVyc2lvbiAqdHdvKTsKK3N0YXRpYyB2b2lkIGFkZF92ZXJzaW9ucyAoc3RydWN0IHZlcnNpb24gKnZlcnNpb25zKTsKKworZXh0ZXJuIGludCB5eWxleCAodm9pZCk7CislfQorCisldW5pb24geworICB1aW50bWF4X3QgbnVtOworICBlbnVtIGV4cHJlc3Npb25fdGFnIG9wOworICBjaGFyICpzdHI7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHByOworICBzdHJ1Y3QgaW5wdXRfc2VjdGlvbl9uYW1lICpzZWN0aW9ubmFtZTsKKyAgc3RydWN0IGZpbGVtYXNrX3NlY3Rpb25fbmFtZSAqZmlsZW1hc2tfc2VjdGlvbl9uYW1lOworICBzdHJ1Y3QgaW5wdXRfcnVsZSAqaW5wdXRfcnVsZTsKKyAgc3RydWN0IG91dHB1dF9ydWxlICpvdXRwdXRfcnVsZTsKKyAgc3RydWN0IGFzc2lnbm1lbnQgKmFzc2lnbm1lbnQ7CisgIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmaWxlbmFtZV9saXN0OworICBzdHJ1Y3QgdmVyc2lvbiAqdmVyc2lvbjsKKyAgc3RydWN0IGlkX2xpc3QgKmlkX2xpc3Q7Cit9CisKKyV0b2tlbiBrQUREX09QCisldG9rZW4ga0FMSUdOCisldG9rZW4ga0FTX05FRURFRAorJXRva2VuIGtFTlRSWQorJXRva2VuIGtFWENMVURFX0ZJTEUKKyV0b2tlbiA8c3RyPiBrRklMRU5BTUUKKyV0b2tlbiBrR0xPQkFMCisldG9rZW4ga0dST1VQCisldG9rZW4gPHN0cj4ga0lECisldG9rZW4ga0lOUFVUCisldG9rZW4ga0lOVEVSUAorJXRva2VuIGtLRUVQCisldG9rZW4ga0xPQ0FMCisldG9rZW4gPG51bT4ga01PREUKKyV0b2tlbiBrTVVMX09QCisldG9rZW4gPG51bT4ga05VTQorJXRva2VuIGtPVVRQVVRfRk9STUFUCisldG9rZW4ga1BBR0VTSVpFCisldG9rZW4ga1BST1ZJREUKKyV0b2tlbiBrU0VBUkNIX0RJUgorJXRva2VuIGtTRUdNRU5UCisldG9rZW4ga1NJWkVPRl9IRUFERVJTCisldG9rZW4ga1NPUlQKKyV0b2tlbiBrVkVSU0lPTgorJXRva2VuIGtWRVJTSU9OX1NDUklQVAorCislbGVmdCAnfCcKKyVsZWZ0ICcmJworJWxlZnQgQUREX09QCislbGVmdCBNVUxfT1AgJyonCisKKyV0eXBlIDxvcD4ga0FERF9PUAorJXR5cGUgPG9wPiBrTVVMX09QCisldHlwZSA8c3RyPiBmaWxlbmFtZV9pZAorJXR5cGUgPHN0cj4gZmlsZW5hbWVfaWRfc3RhcgorJXR5cGUgPHN0cj4gZXhjbHVkZV9vcHQKKyV0eXBlIDxleHByPiBleHByCisldHlwZSA8c2VjdGlvbm5hbWU+IHNvcnRfb3B0X25hbWUKKyV0eXBlIDxmaWxlbWFza19zZWN0aW9uX25hbWU+IHNlY3Rpb25uYW1lCisldHlwZSA8aW5wdXRfcnVsZT4gaW5wdXRzZWN0aW9uCisldHlwZSA8aW5wdXRfcnVsZT4gaW5wdXRzZWN0aW9ucworJXR5cGUgPG91dHB1dF9ydWxlPiBvdXRwdXRzZWN0aW9uCisldHlwZSA8b3V0cHV0X3J1bGU+IG91dHB1dHNlY3Rpb25zCisldHlwZSA8YXNzaWdubWVudD4gYXNzaWdubWVudAorJXR5cGUgPGZpbGVuYW1lX2xpc3Q+IGZpbGVuYW1lX2lkX2xpc3QKKyV0eXBlIDx2ZXJzaW9uPiB2ZXJzaW9ubGlzdAorJXR5cGUgPHZlcnNpb24+IHZlcnNpb24KKyV0eXBlIDx2ZXJzaW9uPiB2ZXJzaW9uX3N0bXRfbGlzdAorJXR5cGUgPHZlcnNpb24+IHZlcnNpb25fc3RtdAorJXR5cGUgPGlkX2xpc3Q+IGZpbGVuYW1lX2lkX3N0YXJfbGlzdAorCislZXhwZWN0IDE2CisKKyUlCisKK3NjcmlwdF9vcl92ZXJzaW9uOgorCQkgIGZpbGUKKwkJfCBrVkVSU0lPTl9TQ1JJUFQgdmVyc2lvbmxpc3QKKwkJICAgIHsgYWRkX3ZlcnNpb25zICgkMik7IH0KKwkJOworCitmaWxlOgkJICBmaWxlIGNvbnRlbnQKKwkJfCBjb250ZW50CisJCTsKKworY29udGVudDoJICBrRU5UUlkgJygnIGtJRCAnKScgJzsnCisJCSAgICB7CisJCSAgICAgIGlmIChsaWtlbHkgKGxkX3N0YXRlLmVudHJ5ID09IE5VTEwpKQorCQkJbGRfc3RhdGUuZW50cnkgPSAkMzsKKwkJICAgIH0KKwkJfCBrU0VBUkNIX0RJUiAnKCcgZmlsZW5hbWVfaWQgJyknICc7JworCQkgICAgeworCQkgICAgICBsZF9uZXdfc2VhcmNoZGlyICgkMyk7CisJCSAgICB9CisJCXwga1BBR0VTSVpFICcoJyBrTlVNICcpJyAnOycKKwkJICAgIHsKKwkJICAgICAgaWYgKGxpa2VseSAobGRfc3RhdGUucGFnZXNpemUgPT0gMCkpCisJCQlsZF9zdGF0ZS5wYWdlc2l6ZSA9ICQzOworCQkgICAgfQorCQl8IGtJTlRFUlAgJygnIGZpbGVuYW1lX2lkICcpJyAnOycKKwkJICAgIHsKKwkJICAgICAgaWYgKGxpa2VseSAobGRfc3RhdGUuaW50ZXJwID09IE5VTEwpKQorCQkJbGRfc3RhdGUuaW50ZXJwID0gJDM7CisJCSAgICB9CisJCXwga1NFR01FTlQga01PREUgJ3snIG91dHB1dHNlY3Rpb25zICd9JworCQkgICAgeworCQkgICAgICBuZXdfc2VnbWVudCAoJDIsICQ0KTsKKwkJICAgIH0KKwkJfCBrU0VHTUVOVCBlcnJvciAneycgb3V0cHV0c2VjdGlvbnMgJ30nCisJCSAgICB7CisJCSAgICAgIGZwdXRzX3VubG9ja2VkIChnZXR0ZXh0ICgibW9kZSBmb3Igc2VnbWVudCBpbnZhbGlkXG4iKSwKKwkJCQkgICAgICBzdGRlcnIpOworCQkgICAgICBuZXdfc2VnbWVudCAoMCwgJDQpOworCQkgICAgfQorCQl8IGtHUk9VUCAnKCcgZmlsZW5hbWVfaWRfbGlzdCAnKScKKwkJICAgIHsKKwkJICAgICAgLyogRmlyc3QgbGl0dGxlIG9wdGltaXphdGlvbi4gIElmIHRoZXJlIGlzIG9ubHkgb25lCisJCQkgZmlsZSBpbiB0aGUgZ3JvdXAgZG9uJ3QgZG8gYW55dGhpbmcuICAqLworCQkgICAgICBpZiAoJDMgIT0gJDMtPm5leHQpCisJCQl7CisJCQkgICQzLT5uZXh0LT5ncm91cF9zdGFydCA9IDE7CisJCQkgICQzLT5ncm91cF9lbmQgPSAxOworCQkJfQorCQkgICAgICBhZGRfaW5wdXRmaWxlcyAoJDMpOworCQkgICAgfQorCQl8IGtJTlBVVCAnKCcgZmlsZW5hbWVfaWRfbGlzdCAnKScKKwkJICAgIHsgYWRkX2lucHV0ZmlsZXMgKCQzKTsgfQorCQl8IGtBU19ORUVERUQgJygnIGZpbGVuYW1lX2lkX2xpc3QgJyknCisJCSAgICB7IGFkZF9pbnB1dGZpbGVzIChtYXJrX2FzX25lZWRlZCAoJDMpKTsgfQorCQl8IGtWRVJTSU9OICd7JyB2ZXJzaW9ubGlzdCAnfScKKwkJICAgIHsgYWRkX3ZlcnNpb25zICgkMyk7IH0KKwkJfCBrT1VUUFVUX0ZPUk1BVCAnKCcgZmlsZW5hbWVfaWQgJyknCisJCSAgICB7IC8qIFhYWCBUT0RPICovIH0KKwkJOworCitvdXRwdXRzZWN0aW9uczoJICBvdXRwdXRzZWN0aW9ucyBvdXRwdXRzZWN0aW9uCisJCSAgICB7CisJCSAgICAgICQyLT5uZXh0ID0gJDEtPm5leHQ7CisJCSAgICAgICQkID0gJDEtPm5leHQgPSAkMjsKKwkJICAgIH0KKwkJfCBvdXRwdXRzZWN0aW9uCisJCSAgICB7ICQkID0gJDE7IH0KKwkJOworCitvdXRwdXRzZWN0aW9uOgkgIGFzc2lnbm1lbnQgJzsnCisJCSAgICB7CisJCSAgICAgICQkID0gbmV3X291dHB1dF9ydWxlIChvdXRwdXRfYXNzaWdubWVudCk7CisJCSAgICAgICQkLT52YWwuYXNzaWdubWVudCA9ICQxOworCQkgICAgfQorCQl8IGtJRCAneycgaW5wdXRzZWN0aW9ucyAnfScKKwkJICAgIHsKKwkJICAgICAgJCQgPSBuZXdfb3V0cHV0X3J1bGUgKG91dHB1dF9zZWN0aW9uKTsKKwkJICAgICAgJCQtPnZhbC5zZWN0aW9uLm5hbWUgPSAkMTsKKwkJICAgICAgJCQtPnZhbC5zZWN0aW9uLmlucHV0ID0gJDMtPm5leHQ7CisJCSAgICAgIGlmIChsZF9zdGF0ZS5zdHJpcCA9PSBzdHJpcF9kZWJ1ZworCQkJICAmJiBlYmxfZGVidWdzY25fcCAobGRfc3RhdGUuZWJsLCAkMSkpCisJCQkkJC0+dmFsLnNlY3Rpb24uaWdub3JlZCA9IHRydWU7CisJCSAgICAgIGVsc2UKKwkJCSQkLT52YWwuc2VjdGlvbi5pZ25vcmVkID0gZmFsc2U7CisJCSAgICAgICQzLT5uZXh0ID0gTlVMTDsKKwkJICAgIH0KKwkJfCBrSUQgJzsnCisJCSAgICB7CisJCSAgICAgIC8qIFRoaXMgaXMgYSBzaG9ydCBjdXQgZm9yICJJRCB7ICooSUQpIH0iLiAgKi8KKwkJICAgICAgJCQgPSBuZXdfb3V0cHV0X3J1bGUgKG91dHB1dF9zZWN0aW9uKTsKKwkJICAgICAgJCQtPnZhbC5zZWN0aW9uLm5hbWUgPSAkMTsKKwkJICAgICAgJCQtPnZhbC5zZWN0aW9uLmlucHV0ID0gbmV3X2lucHV0X3J1bGUgKGlucHV0X3NlY3Rpb24pOworCQkgICAgICAkJC0+dmFsLnNlY3Rpb24uaW5wdXQtPm5leHQgPSBOVUxMOworCQkgICAgICAkJC0+dmFsLnNlY3Rpb24uaW5wdXQtPnZhbC5zZWN0aW9uID0KKwkJCShzdHJ1Y3QgZmlsZW1hc2tfc2VjdGlvbl9uYW1lICopCisJCQkgIG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLAorCQkJCQkgc2l6ZW9mIChzdHJ1Y3QgZmlsZW1hc2tfc2VjdGlvbl9uYW1lKSk7CisJCSAgICAgICQkLT52YWwuc2VjdGlvbi5pbnB1dC0+dmFsLnNlY3Rpb24tPmZpbGVtYXNrID0gTlVMTDsKKwkJICAgICAgJCQtPnZhbC5zZWN0aW9uLmlucHV0LT52YWwuc2VjdGlvbi0+ZXhjbHVkZW1hc2sgPSBOVUxMOworCQkgICAgICAkJC0+dmFsLnNlY3Rpb24uaW5wdXQtPnZhbC5zZWN0aW9uLT5zZWN0aW9uX25hbWUgPQorCQkJbmV3X2lucHV0X3NlY3Rpb25fbmFtZSAoJDEsIGZhbHNlKTsKKwkJICAgICAgJCQtPnZhbC5zZWN0aW9uLmlucHV0LT52YWwuc2VjdGlvbi0+a2VlcF9mbGFnID0gZmFsc2U7CisJCSAgICAgIGlmIChsZF9zdGF0ZS5zdHJpcCA9PSBzdHJpcF9kZWJ1ZworCQkJICAmJiBlYmxfZGVidWdzY25fcCAobGRfc3RhdGUuZWJsLCAkMSkpCisJCQkkJC0+dmFsLnNlY3Rpb24uaWdub3JlZCA9IHRydWU7CisJCSAgICAgIGVsc2UKKwkJCSQkLT52YWwuc2VjdGlvbi5pZ25vcmVkID0gZmFsc2U7CisJCSAgICB9CisJCTsKKworYXNzaWdubWVudDoJICBrSUQgJz0nIGV4cHIKKwkJICAgIHsgJCQgPSBuZXdfYXNzaWdubWVudCAoJDEsICQzLCBmYWxzZSk7IH0KKwkJfCBrUFJPVklERSAnKCcga0lEICc9JyBleHByICcpJworCQkgICAgeyAkJCA9IG5ld19hc3NpZ25tZW50ICgkMywgJDUsIHRydWUpOyB9CisJCTsKKworaW5wdXRzZWN0aW9uczoJICBpbnB1dHNlY3Rpb25zIGlucHV0c2VjdGlvbgorCQkgICAgeworCQkgICAgICAkMi0+bmV4dCA9ICQxLT5uZXh0OworCQkgICAgICAkJCA9ICQxLT5uZXh0ID0gJDI7CisJCSAgICB9CisJCXwgaW5wdXRzZWN0aW9uCisJCSAgICB7ICQkID0gJDE7IH0KKwkJOworCitpbnB1dHNlY3Rpb246CSAgc2VjdGlvbm5hbWUKKwkJICAgIHsKKwkJICAgICAgJCQgPSBuZXdfaW5wdXRfcnVsZSAoaW5wdXRfc2VjdGlvbik7CisJCSAgICAgICQkLT52YWwuc2VjdGlvbiA9ICQxOworCQkgICAgfQorCQl8IGtLRUVQICcoJyBzZWN0aW9ubmFtZSAnKScKKwkJICAgIHsKKwkJICAgICAgJDMtPmtlZXBfZmxhZyA9IHRydWU7CisKKwkJICAgICAgJCQgPSBuZXdfaW5wdXRfcnVsZSAoaW5wdXRfc2VjdGlvbik7CisJCSAgICAgICQkLT52YWwuc2VjdGlvbiA9ICQzOworCQkgICAgfQorCQl8IGFzc2lnbm1lbnQgJzsnCisJCSAgICB7CisJCSAgICAgICQkID0gbmV3X2lucHV0X3J1bGUgKGlucHV0X2Fzc2lnbm1lbnQpOworCQkgICAgICAkJC0+dmFsLmFzc2lnbm1lbnQgPSAkMTsKKwkJICAgIH0KKwkJOworCitzZWN0aW9ubmFtZToJICBmaWxlbmFtZV9pZF9zdGFyICcoJyBleGNsdWRlX29wdCBzb3J0X29wdF9uYW1lICcpJworCQkgICAgeworCQkgICAgICAkJCA9IChzdHJ1Y3QgZmlsZW1hc2tfc2VjdGlvbl9uYW1lICopCisJCQlvYnN0YWNrX2FsbG9jICgmbGRfc3RhdGUuc21lbSwgc2l6ZW9mICgqJCQpKTsKKwkJICAgICAgJCQtPmZpbGVtYXNrID0gJDE7CisJCSAgICAgICQkLT5leGNsdWRlbWFzayA9ICQzOworCQkgICAgICAkJC0+c2VjdGlvbl9uYW1lID0gJDQ7CisJCSAgICAgICQkLT5rZWVwX2ZsYWcgPSBmYWxzZTsKKwkJICAgIH0KKwkJOworCitzb3J0X29wdF9uYW1lOgkgIGtJRAorCQkgICAgeyAkJCA9IG5ld19pbnB1dF9zZWN0aW9uX25hbWUgKCQxLCBmYWxzZSk7IH0KKwkJfCBrU09SVCAnKCcga0lEICcpJworCQkgICAgeyAkJCA9IG5ld19pbnB1dF9zZWN0aW9uX25hbWUgKCQzLCB0cnVlKTsgfQorCQk7CisKK2V4Y2x1ZGVfb3B0OgkgIGtFWENMVURFX0ZJTEUgJygnIGZpbGVuYW1lX2lkICcpJworCQkgICAgeyAkJCA9ICQzOyB9CisJCXwKKwkJICAgIHsgJCQgPSBOVUxMOyB9CisJCTsKKworZXhwcjoJCSAga0FMSUdOICcoJyBleHByICcpJworCQkgICAgeworCQkgICAgICAkJCA9IG5ld19leHByIChleHBfYWxpZ24pOworCQkgICAgICAkJC0+dmFsLmNoaWxkID0gJDM7CisJCSAgICB9CisJCXwgJygnIGV4cHIgJyknCisJCSAgICB7ICQkID0gJDI7IH0KKwkJfCBleHByICcqJyBleHByCisJCSAgICB7CisJCSAgICAgICQkID0gbmV3X2V4cHIgKGV4cF9tdWx0KTsKKwkJICAgICAgJCQtPnZhbC5iaW5hcnkubGVmdCA9ICQxOworCQkgICAgICAkJC0+dmFsLmJpbmFyeS5yaWdodCA9ICQzOworCQkgICAgfQorCQl8IGV4cHIga01VTF9PUCBleHByCisJCSAgICB7CisJCSAgICAgICQkID0gbmV3X2V4cHIgKCQyKTsKKwkJICAgICAgJCQtPnZhbC5iaW5hcnkubGVmdCA9ICQxOworCQkgICAgICAkJC0+dmFsLmJpbmFyeS5yaWdodCA9ICQzOworCQkgICAgfQorCQl8IGV4cHIga0FERF9PUCBleHByCisJCSAgICB7CisJCSAgICAgICQkID0gbmV3X2V4cHIgKCQyKTsKKwkJICAgICAgJCQtPnZhbC5iaW5hcnkubGVmdCA9ICQxOworCQkgICAgICAkJC0+dmFsLmJpbmFyeS5yaWdodCA9ICQzOworCQkgICAgfQorCQl8IGV4cHIgJyYnIGV4cHIKKwkJICAgIHsKKwkJICAgICAgJCQgPSBuZXdfZXhwciAoZXhwX2FuZCk7CisJCSAgICAgICQkLT52YWwuYmluYXJ5LmxlZnQgPSAkMTsKKwkJICAgICAgJCQtPnZhbC5iaW5hcnkucmlnaHQgPSAkMzsKKwkJICAgIH0KKwkJfCBleHByICd8JyBleHByCisJCSAgICB7CisJCSAgICAgICQkID0gbmV3X2V4cHIgKGV4cF9vcik7CisJCSAgICAgICQkLT52YWwuYmluYXJ5LmxlZnQgPSAkMTsKKwkJICAgICAgJCQtPnZhbC5iaW5hcnkucmlnaHQgPSAkMzsKKwkJICAgIH0KKwkJfCBrTlVNCisJCSAgICB7CisJCSAgICAgICQkID0gbmV3X2V4cHIgKGV4cF9udW0pOworCQkgICAgICAkJC0+dmFsLm51bSA9ICQxOworCQkgICAgfQorCQl8IGtJRAorCQkgICAgeworCQkgICAgICAkJCA9IG5ld19leHByIChleHBfaWQpOworCQkgICAgICAkJC0+dmFsLnN0ciA9ICQxOworCQkgICAgfQorCQl8IGtTSVpFT0ZfSEVBREVSUworCQkgICAgeyAkJCA9IG5ld19leHByIChleHBfc2l6ZW9mX2hlYWRlcnMpOyB9CisJCXwga1BBR0VTSVpFCisJCSAgICB7ICQkID0gbmV3X2V4cHIgKGV4cF9wYWdlc2l6ZSk7IH0KKwkJOworCitmaWxlbmFtZV9pZF9saXN0OiBrR1JPVVAgJygnIGZpbGVuYW1lX2lkX2xpc3QgJyknCisJCSAgICB7CisJCSAgICAgIC8qIEZpcnN0IGxpdHRsZSBvcHRpbWl6YXRpb24uICBJZiB0aGVyZSBpcyBvbmx5IG9uZQorCQkJIGZpbGUgaW4gdGhlIGdyb3VwIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KKwkJICAgICAgaWYgKCQzICE9ICQzLT5uZXh0KQorCQkJeworCQkJICAkMy0+bmV4dC0+Z3JvdXBfc3RhcnQgPSAxOworCQkJICAkMy0+Z3JvdXBfZW5kID0gMTsKKwkJCX0KKwkJICAgICAgJCQgPSAkMzsKKwkJICAgIH0KKwkJfCBrQVNfTkVFREVEICcoJyBmaWxlbmFtZV9pZF9saXN0ICcpJworCQkgICAgeyAkJCA9IG1hcmtfYXNfbmVlZGVkICgkMyk7IH0KKwkJfCBmaWxlbmFtZV9pZF9saXN0IGNvbW1hX29wdCBmaWxlbmFtZV9pZAorCQkgICAgeworCQkgICAgICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqbmV3cCA9IG5ld19maWxlbmFtZV9saXN0ZWxlbSAoJDMpOworCQkgICAgICBuZXdwLT5uZXh0ID0gJDEtPm5leHQ7CisJCSAgICAgICQkID0gJDEtPm5leHQgPSBuZXdwOworCQkgICAgfQorCQl8IGZpbGVuYW1lX2lkCisJCSAgICB7ICQkID0gbmV3X2ZpbGVuYW1lX2xpc3RlbGVtICgkMSk7IH0KKwkJOworCitjb21tYV9vcHQ6CSAgJywnCisJCXwKKwkJOworCit2ZXJzaW9ubGlzdDoJICB2ZXJzaW9ubGlzdCB2ZXJzaW9uCisJCSAgICB7CisJCSAgICAgICQyLT5uZXh0ID0gJDEtPm5leHQ7CisJCSAgICAgICQkID0gJDEtPm5leHQgPSAkMjsKKwkJICAgIH0KKwkJfCB2ZXJzaW9uCisJCSAgICB7ICQkID0gJDE7IH0KKwkJOworCit2ZXJzaW9uOgkgICd7JyB2ZXJzaW9uX3N0bXRfbGlzdCAnfScgJzsnCisJCSAgICB7CisJCSAgICAgICQyLT52ZXJzaW9ubmFtZSA9ICIiOworCQkgICAgICAkMi0+cGFyZW50bmFtZSA9IE5VTEw7CisJCSAgICAgICQkID0gJDI7CisJCSAgICB9CisJCXwgZmlsZW5hbWVfaWQgJ3snIHZlcnNpb25fc3RtdF9saXN0ICd9JyAnOycKKwkJICAgIHsKKwkJICAgICAgJDMtPnZlcnNpb25uYW1lID0gJDE7CisJCSAgICAgICQzLT5wYXJlbnRuYW1lID0gTlVMTDsKKwkJICAgICAgJCQgPSAkMzsKKwkJICAgIH0KKwkJfCBmaWxlbmFtZV9pZCAneycgdmVyc2lvbl9zdG10X2xpc3QgJ30nIGZpbGVuYW1lX2lkICc7JworCQkgICAgeworCQkgICAgICAkMy0+dmVyc2lvbm5hbWUgPSAkMTsKKwkJICAgICAgJDMtPnBhcmVudG5hbWUgPSAkNTsKKwkJICAgICAgJCQgPSAkMzsKKwkJICAgIH0KKwkJOworCit2ZXJzaW9uX3N0bXRfbGlzdDoKKwkJICB2ZXJzaW9uX3N0bXRfbGlzdCB2ZXJzaW9uX3N0bXQKKwkJICAgIHsgJCQgPSBtZXJnZV92ZXJzaW9ucyAoJDEsICQyKTsgfQorCQl8IHZlcnNpb25fc3RtdAorCQkgICAgeyAkJCA9ICQxOyB9CisJCTsKKwordmVyc2lvbl9zdG10OgkgIGtHTE9CQUwgZmlsZW5hbWVfaWRfc3Rhcl9saXN0CisJCSAgICB7ICQkID0gbmV3X3ZlcnNpb24gKE5VTEwsICQyKTsgfQorCQl8IGtMT0NBTCBmaWxlbmFtZV9pZF9zdGFyX2xpc3QKKwkJICAgIHsgJCQgPSBuZXdfdmVyc2lvbiAoJDIsIE5VTEwpOyB9CisJCTsKKworZmlsZW5hbWVfaWRfc3Rhcl9saXN0OgorCQkgIGZpbGVuYW1lX2lkX3N0YXJfbGlzdCBmaWxlbmFtZV9pZF9zdGFyICc7JworCQkgICAgeworCQkgICAgICBzdHJ1Y3QgaWRfbGlzdCAqbmV3cCA9IG5ld19pZF9saXN0ZWxlbSAoJDIpOworCQkgICAgICBuZXdwLT5uZXh0ID0gJDEtPm5leHQ7CisJCSAgICAgICQkID0gJDEtPm5leHQgPSBuZXdwOworCQkgICAgfQorCQl8IGZpbGVuYW1lX2lkX3N0YXIgJzsnCisJCSAgICB7ICQkID0gbmV3X2lkX2xpc3RlbGVtICgkMSk7IH0KKwkJOworCitmaWxlbmFtZV9pZDoJICBrRklMRU5BTUUKKwkJICAgIHsgJCQgPSAkMTsgfQorCQl8IGtJRAorCQkgICAgeyAkJCA9ICQxOyB9CisJCTsKKworZmlsZW5hbWVfaWRfc3RhcjogZmlsZW5hbWVfaWQKKwkJICAgIHsgJCQgPSAkMTsgfQorCQl8ICcqJworCQkgICAgeyAkJCA9IE5VTEw7IH0KKwkJOworCislJQorCitzdGF0aWMgdm9pZAoreXllcnJvciAoY29uc3QgY2hhciAqcykKK3sKKyAgZXJyb3IgKDAsIDAsIChsZF9zY2FuX3ZlcnNpb25fc2NyaXB0CisJCT8gZ2V0dGV4dCAoIndoaWxlIHJlYWRpbmcgdmVyc2lvbiBzY3JpcHQgJyVzJzogJXMgYXQgbGluZSAlZCIpCisJCTogZ2V0dGV4dCAoIndoaWxlIHJlYWRpbmcgbGlua2VyIHNjcmlwdCAnJXMnOiAlcyBhdCBsaW5lICVkIikpLAorCSBsZGluX2ZuYW1lLCBnZXR0ZXh0IChzKSwgbGRsaW5lbm8pOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwciAoaW50IHRhZykKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKm5ld3AgPSAoc3RydWN0IGV4cHJlc3Npb24gKikKKyAgICBvYnN0YWNrX2FsbG9jICgmbGRfc3RhdGUuc21lbSwgc2l6ZW9mICgqbmV3cCkpOworCisgIG5ld3AtPnRhZyA9IHRhZzsKKyAgcmV0dXJuIG5ld3A7Cit9CisKKworc3RhdGljIHN0cnVjdCBpbnB1dF9zZWN0aW9uX25hbWUgKgorbmV3X2lucHV0X3NlY3Rpb25fbmFtZSAoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBzb3J0X2ZsYWcpCit7CisgIHN0cnVjdCBpbnB1dF9zZWN0aW9uX25hbWUgKm5ld3AgPSAoc3RydWN0IGlucHV0X3NlY3Rpb25fbmFtZSAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBzaXplb2YgKCpuZXdwKSk7CisKKyAgbmV3cC0+bmFtZSA9IG5hbWU7CisgIG5ld3AtPnNvcnRfZmxhZyA9IHNvcnRfZmxhZzsKKyAgcmV0dXJuIG5ld3A7Cit9CisKKworc3RhdGljIHN0cnVjdCBpbnB1dF9ydWxlICoKK25ld19pbnB1dF9ydWxlIChpbnQgdGFnKQoreworICBzdHJ1Y3QgaW5wdXRfcnVsZSAqbmV3cCA9IChzdHJ1Y3QgaW5wdXRfcnVsZSAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBzaXplb2YgKCpuZXdwKSk7CisKKyAgbmV3cC0+dGFnID0gdGFnOworICBuZXdwLT5uZXh0ID0gbmV3cDsKKyAgcmV0dXJuIG5ld3A7Cit9CisKKworc3RhdGljIHN0cnVjdCBvdXRwdXRfcnVsZSAqCituZXdfb3V0cHV0X3J1bGUgKGludCB0YWcpCit7CisgIHN0cnVjdCBvdXRwdXRfcnVsZSAqbmV3cCA9IChzdHJ1Y3Qgb3V0cHV0X3J1bGUgKikKKyAgICBtZW1zZXQgKG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBzaXplb2YgKCpuZXdwKSksCisJICAgICdcMCcsIHNpemVvZiAoKm5ld3ApKTsKKworICBuZXdwLT50YWcgPSB0YWc7CisgIG5ld3AtPm5leHQgPSBuZXdwOworICByZXR1cm4gbmV3cDsKK30KKworCitzdGF0aWMgc3RydWN0IGFzc2lnbm1lbnQgKgorbmV3X2Fzc2lnbm1lbnQgKGNvbnN0IGNoYXIgKnZhcmlhYmxlLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwcmVzc2lvbiwKKwkJYm9vbCBwcm92aWRlX2ZsYWcpCit7CisgIHN0cnVjdCBhc3NpZ25tZW50ICpuZXdwID0gKHN0cnVjdCBhc3NpZ25tZW50ICopCisgICAgb2JzdGFja19hbGxvYyAoJmxkX3N0YXRlLnNtZW0sIHNpemVvZiAoKm5ld3ApKTsKKworICBuZXdwLT52YXJpYWJsZSA9IHZhcmlhYmxlOworICBuZXdwLT5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgbmV3cC0+c3ltID0gTlVMTDsKKyAgbmV3cC0+cHJvdmlkZV9mbGFnID0gcHJvdmlkZV9mbGFnOworCisgIC8qIEluc2VydCB0aGUgc3ltYm9sIGludG8gYSBoYXNoIHRhYmxlLiAgV2Ugd2lsbCBsYXRlciBoYXZlIHRvIG1hdGMqLworICByZXR1cm4gbmV3cDsKK30KKworCitzdGF0aWMgdm9pZAorbmV3X3NlZ21lbnQgKGludCBtb2RlLCBzdHJ1Y3Qgb3V0cHV0X3J1bGUgKm91dHB1dF9ydWxlKQoreworICBzdHJ1Y3Qgb3V0cHV0X3NlZ21lbnQgKm5ld3A7CisKKyAgbmV3cAorICAgID0gKHN0cnVjdCBvdXRwdXRfc2VnbWVudCAqKSBvYnN0YWNrX2FsbG9jICgmbGRfc3RhdGUuc21lbSwgc2l6ZW9mICgqbmV3cCkpOworICBuZXdwLT5tb2RlID0gbW9kZTsKKyAgbmV3cC0+bmV4dCA9IG5ld3A7CisKKyAgbmV3cC0+b3V0cHV0X3J1bGVzID0gb3V0cHV0X3J1bGUtPm5leHQ7CisgIG91dHB1dF9ydWxlLT5uZXh0ID0gTlVMTDsKKworICAvKiBFbnF1ZXVlIHRoZSBvdXRwdXQgc2VnbWVudCBkZXNjcmlwdGlvbi4gICovCisgIGlmIChsZF9zdGF0ZS5vdXRwdXRfc2VnbWVudHMgPT0gTlVMTCkKKyAgICBsZF9zdGF0ZS5vdXRwdXRfc2VnbWVudHMgPSBuZXdwOworICBlbHNlCisgICAgeworICAgICAgbmV3cC0+bmV4dCA9IGxkX3N0YXRlLm91dHB1dF9zZWdtZW50cy0+bmV4dDsKKyAgICAgIGxkX3N0YXRlLm91dHB1dF9zZWdtZW50cyA9IGxkX3N0YXRlLm91dHB1dF9zZWdtZW50cy0+bmV4dCA9IG5ld3A7CisgICAgfQorCisgIC8qIElmIHRoZSBvdXRwdXQgZmlsZSBzaG91bGQgYmUgc3RyaXBwZWQgb2YgYWxsIHN5bWJvbCBzZXQgdGhlIGZsYWcKKyAgICAgaW4gdGhlIHN0cnVjdHVyZXMgb2YgYWxsIG91dHB1dCBzZWN0aW9ucy4gICovCisgIGlmIChtb2RlID09IDAgJiYgbGRfc3RhdGUuc3RyaXAgPT0gc3RyaXBfYWxsKQorICAgIHsKKyAgICAgIHN0cnVjdCBvdXRwdXRfcnVsZSAqcnVucDsKKworICAgICAgZm9yIChydW5wID0gbmV3cC0+b3V0cHV0X3J1bGVzOyBydW5wICE9IE5VTEw7IHJ1bnAgPSBydW5wLT5uZXh0KQorCWlmIChydW5wLT50YWcgPT0gb3V0cHV0X3NlY3Rpb24pCisJICBydW5wLT52YWwuc2VjdGlvbi5pZ25vcmVkID0gdHJ1ZTsKKyAgICB9Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlbmFtZV9saXN0ICoKK25ld19maWxlbmFtZV9saXN0ZWxlbSAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqbmV3cDsKKworICAvKiBXZSB1c2UgY2FsbG9jIGFuZCBub3QgdGhlIG9ic3RhY2sgc2luY2UgdGhpcyBvYmplY3QgY2FuIGJlIGZyZWVkIHNvb24uICAqLworICBuZXdwID0gKHN0cnVjdCBmaWxlbmFtZV9saXN0ICopIHhjYWxsb2MgKDEsIHNpemVvZiAoKm5ld3ApKTsKKyAgbmV3cC0+bmFtZSA9IHN0cmluZzsKKyAgbmV3cC0+bmV4dCA9IG5ld3A7CisgIHJldHVybiBuZXdwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqCittYXJrX2FzX25lZWRlZCAoc3RydWN0IGZpbGVuYW1lX2xpc3QgKmxpc3RwKQoreworICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqcnVucCA9IGxpc3RwOworICB3aGlsZSAocnVucCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJ1bnAtPmFzX25lZWRlZCA9IHRydWU7CisgICAgICBydW5wID0gcnVucC0+bmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIGxpc3RwOworfQorCisKK3N0YXRpYyB2b2lkCithZGRfaW5wdXRmaWxlcyAoc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZuYW1lcykKK3sKKyAgYXNzZXJ0IChmbmFtZXMgIT0gTlVMTCk7CisKKyAgaWYgKGxkX3N0YXRlLnNyY2ZpbGVzID09IE5VTEwpCisgICAgbGRfc3RhdGUuc3JjZmlsZXMgPSBmbmFtZXM7CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlyc3QgPSBsZF9zdGF0ZS5zcmNmaWxlcy0+bmV4dDsKKworICAgICAgbGRfc3RhdGUuc3JjZmlsZXMtPm5leHQgPSBmbmFtZXMtPm5leHQ7CisgICAgICBmbmFtZXMtPm5leHQgPSBmaXJzdDsKKyAgICAgIGxkX3N0YXRlLnNyY2ZpbGVzLT5uZXh0ID0gZm5hbWVzOworICAgIH0KK30KKworCitzdGF0aWMgX0Jvb2wKK3NwZWNpYWxfY2hhcl9wIChjb25zdCBjaGFyICpzdHIpCit7CisgIHdoaWxlICgqc3RyICE9ICdcMCcpCisgICAgeworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKCpzdHIgPT0gJyonLCAwKQorCSAgfHwgX19idWlsdGluX2V4cGVjdCAoKnN0ciA9PSAnPycsIDApCisJICB8fCBfX2J1aWx0aW5fZXhwZWN0ICgqc3RyID09ICdbJywgMCkpCisJcmV0dXJuIHRydWU7CisKKyAgICAgICsrc3RyOworICAgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKworc3RhdGljIHN0cnVjdCBpZF9saXN0ICoKK25ld19pZF9saXN0ZWxlbSAoY29uc3QgY2hhciAqc3RyKQoreworICBzdHJ1Y3QgaWRfbGlzdCAqbmV3cDsKKworICBuZXdwID0gKHN0cnVjdCBpZF9saXN0ICopIG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBzaXplb2YgKCpuZXdwKSk7CisgIGlmIChzdHIgPT0gTlVMTCkKKyAgICBuZXdwLT51LmlkX3R5cGUgPSBpZF9hbGw7CisgIGVsc2UgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHNwZWNpYWxfY2hhcl9wIChzdHIpLCBmYWxzZSkpCisgICAgbmV3cC0+dS5pZF90eXBlID0gaWRfd2lsZDsKKyAgZWxzZQorICAgIG5ld3AtPnUuaWRfdHlwZSA9IGlkX3N0cjsKKyAgbmV3cC0+aWQgPSBzdHI7CisgIG5ld3AtPm5leHQgPSBuZXdwOworCisgIHJldHVybiBuZXdwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdmVyc2lvbiAqCituZXdfdmVyc2lvbiAoc3RydWN0IGlkX2xpc3QgKmxvY2FsLCBzdHJ1Y3QgaWRfbGlzdCAqZ2xvYmFsKQoreworICBzdHJ1Y3QgdmVyc2lvbiAqbmV3cDsKKworICBuZXdwID0gKHN0cnVjdCB2ZXJzaW9uICopIG9ic3RhY2tfYWxsb2MgKCZsZF9zdGF0ZS5zbWVtLCBzaXplb2YgKCpuZXdwKSk7CisgIG5ld3AtPm5leHQgPSBuZXdwOworICBuZXdwLT5sb2NhbF9uYW1lcyA9IGxvY2FsOworICBuZXdwLT5nbG9iYWxfbmFtZXMgPSBnbG9iYWw7CisgIG5ld3AtPnZlcnNpb25uYW1lID0gTlVMTDsKKyAgbmV3cC0+cGFyZW50bmFtZSA9IE5VTEw7CisKKyAgcmV0dXJuIG5ld3A7Cit9CisKKworc3RhdGljIHN0cnVjdCB2ZXJzaW9uICoKK21lcmdlX3ZlcnNpb25zIChzdHJ1Y3QgdmVyc2lvbiAqb25lLCBzdHJ1Y3QgdmVyc2lvbiAqdHdvKQoreworICBhc3NlcnQgKHR3by0+bG9jYWxfbmFtZXMgPT0gTlVMTCB8fCB0d28tPmdsb2JhbF9uYW1lcyA9PSBOVUxMKTsKKworICBpZiAodHdvLT5sb2NhbF9uYW1lcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChvbmUtPmxvY2FsX25hbWVzID09IE5VTEwpCisJb25lLT5sb2NhbF9uYW1lcyA9IHR3by0+bG9jYWxfbmFtZXM7CisgICAgICBlbHNlCisJeworCSAgdHdvLT5sb2NhbF9uYW1lcy0+bmV4dCA9IG9uZS0+bG9jYWxfbmFtZXMtPm5leHQ7CisJICBvbmUtPmxvY2FsX25hbWVzID0gb25lLT5sb2NhbF9uYW1lcy0+bmV4dCA9IHR3by0+bG9jYWxfbmFtZXM7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChvbmUtPmdsb2JhbF9uYW1lcyA9PSBOVUxMKQorCW9uZS0+Z2xvYmFsX25hbWVzID0gdHdvLT5nbG9iYWxfbmFtZXM7CisgICAgICBlbHNlCisJeworCSAgdHdvLT5nbG9iYWxfbmFtZXMtPm5leHQgPSBvbmUtPmdsb2JhbF9uYW1lcy0+bmV4dDsKKwkgIG9uZS0+Z2xvYmFsX25hbWVzID0gb25lLT5nbG9iYWxfbmFtZXMtPm5leHQgPSB0d28tPmdsb2JhbF9uYW1lczsKKwl9CisgICAgfQorCisgIHJldHVybiBvbmU7Cit9CisKKworc3RhdGljIHZvaWQKK2FkZF9pZF9saXN0IChjb25zdCBjaGFyICp2ZXJzaW9ubmFtZSwgc3RydWN0IGlkX2xpc3QgKnJ1bnAsIF9Cb29sIGxvY2FsKQoreworICBzdHJ1Y3QgaWRfbGlzdCAqbGFzdHAgPSBydW5wOworCisgIGlmIChydW5wID09IE5VTEwpCisgICAgLyogTm90aGluZyB0byBkby4gICovCisgICAgcmV0dXJuOworCisgIC8qIENvbnZlcnQgaW50byBhIHNpbXBsZSBzaW5nbGUtbGlua2VkIGxpc3QuICAqLworICBydW5wID0gcnVucC0+bmV4dDsKKyAgYXNzZXJ0IChydW5wICE9IE5VTEwpOworICBsYXN0cC0+bmV4dCA9IE5VTEw7CisKKyAgZG8KKyAgICBpZiAocnVucC0+dS5pZF90eXBlID09IGlkX3N0cikKKyAgICAgIHsKKwlzdHJ1Y3QgaWRfbGlzdCAqY3VycDsKKwlzdHJ1Y3QgaWRfbGlzdCAqZGVmcDsKKwl1bnNpZ25lZCBsb25nIGludCBodmFsID0gZWxmX2hhc2ggKHJ1bnAtPmlkKTsKKworCWN1cnAgPSBydW5wOworCXJ1bnAgPSBydW5wLT5uZXh0OworCisJZGVmcCA9IGxkX3ZlcnNpb25fc3RyX3RhYl9maW5kICgmbGRfc3RhdGUudmVyc2lvbl9zdHJfdGFiLCBodmFsLCBjdXJwKTsKKwlpZiAoZGVmcCAhPSBOVUxMKQorCSAgeworCSAgICAvKiBUaGVyZSBpcyBhbHJlYWR5IGEgdmVyc2lvbiBkZWZpbml0aW9uIGZvciB0aGlzIHN5bWJvbC4gICovCisJICAgIHdoaWxlIChzdHJjbXAgKGRlZnAtPnUucy52ZXJzaW9ubmFtZSwgdmVyc2lvbm5hbWUpICE9IDApCisJICAgICAgeworCQlpZiAoZGVmcC0+bmV4dCA9PSBOVUxMKQorCQkgIHsKKwkJICAgIC8qIE5vIHZlcnNpb24gbGlrZSB0aGlzIHNvIGZhci4gICovCisJCSAgICBkZWZwLT5uZXh0ID0gY3VycDsKKwkJICAgIGN1cnAtPnUucy5sb2NhbCA9IGxvY2FsOworCQkgICAgY3VycC0+dS5zLnZlcnNpb25uYW1lID0gdmVyc2lvbm5hbWU7CisJCSAgICBjdXJwLT5uZXh0ID0gTlVMTDsKKwkJICAgIGRlZnAgPSBOVUxMOworCQkgICAgYnJlYWs7CisJCSAgfQorCisJCWRlZnAgPSBkZWZwLT5uZXh0OworCSAgICAgIH0KKworCSAgICBpZiAoZGVmcCAhPSBOVUxMICYmIGRlZnAtPnUucy5sb2NhbCAhPSBsb2NhbCkKKwkgICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCB2ZXJzaW9ubmFtZVswXSA9PSAnXDAnCisJCSAgICAgPyBnZXR0ZXh0ICgiXAorc3ltYm9sICclcycgaW4gZGVjbGFyZWQgYm90aCBsb2NhbCBhbmQgZ2xvYmFsIGZvciB1bm5hbWVkIHZlcnNpb24iKQorCQkgICAgIDogZ2V0dGV4dCAoIlwKK3N5bWJvbCAnJXMnIGluIGRlY2xhcmVkIGJvdGggbG9jYWwgYW5kIGdsb2JhbCBmb3IgdmVyc2lvbiAnJXMnIiksCisJCSAgICAgcnVucC0+aWQsIHZlcnNpb25uYW1lKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gZGVmaW5pdGlvbiBmb3IgdGhpcyBzeW1ib2wuICAqLworCSAgICBsZF92ZXJzaW9uX3N0cl90YWJfaW5zZXJ0ICgmbGRfc3RhdGUudmVyc2lvbl9zdHJfdGFiLCBodmFsLCBjdXJwKTsKKworCSAgICBjdXJwLT51LnMubG9jYWwgPSBsb2NhbDsKKwkgICAgY3VycC0+dS5zLnZlcnNpb25uYW1lID0gdmVyc2lvbm5hbWU7CisJICAgIGN1cnAtPm5leHQgPSBOVUxMOworCSAgfQorICAgICAgfQorICAgIGVsc2UgaWYgKHJ1bnAtPnUuaWRfdHlwZSA9PSBpZF9hbGwpCisgICAgICB7CisJaWYgKGxvY2FsKQorCSAgeworCSAgICBpZiAobGRfc3RhdGUuZGVmYXVsdF9iaW5kX2dsb2JhbCkKKwkgICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCQkgICAgIGdldHRleHQgKCJkZWZhdWx0IHZpc2liaWxpdHkgc2V0IGFzIGxvY2FsIGFuZCBnbG9iYWwiKSk7CisJICAgIGxkX3N0YXRlLmRlZmF1bHRfYmluZF9sb2NhbCA9IHRydWU7CisJICB9CisJZWxzZQorCSAgeworCSAgICBpZiAobGRfc3RhdGUuZGVmYXVsdF9iaW5kX2xvY2FsKQorCSAgICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJCSAgICAgZ2V0dGV4dCAoImRlZmF1bHQgdmlzaWJpbGl0eSBzZXQgYXMgbG9jYWwgYW5kIGdsb2JhbCIpKTsKKwkgICAgbGRfc3RhdGUuZGVmYXVsdF9iaW5kX2dsb2JhbCA9IHRydWU7CisJICB9CisKKwlydW5wID0gcnVucC0+bmV4dDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJYXNzZXJ0IChydW5wLT51LmlkX3R5cGUgPT0gaWRfd2lsZCk7CisJLyogWFhYIFRCSSAqLworCWFib3J0ICgpOworICAgICAgfQorICB3aGlsZSAocnVucCAhPSBOVUxMKTsKK30KKworCitzdGF0aWMgdm9pZAorYWRkX3ZlcnNpb25zIChzdHJ1Y3QgdmVyc2lvbiAqdmVyc2lvbnMpCit7CisgIHN0cnVjdCB2ZXJzaW9uICpsYXN0cCA9IHZlcnNpb25zOworCisgIGlmICh2ZXJzaW9ucyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBDb252ZXJ0IGludG8gYSBzaW1wbGUgc2luZ2xlLWxpbmtlZCBsaXN0LiAgKi8KKyAgdmVyc2lvbnMgPSB2ZXJzaW9ucy0+bmV4dDsKKyAgYXNzZXJ0ICh2ZXJzaW9ucyAhPSBOVUxMKTsKKyAgbGFzdHAtPm5leHQgPSBOVUxMOworCisgIGRvCisgICAgeworICAgICAgc3RydWN0IHZlcnNpb24gKm9sZHA7CisKKyAgICAgIGFkZF9pZF9saXN0ICh2ZXJzaW9ucy0+dmVyc2lvbm5hbWUsIHZlcnNpb25zLT5sb2NhbF9uYW1lcywgdHJ1ZSk7CisgICAgICBhZGRfaWRfbGlzdCAodmVyc2lvbnMtPnZlcnNpb25uYW1lLCB2ZXJzaW9ucy0+Z2xvYmFsX25hbWVzLCBmYWxzZSk7CisKKyAgICAgIG9sZHAgPSB2ZXJzaW9uczsKKyAgICAgIHZlcnNpb25zID0gdmVyc2lvbnMtPm5leHQ7CisgICAgfQorICB3aGlsZSAodmVyc2lvbnMgIT0gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbGlibGRfZWxmX2kzODYubWFwIGIvc3JjL2xpYmxkX2VsZl9pMzg2Lm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNhZjZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xpYmxkX2VsZl9pMzg2Lm1hcApAQCAtMCwwICsxLDcgQEAKK0VMRlVUSUxTXzEuMCB7CisgIGdsb2JhbDoKKyAgICBlbGZfaTM4Nl9sZF9pbml0OworCisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL25tLmMgYi9zcmMvbm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWU3MWEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL25tLmMKQEAgLTAsMCArMSwxMjgyIEBACisvKiBQcmludCBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSBFTEYgZmlsZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXIuaD4KKyNpbmNsdWRlIDxhcmdwLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmR3Lmg+CisjaW5jbHVkZSA8bGliaW50bC5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPG1jaGVjay5oPgorI2luY2x1ZGUgPG9ic3RhY2suaD4KKyNpbmNsdWRlIDxzZWFyY2guaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpb19leHQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPHN5c3RlbS5oPgorI2luY2x1ZGUgIi4uL2xpYmVibC9saWJlYmxQLmgiCisKKworLyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24gKEZJTEUgKnN0cmVhbSwgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKK3ZvaWQgKCphcmdwX3Byb2dyYW1fdmVyc2lvbl9ob29rKSAoRklMRSAqLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqKSA9IHByaW50X3ZlcnNpb247CisKKy8qIEJ1ZyByZXBvcnQgYWRkcmVzcy4gICovCitjb25zdCBjaGFyICphcmdwX3Byb2dyYW1fYnVnX2FkZHJlc3MgPSBQQUNLQUdFX0JVR1JFUE9SVDsKKworCisvKiBWYWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGhhdmUgbm8gc2hvcnQgZm9ybS4gICovCisjZGVmaW5lIE9QVF9ERUZJTkVECTB4MTAwCisjZGVmaW5lIE9QVF9NQVJLX1dFQUsJMHgxMDEKKworLyogRGVmaW5pdGlvbnMgb2YgYXJndW1lbnRzIGZvciBhcmdwIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Cit7CisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTl8oIk91dHB1dCBzZWxlY3Rpb246IiksIDAgfSwKKyAgeyAiZGVidWctc3ltcyIsICdhJywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgZGVidWdnZXItb25seSBzeW1ib2xzIiksIDAgfSwKKyAgeyAiZGVmaW5lZC1vbmx5IiwgT1BUX0RFRklORUQsIE5VTEwsIDAsIE5fKCJEaXNwbGF5IG9ubHkgZGVmaW5lZCBzeW1ib2xzIiksCisgICAgMCB9LAorICB7ICJkeW5hbWljIiwgJ0QnLCBOVUxMLCAwLAorICAgIE5fKCJEaXNwbGF5IGR5bmFtaWMgc3ltYm9scyBpbnN0ZWFkIG9mIG5vcm1hbCBzeW1ib2xzIiksIDAgfSwKKyAgeyAiZXh0ZXJuLW9ubHkiLCAnZycsIE5VTEwsIDAsIE5fKCJEaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scyIpLCAwIH0sCisgIHsgInVuZGVmaW5lZC1vbmx5IiwgJ3UnLCBOVUxMLCAwLCBOXygiRGlzcGxheSBvbmx5IHVuZGVmaW5lZCBzeW1ib2xzIiksIDAgfSwKKyAgeyAicHJpbnQtYXJtYXAiLCAncycsIE5VTEwsIDAsCisgICAgTl8oIkluY2x1ZGUgaW5kZXggZm9yIHN5bWJvbHMgZnJvbSBhcmNoaXZlIG1lbWJlcnMiKSwgMCB9LAorCisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTl8oIk91dHB1dCBmb3JtYXQ6IiksIDAgfSwKKyAgeyAicHJpbnQtZmlsZS1uYW1lIiwgJ0EnLCBOVUxMLCAwLAorICAgIE5fKCJQcmludCBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSBldmVyeSBzeW1ib2wiKSwgMCB9LAorICB7IE5VTEwsICdvJywgTlVMTCwgT1BUSU9OX0hJRERFTiwgIlNhbWUgYXMgLUEiLCAwIH0sCisgIHsgImZvcm1hdCIsICdmJywgIkZPUk1BVCIsIDAsCisgICAgTl8oIlVzZSB0aGUgb3V0cHV0IGZvcm1hdCBGT1JNQVQuICBGT1JNQVQgY2FuIGJlIGBic2QnLCBgc3lzdicgb3IgYHBvc2l4Jy4gIFRoZSBkZWZhdWx0IGlzIGBzeXN2JyIpLAorICAgIDAgfSwKKyAgeyBOVUxMLCAnQicsIE5VTEwsIDAsIE5fKCJTYW1lIGFzIC0tZm9ybWF0PWJzZCIpLCAwIH0sCisgIHsgInBvcnRhYmlsaXR5IiwgJ1AnLCBOVUxMLCAwLCBOXygiU2FtZSBhcyAtLWZvcm1hdD1wb3NpeCIpLCAwIH0sCisgIHsgInJhZGl4IiwgJ3QnLCAiUkFESVgiLCAwLCBOXygiVXNlIFJBRElYIGZvciBwcmludGluZyBzeW1ib2wgdmFsdWVzIiksIDAgfSwKKyAgeyAibWFyay13ZWFrIiwgT1BUX01BUktfV0VBSywgTlVMTCwgMCwgTl8oIk1hcmsgd2VhayBzeW1ib2xzIiksIDAgfSwKKyAgeyAicHJpbnQtc2l6ZSIsICdTJywgTlVMTCwgMCwgTl8oIlByaW50IHNpemUgb2YgZGVmaW5lZCBzeW1ib2xzIiksIDAgfSwKKworICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgb3B0aW9uczoiKSwgMCB9LAorICB7ICJudW1lcmljLXNvcnQiLCAnbicsIE5VTEwsIDAsIE5fKCJTb3J0IHN5bWJvbHMgbnVtZXJpY2FsbHkgYnkgYWRkcmVzcyIpLAorICAgIDAgfSwKKyAgeyAibm8tc29ydCIsICdwJywgTlVMTCwgMCwgTl8oIkRvIG5vdCBzb3J0IHRoZSBzeW1ib2xzIiksIDAgfSwKKyAgeyAicmV2ZXJzZS1zb3J0IiwgJ3InLCBOVUxMLCAwLCBOXygiUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQiKSwgMCB9LAorICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJNaXNjZWxsYW5lb3VzOiIpLCAwIH0sCisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Cit9OworCisvKiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRvY1tdID0gTl8oIkxpc3Qgc3ltYm9scyBmcm9tIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iKTsKKworLyogU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgYXJnc19kb2NbXSA9IE5fKCJbRklMRS4uLl0iKTsKKworLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCitzdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Cit7CisgIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworCisvKiBQcmludCBzeW1ib2xzIGluIGZpbGUgbmFtZWQgRk5BTUUuICAqLworc3RhdGljIGludCBwcm9jZXNzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBib29sIG1vcmVfdGhhbl9vbmUpOworCisvKiBIYW5kbGUgY29udGVudCBvZiBhcmNoaXZlLiAgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2FyIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkgICAgICBjb25zdCBjaGFyICpzdWZmaXgpOworCisvKiBIYW5kbGUgRUxGIGZpbGUuICAqLworc3RhdGljIGludCBoYW5kbGVfZWxmIChFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCk7CisKKworI2RlZmluZSBJTlRFUk5BTF9FUlJPUihmbmFtZSkgXAorICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiJXM6IElOVEVSTkFMIEVSUk9SICVkICglcy0lcyk6ICVzIiksICAgICAgXAorCSBmbmFtZSwgX19MSU5FX18sIFZFUlNJT04sIF9fREFURV9fLCBlbGZfZXJybXNnICgtMSkpCisKKworLyogSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2Ygc3ltYm9scy4gICovCit0eXBlZGVmIHN0cnVjdCBHRWxmX1N5bVgKK3sKKyAgR0VsZl9TeW0gc3ltOworICBFbGYzMl9Xb3JkIHhuZHg7CisgIGNoYXIgKndoZXJlOworfSBHRWxmX1N5bVg7CisKKworLyogVXNlci1zZWxlY3RhYmxlIG9wdGlvbnMuICAqLworCisvKiBUaGUgc2VsZWN0ZWQgb3V0cHV0IGZvcm1hdC4gICovCitzdGF0aWMgZW51bQoreworICBmb3JtYXRfc3lzdiA9IDAsCisgIGZvcm1hdF9ic2QsCisgIGZvcm1hdF9wb3NpeAorfSBmb3JtYXQ7CisKKy8qIFByaW50IGRlZmluZWQsIHVuZGVmaW5lZCwgb3IgYm90aD8gICovCitzdGF0aWMgYm9vbCBoaWRlX3VuZGVmaW5lZDsKK3N0YXRpYyBib29sIGhpZGVfZGVmaW5lZDsKKworLyogUHJpbnQgbG9jYWwgc3ltYm9scyBhbHNvPyAgKi8KK3N0YXRpYyBib29sIGhpZGVfbG9jYWw7CisKKy8qIE5vbnplcm8gaWYgZnVsbCBmaWxlbmFtZSBzaG91bGQgcHJlY2VkZSBldmVyeSBzeW1ib2wuICAqLworc3RhdGljIGJvb2wgcHJpbnRfZmlsZV9uYW1lOworCisvKiBJZiB0cnVlIHByaW50IHNpemUgb2YgZGVmaW5lZCBzeW1ib2xzIGluIEJTRCBmb3JtYXQuICAqLworc3RhdGljIGJvb2wgcHJpbnRfc2l6ZTsKKworLyogSWYgdHJ1ZSBwcmludCBhcmNoaXZlIGluZGV4LiAgKi8KK3N0YXRpYyBib29sIHByaW50X2FybWFwOworCisvKiBJZiB0cnVlIHJldmVyc2Ugc29ydGluZy4gICovCitzdGF0aWMgYm9vbCByZXZlcnNlX3NvcnQ7CisKKy8qIFR5cGUgb2YgdGhlIHNlY3Rpb24gd2UgYXJlIHByaW50aW5nLiAgKi8KK3N0YXRpYyBHRWxmX1dvcmQgc3ltc2VjX3R5cGUgPSBTSFRfU1lNVEFCOworCisvKiBTb3J0aW5nIHNlbGVjdGlvbi4gICovCitzdGF0aWMgZW51bQoreworICBzb3J0X25hbWUgPSAwLAorICBzb3J0X251bWVyaWMsCisgIHNvcnRfbm9zb3J0Cit9IHNvcnQ7CisKKy8qIFJhZGl4IGZvciBwcmludGVkIG51bWJlcnMuICAqLworc3RhdGljIGVudW0KK3sKKyAgcmFkaXhfaGV4ID0gMCwKKyAgcmFkaXhfZGVjaW1hbCwKKyAgcmFkaXhfb2N0YWwKK30gcmFkaXg7CisKKy8qIElmIG5vbnplcm8gd2VhayBzeW1ib2xzIGFyZSBkaXN0aW5ndWlzaGVkIGZyb20gZ2xvYmFsIHN5bWJvbHMgYnkgYWRkaW5nCisgICBhIGAqJyBhZnRlciB0aGUgaWRlbnRpZnlpbmcgbGV0dGVyIGZvciB0aGUgc3ltYm9sIGNsYXNzIGFuZCB0eXBlLiAgKi8KK3N0YXRpYyBib29sIG1hcmtfd2VhazsKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByZW1haW5pbmc7CisgIGludCByZXN1bHQgPSAwOworCisgIC8qIE1ha2UgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIHBvc3NpYmxlLiAgKi8KKyAgbXRyYWNlICgpOworCisgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KKyAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZGluLCBGU0VUTE9DS0lOR19CWUNBTExFUik7CisgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKyAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZGVyciwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworCisgIC8qIFNldCBsb2NhbGUuICAqLworICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgY2F0YWxvZyBjYW4gYmUgZm91bmQuICAqLworICAodm9pZCkgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjYXRhbG9nLiAgKi8KKyAgKHZvaWQpIHRleHRkb21haW4gKFBBQ0tBR0UpOworCisgIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gICovCisgICh2b2lkKSBhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCk7CisKKyAgLyogVGVsbCB0aGUgbGlicmFyeSB3aGljaCB2ZXJzaW9uIHdlIGFyZSBleHBlY3RpbmcuICAqLworICAodm9pZCkgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIGlmIChyZW1haW5pbmcgPT0gYXJnYykKKyAgICAvKiBUaGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIG5hbWUgc28gd2UgdXNlIGEub3V0LiAgKi8KKyAgICByZXN1bHQgPSBwcm9jZXNzX2ZpbGUgKCJhLm91dCIsIGZhbHNlKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgYWxsIHRoZSByZW1haW5pbmcgZmlsZXMuICAqLworICAgICAgY29uc3QgYm9vbCBtb3JlX3RoYW5fb25lID0gcmVtYWluaW5nICsgMSA8IGFyZ2M7CisKKyAgICAgIGRvCisJcmVzdWx0IHw9IHByb2Nlc3NfZmlsZSAoYXJndltyZW1haW5pbmddLCBtb3JlX3RoYW5fb25lKTsKKyAgICAgIHdoaWxlICgrK3JlbWFpbmluZyA8IGFyZ2MpOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGZwcmludGYgKHN0cmVhbSwgIm5tICglcykgJXNcbiIsIFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIlwKK0NvcHlyaWdodCAoQykgJXMgUmVkIEhhdCwgSW5jLlxuXAorVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk9cblwKK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuXAorIiksICIyMDA1Iik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIldyaXR0ZW4gYnkgJXMuXG4iKSwgIlVscmljaCBEcmVwcGVyIik7Cit9CisKKworLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KK3N0YXRpYyBlcnJvcl90CitwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywKKwkgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBzd2l0Y2ggKGtleSkKKyAgICB7CisgICAgY2FzZSAnYSc6CisgICAgICAvKiBYWFggKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZic6CisgICAgICBpZiAoc3RyY21wIChhcmcsICJic2QiKSA9PSAwKQorCWZvcm1hdCA9IGZvcm1hdF9ic2Q7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInBvc2l4IikgPT0gMCkKKwlmb3JtYXQgPSBmb3JtYXRfcG9zaXg7CisgICAgICBlbHNlCisJLyogQmUgYnVnIGNvbXBhdGlibGUuICBUaGUgQkZEIGltcGxlbWVudGF0aW9uIGFsc28gZGVmYXVsdGVkIHRvCisJICAgdXNpbmcgdGhlIFN5c1YgZm9ybWF0IGlmIG5vdGhpbmcgZWxzZSBtYXRjaGVzLiAgKi8KKwlmb3JtYXQgPSBmb3JtYXRfc3lzdjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZyc6CisgICAgICBoaWRlX2xvY2FsID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbic6CisgICAgICBzb3J0ID0gc29ydF9udW1lcmljOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdwJzoKKyAgICAgIHNvcnQgPSBzb3J0X25vc29ydDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAndCc6CisgICAgICBpZiAoc3RyY21wIChhcmcsICIxMCIpID09IDAgfHwgc3RyY21wIChhcmcsICJkIikgPT0gMCkKKwlyYWRpeCA9IHJhZGl4X2RlY2ltYWw7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIjgiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAibyIpID09IDApCisJcmFkaXggPSByYWRpeF9vY3RhbDsKKyAgICAgIGVsc2UKKwlyYWRpeCA9IHJhZGl4X2hleDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAndSc6CisgICAgICBoaWRlX3VuZGVmaW5lZCA9IGZhbHNlOworICAgICAgaGlkZV9kZWZpbmVkID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQSc6CisgICAgY2FzZSAnbyc6CisgICAgICBwcmludF9maWxlX25hbWUgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdCJzoKKyAgICAgIGZvcm1hdCA9IGZvcm1hdF9ic2Q7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0QnOgorICAgICAgc3ltc2VjX3R5cGUgPSBTSFRfRFlOU1lNOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdQJzoKKyAgICAgIGZvcm1hdCA9IGZvcm1hdF9wb3NpeDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRfREVGSU5FRDoKKyAgICAgIGhpZGVfdW5kZWZpbmVkID0gdHJ1ZTsKKyAgICAgIGhpZGVfZGVmaW5lZCA9IGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVF9NQVJLX1dFQUs6CisgICAgICBtYXJrX3dlYWsgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdTJzoKKyAgICAgIHByaW50X3NpemUgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdzJzoKKyAgICAgIHByaW50X2FybWFwID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncic6CisgICAgICByZXZlcnNlX3NvcnQgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEFSR1BfRVJSX1VOS05PV047CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBPcGVuIHRoZSBmaWxlIGFuZCBkZXRlcm1pbmUgdGhlIHR5cGUuICAqLworc3RhdGljIGludAorcHJvY2Vzc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgYm9vbCBtb3JlX3RoYW5fb25lKQoreworICAvKiBPcGVuIHRoZSBmaWxlLiAgKi8KKyAgaW50IGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuICclcyciKSwgZm5hbWUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIE5vdyBnZXQgdGhlIEVMRiBkZXNjcmlwdG9yLiAgKi8KKyAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOworICBpZiAoZWxmICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGVsZl9raW5kIChlbGYpID09IEVMRl9LX0VMRikKKwl7CisJICBpbnQgcmVzdWx0ID0gaGFuZGxlX2VsZiAoZWxmLCBtb3JlX3RoYW5fb25lID8gIiIgOiBOVUxMLAorCQkJCSAgIGZuYW1lLCBOVUxMKTsKKworCSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKKwkgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKworCSAgaWYgKGNsb3NlIChmZCkgIT0gMCkKKwkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSBjbG9zZSAnJXMnIiksIGZuYW1lKTsKKworCSAgcmV0dXJuIHJlc3VsdDsKKwl9CisgICAgICBlbHNlIGlmIChlbGZfa2luZCAoZWxmKSA9PSBFTEZfS19BUikKKwl7CisJICBpbnQgcmVzdWx0ID0gaGFuZGxlX2FyIChmZCwgZWxmLCBOVUxMLCBmbmFtZSwgTlVMTCk7CisKKwkgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCisJICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisKKwkgIGlmIChjbG9zZSAoZmQpICE9IDApCisJICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBnZXR0ZXh0ICgid2hpbGUgY2xvc2UgJyVzJyIpLCBmbmFtZSk7CisKKwkgIHJldHVybiByZXN1bHQ7CisJfQorCisgICAgICAvKiBXZSBjYW5ub3QgaGFuZGxlIHRoaXMgdHlwZS4gIENsb3NlIHRoZSBkZXNjcmlwdG9yIGFueXdheS4gICovCisgICAgICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQorCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisgICAgfQorCisgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXM6IEZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIiksIGZuYW1lKTsKKworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50CitoYW5kbGVfYXIgKGludCBmZCwgRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm5hbWUsCisJICAgY29uc3QgY2hhciAqc3VmZml4KQoreworICBzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSkgKyAxOworICBzaXplX3QgcHJlZml4X2xlbiA9IHByZWZpeCAhPSBOVUxMID8gc3RybGVuIChwcmVmaXgpIDogMDsKKyAgY2hhciBuZXdfcHJlZml4W3ByZWZpeF9sZW4gKyBmbmFtZV9sZW4gKyAyXTsKKyAgc2l6ZV90IHN1ZmZpeF9sZW4gPSBzdWZmaXggIT0gTlVMTCA/IHN0cmxlbiAoc3VmZml4KSA6IDA7CisgIGNoYXIgbmV3X3N1ZmZpeFtzdWZmaXhfbGVuICsgMl07CisgIEVsZiAqc3ViZWxmOworICBFbGZfQ21kIGNtZCA9IEVMRl9DX1JFQURfTU1BUDsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgY2hhciAqY3AgPSBuZXdfcHJlZml4OworICBpZiAocHJlZml4ICE9IE5VTEwpCisgICAgY3AgPSBzdHBjcHkgKGNwLCBwcmVmaXgpOworICBjcCA9IHN0cGNweSAoY3AsIGZuYW1lKTsKKyAgc3RwY3B5IChjcCwgIlsiKTsKKworICBjcCA9IG5ld19zdWZmaXg7CisgIGlmIChzdWZmaXggIT0gTlVMTCkKKyAgICBjcCA9IHN0cGNweSAoY3AsIHN1ZmZpeCk7CisgIHN0cGNweSAoY3AsICJdIik7CisKKyAgLyogRmlyc3QgcHJpbnQgdGhlIGFyY2hpdmUgaW5kZXggaWYgdGhpcyBpcyB3YW50ZWQuICAqLworICBpZiAocHJpbnRfYXJtYXApCisgICAgeworICAgICAgRWxmX0Fyc3ltICphcnN5bSA9IGVsZl9nZXRhcnN5bSAoZWxmLCBOVUxMKTsKKworICAgICAgaWYgKGFyc3ltICE9IE5VTEwpCisJeworCSAgRWxmX0FyaGRyICphcmhkciA9IE5VTEw7CisJICBzaXplX3QgYXJoZHJfb2ZmID0gMDsJLyogTm90ZTogMCBpcyBubyB2YWxpZCBvZmZzZXQuICAqLworCisJICBwdXRzIChnZXR0ZXh0KCJcbkFyY2hpdmUgaW5kZXg6IikpOworCisJICB3aGlsZSAoYXJzeW0tPmFzX29mZiAhPSAwKQorCSAgICB7CisJICAgICAgaWYgKGFyaGRyX29mZiAhPSBhcnN5bS0+YXNfb2ZmCisJCSAgJiYgKGVsZl9yYW5kIChlbGYsIGFyc3ltLT5hc19vZmYpICE9IGFyc3ltLT5hc19vZmYKKwkJICAgICAgfHwgKHN1YmVsZiA9IGVsZl9iZWdpbiAoZmQsIGNtZCwgZWxmKSkgPT0gTlVMTAorCQkgICAgICB8fCAoYXJoZHIgPSBlbGZfZ2V0YXJoZHIgKHN1YmVsZikpID09IE5VTEwpKQorCQl7CisJCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJpbnZhbGlkIG9mZnNldCAlenUgZm9yIHN5bWJvbCAlcyIpLAorCQkJIGFyc3ltLT5hc19vZmYsIGFyc3ltLT5hc19uYW1lKTsKKwkJICBjb250aW51ZTsKKwkJfQorCisJICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiJXMgaW4gJXNcbiIpLCBhcnN5bS0+YXNfbmFtZSwgYXJoZHItPmFyX25hbWUpOworCisJICAgICAgKythcnN5bTsKKwkgICAgfQorCisJICBpZiAoZWxmX3JhbmQgKGVsZiwgU0FSTUFHKSAhPSBTQVJNQUcpCisJICAgIHsKKwkgICAgICBlcnJvciAoMCwgMCwKKwkJICAgICBnZXR0ZXh0ICgiY2Fubm90IHJlc2V0IGFyY2hpdmUgb2Zmc2V0IHRvIGJlZ2lubmluZyIpKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogUHJvY2VzcyBhbGwgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZS4gICovCisgIHdoaWxlICgoc3ViZWxmID0gZWxmX2JlZ2luIChmZCwgY21kLCBlbGYpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoZSB0aGUgaGVhZGVyIGZvciB0aGlzIGVsZW1lbnQuICAqLworICAgICAgRWxmX0FyaGRyICphcmhkciA9IGVsZl9nZXRhcmhkciAoc3ViZWxmKTsKKworICAgICAgLyogU2tpcCBvdmVyIHRoZSBpbmRleCBlbnRyaWVzLiAgKi8KKyAgICAgIGlmIChzdHJjbXAgKGFyaGRyLT5hcl9uYW1lLCAiLyIpICE9IDAKKwkgICYmIHN0cmNtcCAoYXJoZHItPmFyX25hbWUsICIvLyIpICE9IDApCisJeworCSAgaWYgKGVsZl9raW5kIChzdWJlbGYpID09IEVMRl9LX0VMRikKKwkgICAgcmVzdWx0IHw9IGhhbmRsZV9lbGYgKHN1YmVsZiwgbmV3X3ByZWZpeCwgYXJoZHItPmFyX25hbWUsCisJCQkJICBuZXdfc3VmZml4KTsKKwkgIGVsc2UgaWYgKGVsZl9raW5kIChzdWJlbGYpID09IEVMRl9LX0FSKQorCSAgICByZXN1bHQgfD0gaGFuZGxlX2FyIChmZCwgc3ViZWxmLCBuZXdfcHJlZml4LCBhcmhkci0+YXJfbmFtZSwKKwkJCQkgbmV3X3N1ZmZpeCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzJXMlczogZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiKSwKKwkJICAgICBuZXdfcHJlZml4LCBhcmhkci0+YXJfbmFtZSwgbmV3X3N1ZmZpeCk7CisJICAgICAgcmVzdWx0ID0gMTsKKwkgICAgfQorCX0KKworICAgICAgLyogR2V0IG5leHQgYXJjaGl2ZSBlbGVtZW50LiAgKi8KKyAgICAgIGNtZCA9IGVsZl9uZXh0IChzdWJlbGYpOworICAgICAgaWYgKGVsZl9lbmQgKHN1YmVsZikgIT0gMCkKKwlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIE1hcHBpbmcgb2YgcmFkaXggYW5kIGJpbmFyeSBjbGFzcyB0byBsZW5ndGguICAqLworc3RhdGljIGNvbnN0IGludCBsZW5ndGhfbWFwWzJdWzNdID0KK3sKKyAgW0VMRkNMQVNTMzIgLSAxXSA9CisgIHsKKyAgICBbcmFkaXhfaGV4XSA9IDgsCisgICAgW3JhZGl4X2RlY2ltYWxdID0gMTAsCisgICAgW3JhZGl4X29jdGFsXSA9IDExCisgIH0sCisgIFtFTEZDTEFTUzY0IC0gMV0gPQorICB7CisgICAgW3JhZGl4X2hleF0gPSAxNiwKKyAgICBbcmFkaXhfZGVjaW1hbF0gPSAyMCwKKyAgICBbcmFkaXhfb2N0YWxdID0gMjIKKyAgfQorfTsKKworCitzdHJ1Y3QgZ2xvYmFsX25hbWUKK3sKKyAgRHdhcmZfR2xvYmFsIGdsb2JhbDsKKyAgY29uc3QgY2hhciAqbmFtZTsKK307CisKKworc3RhdGljIGludAorZ2xvYmFsX2NvbXBhcmUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKyAgY29uc3QgRHdhcmZfR2xvYmFsICpnMSA9IChjb25zdCBEd2FyZl9HbG9iYWwgKikgcDE7CisgIGNvbnN0IER3YXJmX0dsb2JhbCAqZzIgPSAoY29uc3QgRHdhcmZfR2xvYmFsICopIHAyOworCisgIHJldHVybiBzdHJjbXAgKGcxLT5uYW1lLCBnMi0+bmFtZSk7Cit9CisKKworc3RhdGljIHZvaWQgKmdsb2JhbF9yb290OworCisKK3N0YXRpYyBpbnQKK2dldF9nbG9iYWwgKER3YXJmICpkYmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBEd2FyZl9HbG9iYWwgKmdsb2JhbCwKKwkgICAgdm9pZCAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgdHNlYXJjaCAobWVtY3B5ICh4bWFsbG9jIChzaXplb2YgKER3YXJmX0dsb2JhbCkpLCBnbG9iYWwsCisJCSAgIHNpemVvZiAoRHdhcmZfR2xvYmFsKSksCisJICAgJmdsb2JhbF9yb290LCBnbG9iYWxfY29tcGFyZSk7CisKKyAgcmV0dXJuIERXQVJGX0NCX09LOworfQorCisKK3N0cnVjdCBsb2NhbF9uYW1lCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKmZpbGU7CisgIER3YXJmX1dvcmQgbGluZW5vOworICBEd2FyZl9BZGRyIGxvd3BjOworICBEd2FyZl9BZGRyIGhpZ2hwYzsKK307CisKKworc3RhdGljIGludAorbG9jYWxfY29tcGFyZSAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQoreworICBzdHJ1Y3QgbG9jYWxfbmFtZSAqZzEgPSAoc3RydWN0IGxvY2FsX25hbWUgKikgcDE7CisgIHN0cnVjdCBsb2NhbF9uYW1lICpnMiA9IChzdHJ1Y3QgbG9jYWxfbmFtZSAqKSBwMjsKKyAgaW50IHJlc3VsdDsKKworICByZXN1bHQgPSBzdHJjbXAgKGcxLT5uYW1lLCBnMi0+bmFtZSk7CisgIGlmIChyZXN1bHQgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZzEtPmxvd3BjIDw9IGcyLT5sb3dwYyAmJiBnMS0+aGlnaHBjID49IGcyLT5oaWdocGMpCisJeworCSAgLyogZzIgaXMgY29udGFpbmVkIGluIGcxLiAgVXBkYXRlIHRoZSBkYXRhLiAgKi8KKwkgIGcyLT5sb3dwYyA9IGcxLT5sb3dwYzsKKwkgIGcyLT5oaWdocGMgPSBnMS0+aGlnaHBjOworCSAgcmVzdWx0ID0gMDsKKwl9CisgICAgICBlbHNlIGlmIChnMi0+bG93cGMgPD0gZzEtPmxvd3BjICYmIGcyLT5oaWdocGMgPj0gZzEtPmhpZ2hwYykKKwl7CisJICAvKiBnMSBpcyBjb250YWluZWQgaW4gZzIuICBVcGRhdGUgdGhlIGRhdGEuICAqLworCSAgZzEtPmxvd3BjID0gZzItPmxvd3BjOworCSAgZzEtPmhpZ2hwYyA9IGcyLT5oaWdocGM7CisJICByZXN1bHQgPSAwOworCX0KKyAgICAgIGVsc2UKKwlyZXN1bHQgPSBnMS0+bG93cGMgPCBnMi0+bG93cGMgPyAtMSA6IDE7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludAorZ2V0X3Zhcl9yYW5nZSAoRHdhcmZfRGllICpkaWUsIER3YXJmX1dvcmQgKmxvd3BjLCBEd2FyZl9Xb3JkICpoaWdocGMpCit7CisgIER3YXJmX0F0dHJpYnV0ZSBsb2NhdHRyX21lbTsKKyAgRHdhcmZfQXR0cmlidXRlICpsb2NhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9sb2NhdGlvbiwgJmxvY2F0dHJfbWVtKTsKKyAgaWYgIChsb2NhdHRyID09IE5VTEwpCisgICAgcmV0dXJuIDE7CisKKyAgRHdhcmZfTG9jICpsb2M7CisgIHNpemVfdCBubG9jOworICBpZiAoZHdhcmZfZ2V0bG9jbGlzdCAobG9jYXR0ciwgJmxvYywgJm5sb2MpICE9IDApCisgICAgcmV0dXJuIDE7CisKKyAgLyogSW50ZXJwcmV0IHRoZSBsb2NhdGlvbiBleHByZXNzaW9ucy4gICovCisgIC8vIFhYWCBGb3Igbm93IGp1c3QgdGhlIHNpbXBsZSBvbmU6CisgIGlmIChubG9jID09IDEgJiYgbG9jWzBdLmF0b20gPT0gRFdfT1BfYWRkcikKKyAgICB7CisgICAgICAqbG93cGMgPSAqaGlnaHBjID0gbG9jWzBdLm51bWJlcjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyB2b2lkICpsb2NhbF9yb290OworCisKK3N0YXRpYyB2b2lkCitnZXRfbG9jYWxfbmFtZXMgKER3YXJmICpkYmcpCit7CisgIER3YXJmX09mZiBvZmZzZXQgPSAwOworICBEd2FyZl9PZmYgb2xkX29mZnNldDsKKyAgc2l6ZV90IGhzaXplOworCisgIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgb2xkX29mZnNldCA9IG9mZnNldCwgJm9mZnNldCwgJmhzaXplLCBOVUxMLCBOVUxMLAorCQkgICAgICAgTlVMTCkgPT0gMCkKKyAgICB7CisgICAgICBEd2FyZl9EaWUgY3VkaWVfbWVtOworICAgICAgRHdhcmZfRGllICpjdWRpZSA9IGR3YXJmX29mZmRpZSAoZGJnLCBvbGRfb2Zmc2V0ICsgaHNpemUsICZjdWRpZV9tZW0pOworCisgICAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IHRoZSBDVSBESUUgdGhlcmUgaXMgbm8gbmVlZCB0byBnbyBvbiB3aXRoCisJIHRoaXMgQ1UuICAqLworICAgICAgaWYgKGN1ZGllID09IE5VTEwpCisJY29udGludWU7CisgICAgICAvKiBUaGlzIGJldHRlciBiZSBhIENVIERJRS4gICovCisgICAgICBpZiAoZHdhcmZfdGFnIChjdWRpZSkgIT0gRFdfVEFHX2NvbXBpbGVfdW5pdCkKKwljb250aW51ZTsKKworICAgICAgLyogR2V0IHRoZSBsaW5lIGluZm9ybWF0aW9uLiAgKi8KKyAgICAgIER3YXJmX0ZpbGVzICpmaWxlczsKKyAgICAgIHNpemVfdCBuZmlsZXM7CisgICAgICBpZiAoZHdhcmZfZ2V0c3JjZmlsZXMgKGN1ZGllLCAmZmlsZXMsICZuZmlsZXMpICE9IDApCisJY29udGludWU7CisKKyAgICAgIER3YXJmX0RpZSBkaWVfbWVtOworICAgICAgRHdhcmZfRGllICpkaWUgPSAmZGllX21lbTsKKyAgICAgIGlmIChkd2FyZl9jaGlsZCAoY3VkaWUsIGRpZSkgPT0gMCkKKwkvKiBJdGVyYXRlIG92ZXIgYWxsIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgQ1UgRElFLiAgKi8KKwlkbworCSAgeworCSAgICBpbnQgdGFnID0gZHdhcmZfdGFnIChkaWUpOworCSAgICBpZiAodGFnICE9IERXX1RBR19zdWJwcm9ncmFtICYmIHRhZyAhPSBEV19UQUdfdmFyaWFibGUpCisJICAgICAgY29udGludWU7CisKKwkgICAgLyogV2UgYXJlIGludGVyZXN0ZWQgaW4gZml2ZSBhdHRyaWJ1dGVzOiBuYW1lLCBkZWNsX2ZpbGUsCisJICAgICAgIGRlY2xfbGluZSwgbG93X3BjLCBhbmQgaGlnaF9wYy4gICovCisJICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKKwkgICAgRHdhcmZfQXR0cmlidXRlICphdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9uYW1lLCAmYXR0cl9tZW0pOworCSAgICBjb25zdCBjaGFyICpuYW1lID0gZHdhcmZfZm9ybXN0cmluZyAoYXR0cik7CisJICAgIGlmIChuYW1lID09IE5VTEwpCisJICAgICAgY29udGludWU7CisKKwkgICAgRHdhcmZfV29yZCBmaWxlaWR4OworCSAgICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9kZWNsX2ZpbGUsICZhdHRyX21lbSk7CisJICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGF0dHIsICZmaWxlaWR4KSAhPSAwIHx8IGZpbGVpZHggPj0gbmZpbGVzKQorCSAgICAgIGNvbnRpbnVlOworCisJICAgIER3YXJmX1dvcmQgbGluZW5vOworCSAgICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9kZWNsX2xpbmUsICZhdHRyX21lbSk7CisJICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGF0dHIsICZsaW5lbm8pICE9IDAgfHwgbGluZW5vID09IDApCisJICAgICAgY29udGludWU7CisKKwkgICAgRHdhcmZfQWRkciBsb3dwYzsKKwkgICAgRHdhcmZfQWRkciBoaWdocGM7CisJICAgIGlmICh0YWcgPT0gRFdfVEFHX3N1YnByb2dyYW0pCisJICAgICAgeworCQlpZiAoZHdhcmZfbG93cGMgKGRpZSwgJmxvd3BjKSAhPSAwCisJCSAgICB8fCBkd2FyZl9oaWdocGMgKGRpZSwgJmhpZ2hwYykgIT0gMCkKKwkJICBjb250aW51ZTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWlmIChnZXRfdmFyX3JhbmdlIChkaWUsICZsb3dwYywgJmhpZ2hwYykgIT0gMCkKKwkJICBjb250aW51ZTsKKwkgICAgICB9CisKKwkgICAgLyogV2UgaGF2ZSBhbGwgdGhlIGluZm9ybWF0aW9uLiAgQ3JlYXRlIGEgcmVjb3JkLiAgKi8KKwkgICAgc3RydWN0IGxvY2FsX25hbWUgKm5ld3AKKwkgICAgICA9IChzdHJ1Y3QgbG9jYWxfbmFtZSAqKSB4bWFsbG9jIChzaXplb2YgKCpuZXdwKSk7CisJICAgIG5ld3AtPm5hbWUgPSBuYW1lOworCSAgICBuZXdwLT5maWxlID0gZHdhcmZfZmlsZXNyYyAoZmlsZXMsIGZpbGVpZHgsIE5VTEwsIE5VTEwpOworCSAgICBuZXdwLT5saW5lbm8gPSBsaW5lbm87CisJICAgIG5ld3AtPmxvd3BjID0gbG93cGM7CisJICAgIG5ld3AtPmhpZ2hwYyA9IGhpZ2hwYzsKKworCSAgICAvKiBTaW5jZSB3ZSBjYW5ub3QgZGVhbGxvY2F0ZSBpbmRpdmlkdWFsIG1lbW9yeSB3ZSBkbyBub3QgdGVzdAorCSAgICAgICBmb3IgZHVwbGljYXRlcyBpbiB0aGUgdHJlZS4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYW55d2F5LiAgKi8KKwkgICAgaWYgKHRzZWFyY2ggKG5ld3AsICZsb2NhbF9yb290LCBsb2NhbF9jb21wYXJlKSA9PSBOVUxMKQorCSAgICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLAorCQkgICAgIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHNlYXJjaCB0cmVlIikpOworCSAgfQorCXdoaWxlIChkd2FyZl9zaWJsaW5nb2YgKGRpZSwgZGllKSA9PSAwKTsKKyAgICB9Cit9CisKKworLyogU2hvdyBzeW1ib2xzIGluIFN5c1YgZm9ybWF0LiAgKi8KK3N0YXRpYyB2b2lkCitzaG93X3N5bWJvbHNfc3lzdiAoRWJsICplYmwsIEdFbGZfV29yZCBzdHJuZHgsCisJCSAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKmZ1bGxuYW1lLAorCQkgICBHRWxmX1N5bVggKnN5bXMsIHNpemVfdCBuc3ltcywgaW50IGxvbmdlc3RfbmFtZSwKKwkJICAgaW50IGxvbmdlc3Rfd2hlcmUpCit7CisgIHNpemVfdCBzaG51bTsKKyAgaWYgKGVsZl9nZXRzaG51bSAoZWJsLT5lbGYsICZzaG51bSkgPCAwKQorICAgIElOVEVSTkFMX0VSUk9SIChmdWxsbmFtZSk7CisKKyAgYm9vbCBzY25uYW1lc19tYWxsb2NlZCA9IHNobnVtICogc2l6ZW9mIChjb25zdCBjaGFyICopID4gMTI4ICogMTAyNDsKKyAgY29uc3QgY2hhciAqKnNjbm5hbWVzOworICBpZiAoc2NubmFtZXNfbWFsbG9jZWQpCisgICAgc2NubmFtZXMgPSAoY29uc3QgY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjb25zdCBjaGFyICopICogc2hudW0pOworICBlbHNlCisgICAgc2NubmFtZXMgPSAoY29uc3QgY2hhciAqKikgYWxsb2NhIChzaXplb2YgKGNvbnN0IGNoYXIgKikgKiBzaG51bSk7CisgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KKyAgc2l6ZV90IHNoc3RybmR4OworICBpZiAoZWxmX2dldHNoc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7CisKKyAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gbmFtZXMuICAqLworICBFbGZfU2NuICpzY24gPSBOVUxMOworICBzaXplX3QgY250ID0gMTsKKyAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworCisgICAgICBhc3NlcnQgKGVsZl9uZHhzY24gKHNjbikgPT0gY250KyspOworCisgICAgICBzY25uYW1lc1tlbGZfbmR4c2NuIChzY24pXQorCT0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LAorCQkgICAgICBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKS0+c2hfbmFtZSk7CisgICAgfQorCisgIGludCBkaWdpdHMgPSBsZW5ndGhfbWFwW2dlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKSAtIDFdW3JhZGl4XTsKKworICAvKiBXZSBhbHdheXMgcHJpbnQgdGhpcyBwcm9sb2cuICAqLworICBpZiAocHJlZml4ID09IE5VTEwgfHwgMSkKKyAgICBwcmludGYgKGdldHRleHQgKCJcblxuU3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZnVsbG5hbWUpOworICBlbHNlCisgICAgcHJpbnRmIChnZXR0ZXh0ICgiXG5cblN5bWJvbHMgZnJvbSAlc1slc106XG5cbiIpLCBwcmVmaXgsIGZuYW1lKTsKKworICAvKiBUaGUgaGVhZGVyIGxpbmUuICAqLworICBwcmludGYgKGdldHRleHQgKCIlKnMlLSpzICUtKnMgQ2xhc3MgIFR5cGUgICAgICUtKnMgJSpzIFNlY3Rpb25cblxuIiksCisJICBwcmludF9maWxlX25hbWUgPyAoaW50KSBzdHJsZW4gKGZ1bGxuYW1lKSArIDE6IDAsICIiLAorCSAgbG9uZ2VzdF9uYW1lLCBzZ2V0dGV4dCAoInN5c3Z8TmFtZSIpLAorCSAgLyogVFJBTlM6IHRoZSAic3lzdnwiIHBhcnRzIG1ha2VzIHRoZSBzdHJpbmcgdW5pcXVlLiAgKi8KKwkgIGRpZ2l0cywgc2dldHRleHQgKCJzeXN2fFZhbHVlIiksCisJICAvKiBUUkFOUzogdGhlICJzeXN2fCIgcGFydHMgbWFrZXMgdGhlIHN0cmluZyB1bmlxdWUuICAqLworCSAgZGlnaXRzLCBzZ2V0dGV4dCAoInN5c3Z8U2l6ZSIpLAorCSAgLyogVFJBTlM6IHRoZSAic3lzdnwiIHBhcnRzIG1ha2VzIHRoZSBzdHJpbmcgdW5pcXVlLiAgKi8KKwkgIGxvbmdlc3Rfd2hlcmUsIHNnZXR0ZXh0ICgic3lzdnxMaW5lIikpOworCisgIC8qIFdoaWNoIGZvcm1hdCBzdHJpbmcgdG8gdXNlIChkaWZmZXJlbnQgcmFkaXggZm9yIG51bWJlcnMpLiAgKi8KKyAgY29uc3QgY2hhciAqZm10c3RyOworICBpZiAocmFkaXggPT0gcmFkaXhfaGV4KQorICAgIGZtdHN0ciA9ICIlLSpzfCUwKiIgUFJJeDY0ICJ8JS02c3wlLThzfCUqIiBQUkl4NjQgInwlKnN8JXNcbiI7CisgIGVsc2UgaWYgKHJhZGl4ID09IHJhZGl4X2RlY2ltYWwpCisgICAgZm10c3RyID0gIiUtKnN8JSoiIFBSSWQ2NCAifCUtNnN8JS04c3wlKiIgUFJJZDY0ICJ8JSpzfCVzXG4iOworICBlbHNlCisgICAgZm10c3RyID0gIiUtKnN8JTAqIiBQUklvNjQgInwlLTZzfCUtOHN8JSoiIFBSSW82NCAifCUqc3wlc1xuIjsKKworICAvKiBJdGVyYXRlIG92ZXIgYWxsIHN5bWJvbHMuICAqLworICBmb3IgKGNudCA9IDA7IGNudCA8IG5zeW1zOyArK2NudCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzeW1zdHIgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc3RybmR4LAorCQkJCSAgICAgICBzeW1zW2NudF0uc3ltLnN0X25hbWUpOworICAgICAgY2hhciBzeW1iaW5kYnVmWzUwXTsKKyAgICAgIGNoYXIgc3ltdHlwZWJ1Zls1MF07CisgICAgICBjaGFyIHNlY25hbWVidWZbMTAyNF07CisKKyAgICAgIC8qIElmIHdlIGhhdmUgdG8gcHJlY2VkZSB0aGUgbGluZSB3aXRoIHRoZSBmaWxlIG5hbWUuICAqLworICAgICAgaWYgKHByaW50X2ZpbGVfbmFtZSkKKwl7CisJICBmcHV0c191bmxvY2tlZCAoZnVsbG5hbWUsIHN0ZG91dCk7CisJICBwdXRjaGFyX3VubG9ja2VkICgnOicpOworCX0KKworICAgICAgLyogUHJpbnQgdGhlIGFjdHVhbCBzdHJpbmcuICAqLworICAgICAgcHJpbnRmIChmbXRzdHIsCisJICAgICAgbG9uZ2VzdF9uYW1lLCBzeW1zdHIsCisJICAgICAgZGlnaXRzLCBzeW1zW2NudF0uc3ltLnN0X3ZhbHVlLAorCSAgICAgIGVibF9zeW1ib2xfYmluZGluZ19uYW1lIChlYmwsCisJCQkJICAgICAgIEdFTEZfU1RfQklORCAoc3ltc1tjbnRdLnN5bS5zdF9pbmZvKSwKKwkJCQkgICAgICAgc3ltYmluZGJ1Ziwgc2l6ZW9mIChzeW1iaW5kYnVmKSksCisJICAgICAgZWJsX3N5bWJvbF90eXBlX25hbWUgKGVibCwgR0VMRl9TVF9UWVBFIChzeW1zW2NudF0uc3ltLnN0X2luZm8pLAorCQkJCSAgICBzeW10eXBlYnVmLCBzaXplb2YgKHN5bXR5cGVidWYpKSwKKwkgICAgICBkaWdpdHMsIHN5bXNbY250XS5zeW0uc3Rfc2l6ZSwgbG9uZ2VzdF93aGVyZSwgc3ltc1tjbnRdLndoZXJlLAorCSAgICAgIGVibF9zZWN0aW9uX25hbWUgKGVibCwgc3ltc1tjbnRdLnN5bS5zdF9zaG5keCwgc3ltc1tjbnRdLnhuZHgsCisJCQkJc2VjbmFtZWJ1Ziwgc2l6ZW9mIChzZWNuYW1lYnVmKSwgc2NubmFtZXMsCisJCQkJc2hudW0pKTsKKyAgICB9CisKKyAgaWYgKHNjbm5hbWVzX21hbGxvY2VkKQorICAgIGZyZWUgKHNjbm5hbWVzKTsKK30KKworCitzdGF0aWMgY2hhcgorY2xhc3NfdHlwZV9jaGFyIChHRWxmX1N5bSAqc3ltKQoreworICBpbnQgbG9jYWxfcCA9IEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfTE9DQUw7CisKKyAgLyogWFhYIEFkZCBzdXBwb3J0IGZvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgdHlwZXMgYW5kIGNsYXNzZXMuICAqLworICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQUJTKQorICAgIHJldHVybiBsb2NhbF9wID8gJ2EnIDogJ0EnOworCisgIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRikKKyAgICAvKiBVbmRlZmluZWQgc3ltYm9scyBtdXN0IGJlIGdsb2JhbC4gICovCisgICAgcmV0dXJuICdVJzsKKworICBjaGFyIHJlc3VsdCA9ICJORFRTRkIgICAgICAgICAgIltHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbyldOworCisgIHJldHVybiBsb2NhbF9wID8gdG9sb3dlciAocmVzdWx0KSA6IHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZAorc2hvd19zeW1ib2xzX2JzZCAoRWxmICplbGYsIEdFbGZfV29yZCBzdHJuZHgsCisJCSAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqZnVsbG5hbWUsCisJCSAgR0VsZl9TeW1YICpzeW1zLCBzaXplX3QgbnN5bXMpCit7CisgIGludCBkaWdpdHMgPSBsZW5ndGhfbWFwW2dlbGZfZ2V0Y2xhc3MgKGVsZikgLSAxXVtyYWRpeF07CisKKyAgaWYgKHByZWZpeCAhPSBOVUxMICYmICEgcHJpbnRfZmlsZV9uYW1lKQorICAgIHByaW50ZiAoIlxuJXM6XG4iLCBmbmFtZSk7CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZtdHN0cnNbXSA9CisgICAgeworICAgICAgW3JhZGl4X2hleF0gPSAiJTAqIiBQUkl4NjQgIiAlYyVzICVzXG4iLAorICAgICAgW3JhZGl4X2RlY2ltYWxdID0gIiUqIiBQUklkNjQgIiAlYyVzICVzXG4iLAorICAgICAgW3JhZGl4X29jdGFsXSA9ICIlMCoiIFBSSW82NCAiICVjJXMgJXNcbiIKKyAgICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2ZtdHN0cnNbXSA9CisgICAgeworICAgICAgW3JhZGl4X2hleF0gPSAiJTIkMCoxJCIgUFJJeDY0ICIgJTckMCo2JCIgUFJJeDY0ICIgJTMkYyU0JHMgJTUkc1xuIiwKKyAgICAgIFtyYWRpeF9kZWNpbWFsXSA9ICIlMiQqMSQiIFBSSWQ2NCAiICU3JCo2JCIgUFJJZDY0ICIgJTMkYyU0JHMgJTUkc1xuIiwKKyAgICAgIFtyYWRpeF9vY3RhbF0gPSAiJTIkMCoxJCIgUFJJbzY0ICIgJTckMCo2JCIgUFJJbzY0ICIgJTMkYyU0JHMgJTUkc1xuIgorICAgIH07CisKKyAgLyogSXRlcmF0ZSBvdmVyIGFsbCBzeW1ib2xzLiAgKi8KKyAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbnN5bXM7ICsrY250KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnN5bXN0ciA9IGVsZl9zdHJwdHIgKGVsZiwgc3RybmR4LCBzeW1zW2NudF0uc3ltLnN0X25hbWUpOworCisgICAgICAvKiBQcmludGluZyBlbnRyaWVzIHdpdGggYSB6ZXJvLWxlbmd0aCBuYW1lIG1ha2VzIHRoZSBvdXRwdXQKKwkgbm90IHZlcnkgd2VsbCBwYXJzZWFibGUuICBTaW5jZSB0aGVzZSBlbnRyaWVzIGRvbid0IGNhcnJ5CisJIG11Y2ggaW5mb3JtYXRpb24gd2UgbGVhdmUgdGhlbSBvdXQuICAqLworICAgICAgaWYgKHN5bXN0clswXSA9PSAnXDAnKQorCWNvbnRpbnVlOworCisgICAgICAvKiBJZiB3ZSBoYXZlIHRvIHByZWNlZGUgdGhlIGxpbmUgd2l0aCB0aGUgZmlsZSBuYW1lLiAgKi8KKyAgICAgIGlmIChwcmludF9maWxlX25hbWUpCisJeworCSAgZnB1dHNfdW5sb2NrZWQgKGZ1bGxuYW1lLCBzdGRvdXQpOworCSAgcHV0Y2hhcl91bmxvY2tlZCAoJzonKTsKKwl9CisKKyAgICAgIGlmIChzeW1zW2NudF0uc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKKwlwcmludGYgKCIlKnMgVSVzICVzXG4iLAorCQlkaWdpdHMsICIiLAorCQltYXJrX3dlYWsKKwkJPyAoR0VMRl9TVF9CSU5EIChzeW1zW2NudF0uc3ltLnN0X2luZm8pID09IFNUQl9XRUFLCisJCSAgID8gIioiIDogIiAiKQorCQk6ICIiLAorCQllbGZfc3RycHRyIChlbGYsIHN0cm5keCwgc3ltc1tjbnRdLnN5bS5zdF9uYW1lKSk7CisgICAgICBlbHNlCisJcHJpbnRmIChwcmludF9zaXplID8gc2ZtdHN0cnNbcmFkaXhdIDogZm10c3Ryc1tyYWRpeF0sCisJCWRpZ2l0cywgc3ltc1tjbnRdLnN5bS5zdF92YWx1ZSwKKwkJY2xhc3NfdHlwZV9jaGFyICgmc3ltc1tjbnRdLnN5bSksCisJCW1hcmtfd2VhaworCQk/IChHRUxGX1NUX0JJTkQgKHN5bXNbY250XS5zeW0uc3RfaW5mbykgPT0gU1RCX1dFQUsKKwkJICAgPyAiKiIgOiAiICIpCisJCTogIiIsCisJCWVsZl9zdHJwdHIgKGVsZiwgc3RybmR4LCBzeW1zW2NudF0uc3ltLnN0X25hbWUpLAorCQlkaWdpdHMsICh1aW50NjRfdCkgc3ltc1tjbnRdLnN5bS5zdF9zaXplKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3Nob3dfc3ltYm9sc19wb3NpeCAoRWxmICplbGYsIEdFbGZfV29yZCBzdHJuZHgsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJICAgIGNvbnN0IGNoYXIgKmZ1bGxuYW1lLCBHRWxmX1N5bVggKnN5bXMsIHNpemVfdCBuc3ltcykKK3sKKyAgaWYgKHByZWZpeCAhPSBOVUxMICYmICEgcHJpbnRfZmlsZV9uYW1lKQorICAgIHByaW50ZiAoIiVzOlxuIiwgZnVsbG5hbWUpOworCisgIGNvbnN0IGNoYXIgKmZtdHN0cjsKKyAgaWYgKHJhZGl4ID09IHJhZGl4X2hleCkKKyAgICBmbXRzdHIgPSAiJXMgJWMlcyAlMCoiIFBSSXg2NCAiICUwKiIgUFJJeDY0ICJcbiI7CisgIGVsc2UgaWYgKHJhZGl4ID09IHJhZGl4X2RlY2ltYWwpCisgICAgZm10c3RyID0gIiVzICVjJXMgJSoiIFBSSWQ2NCAiICUqIiBQUklkNjQgIlxuIjsKKyAgZWxzZQorICAgIGZtdHN0ciA9ICIlcyAlYyVzICUwKiIgUFJJbzY0ICIgJTAqIiBQUklvNjQgIlxuIjsKKworICBpbnQgZGlnaXRzID0gbGVuZ3RoX21hcFtnZWxmX2dldGNsYXNzIChlbGYpIC0gMV1bcmFkaXhdOworCisgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgc3ltYm9scy4gICovCisgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IG5zeW1zOyArK2NudCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzeW1zdHIgPSBlbGZfc3RycHRyIChlbGYsIHN0cm5keCwgc3ltc1tjbnRdLnN5bS5zdF9uYW1lKTsKKworICAgICAgLyogUHJpbnRpbmcgZW50cmllcyB3aXRoIGEgemVyby1sZW5ndGggbmFtZSBtYWtlcyB0aGUgb3V0cHV0CisJIG5vdCB2ZXJ5IHdlbGwgcGFyc2VhYmxlLiAgU2luY2UgdGhlc2UgZW50cmllcyBkb24ndCBjYXJyeQorCSBtdWNoIGluZm9ybWF0aW9uIHdlIGxlYXZlIHRoZW0gb3V0LiAgKi8KKyAgICAgIGlmIChzeW1zdHJbMF0gPT0gJ1wwJykKKwljb250aW51ZTsKKworICAgICAgLyogSWYgd2UgaGF2ZSB0byBwcmVjZWRlIHRoZSBsaW5lIHdpdGggdGhlIGZpbGUgbmFtZS4gICovCisgICAgICBpZiAocHJpbnRfZmlsZV9uYW1lKQorCXsKKwkgIGZwdXRzX3VubG9ja2VkIChmdWxsbmFtZSwgc3Rkb3V0KTsKKwkgIHB1dGNoYXJfdW5sb2NrZWQgKCc6Jyk7CisJICBwdXRjaGFyX3VubG9ja2VkICgnICcpOworCX0KKworICAgICAgcHJpbnRmIChmbXRzdHIsCisJICAgICAgc3ltc3RyLAorCSAgICAgIGNsYXNzX3R5cGVfY2hhciAoJnN5bXNbY250XS5zeW0pLAorCSAgICAgIG1hcmtfd2VhaworCSAgICAgID8gKEdFTEZfU1RfQklORCAoc3ltc1tjbnRdLnN5bS5zdF9pbmZvKSA9PSBTVEJfV0VBSyA/ICIqIiA6ICIgIikKKwkgICAgICA6ICIiLAorCSAgICAgIGRpZ2l0cywgc3ltc1tjbnRdLnN5bS5zdF92YWx1ZSwKKwkgICAgICBkaWdpdHMsIHN5bXNbY250XS5zeW0uc3Rfc2l6ZSk7CisgICAgfQorfQorCisKKy8qIE1heGltdW0gc2l6ZSBvZiBtZW1vcnkgd2UgYWxsb2NhdGUgb24gdGhlIHN0YWNrLiAgKi8KKyNkZWZpbmUgTUFYX1NUQUNLX0FMTE9DCTY1NTM2CisKK3N0YXRpYyB2b2lkCitzaG93X3N5bWJvbHMgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsIEVsZl9TY24gKnNjbiwgRWxmX1NjbiAqeG5keHNjbiwKKwkgICAgICBHRWxmX1NoZHIgKnNoZHIsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm5hbWUsCisJICAgICAgY29uc3QgY2hhciAqZnVsbG5hbWUpCit7CisgIGludCBzb3J0X2J5X25hbWUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKKyAgICB7CisgICAgICBHRWxmX1N5bVggKnMxID0gKEdFbGZfU3ltWCAqKSBwMTsKKyAgICAgIEdFbGZfU3ltWCAqczIgPSAoR0VsZl9TeW1YICopIHAyOworICAgICAgaW50IHJlc3VsdDsKKworICAgICAgcmVzdWx0ID0gc3RyY21wIChlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgczEtPnN5bS5zdF9uYW1lKSwKKwkJICAgICAgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rLCBzMi0+c3ltLnN0X25hbWUpKTsKKworICAgICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IC1yZXN1bHQgOiByZXN1bHQ7CisgICAgfQorCisgIGludCBzb3J0X2J5X2FkZHJlc3MgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKKyAgICB7CisgICAgICBHRWxmX1N5bVggKnMxID0gKEdFbGZfU3ltWCAqKSBwMTsKKyAgICAgIEdFbGZfU3ltWCAqczIgPSAoR0VsZl9TeW1YICopIHAyOworCisgICAgICBpbnQgcmVzdWx0ID0gKHMxLT5zeW0uc3RfdmFsdWUgPCBzMi0+c3ltLnN0X3ZhbHVlCisJCSAgICA/IC0xIDogKHMxLT5zeW0uc3RfdmFsdWUgPT0gczItPnN5bS5zdF92YWx1ZSA/IDAgOiAxKSk7CisKKyAgICAgIHJldHVybiByZXZlcnNlX3NvcnQgPyAtcmVzdWx0IDogcmVzdWx0OworICAgIH0KKworICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCisgIHNpemVfdCBzaHN0cm5keDsKKyAgaWYgKGVsZl9nZXRzaHN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOworCisgIC8qIFRoZSBzZWN0aW9uIGlzIHRoYXQgbGFyZ2UuICAqLworICBzaXplX3Qgc2l6ZSA9IHNoZHItPnNoX3NpemU7CisgIC8qIE9uZSBlbnRyeSBpcyB0aGlzIGxhcmdlLiAgKi8KKyAgc2l6ZV90IGVudHNpemUgPSBzaGRyLT5zaF9lbnRzaXplOworCisgIC8qIENvbnNpc3RlbmN5IGNoZWNrcy4gICovCisgIGlmIChlbnRzaXplICE9IGdlbGZfZnNpemUgKGVibC0+ZWxmLCBFTEZfVF9TWU0sIDEsIGVoZHItPmVfdmVyc2lvbikpCisgICAgZXJyb3IgKDAsIDAsCisJICAgZ2V0dGV4dCAoIiVzOiBlbnRyeSBzaXplIGluIHNlY3Rpb24gYCVzJyBpcyBub3Qgd2hhdCB3ZSBleHBlY3QiKSwKKwkgICBmdWxsbmFtZSwgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSk7CisgIGVsc2UgaWYgKHNpemUgJSBlbnRzaXplICE9IDApCisgICAgZXJyb3IgKDAsIDAsCisJICAgZ2V0dGV4dCAoIiVzOiBzaXplIG9mIHNlY3Rpb24gYCVzJyBpcyBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZSIpLAorCSAgIGZ1bGxuYW1lLCBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpKTsKKworICAvKiBDb21wdXRlIG51bWJlciBvZiBlbnRyaWVzLiAgSGFuZGxlIGJ1Z2d5IGVudHNpemUgdmFsdWVzLiAgKi8KKyAgc2l6ZV90IG5lbnRyaWVzID0gc2l6ZSAvIChlbnRzaXplID86IDEpOworCisKKyNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCisjZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCisgIHN0cnVjdCBvYnN0YWNrIHdoZXJlb2I7CisgIG9ic3RhY2tfaW5pdCAoJndoZXJlb2IpOworCisgIC8qIEdldCBhIERXQVJGIGRlYnVnZ2luZyBkZXNjcmlwdG9yLiAgSXQncyBubyBwcm9ibGVtIGlmIHRoaXMgaXNuJ3QKKyAgICAgcG9zc2libGUuICBXZSBqdXN0IHdvbid0IHByaW50IGFueSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCisgIER3YXJmICpkYmcgPSBOVUxMOworICBpZiAoZm9ybWF0ID09IGZvcm1hdF9zeXN2KQorICAgIHsKKyAgICAgIGRiZyA9IGR3YXJmX2JlZ2luX2VsZiAoZWJsLT5lbGYsIERXQVJGX0NfUkVBRCwgTlVMTCk7CisgICAgICBpZiAoZGJnICE9IE5VTEwpCisJeworCSAgKHZvaWQpIGR3YXJmX2dldHB1Ym5hbWVzIChkYmcsIGdldF9nbG9iYWwsIE5VTEwsIDApOworCisJICBnZXRfbG9jYWxfbmFtZXMgKGRiZyk7CisJfQorICAgIH0KKworICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5LgorCisgICAgIFhYWCBXZSBjYW4gdXNlIGEgZGlydHkgdHJpY2sgaGVyZS4gIFNpbmNlIEdFbGZfU3ltID09IEVsZjY0X1N5bSB3ZQorICAgICBjYW4gdXNlIHRoZSBkYXRhIG1lbW9yeSBpbnN0ZWFkIG9mIGNvcHlpbmcgYWdhaW4gaWYgd2hhdCB3ZSByZWFkCisgICAgIGlzIGEgNjQgYml0IGZpbGUuICAqLworICBHRWxmX1N5bVggKnN5bV9tZW07CisgIGlmIChuZW50cmllcyAqIHNpemVvZiAoR0VsZl9TeW1YKSA8IE1BWF9TVEFDS19BTExPQykKKyAgICBzeW1fbWVtID0gKEdFbGZfU3ltWCAqKSBhbGxvY2EgKG5lbnRyaWVzICogc2l6ZW9mIChHRWxmX1N5bVgpKTsKKyAgZWxzZQorICAgIHN5bV9tZW0gPSAoR0VsZl9TeW1YICopIHhtYWxsb2MgKG5lbnRyaWVzICogc2l6ZW9mIChHRWxmX1N5bVgpKTsKKworICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLworICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworICBFbGZfRGF0YSAqeG5keGRhdGEgPSBlbGZfZ2V0ZGF0YSAoeG5keHNjbiwgTlVMTCk7CisgIGlmIChkYXRhID09IE5VTEwgfHwgKHhuZHhzY24gIT0gTlVMTCAmJiB4bmR4ZGF0YSA9PSBOVUxMKSkKKyAgICBJTlRFUk5BTF9FUlJPUiAoZnVsbG5hbWUpOworCisgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgc3ltYm9scy4gICovCisgIGludCBsb25nZXN0X25hbWUgPSA0OworICBpbnQgbG9uZ2VzdF93aGVyZSA9IDQ7CisgIHNpemVfdCBuZW50cmllc191c2VkID0gMDsKKyAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbmVudHJpZXM7ICsrY250KQorICAgIHsKKyAgICAgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bXNobmR4IChkYXRhLCB4bmR4ZGF0YSwgY250LAorCQkJCQkmc3ltX21lbVtuZW50cmllc191c2VkXS5zeW0sCisJCQkJCSZzeW1fbWVtW25lbnRyaWVzX3VzZWRdLnhuZHgpOworICAgICAgaWYgKHN5bSA9PSBOVUxMKQorCUlOVEVSTkFMX0VSUk9SIChmdWxsbmFtZSk7CisKKyAgICAgIC8qIEZpbHRlciBvdXQgYWRtaW5pc3RyYXRpdmUgc3ltYm9scyB3aXRob3V0IGEgbmFtZSBhbmQgdGhvc2UKKwkgZGVzZWxlY3RlZCBieSB0aGVyIHVzZXIgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9ucy4gICovCisgICAgICBpZiAoKGhpZGVfdW5kZWZpbmVkICYmIHN5bS0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQorCSAgfHwgKGhpZGVfZGVmaW5lZCAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9VTkRFRikKKwkgIHx8IChoaWRlX2xvY2FsICYmIEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpKQorCWNvbnRpbnVlOworCisgICAgICBzeW1fbWVtW25lbnRyaWVzX3VzZWRdLndoZXJlID0gIiI7CisgICAgICBpZiAoZm9ybWF0ID09IGZvcm1hdF9zeXN2KQorCXsKKwkgIGNvbnN0IGNoYXIgKnN5bXN0ciA9IGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rLAorCQkJCQkgICBzeW0tPnN0X25hbWUpOworCisJICBsb25nZXN0X25hbWUgPSBNQVggKChzaXplX3QpIGxvbmdlc3RfbmFtZSwgc3RybGVuIChzeW1zdHIpKTsKKworCSAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGCisJICAgICAgJiYgR0VMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTAorCSAgICAgICYmIGdsb2JhbF9yb290ICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBEd2FyZl9HbG9iYWwgZmFrZSA9IHsgLm5hbWUgPSBzeW1zdHIgfTsKKwkgICAgICBEd2FyZl9HbG9iYWwgKipmb3VuZCA9IHRmaW5kICgmZmFrZSwgJmdsb2JhbF9yb290LAorCQkJCQkgICAgZ2xvYmFsX2NvbXBhcmUpOworCSAgICAgIGlmIChmb3VuZCAhPSBOVUxMKQorCQl7CisJCSAgRHdhcmZfRGllIGRpZV9tZW07CisJCSAgRHdhcmZfRGllICpkaWUgPSBkd2FyZl9vZmZkaWUgKGRiZywgKCpmb3VuZCktPmRpZV9vZmZzZXQsCisJCQkJCQkgJmRpZV9tZW0pOworCisJCSAgRHdhcmZfRGllIGN1ZGllX21lbTsKKwkJICBEd2FyZl9EaWUgKmN1ZGllID0gTlVMTDsKKworCQkgIER3YXJmX0FkZHIgbG93cGM7CisJCSAgRHdhcmZfQWRkciBoaWdocGM7CisJCSAgaWYgKGRpZSAhPSBOVUxMCisJCSAgICAgICYmIGR3YXJmX2xvd3BjIChkaWUsICZsb3dwYykgPT0gMAorCQkgICAgICAmJiBsb3dwYyA8PSBzeW0tPnN0X3ZhbHVlCisJCSAgICAgICYmIGR3YXJmX2hpZ2hwYyAoZGllLCAmaGlnaHBjKSA9PSAwCisJCSAgICAgICYmIGhpZ2hwYyA+IHN5bS0+c3RfdmFsdWUpCisJCSAgICBjdWRpZSA9IGR3YXJmX29mZmRpZSAoZGJnLCAoKmZvdW5kKS0+Y3Vfb2Zmc2V0LAorCQkJCQkgICZjdWRpZV9tZW0pOworCQkgIGlmIChjdWRpZSAhPSBOVUxMKQorCQkgICAgeworCQkgICAgICBEd2FyZl9MaW5lICpsaW5lID0gZHdhcmZfZ2V0c3JjX2RpZSAoY3VkaWUsCisJCQkJCQkJICAgc3ltLT5zdF92YWx1ZSk7CisJCSAgICAgIGlmIChsaW5lICE9IE5VTEwpCisJCQl7CisJCQkgIC8qIFdlIGZvdW5kIHRoZSBsaW5lLiAgKi8KKwkJCSAgaW50IGxpbmVubzsKKwkJCSAgKHZvaWQpIGR3YXJmX2xpbmVubyAobGluZSwgJmxpbmVubyk7CisJCQkgIGludCBuOworCQkJICBuID0gb2JzdGFja19wcmludGYgKCZ3aGVyZW9iLCAiJXM6JWQlYyIsCisJCQkJCSAgICAgIGJhc2VuYW1lIChkd2FyZl9saW5lc3JjIChsaW5lLAorCQkJCQkJCQkgICAgICAgTlVMTCwKKwkJCQkJCQkJICAgICAgIE5VTEwpKSwKKwkJCQkJICAgICAgbGluZW5vLCAnXDAnKTsKKwkJCSAgc3ltX21lbVtuZW50cmllc191c2VkXS53aGVyZQorCQkJICAgID0gb2JzdGFja19maW5pc2ggKCZ3aGVyZW9iKTsKKworCQkJICAvKiBUaGUgcmV0dXJuIHZhbHVlIG9mIG9ic3RhY2tfcHJpbnQgaW5jbHVkZWQgdGhlCisJCQkgICAgIE5VTCBieXRlLCBzbyBzdWJ0cmFjdCBvbmUuICAqLworCQkJICBpZiAoLS1uID4gKGludCkgbG9uZ2VzdF93aGVyZSkKKwkJCSAgICBsb25nZXN0X3doZXJlID0gKHNpemVfdCkgbjsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIC8qIFRyeSB0byBmaW5kIHRoZSBzeW1vbCBhbW9uZyB0aGUgbG9jYWwgc3ltYm9scy4gICovCisJICBpZiAoc3ltX21lbVtuZW50cmllc191c2VkXS53aGVyZVswXSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgc3RydWN0IGxvY2FsX25hbWUgZmFrZSA9CisJCXsKKwkJICAubmFtZSA9IHN5bXN0ciwKKwkJICAubG93cGMgPSBzeW0tPnN0X3ZhbHVlLAorCQkgIC5oaWdocGMgPSBzeW0tPnN0X3ZhbHVlLAorCQl9OworCSAgICAgIHN0cnVjdCBsb2NhbF9uYW1lICoqZm91bmQgPSB0ZmluZCAoJmZha2UsICZsb2NhbF9yb290LAorCQkJCQkJIGxvY2FsX2NvbXBhcmUpOworCSAgICAgIGlmIChmb3VuZCAhPSBOVUxMKQorCQl7CisJCSAgLyogV2UgZm91bmQgdGhlIGxpbmUuICAqLworCQkgIGludCBuID0gb2JzdGFja19wcmludGYgKCZ3aGVyZW9iLCAiJXM6JSIgUFJJdTY0ICIlYyIsCisJCQkJCSAgYmFzZW5hbWUgKCgqZm91bmQpLT5maWxlKSwKKwkJCQkJICAoKmZvdW5kKS0+bGluZW5vLAorCQkJCQkgICdcMCcpOworCQkgIHN5bV9tZW1bbmVudHJpZXNfdXNlZF0ud2hlcmUgPSBvYnN0YWNrX2ZpbmlzaCAoJndoZXJlb2IpOworCisJCSAgLyogVGhlIHJldHVybiB2YWx1ZSBvZiBvYnN0YWNrX3ByaW50IGluY2x1ZGVkIHRoZQorCQkgICAgIE5VTCBieXRlLCBzbyBzdWJ0cmFjdCBvbmUuICAqLworCQkgIGlmICgtLW4gPiAoaW50KSBsb25nZXN0X3doZXJlKQorCQkgICAgbG9uZ2VzdF93aGVyZSA9IChzaXplX3QpIG47CisJCX0KKwkgICAgfQorCX0KKworICAgICAgLyogV2UgdXNlIHRoaXMgZW50cnkuICAqLworICAgICAgKytuZW50cmllc191c2VkOworICAgIH0KKyAgLyogTm93IHdlIGtub3cgdGhlIGV4YWN0IG51bWJlci4gICovCisgIG5lbnRyaWVzID0gbmVudHJpZXNfdXNlZDsKKworICAvKiBTb3J0IHRoZSBlbnRyaWVzIGFjY29yZGluZyB0byB0aGUgdXNlcnMgd2lzaGVzLiAgKi8KKyAgaWYgKHNvcnQgPT0gc29ydF9uYW1lKQorICAgIHFzb3J0IChzeW1fbWVtLCBuZW50cmllcywgc2l6ZW9mIChHRWxmX1N5bVgpLCBzb3J0X2J5X25hbWUpOworICBlbHNlIGlmIChzb3J0ID09IHNvcnRfbnVtZXJpYykKKyAgICBxc29ydCAoc3ltX21lbSwgbmVudHJpZXMsIHNpemVvZiAoR0VsZl9TeW1YKSwgc29ydF9ieV9hZGRyZXNzKTsKKworICAvKiBGaW5hbGx5IHByaW50IGFjY29yZGluZyB0byB0aGUgdXNlcnMgc2VsZWN0aW9uLiAgKi8KKyAgc3dpdGNoIChmb3JtYXQpCisgICAgeworICAgIGNhc2UgZm9ybWF0X3N5c3Y6CisgICAgICBzaG93X3N5bWJvbHNfc3lzdiAoZWJsLCBzaGRyLT5zaF9saW5rLCBwcmVmaXgsIGZuYW1lLAorCQkJIGZ1bGxuYW1lLCBzeW1fbWVtLCBuZW50cmllcywgbG9uZ2VzdF9uYW1lLAorCQkJIGxvbmdlc3Rfd2hlcmUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGZvcm1hdF9ic2Q6CisgICAgICBzaG93X3N5bWJvbHNfYnNkIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgcHJlZml4LCBmbmFtZSwgZnVsbG5hbWUsCisJCQlzeW1fbWVtLCBuZW50cmllcyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZm9ybWF0X3Bvc2l4OgorICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQgKGZvcm1hdCA9PSBmb3JtYXRfcG9zaXgpOworICAgICAgc2hvd19zeW1ib2xzX3Bvc2l4IChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgcHJlZml4LCBmdWxsbmFtZSwgc3ltX21lbSwKKwkJCSAgbmVudHJpZXMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIEZyZWUgYWxsIG1lbW9yeS4gICovCisgIGlmIChuZW50cmllcyAqIHNpemVvZiAoR0VsZl9TeW0pID49IE1BWF9TVEFDS19BTExPQykKKyAgICBmcmVlIChzeW1fbWVtKTsKKworICBvYnN0YWNrX2ZyZWUgKCZ3aGVyZW9iLCBOVUxMKTsKKworICBpZiAoZGJnICE9IE5VTEwpCisgICAgeworICAgICAgdGRlc3Ryb3kgKGdsb2JhbF9yb290LCBmcmVlKTsKKyAgICAgIGdsb2JhbF9yb290ID0gTlVMTDsKKworICAgICAgdGRlc3Ryb3kgKGxvY2FsX3Jvb3QsIGZyZWUpOworICAgICAgbG9jYWxfcm9vdCA9IE5VTEw7CisKKyAgICAgICh2b2lkKSBkd2FyZl9lbmQgKGRiZyk7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQKK2hhbmRsZV9lbGYgKEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAorCSAgICBjb25zdCBjaGFyICpzdWZmaXgpCit7CisgIHNpemVfdCBwcmVmaXhfbGVuID0gcHJlZml4ID09IE5VTEwgPyAwIDogc3RybGVuIChwcmVmaXgpOworICBzaXplX3Qgc3VmZml4X2xlbiA9IHN1ZmZpeCA9PSBOVUxMID8gMCA6IHN0cmxlbiAoc3VmZml4KTsKKyAgc2l6ZV90IGZuYW1lX2xlbiA9IHN0cmxlbiAoZm5hbWUpICsgMTsKKyAgY2hhciBmdWxsbmFtZVtwcmVmaXhfbGVuICsgMSArIGZuYW1lX2xlbiArIHN1ZmZpeF9sZW5dOworICBjaGFyICpjcCA9IGZ1bGxuYW1lOworICBFbGZfU2NuICpzY24gPSBOVUxMOworICBpbnQgYW55ID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIEdFbGZfRWhkciBlaGRyX21lbTsKKyAgR0VsZl9FaGRyICplaGRyOworICBFYmwgKmVibDsKKworICAvKiBHZXQgdGhlIGJhY2tlbmQgZm9yIHRoaXMgb2JqZWN0IGZpbGUgdHlwZS4gICovCisgIGVibCA9IGVibF9vcGVuYmFja2VuZCAoZWxmKTsKKworICAvKiBXZSBuZWVkIHRoZSBFTEYgaGVhZGVyIGluIGEgZmV3IHBsYWNlcy4gICovCisgIGVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICBJTlRFUk5BTF9FUlJPUiAoZnVsbG5hbWUpOworCisgIC8qIElmIHdlIGFyZSBhc2tlZCB0byBwcmludCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgYW5kIHRoaXMgaXMKKyAgICAgZXhlY3V0YWJsZSBvciBkeW5hbWljIGV4ZWN1dGFibGUsIGZhaWwuICAqLworICBpZiAoc3ltc2VjX3R5cGUgPT0gU0hUX0RZTlNZTQorICAgICAgJiYgZWhkci0+ZV90eXBlICE9IEVUX0VYRUMgJiYgZWhkci0+ZV90eXBlICE9IEVUX0RZTikKKyAgICB7CisgICAgICAvKiBYWFggQWRkIG1hY2hpbmUgc3BlY2lmaWMgb2JqZWN0IGZpbGUgdHlwZXMuICAqLworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlcyVzJXMlczogSW52YWxpZCBvcGVyYXRpb24iKSwKKwkgICAgIHByZWZpeCA/OiAiIiwgcHJlZml4ID8gIigiIDogIiIsIGZuYW1lLCBwcmVmaXggPyAiKSIgOiAiIik7CisgICAgICByZXN1bHQgPSAxOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIENyZWF0ZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSBmaWxlLiAgKi8KKyAgaWYgKHByZWZpeCAhPSBOVUxMKQorICAgIGNwID0gbWVtcGNweSAoY3AsIHByZWZpeCwgcHJlZml4X2xlbik7CisgIGNwID0gbWVtcGNweSAoY3AsIGZuYW1lLCBmbmFtZV9sZW4pOworICBpZiAoc3VmZml4ICE9IE5VTEwpCisgICAgbWVtY3B5IChjcCAtIDEsIHN1ZmZpeCwgc3VmZml4X2xlbiArIDEpOworCisgIC8qIEZpbmQgdGhlIHN5bWJvbCB0YWJsZS4KKworICAgICBYWFggQ2FuIHRoZXJlIGJlIG1vcmUgdGhhbiBvbmU/ICBEbyB3ZSBwcmludCBhbGw/ICBDdXJyZW50bHkgd2UgZG8uICAqLworICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIGlmIChzaGRyID09IE5VTEwpCisJSU5URVJOQUxfRVJST1IgKGZ1bGxuYW1lKTsKKworICAgICAgaWYgKHNoZHItPnNoX3R5cGUgPT0gc3ltc2VjX3R5cGUpCisJeworCSAgRWxmX1NjbiAqeG5keHNjbiA9IE5VTEw7CisKKwkgIC8qIFdlIGhhdmUgYSBzeW1ib2wgdGFibGUuICBGaXJzdCBtYWtlIHN1cmUgd2UgcmVtZW1iZXIgdGhpcy4gICovCisJICBhbnkgPSAxOworCisJICAvKiBMb29rIGZvciBhbiBleHRlbmRlZCBzZWN0aW9uIGluZGV4IHRhYmxlIGZvciB0aGlzIHNlY3Rpb24uICAqLworCSAgaWYgKHN5bXNlY190eXBlID09IFNIVF9TWU1UQUIpCisJICAgIHsKKwkgICAgICBzaXplX3Qgc2NubmR4ID0gZWxmX25keHNjbiAoc2NuKTsKKworCSAgICAgIHdoaWxlICgoeG5keHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHhuZHhzY24pKSAhPSBOVUxMKQorCQl7CisJCSAgR0VsZl9TaGRyIHhuZHhzaGRyX21lbTsKKwkJICBHRWxmX1NoZHIgKnhuZHhzaGRyID0gZ2VsZl9nZXRzaGRyICh4bmR4c2NuLCAmeG5keHNoZHJfbWVtKTsKKworCQkgIGlmICh4bmR4c2hkciA9PSBOVUxMKQorCQkgICAgSU5URVJOQUxfRVJST1IgKGZ1bGxuYW1lKTsKKworCQkgIGlmICh4bmR4c2hkci0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCX1NITkRYCisJCSAgICAgICYmIHhuZHhzaGRyLT5zaF9saW5rID09IHNjbm5keCkKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgc2hvd19zeW1ib2xzIChlYmwsIGVoZHIsIHNjbiwgeG5keHNjbiwgc2hkciwgcHJlZml4LCBmbmFtZSwKKwkJCWZ1bGxuYW1lKTsKKwl9CisgICAgfQorCisgIGlmICghIGFueSkKKyAgICB7CisgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzJXMlczogbm8gc3ltYm9scyIpLAorCSAgICAgcHJlZml4ID86ICIiLCBwcmVmaXggPyAiOiIgOiAiIiwgZm5hbWUpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisKKyBvdXQ6CisgIC8qIENsb3NlIHRoZSBFTEYgYmFja2VuZCBsaWJyYXJ5IGRlc2NyaXB0b3IuICAqLworICBlYmxfY2xvc2ViYWNrZW5kIChlYmwpOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvbm9uZV9sZC5jIGIvc3JjL25vbmVfbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjBmMGZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL25vbmVfbGQuYwpAQCAtMCwwICsxIEBACisvKiBOb3RoaW5nIGhlcmUuICBUaGlzIGlzIGp1c3QgYSB0ZXN0aW1vbnkgb2YgYXV0b21ha2UgaW5mbGV4aWJpbGl0eS4gICovCmRpZmYgLS1naXQgYS9zcmMvcmVhZGVsZi5jIGIvc3JjL3JlYWRlbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTUzMmZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3JlYWRlbGYuYwpAQCAtMCwwICsxLDQ5OTcgQEAKKy8qIFByaW50IGluZm9ybWF0aW9uIGZyb20gRUxGIGZpbGUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFyZ3AuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxhbmdpbmZvLmg+CisjaW5jbHVkZSA8bGliZHcuaD4KKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPHN5c3RlbS5oPgorI2luY2x1ZGUgIi4uL2xpYmVibC9saWJlYmxQLmgiCisjaW5jbHVkZSAiLi4vbGliZHcvbGliZHdQLmgiCisjaW5jbHVkZSAiLi4vbGliZHcvbWVtb3J5LWFjY2Vzcy5oIgorCisKKy8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCitzdGF0aWMgdm9pZCBwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7Cit2b2lkICgqYXJncF9wcm9ncmFtX3ZlcnNpb25faG9vaykgKEZJTEUgKiwgc3RydWN0IGFyZ3Bfc3RhdGUgKikgPSBwcmludF92ZXJzaW9uOworCisvKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLworY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzID0gUEFDS0FHRV9CVUdSRVBPUlQ7CisKKy8qIERlZmluaXRpb25zIG9mIGFyZ3VtZW50cyBmb3IgYXJncCBmdW5jdGlvbnMuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQoreworICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgc2VsZWN0aW9uOiIpLCAwIH0sCisgIHsgImFsbCIsICdhJywgTlVMTCwgMCwgTl8oIkVxdWl2YWxlbnQgdG86IC1oIC1sIiksIDAgfSwKKyAgeyAiZHluYW1pYyIsICdkJywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgdGhlIGR5bmFtaWMgc2VnbWVudCIpLCAwIH0sCisgIHsgImZpbGUtaGVhZGVyIiwgJ2gnLCBOVUxMLCAwLCBOXygiRGlzcGxheSB0aGUgRUxGIGZpbGUgaGVhZGVyIiksIDAgfSwKKyAgeyAiaGlzdG9ncmFtIiwgJ0knLCBOVUxMLCAwLAorICAgIE5fKCJEaXNwbGF5IGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzIiksIDAgfSwKKyAgeyAicHJvZ3JhbS1oZWFkZXJzIiwgJ2wnLCBOVUxMLCAwLCBOXygiRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzIiksIDAgfSwKKyAgeyAicmVsb2NzIiwgJ3InLCBOVUxMLCAwLCBOXygiRGlzcGxheSByZWxvY2F0aW9ucyIpLCAwIH0sCisgIHsgInNlY3Rpb24taGVhZGVycyIsICdTJywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgdGhlIHNlY3Rpb25zJyBoZWFkZXIiKSwgMCB9LAorICB7ICJzeW1ib2xzIiwgJ3MnLCBOVUxMLCAwLCBOXygiRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlIiksIDAgfSwKKyAgeyAidmVyc2lvbi1pbmZvIiwgJ1YnLCBOVUxMLCAwLCBOXygiRGlzcGxheSB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uIiksIDAgfSwKKyAgeyAiZGVidWctZHVtcCIsICd3JywgIlNFQ1RJT04iLCBPUFRJT05fQVJHX09QVElPTkFMLAorICAgIE5fKCJEaXNwbGF5IERXQVJGIHNlY3Rpb24gY29udGVudC4gIFNFQ1RJT04gY2FuIGJlIG9uZSBvZiBhYmJyZXYsICIKKyAgICAgICAiYXJhbmdlcywgZnJhbWUsIGluZm8sIGxvYywgbGluZSwgcmFuZ2VzLCBwdWJuYW1lcywgc3RyLCBvciBtYWNpbmZvLiIpLAorICAgIDAgfSwKKyAgeyAibm90ZXMiLCAnbicsIE5VTEwsIDAsIE5fKCJEaXNwbGF5IHRoZSBjb3JlIG5vdGVzIiksIDAgfSwKKyAgeyAiYXJjaC1zcGVjaWZpYyIsICdBJywgTlVMTCwgMCwKKyAgICBOXygiRGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24gKGlmIGFueSkiKSwgMCB9LAorCisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTl8oIk91dHB1dCBjb250cm9sOiIpLCAwIH0sCisKKyAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KK307CisKKy8qIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uICAqLworc3RhdGljIGNvbnN0IGNoYXIgZG9jW10gPSBOXygiXAorUHJpbnQgaW5mb3JtYXRpb24gZnJvbSBFTEYgZmlsZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLiIpOworCisvKiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4gICovCitzdGF0aWMgY29uc3QgY2hhciBhcmdzX2RvY1tdID0gTl8oIkZJTEUuLi4iKTsKKworLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCitzdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Cit7CisgIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworCisvKiBGbGFncyBzZXQgYnkgdGhlIG9wdGlvbiBjb250cm9sbGluZyB0aGUgb3V0cHV0LiAgKi8KKworLyogVHJ1ZSBpZiBkeW5hbWljIHNlZ21lbnQgc2hvdWxkIGJlIHByaW50ZWQuICAqLworc3RhdGljIGJvb2wgcHJpbnRfZHluYW1pY190YWJsZTsKKworLyogVHJ1ZSBpZiB0aGUgZmlsZSBoZWFkZXIgc2hvdWxkIGJlIHByaW50ZWQuICAqLworc3RhdGljIGJvb2wgcHJpbnRfZmlsZV9oZWFkZXI7CisKKy8qIFRydWUgaWYgdGhlIHByb2dyYW0gaGVhZGVycyBzaG91bGQgYmUgcHJpbnRlZC4gICovCitzdGF0aWMgYm9vbCBwcmludF9wcm9ncmFtX2hlYWRlcjsKKworLyogVHJ1ZSBpZiByZWxvY2F0aW9ucyBzaG91bGQgYmUgcHJpbnRlZC4gICovCitzdGF0aWMgYm9vbCBwcmludF9yZWxvY2F0aW9uczsKKworLyogVHJ1ZSBpZiB0aGUgc2VjdGlvbiBoZWFkZXJzIHNob3VsZCBiZSBwcmludGVkLiAgKi8KK3N0YXRpYyBib29sIHByaW50X3NlY3Rpb25faGVhZGVyOworCisvKiBUcnVlIGlmIHRoZSBzeW1ib2wgdGFibGUgc2hvdWxkIGJlIHByaW50ZWQuICAqLworc3RhdGljIGJvb2wgcHJpbnRfc3ltYm9sX3RhYmxlOworCisvKiBUcnVlIGlmIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHNob3VsZCBiZSBwcmludGVkLiAgKi8KK3N0YXRpYyBib29sIHByaW50X3ZlcnNpb25faW5mbzsKKworLyogVHJ1ZSBpZiBzZWN0aW9uIGdyb3VwcyBzaG91bGQgYmUgcHJpbnRlZC4gICovCitzdGF0aWMgYm9vbCBwcmludF9zZWN0aW9uX2dyb3VwczsKKworLyogVHJ1ZSBpZiBidWNrZXQgbGlzdCBsZW5ndGggaGlzdG9ncmFtIHNob3VsZCBiZSBwcmludGVkLiAgKi8KK3N0YXRpYyBib29sIHByaW50X2hpc3RvZ3JhbTsKKworLyogVHJ1ZSBpZiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGRhdGEgc2hvdWxkIGJlIHByaW50ZWQuICAqLworc3RhdGljIGJvb2wgcHJpbnRfYXJjaDsKKworLyogVHJ1ZSBpZiBub3RlIHNlY3Rpb24gY29udGVudCBzaG91bGQgYmUgcHJpbnRlZC4gICovCitzdGF0aWMgYm9vbCBwcmludF9ub3RlczsKKworLyogU2VsZWN0IHByaW50aW5nIG9mIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCitzdGF0aWMgZW51bSBzZWN0aW9uX2UKK3sKKyAgc2VjdGlvbl9hYmJyZXYgPSAxLAkvKiAuZGVidWdfYWJicmV2ICAqLworICBzZWN0aW9uX2FyYW5nZXMgPSAyLAkvKiAuZGVidWdfYXJhbmdlcyAgKi8KKyAgc2VjdGlvbl9mcmFtZSA9IDQsCS8qIC5kZWJ1Z19mcmFtZSBvciAuZWhfZnJhbWUgICovCisgIHNlY3Rpb25faW5mbyA9IDgsCS8qIC5kZWJ1Z19pbmZvICAqLworICBzZWN0aW9uX2xpbmUgPSAxNiwJLyogLmRlYnVnX2xpbmUgICovCisgIHNlY3Rpb25fbG9jID0gMzIsCS8qIC5kZWJ1Z19sb2MgICovCisgIHNlY3Rpb25fcHVibmFtZXMgPSA2NCwvKiAuZGVidWdfcHVibmFtZXMgICovCisgIHNlY3Rpb25fc3RyID0gMTI4LAkvKiAuZGVidWdfc3RyICAqLworICBzZWN0aW9uX21hY2luZm8gPSAyNTYsLyogLmRlYnVnX21hY2luZm8gICovCisgIHNlY3Rpb25fcmFuZ2VzID0gNTEyLCAvKiAuZGVidWdfcmFuZ2VzICAqLworICBzZWN0aW9uX2FsbCA9IChzZWN0aW9uX2FiYnJldiB8IHNlY3Rpb25fYXJhbmdlcyB8IHNlY3Rpb25fZnJhbWUKKwkJIHwgc2VjdGlvbl9pbmZvIHwgc2VjdGlvbl9saW5lIHwgc2VjdGlvbl9sb2MKKwkJIHwgc2VjdGlvbl9wdWJuYW1lcyB8IHNlY3Rpb25fc3RyIHwgc2VjdGlvbl9tYWNpbmZvCisJCSB8IHNlY3Rpb25fcmFuZ2VzKQorfSBwcmludF9kZWJ1Z19zZWN0aW9uczsKKworLyogTnVtYmVyIG9mIHNlY3Rpb25zIGluIHRoZSBmaWxlLiAgKi8KK3N0YXRpYyBzaXplX3Qgc2hudW07CisKKworLyogRGVjbGFyYXRpb25zIG9mIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgKGludCBmZCwgRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCSAgY29uc3QgY2hhciAqZm5hbWUsIGJvb2wgb25seV9vbmUpOworc3RhdGljIHZvaWQgcHJvY2Vzc19lbGZfZmlsZSAoRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgICAgICBib29sIG9ubHlfb25lKTsKK3N0YXRpYyB2b2lkIHByaW50X2VoZHIgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpOworc3RhdGljIHZvaWQgcHJpbnRfc2hkciAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkcik7CitzdGF0aWMgdm9pZCBwcmludF9waGRyIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyKTsKK3N0YXRpYyB2b2lkIHByaW50X3NjbmdycCAoRWJsICplYmwpOworc3RhdGljIHZvaWQgcHJpbnRfZHluYW1pYyAoRWJsICplYmwpOworc3RhdGljIHZvaWQgcHJpbnRfcmVsb2NzIChFYmwgKmVibCk7CitzdGF0aWMgdm9pZCBoYW5kbGVfcmVsb2NzX3JlbCAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9yZWxvY3NfcmVsYSAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKTsKK3N0YXRpYyB2b2lkIHByaW50X3N5bXRhYiAoRWJsICplYmwsIGludCB0eXBlKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9zeW10YWIgKEVibCAqZWJsLCBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkcik7CitzdGF0aWMgdm9pZCBwcmludF92ZXJpbmZvIChFYmwgKmVibCk7CitzdGF0aWMgdm9pZCBoYW5kbGVfdmVybmVlZCAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV92ZXJkZWYgKEVibCAqZWJsLCBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkcik7CitzdGF0aWMgdm9pZCBoYW5kbGVfdmVyc3ltIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLAorCQkJICAgR0VsZl9TaGRyICpzaGRyKTsKK3N0YXRpYyB2b2lkIHByaW50X2RlYnVnIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9oYXNoIChFYmwgKmVibCk7CitzdGF0aWMgdm9pZCBoYW5kbGVfbm90ZXMgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpOworc3RhdGljIHZvaWQgcHJpbnRfbGlibGlzdCAoRWJsICplYmwpOworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgLyogU2V0IGxvY2FsZS4gICovCisgIHNldGxvY2FsZSAoTENfQUxMLCAiIik7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjYXRhbG9nLiAgKi8KKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgLyogUGFyc2UgYW5kIHByb2Nlc3MgYXJndW1lbnRzLiAgKi8KKyAgaW50IHJlbWFpbmluZzsKKyAgYXJncF9wYXJzZSAoJmFyZ3AsIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsIE5VTEwpOworCisgIC8qIEJlZm9yZSB3ZSBzdGFydCB0ZWxsIHRoZSBFTEYgbGlicmFyeSB3aGljaCB2ZXJzaW9uIHdlIGFyZSB1c2luZy4gICovCisgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKKworICAvKiBOb3cgcHJvY2VzcyBhbGwgdGhlIGZpbGVzIGdpdmVuIGF0IHRoZSBjb21tYW5kIGxpbmUuICAqLworICBib29sIG9ubHlfb25lID0gcmVtYWluaW5nICsgMSA9PSBhcmdjOworICBkbworICAgIHsKKyAgICAgIC8qIE9wZW4gdGhlIGZpbGUuICAqLworICAgICAgaW50IGZkID0gb3BlbiAoYXJndltyZW1haW5pbmddLCBPX1JET05MWSk7CisgICAgICBpZiAoZmQgPT0gLTEpCisJeworCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IG9wZW4gaW5wdXQgZmlsZSIpKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogQ3JlYXRlIGFuIGBFbGYnIGRlc2NyaXB0b3IuICAqLworICAgICAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOworICAgICAgaWYgKGVsZiA9PSBOVUxMKQorCWVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdlbmVyYXRlIEVsZiBkZXNjcmlwdG9yOiAlc1xuIiksCisJICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBlbHNlCisJeworCSAgcHJvY2Vzc19maWxlIChmZCwgZWxmLCBOVUxMLCBhcmd2W3JlbWFpbmluZ10sIG9ubHlfb25lKTsKKworCSAgLyogTm93IHdlIGNhbiBjbG9zZSB0aGUgZGVzY3JpcHRvci4gICovCisJICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQorCSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImVycm9yIHdoaWxlIGNsb3NpbmcgRWxmIGRlc2NyaXB0b3I6ICVzIiksCisJCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisJfQorCisgICAgICBjbG9zZSAoZmQpOworICAgIH0KKyAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7CisKKyAgcmV0dXJuIGVycm9yX21lc3NhZ2VfY291bnQgIT0gMDsKK30KKworCisvKiBIYW5kbGUgcHJvZ3JhbSBhcmd1bWVudHMuICAqLworc3RhdGljIGVycm9yX3QKK3BhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLAorCSAgIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIC8qIFRydWUgaWYgYW55IG9mIHRoZSBjb250cm9sIG9wdGlvbnMgaXMgc2V0LiAgKi8KKyAgc3RhdGljIGJvb2wgYW55X2NvbnRyb2xfb3B0aW9uOworCisgIHN3aXRjaCAoa2V5KQorICAgIHsKKyAgICBjYXNlICdhJzoKKyAgICAgIHByaW50X2ZpbGVfaGVhZGVyID0gdHJ1ZTsKKyAgICAgIHByaW50X3Byb2dyYW1faGVhZGVyID0gdHJ1ZTsKKyAgICAgIHByaW50X3JlbG9jYXRpb25zID0gdHJ1ZTsKKyAgICAgIHByaW50X3NlY3Rpb25faGVhZGVyID0gdHJ1ZTsKKyAgICAgIHByaW50X3N5bWJvbF90YWJsZSA9IHRydWU7CisgICAgICBwcmludF92ZXJzaW9uX2luZm8gPSB0cnVlOworICAgICAgcHJpbnRfZHluYW1pY190YWJsZSA9IHRydWU7CisgICAgICBwcmludF9zZWN0aW9uX2dyb3VwcyA9IHRydWU7CisgICAgICBwcmludF9oaXN0b2dyYW0gPSB0cnVlOworICAgICAgcHJpbnRfYXJjaCA9IHRydWU7CisgICAgICBwcmludF9ub3RlcyA9IHRydWU7CisgICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnQSc6CisgICAgICBwcmludF9hcmNoID0gdHJ1ZTsKKyAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgIHByaW50X2R5bmFtaWNfdGFibGUgPSB0cnVlOworICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgorICAgICAgcHJpbnRfc2VjdGlvbl9ncm91cHMgPSB0cnVlOworICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOgorICAgICAgcHJpbnRfZmlsZV9oZWFkZXIgPSB0cnVlOworICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0knOgorICAgICAgcHJpbnRfaGlzdG9ncmFtID0gdHJ1ZTsKKyAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoKKyAgICAgIHByaW50X3Byb2dyYW1faGVhZGVyID0gdHJ1ZTsKKyAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICduJzoKKyAgICAgIHByaW50X25vdGVzID0gdHJ1ZTsKKyAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdyJzoKKyAgICAgIHByaW50X3JlbG9jYXRpb25zID0gdHJ1ZTsKKyAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7CisgICAgIGJyZWFrOworICAgIGNhc2UgJ1MnOgorICAgICAgcHJpbnRfc2VjdGlvbl9oZWFkZXIgPSB0cnVlOworICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgcHJpbnRfc3ltYm9sX3RhYmxlID0gdHJ1ZTsKKyAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdWJzoKKyAgICAgIHByaW50X3ZlcnNpb25faW5mbyA9IHRydWU7CisgICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6CisgICAgICBpZiAoYXJnID09IE5VTEwpCisJcHJpbnRfZGVidWdfc2VjdGlvbnMgPSBzZWN0aW9uX2FsbDsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiYWJicmV2IikgPT0gMCkKKwlwcmludF9kZWJ1Z19zZWN0aW9ucyB8PSBzZWN0aW9uX2FiYnJldjsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiYXJhbmdlcyIpID09IDApCisJcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9hcmFuZ2VzOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyYW5nZXMiKSA9PSAwKQorCXByaW50X2RlYnVnX3NlY3Rpb25zIHw9IHNlY3Rpb25fcmFuZ2VzOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJmcmFtZSIpID09IDApCisJcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9mcmFtZTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiaW5mbyIpID09IDApCisJcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9pbmZvOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJsb2MiKSA9PSAwKQorCXByaW50X2RlYnVnX3NlY3Rpb25zIHw9IHNlY3Rpb25fbG9jOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJsaW5lIikgPT0gMCkKKwlwcmludF9kZWJ1Z19zZWN0aW9ucyB8PSBzZWN0aW9uX2xpbmU7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInB1Ym5hbWVzIikgPT0gMCkKKwlwcmludF9kZWJ1Z19zZWN0aW9ucyB8PSBzZWN0aW9uX3B1Ym5hbWVzOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJzdHIiKSA9PSAwKQorCXByaW50X2RlYnVnX3NlY3Rpb25zIHw9IHNlY3Rpb25fc3RyOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJtYWNpbmZvIikgPT0gMCkKKwlwcmludF9kZWJ1Z19zZWN0aW9ucyB8PSBzZWN0aW9uX21hY2luZm87CisgICAgICBlbHNlCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCBnZXR0ZXh0ICgiVW5rbm93biBEV0FSRiBkZWJ1ZyBzZWN0aW9uIGAlcycuXG4iKSwKKwkJICAgYXJnKTsKKwkgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwKKwkJICAgICBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisJICBleGl0ICgxKTsKKwl9CisgICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdQX0tFWV9OT19BUkdTOgorICAgICAgZnB1dHMgKGdldHRleHQgKCJNaXNzaW5nIGZpbGUgbmFtZS5cbiIpLCBzdGRlcnIpOworICAgICAgZ290byBkb19hcmdwX2hlbHA7CisgICAgY2FzZSBBUkdQX0tFWV9GSU5JOgorICAgICAgaWYgKCEgYW55X2NvbnRyb2xfb3B0aW9uKQorCXsKKwkgIGZwdXRzIChnZXR0ZXh0ICgiTm8gb3BlcmF0aW9uIHNwZWNpZmllZC5cbiIpLCBzdGRlcnIpOworCWRvX2FyZ3BfaGVscDoKKwkgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSB8IEFSR1BfSEVMUF9FWElUX0VSUiwKKwkJICAgICBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7CisJICBleGl0ICgxKTsKKwl9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEFSR1BfRVJSX1VOS05PV047CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBQcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfdmVyc2lvbiAoRklMRSAqc3RyZWFtLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBmcHJpbnRmIChzdHJlYW0sICJyZWFkZWxmICglcykgJXNcbiIsIFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIlwKK0NvcHlyaWdodCAoQykgJXMgUmVkIEhhdCwgSW5jLlxuXAorVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk9cblwKK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuXAorIiksICIyMDA1Iik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIldyaXR0ZW4gYnkgJXMuXG4iKSwgIlVscmljaCBEcmVwcGVyIik7Cit9CisKKworLyogUHJvY2VzcyBvbmUgZmlsZS4gICovCitzdGF0aWMgdm9pZAorcHJvY2Vzc19maWxlIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAorCSAgICAgIGJvb2wgb25seV9vbmUpCit7CisgIC8qIFdlIGNhbiBoYW5kbGUgdHdvIHR5cGVzIG9mIGZpbGVzOiBFTEYgZmlsZXMgYW5kIGFyY2hpdmVzLiAgKi8KKyAgRWxmX0tpbmQga2luZCA9IGVsZl9raW5kIChlbGYpOworICBzdHJ1Y3Qgc3RhdDY0IHN0OworCisgIHN3aXRjaCAoa2luZCkKKyAgICB7CisgICAgY2FzZSBFTEZfS19FTEY6CisgICAgICAvKiBZZXMhICBJdCdzIGFuIEVMRiBmaWxlLiAgKi8KKyAgICAgIHByb2Nlc3NfZWxmX2ZpbGUgKGVsZiwgcHJlZml4LCBmbmFtZSwgb25seV9vbmUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRl9LX0FSOgorICAgICAgeworCUVsZiAqc3ViZWxmOworCUVsZl9DbWQgY21kID0gRUxGX0NfUkVBRF9NTUFQOworCXNpemVfdCBwcmVmaXhfbGVuID0gcHJlZml4ID09IE5VTEwgPyAwIDogc3RybGVuIChwcmVmaXgpOworCXNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKSArIDE7CisJY2hhciBuZXdfcHJlZml4W3ByZWZpeF9sZW4gKyAxICsgZm5hbWVfbGVuXTsKKwljaGFyICpjcCA9IG5ld19wcmVmaXg7CisKKwkvKiBDcmVhdGUgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgZmlsZS4gICovCisJaWYgKHByZWZpeCAhPSBOVUxMKQorCSAgeworCSAgICBjcCA9IG1lbXBjcHkgKGNwLCBwcmVmaXgsIHByZWZpeF9sZW4pOworCSAgICAqY3ArKyA9ICc6JzsKKwkgIH0KKwltZW1jcHkgKGNwLCBmbmFtZSwgZm5hbWVfbGVuKTsKKworCS8qIEl0J3MgYW4gYXJjaGl2ZS4gIFdlIHByb2Nlc3MgZWFjaCBmaWxlIGluIGl0LiAgKi8KKwl3aGlsZSAoKHN1YmVsZiA9IGVsZl9iZWdpbiAoZmQsIGNtZCwgZWxmKSkgIT0gTlVMTCkKKwkgIHsKKwkgICAga2luZCA9IGVsZl9raW5kIChzdWJlbGYpOworCisJICAgIC8qIENhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseS4gICovCisJICAgIGlmIChraW5kID09IEVMRl9LX0VMRiB8fCBraW5kID09IEVMRl9LX0FSKQorCSAgICAgIHsKKwkJRWxmX0FyaGRyICphcmhkciA9IGVsZl9nZXRhcmhkciAoc3ViZWxmKTsKKwkJYXNzZXJ0IChhcmhkciAhPSBOVUxMKTsKKworCQlwcm9jZXNzX2ZpbGUgKGZkLCBzdWJlbGYsIG5ld19wcmVmaXgsIGFyaGRyLT5hcl9uYW1lLCBmYWxzZSk7CisJICAgICAgfQorCisJICAgIC8qIEdldCBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCisJICAgIGNtZCA9IGVsZl9uZXh0IChzdWJlbGYpOworCSAgICBpZiAoZWxmX2VuZCAoc3ViZWxmKSAhPSAwKQorCSAgICAgIGVycm9yICgwLCAwLAorCQkgICAgIGdldHRleHQgKCIgZXJyb3Igd2hpbGUgZnJlZWluZyBzdWItRUxGIGRlc2NyaXB0b3I6ICVzXG4iKSwKKwkJICAgICBlbGZfZXJybXNnICgtMSkpOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGZzdGF0NjQgKGZkLCAmc3QpICE9IDApCisJZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSIpKTsKKyAgICAgIGVsc2UgaWYgKHN0LnN0X3NpemUgPT0gMCkKKwllcnJvciAoMCwgMCwgZ2V0dGV4dCAoImlucHV0IGZpbGUgaXMgZW1wdHkiKSk7CisgICAgICBlbHNlCisJLyogV2UgY2Fubm90IGRvIGFueXRoaW5nLiAgKi8KKwllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKK05vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0IikpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKy8qIFByb2Nlc3Mgb25lIGZpbGUuICAqLworc3RhdGljIHZvaWQKK3Byb2Nlc3NfZWxmX2ZpbGUgKEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkgIGJvb2wgb25seV9vbmUpCit7CisgIEdFbGZfRWhkciBlaGRyX21lbTsKKyAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7CisgIEVibCAqZWJsOworCisgIC8qIFByaW50IHRoZSBmaWxlIG5hbWUuICAqLworICBpZiAoIW9ubHlfb25lKQorICAgIHsKKyAgICAgIGlmIChwcmVmaXggIT0gTlVMTCkKKwlwcmludGYgKCJcbiVzKCVzKTpcblxuIiwgcHJlZml4LCBmbmFtZSk7CisgICAgICBlbHNlCisJcHJpbnRmICgiXG4lczpcblxuIiwgZm5hbWUpOworICAgIH0KKworICBpZiAoZWhkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IHJlYWQgRUxGIGhlYWRlcjogJXMiKSwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZWJsID0gZWJsX29wZW5iYWNrZW5kIChlbGYpOworICBpZiAoZWJsID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBFQkwgaGFuZGxlIikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzZWN0aW9ucy4gICovCisgIGlmIChlbGZfZ2V0c2hudW0gKGVibC0+ZWxmLCAmc2hudW0pIDwgMCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBzZWN0aW9uczogJXMiKSwKKwkgICBlbGZfZXJybXNnICgtMSkpOworCisgIGlmIChwcmludF9maWxlX2hlYWRlcikKKyAgICBwcmludF9laGRyIChlYmwsIGVoZHIpOworICBpZiAocHJpbnRfc2VjdGlvbl9oZWFkZXIpCisgICAgcHJpbnRfc2hkciAoZWJsLCBlaGRyKTsKKyAgaWYgKHByaW50X3Byb2dyYW1faGVhZGVyKQorICAgIHByaW50X3BoZHIgKGVibCwgZWhkcik7CisgIGlmIChwcmludF9zZWN0aW9uX2dyb3VwcykKKyAgICBwcmludF9zY25ncnAgKGVibCk7CisgIGlmIChwcmludF9keW5hbWljX3RhYmxlKQorICAgIHByaW50X2R5bmFtaWMgKGVibCk7CisgIGlmIChwcmludF9yZWxvY2F0aW9ucykKKyAgICBwcmludF9yZWxvY3MgKGVibCk7CisgIGlmIChwcmludF9oaXN0b2dyYW0pCisgICAgaGFuZGxlX2hhc2ggKGVibCk7CisgIGlmIChwcmludF9zeW1ib2xfdGFibGUpCisgICAgcHJpbnRfc3ltdGFiIChlYmwsIFNIVF9EWU5TWU0pOworICBpZiAocHJpbnRfdmVyc2lvbl9pbmZvKQorICAgIHByaW50X3ZlcmluZm8gKGVibCk7CisgIGlmIChwcmludF9zeW1ib2xfdGFibGUpCisgICAgcHJpbnRfc3ltdGFiIChlYmwsIFNIVF9TWU1UQUIpOworICBpZiAocHJpbnRfYXJjaCkKKyAgICBwcmludF9saWJsaXN0IChlYmwpOworICBpZiAocHJpbnRfZGVidWdfc2VjdGlvbnMgIT0gMCkKKyAgICBwcmludF9kZWJ1ZyAoZWJsLCBlaGRyKTsKKyAgaWYgKHByaW50X25vdGVzKQorICAgIGhhbmRsZV9ub3RlcyAoZWJsLCBlaGRyKTsKKworICBlYmxfY2xvc2ViYWNrZW5kIChlYmwpOworfQorCisKKy8qIFByaW50IGZpbGUgdHlwZS4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfZmlsZV90eXBlICh1bnNpZ25lZCBzaG9ydCBpbnQgZV90eXBlKQoreworICBpZiAoZV90eXBlIDw9IEVUX0NPUkUpCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtub3dudHlwZXNbXSA9CisgICAgICB7CisJTl8oIk5PTkUgKE5vbmUpIiksCisJTl8oIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiKSwKKwlOXygiRVhFQyAoRXhlY3V0YWJsZSBmaWxlKSIpLAorCU5fKCJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiKSwKKwlOXygiQ09SRSAoQ29yZSBmaWxlKSIpCisgICAgICB9OworICAgICAgcHV0cyAoZ2V0dGV4dCAoa25vd250eXBlc1tlX3R5cGVdKSk7CisgICAgfQorICBlbHNlIGlmIChlX3R5cGUgPj0gRVRfTE9PUyAmJiBlX3R5cGUgPD0gRVRfSElPUykKKyAgICBwcmludGYgKGdldHRleHQgKCJPUyBTcGVjaWZpYzogKCV4KVxuIiksICBlX3R5cGUpOworICBlbHNlIGlmIChlX3R5cGUgPj0gRVRfTE9QUk9DIC8qICYmIGVfdHlwZSA8PSBFVF9ISVBST0MgYWx3YXlzIHRydWUgKi8pCisgICAgcHJpbnRmIChnZXR0ZXh0ICgiUHJvY2Vzc29yIFNwZWNpZmljOiAoJXgpXG4iKSwgIGVfdHlwZSk7CisgIGVsc2UKKyAgICBwdXRzICgiPz8/Iik7Cit9CisKKworLyogUHJpbnQgRUxGIGhlYWRlci4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfZWhkciAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkcikKK3sKKyAgY2hhciBidWZbNTEyXTsKKyAgc2l6ZV90IGNudDsKKworICBmcHV0c191bmxvY2tlZCAoZ2V0dGV4dCAoIkVMRiBIZWFkZXI6XG4gIE1hZ2ljOiAgIiksIHN0ZG91dCk7CisgIGZvciAoY250ID0gMDsgY250IDwgRUlfTklERU5UOyArK2NudCkKKyAgICBwcmludGYgKCIgJTAyaGh4IiwgZWhkci0+ZV9pZGVudFtjbnRdKTsKKworICBwcmludGYgKGdldHRleHQgKCJcbiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCisJICBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gIkVMRjMyIgorCSAgOiBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzY0ID8gIkVMRjY0IgorCSAgOiAiXD9cP1w/Iik7CisKKyAgcHJpbnRmIChnZXR0ZXh0ICgiICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKKwkgIGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJMU0IKKwkgID8gIjIncyBjb21wbGVtZW50LCBsaXR0bGUgZW5kaWFuIgorCSAgOiBlaGRyLT5lX2lkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTVNCCisJICA/ICIyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiIgOiAiXD9cP1w/Iik7CisKKyAgcHJpbnRmIChnZXR0ZXh0ICgiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVoaGQgJXNcbiIpLAorCSAgZWhkci0+ZV9pZGVudFtFSV9WRVJTSU9OXSwKKwkgIGVoZHItPmVfaWRlbnRbRUlfVkVSU0lPTl0gPT0gRVZfQ1VSUkVOVCA/IGdldHRleHQgKCIoY3VycmVudCkiKQorCSAgOiAiKFw/XD9cPykiKTsKKworICBwcmludGYgKGdldHRleHQgKCIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAorCSAgZWJsX29zYWJpX25hbWUgKGVibCwgZWhkci0+ZV9pZGVudFtFSV9PU0FCSV0sIGJ1Ziwgc2l6ZW9mIChidWYpKSk7CisKKyAgcHJpbnRmIChnZXR0ZXh0ICgiICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICVoaGRcbiIpLAorCSAgZWhkci0+ZV9pZGVudFtFSV9BQklWRVJTSU9OXSk7CisKKyAgZnB1dHNfdW5sb2NrZWQgKGdldHRleHQgKCIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiksIHN0ZG91dCk7CisgIHByaW50X2ZpbGVfdHlwZSAoZWhkci0+ZV90eXBlKTsKKworICBwcmludGYgKGdldHRleHQgKCIgIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLCBlYmwtPm5hbWUpOworCisgIHByaW50ZiAoZ2V0dGV4dCAoIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIiksCisJICBlaGRyLT5lX3ZlcnNpb24sCisJICBlaGRyLT5lX3ZlcnNpb24gID09IEVWX0NVUlJFTlQgPyBnZXR0ZXh0ICgiKGN1cnJlbnQpIikgOiAiKFw/XD9cPykiKTsKKworICBwcmludGYgKGdldHRleHQgKCIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgJSMiIFBSSXg2NCAiXG4iKSwKKwkgIGVoZHItPmVfZW50cnkpOworCisgIHByaW50ZiAoZ2V0dGV4dCAoIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlIiBQUklkNjQgIiAlc1xuIiksCisJICBlaGRyLT5lX3Bob2ZmLCBnZXR0ZXh0ICgiKGJ5dGVzIGludG8gZmlsZSkiKSk7CisKKyAgcHJpbnRmIChnZXR0ZXh0ICgiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICUiIFBSSWQ2NCAiICVzXG4iKSwKKwkgIGVoZHItPmVfc2hvZmYsIGdldHRleHQgKCIoYnl0ZXMgaW50byBmaWxlKSIpKTsKKworICBwcmludGYgKGdldHRleHQgKCIgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAorCSAgZWJsX21hY2hpbmVfZmxhZ19uYW1lIChlYmwsIGVoZHItPmVfZmxhZ3MsIGJ1Ziwgc2l6ZW9mIChidWYpKSk7CisKKyAgcHJpbnRmIChnZXR0ZXh0ICgiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICUiIFBSSWQxNiAiICVzXG4iKSwKKwkgIGVoZHItPmVfZWhzaXplLCBnZXR0ZXh0ICgiKGJ5dGVzKSIpKTsKKworICBwcmludGYgKGdldHRleHQgKCIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllczogICAgJSIgUFJJZDE2ICIgJXNcbiIpLAorCSAgZWhkci0+ZV9waGVudHNpemUsIGdldHRleHQgKCIoYnl0ZXMpIikpOworCisgIHByaW50ZiAoZ2V0dGV4dCAoIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBlbnRyaWVzOiAlIiBQUklkMTYgIlxuIiksCisJICBlaGRyLT5lX3BobnVtKTsKKworICBwcmludGYgKGdldHRleHQgKCIgIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXIgZW50cmllczogICAgJSIgUFJJZDE2ICIgJXNcbiIpLAorCSAgZWhkci0+ZV9zaGVudHNpemUsIGdldHRleHQgKCIoYnl0ZXMpIikpOworCisgIHByaW50ZiAoZ2V0dGV4dCAoIiAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVycyBlbnRyaWVzOiAlIiBQUklkMTYpLAorCSAgZWhkci0+ZV9zaG51bSk7CisgIGlmIChlaGRyLT5lX3NobnVtID09IDApCisgICAgeworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyOworCisgICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgMCksICZzaGRyX21lbSk7CisgICAgICBpZiAoc2hkciAhPSBOVUxMKQorCXByaW50ZiAoZ2V0dGV4dCAoIiAoJSIgUFJJdTMyICIgaW4gWzBdLnNoX3NpemUpIiksCisJCSh1aW50MzJfdCkgc2hkci0+c2hfc2l6ZSk7CisgICAgICBlbHNlCisJZnB1dHNfdW5sb2NrZWQgKGdldHRleHQgKCIgKFswXSBub3QgYXZhaWxhYmxlKSIpLCBzdGRvdXQpOworICAgIH0KKyAgZnB1dGNfdW5sb2NrZWQgKCdcbicsIHN0ZG91dCk7CisKKyAgaWYgKGVoZHItPmVfc2hzdHJuZHggPT0gU0hOX1hJTkRFWCkKKyAgICB7CisgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnNoZHI7CisKKyAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCAwKSwgJnNoZHJfbWVtKTsKKyAgICAgIGlmIChzaGRyICE9IE5VTEwpCisJLyogV2UgbWFuYWdlZCB0byBnZXQgdGhlIHplcm90aCBzZWN0aW9uLiAgKi8KKwlzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1ZiksIGdldHRleHQgKCIgKCUiIFBSSXUzMiAiIGluIFswXS5zaF9saW5rKSIpLAorCQkgICh1aW50MzJfdCkgc2hkci0+c2hfbGluayk7CisgICAgICBlbHNlCisJeworCSAgc3RybmNweSAoYnVmLCBnZXR0ZXh0ICgiIChbMF0gbm90IGF2YWlsYWJsZSkiKSwgc2l6ZW9mIChidWYpKTsKKwkgIGJ1ZltzaXplb2YgKGJ1ZikgLSAxXSA9ICdcMCc7CisJfQorCisgICAgICBwcmludGYgKGdldHRleHQgKCIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogWElOREVYJXNcblxuIiksCisJICAgICAgYnVmKTsKKyAgICB9CisgIGVsc2UKKyAgICBwcmludGYgKGdldHRleHQgKCIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJSIgUFJJZDE2ICJcblxuIiksCisJICAgIGVoZHItPmVfc2hzdHJuZHgpOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2dldF92aXNpYmlsaXR5X3R5cGUgKGludCB2YWx1ZSkKK3sKKyAgc3dpdGNoICh2YWx1ZSkKKyAgICB7CisgICAgY2FzZSBTVFZfREVGQVVMVDoKKyAgICAgIHJldHVybiAiREVGQVVMVCI7CisgICAgY2FzZSBTVFZfSU5URVJOQUw6CisgICAgICByZXR1cm4gIklOVEVSTkFMIjsKKyAgICBjYXNlIFNUVl9ISURERU46CisgICAgICByZXR1cm4gIkhJRERFTiI7CisgICAgY2FzZSBTVFZfUFJPVEVDVEVEOgorICAgICAgcmV0dXJuICJQUk9URUNURUQiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIj8/PyI7CisgICAgfQorfQorCisKKy8qIFByaW50IHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLworc3RhdGljIHZvaWQKK3ByaW50X3NoZHIgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpCit7CisgIHNpemVfdCBjbnQ7CisgIHNpemVfdCBzaHN0cm5keDsKKworICBpZiAoISBwcmludF9maWxlX2hlYWRlcikKKyAgICBwcmludGYgKGdldHRleHQgKCJcCitUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiOlxuXAorXG4iKSwKKwkgICAgZWhkci0+ZV9zaG51bSwgZWhkci0+ZV9zaG9mZik7CisKKyAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLworICBpZiAoZWxmX2dldHNoc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7CisKKyAgcHV0cyAoZ2V0dGV4dCAoIlNlY3Rpb24gSGVhZGVyczoiKSk7CisKKyAgaWYgKGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIpCisgICAgcHV0cyAoZ2V0dGV4dCAoIltOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxhZ3MgTGsgSW5mIEFsIikpOworICBlbHNlCisgICAgcHV0cyAoZ2V0dGV4dCAoIltOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgICAgICAgICAgT2ZmICAgICAgU2l6ZSAgICAgRVMgRmxhZ3MgTGsgSW5mIEFsIikpOworCisgIGZvciAoY250ID0gMDsgY250IDwgc2hudW07ICsrY250KQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICBjaGFyIGZsYWdidWZbMjBdOworICAgICAgY2hhciAqY3A7CisgICAgICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgY250KTsKKyAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgICAgIEdFbGZfU2hkciAqc2hkcjsKKworICAgICAgaWYgKHNjbiA9PSBOVUxMKQorCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb246ICVzIiksCisJICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLworICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiKSwKKwkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgY3AgPSBmbGFnYnVmOworICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX1dSSVRFKQorCSpjcCsrID0gJ1cnOworICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKQorCSpjcCsrID0gJ0EnOworICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikKKwkqY3ArKyA9ICdYJzsKKyAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9NRVJHRSkKKwkqY3ArKyA9ICdNJzsKKyAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9TVFJJTkdTKQorCSpjcCsrID0gJ1MnOworICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0lORk9fTElOSykKKwkqY3ArKyA9ICdJJzsKKyAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9MSU5LX09SREVSKQorCSpjcCsrID0gJ0wnOworICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX09TX05PTkNPTkZPUk1JTkcpCisJKmNwKysgPSAnTic7CisgICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfR1JPVVApCisJKmNwKysgPSAnRyc7CisgICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfVExTKQorCSpjcCsrID0gJ1QnOworICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX09SREVSRUQpCisJKmNwKysgPSAnTyc7CisgICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfRVhDTFVERSkKKwkqY3ArKyA9ICdFJzsKKyAgICAgICpjcCA9ICdcMCc7CisKKyAgICAgIHByaW50ZiAoIlslMnp1XSAlLTIwcyAlLTEycyAlMCoiIFBSSXg2NCAiICUwKiIgUFJJeDY0ICIgJTAqIiBQUkl4NjQKKwkgICAgICAiICUyIiBQUklkNjQgIiAlLTVzICUyIiBQUklkMzIgIiAlMyIgUFJJZDMyCisJICAgICAgIiAlMiIgUFJJZDY0ICJcbiIsCisJICAgICAgY250LAorCSAgICAgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSkKKwkgICAgICA/OiAiPGNvcnJ1cHQ+IiwKKwkgICAgICBlYmxfc2VjdGlvbl90eXBlX25hbWUgKGVibCwgc2hkci0+c2hfdHlwZSwgYnVmLCBzaXplb2YgKGJ1ZikpLAorCSAgICAgIGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIgPyA4IDogMTYsIHNoZHItPnNoX2FkZHIsCisJICAgICAgZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDYgOiA4LCBzaGRyLT5zaF9vZmZzZXQsCisJICAgICAgZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDYgOiA4LCBzaGRyLT5zaF9zaXplLAorCSAgICAgIHNoZHItPnNoX2VudHNpemUsIGZsYWdidWYsIHNoZHItPnNoX2xpbmssIHNoZHItPnNoX2luZm8sCisJICAgICAgc2hkci0+c2hfYWRkcmFsaWduKTsKKyAgICB9CisKKyAgZnB1dGNfdW5sb2NrZWQgKCdcbicsIHN0ZG91dCk7Cit9CisKKworLyogUHJpbnQgdGhlIHByb2dyYW0gaGVhZGVyLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9waGRyIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyKQoreworICBzaXplX3QgY250OworICBzaXplX3Qgc2hzdHJuZHg7CisKKyAgaWYgKGVoZHItPmVfcGhudW0gPT0gMCkKKyAgICAvKiBObyBwcm9ncmFtIGhlYWRlciwgdGhpcyBpcyBPSyBpbiByZWxvY2F0YWJsZSBvYmplY3RzLiAgKi8KKyAgICByZXR1cm47CisKKyAgcHV0cyAoZ2V0dGV4dCAoIlByb2dyYW0gSGVhZGVyczoiKSk7CisgIGlmIChlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyKQorICAgIHB1dHMgKGdldHRleHQgKCJcCisgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgUGh5c0FkZHIgICBGaWxlU2l6ICBNZW1TaXogICBGbGcgQWxpZ24iKSk7CisgIGVsc2UKKyAgICBwdXRzIChnZXR0ZXh0ICgiXAorICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgICAgICAgICAgUGh5c0FkZHIgICAgICAgICAgIEZpbGVTaXogIE1lbVNpeiAgIEZsZyBBbGlnbiIpKTsKKworICAvKiBQcm9jZXNzIGFsbCBwcm9ncmFtIGhlYWRlcnMuICAqLworICBib29sIGhhc19yZWxybyA9IGZhbHNlOworICBHRWxmX0FkZHIgcmVscm9fZnJvbSA9IDA7CisgIEdFbGZfQWRkciByZWxyb190byA9IDA7CisgIGZvciAoY250ID0gMDsgY250IDwgZWhkci0+ZV9waG51bTsgKytjbnQpCisgICAgeworICAgICAgY2hhciBidWZbMTI4XTsKKyAgICAgIEdFbGZfUGhkciBtZW07CisgICAgICBHRWxmX1BoZHIgKnBoZHIgPSBnZWxmX2dldHBoZHIgKGVibC0+ZWxmLCBjbnQsICZtZW0pOworCisgICAgICAvKiBJZiBmb3Igc29tZSByZWFzb24gdGhlIGhlYWRlciBjYW5ub3QgYmUgcmV0dXJuZWQgc2hvdyB0aGlzLiAgKi8KKyAgICAgIGlmIChwaGRyID09IE5VTEwpCisJeworCSAgcHV0cyAoIiAgPz8/Iik7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHByaW50ZiAoIiAgJS0xNHMgMHglMDYiIFBSSXg2NCAiIDB4JTAqIiBQUkl4NjQgIiAweCUwKiIgUFJJeDY0CisJICAgICAgIiAweCUwNiIgUFJJeDY0ICIgMHglMDYiIFBSSXg2NCAiICVjJWMlYyAweCUiIFBSSXg2NCAiXG4iLAorCSAgICAgIGVibF9zZWdtZW50X3R5cGVfbmFtZSAoZWJsLCBwaGRyLT5wX3R5cGUsIGJ1Ziwgc2l6ZW9mIChidWYpKSwKKwkgICAgICBwaGRyLT5wX29mZnNldCwKKwkgICAgICBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gOCA6IDE2LCBwaGRyLT5wX3ZhZGRyLAorCSAgICAgIGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIgPyA4IDogMTYsIHBoZHItPnBfcGFkZHIsCisJICAgICAgcGhkci0+cF9maWxlc3osCisJICAgICAgcGhkci0+cF9tZW1zeiwKKwkgICAgICBwaGRyLT5wX2ZsYWdzICYgUEZfUiA/ICdSJyA6ICcgJywKKwkgICAgICBwaGRyLT5wX2ZsYWdzICYgUEZfVyA/ICdXJyA6ICcgJywKKwkgICAgICBwaGRyLT5wX2ZsYWdzICYgUEZfWCA/ICdFJyA6ICcgJywKKwkgICAgICBwaGRyLT5wX2FsaWduKTsKKworICAgICAgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9JTlRFUlApCisJeworCSAgLyogV2UgY2FuIHNob3cgdGhlIHVzZXIgdGhlIG5hbWUgb2YgdGhlIGludGVycHJldGVyLiAgKi8KKwkgIHNpemVfdCBtYXhzaXplOworCSAgY2hhciAqZmlsZWRhdGEgPSBlbGZfcmF3ZmlsZSAoZWJsLT5lbGYsICZtYXhzaXplKTsKKworCSAgaWYgKGZpbGVkYXRhICE9IE5VTEwgJiYgcGhkci0+cF9vZmZzZXQgPCBtYXhzaXplKQorCSAgICBwcmludGYgKGdldHRleHQgKCJcdFtSZXF1ZXN0aW5nIHByb2dyYW0gaW50ZXJwcmV0ZXI6ICVzXVxuIiksCisJCSAgICBmaWxlZGF0YSArIHBoZHItPnBfb2Zmc2V0KTsKKwl9CisgICAgICBlbHNlIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfR05VX1JFTFJPKQorCXsKKwkgIGhhc19yZWxybyA9IHRydWU7CisJICByZWxyb19mcm9tID0gcGhkci0+cF92YWRkcjsKKwkgIHJlbHJvX3RvID0gcmVscm9fZnJvbSArIHBoZHItPnBfbWVtc3o7CisJfQorICAgIH0KKworICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCisgIGlmIChlbGZfZ2V0c2hzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKKworICBwdXRzIChnZXR0ZXh0ICgiXG4gU2VjdGlvbiB0byBTZWdtZW50IG1hcHBpbmc6XG4gIFNlZ21lbnQgU2VjdGlvbnMuLi4iKSk7CisKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBlaGRyLT5lX3BobnVtOyArK2NudCkKKyAgICB7CisgICAgICBHRWxmX1BoZHIgcGhkcl9tZW07CisgICAgICBHRWxmX1BoZHIgKnBoZHIgPSBnZWxmX2dldHBoZHIgKGVibC0+ZWxmLCBjbnQsICZwaGRyX21lbSk7CisgICAgICBzaXplX3QgaW5uZXI7CisKKyAgICAgIC8qIFByaW50IHRoZSBzZWdtZW50IG51bWJlci4gICovCisgICAgICBwcmludGYgKCIgICAlMi4yenUgICAgICIsIGNudCk7CisKKyAgICAgIC8qIFRoaXMgbXVzdCBub3QgaGFwcGVuLiAgKi8KKyAgICAgIGlmIChwaGRyID09IE5VTEwpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXI6ICVzIiksCisJICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgICAgIC8qIEl0ZXJhdGUgb3ZlciB0aGUgc2VjdGlvbnMuICAqLworICAgICAgYm9vbCBpbl9yZWxybyA9IGZhbHNlOworICAgICAgYm9vbCBpbl9ybyA9IGZhbHNlOworICAgICAgZm9yIChpbm5lciA9IDE7IGlubmVyIDwgc2hudW07ICsraW5uZXIpCisJeworCSAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIGlubmVyKTsKKwkgIEdFbGZfU2hkciBzaGRyX21lbTsKKwkgIEdFbGZfU2hkciAqc2hkcjsKKworCSAgLyogSXQgc2hvdWxkIG5vdCBoYXBwZW4uICAqLworCSAgaWYgKHNjbiA9PSBOVUxMKQorCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uOiAlcyIpLAorCQkgICBlbGZfZXJybXNnICgtMSkpOworCisJICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyLiAgKi8KKwkgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKwkgIGlmIChzaGRyID09IE5VTEwpCisJICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJCSAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyOiAlcyIpLAorCQkgICBlbGZfZXJybXNnICgtMSkpOworCisJICBpZiAoc2hkci0+c2hfc2l6ZSA+IDAKKwkgICAgICAvKiBDb21wYXJlIGFsbG9jYXRlZCBzZWN0aW9ucyBieSBWTUEsIHVuYWxsb2NhdGVkCisJCSBzZWN0aW9ucyBieSBmaWxlIG9mZnNldC4gICovCisJICAgICAgJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DCisJCSAgPyAoc2hkci0+c2hfYWRkciA+PSBwaGRyLT5wX3ZhZGRyCisJCSAgICAgJiYgKHNoZHItPnNoX2FkZHIgKyBzaGRyLT5zaF9zaXplCisJCQkgPD0gcGhkci0+cF92YWRkciArIHBoZHItPnBfbWVtc3opKQorCQkgIDogKHNoZHItPnNoX29mZnNldCA+PSBwaGRyLT5wX29mZnNldAorCQkgICAgICYmIChzaGRyLT5zaF9vZmZzZXQgKyBzaGRyLT5zaF9zaXplCisJCQkgPD0gcGhkci0+cF9vZmZzZXQgKyBwaGRyLT5wX2ZpbGVzeikpKSkKKwkgICAgeworCSAgICAgIGlmIChoYXNfcmVscm8gJiYgIWluX3JlbHJvCisJCSAgJiYgc2hkci0+c2hfYWRkciA+PSByZWxyb19mcm9tCisJCSAgJiYgc2hkci0+c2hfYWRkciArIHNoZHItPnNoX3NpemUgPD0gcmVscm9fdG8pCisJCXsKKwkJICBmcHV0c191bmxvY2tlZCAoIiBbUkVMUk86Iiwgc3Rkb3V0KTsKKwkJICBpbl9yZWxybyA9IHRydWU7CisJCX0KKwkgICAgICBlbHNlIGlmIChoYXNfcmVscm8gJiYgaW5fcmVscm8gJiYgc2hkci0+c2hfYWRkciA+PSByZWxyb190bykKKwkJeworCQkgIGZwdXRzX3VubG9ja2VkICgiXSIsIHN0ZG91dCk7CisJCSAgaW5fcmVscm8gPSAgZmFsc2U7CisJCX0KKwkgICAgICBlbHNlIGlmIChoYXNfcmVscm8gJiYgaW5fcmVscm8KKwkJICAgICAgICYmIHNoZHItPnNoX2FkZHIgKyBzaGRyLT5zaF9zaXplID4gcmVscm9fdG8pCisJCWZwdXRzX3VubG9ja2VkICgiXSA8UkVMUk86Iiwgc3Rkb3V0KTsKKwkgICAgICBlbHNlIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfTE9BRCAmJiAocGhkci0+cF9mbGFncyAmIFBGX1cpID09IDApCisJCXsKKwkJICBpZiAoIWluX3JvKQorCQkgICAgeworCQkgICAgICBmcHV0c191bmxvY2tlZCAoIiBbUk86Iiwgc3Rkb3V0KTsKKwkJICAgICAgaW5fcm8gPSB0cnVlOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogRGV0ZXJtaW5lIHRoZSBzZWdtZW50IHRoaXMgc2VjdGlvbiBpcyBwYXJ0IG9mLiAgKi8KKwkJICBzaXplX3QgY250MjsKKwkJICBHRWxmX1BoZHIgKnBoZHIyID0gTlVMTDsKKwkJICBmb3IgKGNudDIgPSAwOyBjbnQyIDwgZWhkci0+ZV9waG51bTsgKytjbnQyKQorCQkgICAgeworCQkgICAgICBHRWxmX1BoZHIgcGhkcjJfbWVtOworCQkgICAgICBwaGRyMiA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIGNudDIsICZwaGRyMl9tZW0pOworCisJCSAgICAgIGlmIChwaGRyMiAhPSBOVUxMICYmIHBoZHIyLT5wX3R5cGUgPT0gUFRfTE9BRAorCQkJICAmJiBzaGRyLT5zaF9hZGRyID49IHBoZHIyLT5wX3ZhZGRyCisJCQkgICYmIChzaGRyLT5zaF9hZGRyICsgc2hkci0+c2hfc2l6ZQorCQkJICAgICAgPD0gcGhkcjItPnBfdmFkZHIgKyBwaGRyMi0+cF9tZW1zeikpCisJCQlicmVhazsKKwkJICAgIH0KKworCQkgIGlmIChjbnQyIDwgZWhkci0+ZV9waG51bSkKKwkJICAgIHsKKwkJICAgICAgaWYgKChwaGRyMi0+cF9mbGFncyAmIFBGX1cpID09IDAgJiYgIWluX3JvKQorCQkJeworCQkJICBmcHV0c191bmxvY2tlZCAoIiBbUk86Iiwgc3Rkb3V0KTsKKwkJCSAgaW5fcm8gPSB0cnVlOworCQkJfQorCQkgICAgICBlbHNlIGlmICgocGhkcjItPnBfZmxhZ3MgJiBQRl9XKSAhPSAwICYmIGluX3JvKQorCQkJeworCQkJICBmcHV0c191bmxvY2tlZCAoIl0iLCBzdGRvdXQpOworCQkJICBpbl9ybyA9IGZhbHNlOworCQkJfQorCQkgICAgfQorCQl9CisKKwkgICAgICBwcmludGYgKCIgJXMiLAorCQkgICAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpKTsKKworCSAgICAgIC8qIFNpZ25hbCB0aGF0IHRoaXMgc2VjdGluIGlzIG9ubHkgcGFydGlhbGx5IGNvdmVyZWQuICAqLworCSAgICAgIGlmIChoYXNfcmVscm8gJiYgaW5fcmVscm8KKwkJICAgICAgICYmIHNoZHItPnNoX2FkZHIgKyBzaGRyLT5zaF9zaXplID4gcmVscm9fdG8pCisJCXsKKwkJICBmcHV0c191bmxvY2tlZCAoIj4iLCBzdGRvdXQpOworCQkgIGluX3JlbHJvID0gIGZhbHNlOworCQl9CisJICAgIH0KKwl9CisgICAgICBpZiAoaW5fcmVscm8gfHwgaW5fcm8pCisJZnB1dHNfdW5sb2NrZWQgKCJdIiwgc3Rkb3V0KTsKKworICAgICAgLyogRmluaXNoIHRoZSBsaW5lLiAgKi8KKyAgICAgIGZwdXRjX3VubG9ja2VkICgnXG4nLCBzdGRvdXQpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraGFuZGxlX3NjbmdycCAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKQoreworICBFbGZfRGF0YSAqZGF0YTsKKyAgRWxmMzJfV29yZCAqZ3JwcmVmOworICBFbGZfU2NuICpzeW1zY247CisgIEdFbGZfU2hkciBzeW1zaGRyX21lbTsKKyAgR0VsZl9TaGRyICpzeW1zaGRyOworICBFbGZfRGF0YSAqc3ltZGF0YTsKKyAgR0VsZl9TeW0gc3ltX21lbTsKKyAgc2l6ZV90IGNudDsKKyAgc2l6ZV90IHNoc3RybmR4OworCisgIC8qIEdldCB0aGUgZGF0YSBvZiB0aGUgc2VjdGlvbi4gICovCisgIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKworICBzeW1zY24gPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayk7CisgIHN5bXNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnN5bXNoZHJfbWVtKTsKKyAgc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOworCisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YS0+ZF9zaXplIDwgc2l6ZW9mIChFbGYzMl9Xb3JkKSB8fCBzeW1zaGRyID09IE5VTEwKKyAgICAgIHx8IHN5bWRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLworICBpZiAoZWxmX2dldHNoc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7CisKKyAgZ3JwcmVmID0gKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWY7CisKKyAgcHJpbnRmICgoZ3JwcmVmWzBdICYgR1JQX0NPTURBVCkKKwkgID8gbmdldHRleHQgKCJcCitcbkNPTURBVCBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJ5OlxuIiwKKwkJICAgICAgIlwKK1xuQ09NREFUIHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cmllczpcbiIsCisJCSAgICAgIGRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoRWxmMzJfV29yZCkgLSAxKQorCSAgOiBuZ2V0dGV4dCAoIlwKK1xuU2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIsICJcCitcblNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cmllczpcbiIsCisJCSAgICAgIGRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoRWxmMzJfV29yZCkgLSAxKSwKKwkgIGVsZl9uZHhzY24gKHNjbiksCisJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAorCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHN5bXNoZHItPnNoX2xpbmssCisJCSAgICAgIGdlbGZfZ2V0c3ltIChzeW1kYXRhLCBzaGRyLT5zaF9pbmZvLCAmc3ltX21lbSktPnN0X25hbWUpCisJICA/OiBnZXR0ZXh0ICgiPElOVkFMSUQgU1lNQk9MPiIpLAorCSAgZGF0YS0+ZF9zaXplIC8gc2l6ZW9mIChFbGYzMl9Xb3JkKSAtIDEpOworCisgIGZvciAoY250ID0gMTsgY250IDwgZGF0YS0+ZF9zaXplIC8gc2l6ZW9mIChFbGYzMl9Xb3JkKTsgKytjbnQpCisgICAgeworICAgICAgR0VsZl9TaGRyIGdycHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpncnBzaGRyOworCisgICAgICBncnBzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgZ3JwcmVmW2NudF0pLAorCQkJICAgICAgJmdycHNoZHJfbWVtKTsKKworICAgICAgaWYgKGdycHNoZHIgPT0gTlVMTCkKKwlwcmludGYgKGdldHRleHQgKCIgIFslMnVdIDxJTlZBTElEIFNFQ1RJT04+XG4iKSwgZ3JwcmVmW2NudF0pOworICAgICAgZWxzZQorCXByaW50ZiAoIiAgWyUydV0gJXNcbiIsCisJCWdycHJlZltjbnRdLAorCQllbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIGdycHNoZHItPnNoX25hbWUpCisJCT86IGdldHRleHQgKCI8SU5WQUxJRCBTRUNUSU9OPiIpKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X3NjbmdycCAoRWJsICplYmwpCit7CisgIC8qIEZpbmQgYWxsIHJlbG9jYXRpb24gc2VjdGlvbnMgYW5kIGhhbmRsZSB0aGVtLiAgKi8KKyAgRWxmX1NjbiAqc2NuID0gTlVMTDsKKworICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgLyogSGFuZGxlIHRoZSBzZWN0aW9uIGlmIGl0IGlzIGEgc3ltYm9sIHRhYmxlLiAgKi8KKyAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworCisgICAgICBpZiAoc2hkciAhPSBOVUxMICYmIHNoZHItPnNoX3R5cGUgPT0gU0hUX0dST1VQKQorCWhhbmRsZV9zY25ncnAgKGVibCwgc2NuLCBzaGRyKTsKKyAgICB9Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmbGFncworeworICBpbnQgbWFzazsKKyAgY29uc3QgY2hhciAqc3RyOworfSBkdF9mbGFnc1tdID0KKyAgeworICAgIHsgREZfT1JJR0lOLCAiT1JJR0lOIiB9LAorICAgIHsgREZfU1lNQk9MSUMsICJTWU1CT0xJQyIgfSwKKyAgICB7IERGX1RFWFRSRUwsICJURVhUUkVMIiB9LAorICAgIHsgREZfQklORF9OT1csICJCSU5EX05PVyIgfSwKKyAgICB7IERGX1NUQVRJQ19UTFMsICJTVEFUSUNfVExTIiB9CisgIH07CitzdGF0aWMgY29uc3QgaW50IG5kdF9mbGFncyA9IHNpemVvZiAoZHRfZmxhZ3MpIC8gc2l6ZW9mIChkdF9mbGFnc1swXSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmxhZ3MgZHRfZmxhZ3NfMVtdID0KKyAgeworICAgIHsgREZfMV9OT1csICJOT1ciIH0sCisgICAgeyBERl8xX0dMT0JBTCwgIkdMT0JBTCIgfSwKKyAgICB7IERGXzFfR1JPVVAsICJHUk9VUCIgfSwKKyAgICB7IERGXzFfTk9ERUxFVEUsICJOT0RFTEVURSIgfSwKKyAgICB7IERGXzFfTE9BREZMVFIsICJMT0FERkxUUiIgfSwKKyAgICB7IERGXzFfSU5JVEZJUlNULCAiSU5JVEZJUlNUIiB9LAorICAgIHsgREZfMV9OT09QRU4sICJOT09QRU4iIH0sCisgICAgeyBERl8xX09SSUdJTiwgIk9SSUdJTiIgfSwKKyAgICB7IERGXzFfRElSRUNULCAiRElSRUNUIiB9LAorICAgIHsgREZfMV9UUkFOUywgIlRSQU5TIiB9LAorICAgIHsgREZfMV9JTlRFUlBPU0UsICJJTlRFUlBPU0UiIH0sCisgICAgeyBERl8xX05PREVGTElCLCAiTk9ERUZMSUIiIH0sCisgICAgeyBERl8xX05PRFVNUCwgIk5PRFVNUCIgfSwKKyAgICB7IERGXzFfQ09ORkFMVCwgIkNPTkZBTFQiIH0sCisgICAgeyBERl8xX0VOREZJTFRFRSwgIkVOREZJTFRFRSIgfSwKKyAgICB7IERGXzFfRElTUFJFTERORSwgIkRJU1BSRUxETkUiIH0sCisgICAgeyBERl8xX0RJU1BSRUxQTkQsICJESVNQUkVMUE5EIiB9LAorICB9Oworc3RhdGljIGNvbnN0IGludCBuZHRfZmxhZ3NfMSA9IHNpemVvZiAoZHRfZmxhZ3NfMSkgLyBzaXplb2YgKGR0X2ZsYWdzXzFbMF0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZsYWdzIGR0X2ZlYXR1cmVfMVtdID0KKyAgeworICAgIHsgRFRGXzFfUEFSSU5JVCwgIlBBUklOSVQiIH0sCisgICAgeyBEVEZfMV9DT05GRVhQLCAiQ09ORkVYUCIgfQorICB9Oworc3RhdGljIGNvbnN0IGludCBuZHRfZmVhdHVyZV8xID0gKHNpemVvZiAoZHRfZmVhdHVyZV8xKQorCQkJCSAgLyBzaXplb2YgKGR0X2ZlYXR1cmVfMVswXSkpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZsYWdzIGR0X3Bvc2ZsYWdfMVtdID0KKyAgeworICAgIHsgREZfUDFfTEFaWUxPQUQsICJMQVpZTE9BRCIgfSwKKyAgICB7IERGX1AxX0dST1VQUEVSTSwgIkdST1VQUEVSTSIgfQorICB9Oworc3RhdGljIGNvbnN0IGludCBuZHRfcG9zZmxhZ18xID0gKHNpemVvZiAoZHRfcG9zZmxhZ18xKQorCQkJCSAgLyBzaXplb2YgKGR0X3Bvc2ZsYWdfMVswXSkpOworCisKK3N0YXRpYyB2b2lkCitwcmludF9mbGFncyAoaW50IGNsYXNzLCBHRWxmX1h3b3JkIGRfdmFsLCBjb25zdCBzdHJ1Y3QgZmxhZ3MgKmZsYWdzLAorCQlpbnQgbmZsYWdzKQoreworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgaW50IGNudDsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IG5mbGFnczsgKytjbnQpCisgICAgaWYgKGRfdmFsICYgZmxhZ3NbY250XS5tYXNrKQorICAgICAgeworCWlmICghZmlyc3QpCisJICBwdXRjaGFyX3VubG9ja2VkICgnICcpOworCWZwdXRzX3VubG9ja2VkIChmbGFnc1tjbnRdLnN0ciwgc3Rkb3V0KTsKKwlkX3ZhbCAmPSB+ZmxhZ3NbY250XS5tYXNrOworCWZpcnN0ID0gZmFsc2U7CisgICAgICB9CisKKyAgaWYgKGRfdmFsICE9IDApCisgICAgeworICAgICAgaWYgKCFmaXJzdCkKKwlwdXRjaGFyX3VubG9ja2VkICgnICcpOworICAgICAgcHJpbnRmICgiJSMwKiIgUFJJeDY0LCBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgZF92YWwpOworICAgIH0KKworICBwdXRjaGFyX3VubG9ja2VkICgnXG4nKTsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfZHRfZmxhZ3MgKGludCBjbGFzcywgR0VsZl9Yd29yZCBkX3ZhbCkKK3sKKyAgcHJpbnRfZmxhZ3MgKGNsYXNzLCBkX3ZhbCwgZHRfZmxhZ3MsIG5kdF9mbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X2R0X2ZsYWdzXzEgKGludCBjbGFzcywgR0VsZl9Yd29yZCBkX3ZhbCkKK3sKKyAgcHJpbnRfZmxhZ3MgKGNsYXNzLCBkX3ZhbCwgZHRfZmxhZ3NfMSwgbmR0X2ZsYWdzXzEpOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9kdF9mZWF0dXJlXzEgKGludCBjbGFzcywgR0VsZl9Yd29yZCBkX3ZhbCkKK3sKKyAgcHJpbnRfZmxhZ3MgKGNsYXNzLCBkX3ZhbCwgZHRfZmVhdHVyZV8xLCBuZHRfZmVhdHVyZV8xKTsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfZHRfcG9zZmxhZ18xIChpbnQgY2xhc3MsIEdFbGZfWHdvcmQgZF92YWwpCit7CisgIHByaW50X2ZsYWdzIChjbGFzcywgZF92YWwsIGR0X3Bvc2ZsYWdfMSwgbmR0X3Bvc2ZsYWdfMSk7Cit9CisKKworc3RhdGljIHZvaWQKK2hhbmRsZV9keW5hbWljIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpCit7CisgIGludCBjbGFzcyA9IGdlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKTsKKyAgR0VsZl9TaGRyIGdsaW5rOworICBFbGZfRGF0YSAqZGF0YTsKKyAgc2l6ZV90IGNudDsKKyAgc2l6ZV90IHNoc3RybmR4OworCisgIC8qIEdldCB0aGUgZGF0YSBvZiB0aGUgc2VjdGlvbi4gICovCisgIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLworICBpZiAoZWxmX2dldHNoc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7CisKKyAgcHJpbnRmIChuZ2V0dGV4dCAoIlwKK1xuRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyeTpcbiBBZGRyOiAlIzAqIiBQUkl4NjQgIiAgT2Zmc2V0OiAlIzA4IiBQUkl4NjQgIiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iLAorCQkgICAgIlwKK1xuRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIEFkZHI6ICUjMCoiIFBSSXg2NCAiICBPZmZzZXQ6ICUjMDgiIFBSSXg2NCAiICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIsCisJCSAgICBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZSksCisJICAodW5zaWduZWQgbG9uZyBpbnQpIChzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZSksCisJICBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgc2hkci0+c2hfYWRkciwKKwkgIHNoZHItPnNoX29mZnNldCwKKwkgIChpbnQpIHNoZHItPnNoX2xpbmssCisJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsCisJCSAgICAgIGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspLAorCQkJCSAgICAmZ2xpbmspLT5zaF9uYW1lKSk7CisgIGZwdXRzX3VubG9ja2VkIChnZXR0ZXh0ICgiICBUeXBlICAgICAgICAgICAgICBWYWx1ZVxuIiksIHN0ZG91dCk7CisKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsgKytjbnQpCisgICAgeworICAgICAgY2hhciBidWZbNjRdOworICAgICAgR0VsZl9EeW4gZHlubWVtOworICAgICAgR0VsZl9EeW4gKmR5bjsKKworICAgICAgZHluID0gZ2VsZl9nZXRkeW4gKGRhdGEsIGNudCwgJmR5bm1lbSk7CisgICAgICBpZiAoZHluID09IE5VTEwpCisJYnJlYWs7CisKKyAgICAgIHByaW50ZiAoIiAgJS0xN3MgIiwKKwkgICAgICBlYmxfZHluYW1pY190YWdfbmFtZSAoZWJsLCBkeW4tPmRfdGFnLCBidWYsIHNpemVvZiAoYnVmKSkpOworCisgICAgICBzd2l0Y2ggKGR5bi0+ZF90YWcpCisJeworCWNhc2UgRFRfTlVMTDoKKwljYXNlIERUX0RFQlVHOgorCWNhc2UgRFRfQklORF9OT1c6CisJY2FzZSBEVF9URVhUUkVMOgorCSAgLyogTm8gZnVydGhlciBvdXRwdXQuICAqLworCSAgZnB1dGMgKCdcbicsIHN0ZG91dCk7CisJICBicmVhazsKKworCWNhc2UgRFRfTkVFREVEOgorCSAgcHJpbnRmIChnZXR0ZXh0ICgiU2hhcmVkIGxpYnJhcnk6IFslc11cbiIpLAorCQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rLCBkeW4tPmRfdW4uZF92YWwpKTsKKwkgIGJyZWFrOworCisJY2FzZSBEVF9TT05BTUU6CisJICBwcmludGYgKGdldHRleHQgKCJMaWJyYXJ5IHNvbmFtZTogWyVzXVxuIiksCisJCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmssIGR5bi0+ZF91bi5kX3ZhbCkpOworCSAgYnJlYWs7CisKKwljYXNlIERUX1JQQVRIOgorCSAgcHJpbnRmIChnZXR0ZXh0ICgiTGlicmFyeSBycGF0aDogWyVzXVxuIiksCisJCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmssIGR5bi0+ZF91bi5kX3ZhbCkpOworCSAgYnJlYWs7CisKKwljYXNlIERUX1JVTlBBVEg6CisJICBwcmludGYgKGdldHRleHQgKCJMaWJyYXJ5IHJ1bnBhdGg6IFslc11cbiIpLAorCQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rLCBkeW4tPmRfdW4uZF92YWwpKTsKKwkgIGJyZWFrOworCisJY2FzZSBEVF9QTFRSRUxTWjoKKwljYXNlIERUX1JFTEFTWjoKKwljYXNlIERUX1NUUlNaOgorCWNhc2UgRFRfUkVMU1o6CisJY2FzZSBEVF9SRUxBRU5UOgorCWNhc2UgRFRfU1lNRU5UOgorCWNhc2UgRFRfUkVMRU5UOgorCWNhc2UgRFRfUExUUEFEU1o6CisJY2FzZSBEVF9NT1ZFRU5UOgorCWNhc2UgRFRfTU9WRVNaOgorCWNhc2UgRFRfSU5JVF9BUlJBWVNaOgorCWNhc2UgRFRfRklOSV9BUlJBWVNaOgorCWNhc2UgRFRfU1lNSU5TWjoKKwljYXNlIERUX1NZTUlORU5UOgorCWNhc2UgRFRfR05VX0NPTkZMSUNUU1o6CisJY2FzZSBEVF9HTlVfTElCTElTVFNaOgorCSAgcHJpbnRmIChnZXR0ZXh0ICgiJSIgUFJJZDY0ICIgKGJ5dGVzKVxuIiksIGR5bi0+ZF91bi5kX3ZhbCk7CisJICBicmVhazsKKworCWNhc2UgRFRfVkVSREVGTlVNOgorCWNhc2UgRFRfVkVSTkVFRE5VTToKKwljYXNlIERUX1JFTEFDT1VOVDoKKwljYXNlIERUX1JFTENPVU5UOgorCSAgcHJpbnRmICgiJSIgUFJJZDY0ICJcbiIsIGR5bi0+ZF91bi5kX3ZhbCk7CisJICBicmVhazsKKworCWNhc2UgRFRfUExUUkVMOgorCSAgcHV0cyAoZWJsX2R5bmFtaWNfdGFnX25hbWUgKGVibCwgZHluLT5kX3VuLmRfdmFsLCBOVUxMLCAwKSk7CisJICBicmVhazsKKworCWNhc2UgRFRfRkxBR1M6CisJICBwcmludF9kdF9mbGFncyAoY2xhc3MsIGR5bi0+ZF91bi5kX3ZhbCk7CisJICBicmVhazsKKworCWNhc2UgRFRfRkxBR1NfMToKKwkgIHByaW50X2R0X2ZsYWdzXzEgKGNsYXNzLCBkeW4tPmRfdW4uZF92YWwpOworCSAgYnJlYWs7CisKKwljYXNlIERUX0ZFQVRVUkVfMToKKwkgIHByaW50X2R0X2ZlYXR1cmVfMSAoY2xhc3MsIGR5bi0+ZF91bi5kX3ZhbCk7CisJICBicmVhazsKKworCWNhc2UgRFRfUE9TRkxBR18xOgorCSAgcHJpbnRfZHRfcG9zZmxhZ18xIChjbGFzcywgZHluLT5kX3VuLmRfdmFsKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHByaW50ZiAoIiUjMCoiIFBSSXg2NCAiXG4iLAorCQkgIGNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCBkeW4tPmRfdW4uZF92YWwpOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworCisvKiBQcmludCB0aGUgZHluYW1pYyBzZWdtZW50LiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9keW5hbWljIChFYmwgKmVibCkKK3sKKyAgLyogRmluZCBhbGwgcmVsb2NhdGlvbiBzZWN0aW9ucyBhbmQgaGFuZGxlIHRoZW0uICAqLworICBFbGZfU2NuICpzY24gPSBOVUxMOworCisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAvKiBIYW5kbGUgdGhlIHNlY3Rpb24gaWYgaXQgaXMgYSBzeW1ib2wgdGFibGUuICAqLworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIGlmIChzaGRyICE9IE5VTEwgJiYgc2hkci0+c2hfdHlwZSA9PSBTSFRfRFlOQU1JQykKKwl7CisJICBoYW5kbGVfZHluYW1pYyAoZWJsLCBzY24sIHNoZHIpOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworCisvKiBQcmludCByZWxvY2F0aW9ucy4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfcmVsb2NzIChFYmwgKmVibCkKK3sKKyAgLyogRmluZCBhbGwgcmVsb2NhdGlvbiBzZWN0aW9ucyBhbmQgaGFuZGxlIHRoZW0uICAqLworICBFbGZfU2NuICpzY24gPSBOVUxMOworCisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAvKiBIYW5kbGUgdGhlIHNlY3Rpb24gaWYgaXQgaXMgYSBzeW1ib2wgdGFibGUuICAqLworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIGlmIChzaGRyICE9IE5VTEwpCisJeworCSAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKKwkgICAgaGFuZGxlX3JlbG9jc19yZWwgKGVibCwgc2NuLCBzaGRyKTsKKwkgIGVsc2UgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpCisJICAgIGhhbmRsZV9yZWxvY3NfcmVsYSAoZWJsLCBzY24sIHNoZHIpOworCX0KKyAgICB9Cit9CisKKworLyogSGFuZGxlIGEgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfcmVsb2NzX3JlbCAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKQoreworICBpbnQgY2xhc3MgPSBnZWxmX2dldGNsYXNzIChlYmwtPmVsZik7CisgIGludCBuZW50cmllcyA9IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOworICBpbnQgY250OworICBFbGZfRGF0YSAqZGF0YTsKKyAgRWxmX1NjbiAqc3ltc2NuOworICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07CisgIEdFbGZfU2hkciAqc3ltc2hkcjsKKyAgRWxmX0RhdGEgKnN5bWRhdGE7CisgIEdFbGZfU2hkciBkZXN0c2hkcl9tZW07CisgIEdFbGZfU2hkciAqZGVzdHNoZHI7CisgIEVsZl9TY24gKnhuZHhzY247CisgIEVsZl9EYXRhICp4bmR4ZGF0YSA9IE5VTEw7CisgIHNpemVfdCBzaHN0cm5keDsKKworICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLworICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIEdldCB0aGUgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uLiAgKi8KKyAgc3ltc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspOworICBzeW1zaGRyID0gZ2VsZl9nZXRzaGRyIChzeW1zY24sICZzeW1zaGRyX21lbSk7CisgIHN5bWRhdGEgPSBlbGZfZ2V0ZGF0YSAoc3ltc2NuLCBOVUxMKTsKKworICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIG9mIHRoZSBzZWN0aW9uIHRoZSByZWxvY2F0aW9ucyBhcmUgZm9yLiAgKi8KKyAgZGVzdHNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9pbmZvKSwKKwkJCSAgICZkZXN0c2hkcl9tZW0pOworCisgIGlmIChzeW1zaGRyID09IE5VTEwgfHwgc3ltZGF0YSA9PSBOVUxMIHx8IGRlc3RzaGRyID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXG5JbnZhbGlkIHN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIlxuIiksCisJICAgICAgc2hkci0+c2hfb2Zmc2V0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogU2VhcmNoIGZvciB0aGUgb3B0aW9uYWwgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZS4gICovCisgIHhuZHhzY24gPSBOVUxMOworICB3aGlsZSAoKHhuZHhzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHhuZHhzY24pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIEdFbGZfU2hkciB4bmR4c2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnhuZHhzaGRyOworCisgICAgICB4bmR4c2hkciA9IGdlbGZfZ2V0c2hkciAoeG5keHNjbiwgJnhuZHhzaGRyX21lbSk7CisgICAgICBpZiAoeG5keHNoZHIgIT0gTlVMTCAmJiB4bmR4c2hkci0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCX1NITkRYCisJICAmJiB4bmR4c2hkci0+c2hfbGluayA9PSBlbGZfbmR4c2NuIChzeW1zY24pKQorCXsKKwkgIC8qIEZvdW5kIGl0LiAgKi8KKwkgIHhuZHhkYXRhID0gZWxmX2dldGRhdGEgKHhuZHhzY24sIE5VTEwpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCisgIGlmIChlbGZfZ2V0c2hzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKKworICBpZiAoc2hkci0+c2hfaW5mbyAhPSAwKQorICAgIHByaW50ZiAobmdldHRleHQgKCJcCitcblJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGZvciBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMCIgUFJJeDY0ICIgY29udGFpbnMgJWQgZW50cnk6XG4iLAorCQkgICAgIlwKK1xuUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIiBjb250YWlucyAlZCBlbnRyaWVzOlxuIiwKKwkJICAgICAgbmVudHJpZXMpLAorCSAgICAodW5zaWduZWQgaW50KSBlbGZfbmR4c2NuIChzY24pLAorCSAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAorCSAgICAodW5zaWduZWQgaW50KSBzaGRyLT5zaF9pbmZvLAorCSAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIGRlc3RzaGRyLT5zaF9uYW1lKSwKKwkgICAgc2hkci0+c2hfb2Zmc2V0LAorCSAgICBuZW50cmllcyk7CisgIGVsc2UKKyAgICAvKiBUaGUgLnJlbC5keW4gc2VjdGlvbiBkb2VzIG5vdCByZWZlciB0byBhIHNwZWNpZmljIHNlY3Rpb24gYnV0CisgICAgICAgaW5zdGVhZCBvZiBzZWN0aW9uIGluZGV4IHplcm8uICBEbyBub3QgdHJ5IHRvIHByaW50IGEgc2VjdGlvbgorICAgICAgIG5hbWUuICAqLworICAgIHByaW50ZiAobmdldHRleHQgKCJcCitcblJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiIGNvbnRhaW5zICVkIGVudHJ5OlxuIiwKKwkJICAgICJcCitcblJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iLAorCQkgICAgICBuZW50cmllcyksCisJICAgICh1bnNpZ25lZCBpbnQpIGVsZl9uZHhzY24gKHNjbiksCisJICAgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCisJICAgIHNoZHItPnNoX29mZnNldCwKKwkgICAgbmVudHJpZXMpOworICBmcHV0c191bmxvY2tlZCAoY2xhc3MgPT0gRUxGQ0xBU1MzMgorCQkgID8gZ2V0dGV4dCAoIlwKKyAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgTmFtZVxuIikKKwkJICA6IGdldHRleHQgKCJcCisgIE9mZnNldCAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICBOYW1lXG4iKSwKKwkgc3Rkb3V0KTsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IG5lbnRyaWVzOyArK2NudCkKKyAgICB7CisgICAgICBHRWxmX1JlbCByZWxtZW07CisgICAgICBHRWxmX1JlbCAqcmVsOworCisgICAgICByZWwgPSBnZWxmX2dldHJlbCAoZGF0YSwgY250LCAmcmVsbWVtKTsKKyAgICAgIGlmIChyZWwgIT0gTlVMTCkKKwl7CisJICBjaGFyIGJ1ZlsxMjhdOworCSAgR0VsZl9TeW0gc3ltbWVtOworCSAgR0VsZl9TeW0gKnN5bTsKKwkgIEVsZjMyX1dvcmQgeG5keDsKKworCSAgc3ltID0gZ2VsZl9nZXRzeW1zaG5keCAoc3ltZGF0YSwgeG5keGRhdGEsIEdFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKSwKKwkJCQkgICZzeW1tZW0sICZ4bmR4KTsKKwkgIGlmIChzeW0gPT0gTlVMTCkKKwkgICAgcHJpbnRmICgiICAlIzAqIiBQUkl4NjQgIiAgJS0yMHMgPCVzICVsZD5cbiIsCisJCSAgICBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgcmVsLT5yX29mZnNldCwKKwkJICAgIGVibF9yZWxvY190eXBlX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJCSAgICAvKiBBdm9pZCB0aGUgbGVhZGluZyBSXyB3aGljaCBpc24ndCBjYXJyeWluZyBhbnkKKwkJICAgICAgIGluZm9ybWF0aW9uLiAgKi8KKwkJICAgID8gZWJsX3JlbG9jX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pLAorCQkJCQkgICBidWYsIHNpemVvZiAoYnVmKSkgKyAyCisJCSAgICA6IGdldHRleHQgKCI8SU5WQUxJRCBSRUxPQz4iKSwKKwkJICAgIGdldHRleHQgKCJJTlZBTElEIFNZTUJPTCIpLAorCQkgICAgKGxvbmcgaW50KSBHRUxGX1JfU1lNIChyZWwtPnJfaW5mbykpOworCSAgZWxzZSBpZiAoR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9TRUNUSU9OKQorCSAgICBwcmludGYgKCIgICUjMCoiIFBSSXg2NCAiICAlLTIwcyAlIzAqIiBQUkl4NjQgIiAgJXNcbiIsCisJCSAgICBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgcmVsLT5yX29mZnNldCwKKwkJICAgIGVibF9yZWxvY190eXBlX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJCSAgICAvKiBBdm9pZCB0aGUgbGVhZGluZyBSXyB3aGljaCBpc24ndCBjYXJyeWluZyBhbnkKKwkJICAgICAgIGluZm9ybWF0aW9uLiAgKi8KKwkJICAgID8gZWJsX3JlbG9jX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pLAorCQkJCQkgICBidWYsIHNpemVvZiAoYnVmKSkgKyAyCisJCSAgICA6IGdldHRleHQgKCI8SU5WQUxJRCBSRUxPQz4iKSwKKwkJICAgIGNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCBzeW0tPnN0X3ZhbHVlLAorCQkgICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHN5bXNoZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZGVzdHNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLAorCQkJCQkJICAgc3ltLT5zdF9zaG5keCA9PSBTSE5fWElOREVYCisJCQkJCQkgICA/IHhuZHggOiBzeW0tPnN0X3NobmR4KSwKKwkJCQkgICAgICAgJmRlc3RzaGRyX21lbSk7CisKKwkgICAgICBpZiAoc2hkciA9PSBOVUxMKQorCQlwcmludGYgKCIgICUjMCoiIFBSSXg2NCAiICAlLTIwcyA8JXMgJWxkPlxuIiwKKwkJCWNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCByZWwtPnJfb2Zmc2V0LAorCQkJZWJsX3JlbG9jX3R5cGVfY2hlY2sgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKwkJCS8qIEF2b2lkIHRoZSBsZWFkaW5nIFJfIHdoaWNoIGlzbid0IGNhcnJ5aW5nIGFueQorCQkJICAgaW5mb3JtYXRpb24uICAqLworCQkJPyBlYmxfcmVsb2NfdHlwZV9uYW1lIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyksCisJCQkJCSAgICAgICBidWYsIHNpemVvZiAoYnVmKSkgKyAyCisJCQk6IGdldHRleHQgKCI8SU5WQUxJRCBSRUxPQz4iKSwKKwkJCWdldHRleHQgKCJJTlZBTElEIFNFQ1RJT04iKSwKKwkJCShsb25nIGludCkgKHN5bS0+c3Rfc2huZHggPT0gU0hOX1hJTkRFWAorCQkJCSAgICA/IHhuZHggOiBzeW0tPnN0X3NobmR4KSk7CisJICAgICAgZWxzZQorCQlwcmludGYgKCIgICUjMCoiIFBSSXg2NCAiICAlLTIwcyAlIzAqIiBQUkl4NjQgIiAgJXNcbiIsCisJCQljbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgcmVsLT5yX29mZnNldCwKKwkJCWVibF9yZWxvY190eXBlX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJCQkvKiBBdm9pZCB0aGUgbGVhZGluZyBSXyB3aGljaCBpc24ndCBjYXJyeWluZyBhbnkKKwkJCSAgIGluZm9ybWF0aW9uLiAgKi8KKwkJCT8gZWJsX3JlbG9jX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pLAorCQkJCQkgICAgICAgYnVmLCBzaXplb2YgKGJ1ZikpICsgMgorCQkJOiBnZXR0ZXh0ICgiPElOVkFMSUQgUkVMT0M+IiksCisJCQljbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgc3ltLT5zdF92YWx1ZSwKKwkJCWVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgZGVzdHNoZHItPnNoX25hbWUpKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworLyogSGFuZGxlIGEgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfcmVsb2NzX3JlbGEgKEVibCAqZWJsLCBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkcikKK3sKKyAgaW50IGNsYXNzID0gZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpOworICBpbnQgbmVudHJpZXMgPSBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKKworICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLworICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBHZXQgdGhlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbi4gICovCisgIEVsZl9TY24gKnN5bXNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKTsKKyAgR0VsZl9TaGRyIHN5bXNoZHJfbWVtOworICBHRWxmX1NoZHIgKnN5bXNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnN5bXNoZHJfbWVtKTsKKyAgRWxmX0RhdGEgKnN5bWRhdGEgPSBlbGZfZ2V0ZGF0YSAoc3ltc2NuLCBOVUxMKTsKKworICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIG9mIHRoZSBzZWN0aW9uIHRoZSByZWxvY2F0aW9ucyBhcmUgZm9yLiAgKi8KKyAgR0VsZl9TaGRyIGRlc3RzaGRyX21lbTsKKyAgR0VsZl9TaGRyICpkZXN0c2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2luZm8pLAorCQkJCSAgICAgICZkZXN0c2hkcl9tZW0pOworCisgIGlmIChzeW1zaGRyID09IE5VTEwgfHwgc3ltZGF0YSA9PSBOVUxMIHx8IGRlc3RzaGRyID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXG5JbnZhbGlkIHN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIlxuIiksCisJICAgICAgc2hkci0+c2hfb2Zmc2V0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogU2VhcmNoIGZvciB0aGUgb3B0aW9uYWwgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZS4gICovCisgIEVsZl9EYXRhICp4bmR4ZGF0YSA9IE5VTEw7CisgIEVsZl9TY24gKnhuZHhzY24gPSBOVUxMOworICB3aGlsZSAoKHhuZHhzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHhuZHhzY24pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIEdFbGZfU2hkciB4bmR4c2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnhuZHhzaGRyOworCisgICAgICB4bmR4c2hkciA9IGdlbGZfZ2V0c2hkciAoeG5keHNjbiwgJnhuZHhzaGRyX21lbSk7CisgICAgICBpZiAoeG5keHNoZHIgIT0gTlVMTCAmJiB4bmR4c2hkci0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCX1NITkRYCisJICAmJiB4bmR4c2hkci0+c2hfbGluayA9PSBlbGZfbmR4c2NuIChzeW1zY24pKQorCXsKKwkgIC8qIEZvdW5kIGl0LiAgKi8KKwkgIHhuZHhkYXRhID0gZWxmX2dldGRhdGEgKHhuZHhzY24sIE5VTEwpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCisgIHNpemVfdCBzaHN0cm5keDsKKyAgaWYgKGVsZl9nZXRzaHN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOworCisgIHByaW50ZiAobmdldHRleHQgKCJcCitcblJlbG9jYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBmb3Igc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiIGNvbnRhaW5zICVkIGVudHJ5OlxuIiwKKwkJICAgICJcCitcblJlbG9jYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBmb3Igc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iLAorCQkgICAgbmVudHJpZXMpLAorCSAgZWxmX25keHNjbiAoc2NuKSwKKwkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCisJICAodW5zaWduZWQgaW50KSBzaGRyLT5zaF9pbmZvLAorCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBkZXN0c2hkci0+c2hfbmFtZSksCisJICBzaGRyLT5zaF9vZmZzZXQsCisJICBuZW50cmllcyk7CisgIGZwdXRzX3VubG9ja2VkIChjbGFzcyA9PSBFTEZDTEFTUzMyCisJCSAgPyBnZXR0ZXh0ICgiXAorICBPZmZzZXQgICAgICBUeXBlICAgICAgICAgICAgVmFsdWUgICAgICAgQWRkZW5kIE5hbWVcbiIpCisJCSAgOiBnZXR0ZXh0ICgiXAorICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIEFkZGVuZCBOYW1lXG4iKSwKKwkJICBzdGRvdXQpOworCisgIGZvciAoaW50IGNudCA9IDA7IGNudCA8IG5lbnRyaWVzOyArK2NudCkKKyAgICB7CisgICAgICBHRWxmX1JlbGEgcmVsbWVtOworICAgICAgR0VsZl9SZWxhICpyZWwgPSBnZWxmX2dldHJlbGEgKGRhdGEsIGNudCwgJnJlbG1lbSk7CisgICAgICBpZiAocmVsICE9IE5VTEwpCisJeworCSAgY2hhciBidWZbNjRdOworCSAgR0VsZl9TeW0gc3ltbWVtOworCSAgR0VsZl9TeW0gKnN5bTsKKwkgIEVsZjMyX1dvcmQgeG5keDsKKworCSAgc3ltID0gZ2VsZl9nZXRzeW1zaG5keCAoc3ltZGF0YSwgeG5keGRhdGEsIEdFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKSwKKwkJCQkgICZzeW1tZW0sICZ4bmR4KTsKKworCSAgaWYgKHN5bSA9PSBOVUxMKQorCSAgICBwcmludGYgKCIgICUjMCoiIFBSSXg2NCAiICAlLTE1cyA8JXMgJWxkPlxuIiwKKwkJICAgIGNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCByZWwtPnJfb2Zmc2V0LAorCQkgICAgZWJsX3JlbG9jX3R5cGVfY2hlY2sgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKwkJICAgIC8qIEF2b2lkIHRoZSBsZWFkaW5nIFJfIHdoaWNoIGlzbid0IGNhcnJ5aW5nIGFueQorCQkgICAgICAgaW5mb3JtYXRpb24uICAqLworCQkgICAgPyBlYmxfcmVsb2NfdHlwZV9uYW1lIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyksCisJCQkJCSAgIGJ1Ziwgc2l6ZW9mIChidWYpKSArIDIKKwkJICAgIDogZ2V0dGV4dCAoIjxJTlZBTElEIFJFTE9DPiIpLAorCQkgICAgZ2V0dGV4dCAoIklOVkFMSUQgU1lNQk9MIiksCisJCSAgICAobG9uZyBpbnQpIEdFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKSk7CisJICBlbHNlIGlmIChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX1NFQ1RJT04pCisJICAgIHByaW50ZiAoIlwKKyAgJSMwKiIgUFJJeDY0ICIgICUtMTVzICUjMCoiIFBSSXg2NCAiICArJTUiIFBSSWQ2NCAiICVzXG4iLAorCQkgICAgY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIHJlbC0+cl9vZmZzZXQsCisJCSAgICBlYmxfcmVsb2NfdHlwZV9jaGVjayAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCQkgICAgLyogQXZvaWQgdGhlIGxlYWRpbmcgUl8gd2hpY2ggaXNuJ3QgY2FycnlpbmcgYW55CisJCSAgICAgICBpbmZvcm1hdGlvbi4gICovCisJCSAgICA/IGVibF9yZWxvY190eXBlX25hbWUgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSwKKwkJCQkJICAgYnVmLCBzaXplb2YgKGJ1ZikpICsgMgorCQkgICAgOiBnZXR0ZXh0ICgiPElOVkFMSUQgUkVMT0M+IiksCisJCSAgICBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgc3ltLT5zdF92YWx1ZSwKKwkJICAgIHJlbC0+cl9hZGRlbmQsCisJCSAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc3ltc2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBkZXN0c2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsCisJCQkJCQkgICBzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgKKwkJCQkJCSAgID8geG5keCA6IHN5bS0+c3Rfc2huZHgpLAorCQkJCSAgICAgICAmZGVzdHNoZHJfbWVtKTsKKworCSAgICAgIGlmIChzaGRyID09IE5VTEwpCisJCXByaW50ZiAoIiAgJSMwKiIgUFJJeDY0ICIgICUtMTVzIDwlcyAlbGQ+XG4iLAorCQkJY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIHJlbC0+cl9vZmZzZXQsCisJCQllYmxfcmVsb2NfdHlwZV9jaGVjayAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCQkJLyogQXZvaWQgdGhlIGxlYWRpbmcgUl8gd2hpY2ggaXNuJ3QgY2FycnlpbmcgYW55CisJCQkgICBpbmZvcm1hdGlvbi4gICovCisJCQk/IGVibF9yZWxvY190eXBlX25hbWUgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSwKKwkJCQkJICAgICAgIGJ1Ziwgc2l6ZW9mIChidWYpKSArIDIKKwkJCTogZ2V0dGV4dCAoIjxJTlZBTElEIFJFTE9DPiIpLAorCQkJZ2V0dGV4dCAoIklOVkFMSUQgU0VDVElPTiIpLAorCQkJKGxvbmcgaW50KSAoc3ltLT5zdF9zaG5keCA9PSBTSE5fWElOREVYCisJCQkJICAgID8geG5keCA6IHN5bS0+c3Rfc2huZHgpKTsKKwkgICAgICBlbHNlCisJCXByaW50ZiAoIlwKKyAgJSMwKiIgUFJJeDY0ICIgICUtMTVzICUjMCoiIFBSSXg2NCAiICArJTUiIFBSSWQ2NCAiICVzXG4iLAorCQkJY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIHJlbC0+cl9vZmZzZXQsCisJCQllYmxfcmVsb2NfdHlwZV9jaGVjayAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCQkJLyogQXZvaWQgdGhlIGxlYWRpbmcgUl8gd2hpY2ggaXNuJ3QgY2FycnlpbmcgYW55CisJCQkgICBpbmZvcm1hdGlvbi4gICovCisJCQk/IGVibF9yZWxvY190eXBlX25hbWUgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSwKKwkJCQkJICAgICAgIGJ1Ziwgc2l6ZW9mIChidWYpKSArIDIKKwkJCTogZ2V0dGV4dCAoIjxJTlZBTElEIFJFTE9DPiIpLAorCQkJY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIHN5bS0+c3RfdmFsdWUsCisJCQlyZWwtPnJfYWRkZW5kLAorCQkJZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBkZXN0c2hkci0+c2hfbmFtZSkpOworCSAgICB9CisJfQorICAgIH0KK30KKworCisvKiBQcmludCB0aGUgcHJvZ3JhbSBoZWFkZXIuICAqLworc3RhdGljIHZvaWQKK3ByaW50X3N5bXRhYiAoRWJsICplYmwsIGludCB0eXBlKQoreworICAvKiBGaW5kIHRoZSBzeW1ib2wgdGFibGUocykuICBGb3IgdGhpcyB3ZSBoYXZlIHRvIHNlYXJjaCB0aHJvdWdoIHRoZQorICAgICBzZWN0aW9uIHRhYmxlLiAgKi8KKyAgRWxmX1NjbiAqc2NuID0gTlVMTDsKKworICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgdGhlIHNlY3Rpb24gaWYgaXQgaXMgYSBzeW1ib2wgdGFibGUuICAqLworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIGlmIChzaGRyICE9IE5VTEwgJiYgc2hkci0+c2hfdHlwZSA9PSAoR0VsZl9Xb3JkKSB0eXBlKQorCWhhbmRsZV9zeW10YWIgKGVibCwgc2NuLCBzaGRyKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2hhbmRsZV9zeW10YWIgKEVibCAqZWJsLCBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkcikKK3sKKyAgRWxmX0RhdGEgKnZlcnN5bV9kYXRhID0gTlVMTDsKKyAgRWxmX0RhdGEgKnZlcm5lZWRfZGF0YSA9IE5VTEw7CisgIEVsZl9EYXRhICp2ZXJkZWZfZGF0YSA9IE5VTEw7CisgIEVsZl9EYXRhICp4bmR4X2RhdGEgPSBOVUxMOworICBFbGZfU2NuICpydW5zY247CisgIEVsZl9EYXRhICpkYXRhOworICBpbnQgY2xhc3MgPSBnZWxmX2dldGNsYXNzIChlYmwtPmVsZik7CisgIHVuc2lnbmVkIGludCBuc3ltczsKKyAgdW5zaWduZWQgaW50IGNudDsKKyAgRWxmMzJfV29yZCB2ZXJuZWVkX3N0cmlkeCA9IDA7CisgIEVsZjMyX1dvcmQgdmVyZGVmX3N0cmlkeCA9IDA7CisgIEdFbGZfU2hkciBnbGluazsKKyAgc2l6ZV90IHNoc3RybmR4OworCisgIC8qIEdldCB0aGUgZGF0YSBvZiB0aGUgc2VjdGlvbi4gICovCisgIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogRmluZCBvdXQgd2hldGhlciB3ZSBoYXZlIG90aGVyIHNlY3Rpb25zIHdlIG1pZ2h0IG5lZWQuICAqLworICBydW5zY24gPSBOVUxMOworICB3aGlsZSAoKHJ1bnNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgcnVuc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBHRWxmX1NoZHIgcnVuc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnJ1bnNoZHIgPSBnZWxmX2dldHNoZHIgKHJ1bnNjbiwgJnJ1bnNoZHJfbWVtKTsKKworICAgICAgaWYgKHJ1bnNoZHIgIT0gTlVMTCkKKwl7CisJICBpZiAocnVuc2hkci0+c2hfdHlwZSA9PSBTSFRfR05VX3ZlcnN5bQorCSAgICAgICYmIHJ1bnNoZHItPnNoX2xpbmsgPT0gZWxmX25keHNjbiAoc2NuKSkKKwkgICAgLyogQmluZ28sIGZvdW5kIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgTm93IGdldCB0aGUgZGF0YS4gICovCisJICAgIHZlcnN5bV9kYXRhID0gZWxmX2dldGRhdGEgKHJ1bnNjbiwgTlVMTCk7CisJICBlbHNlIGlmIChydW5zaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVybmVlZCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZWVkZWQgdmVyc2lvbnMuICAqLworCSAgICAgIHZlcm5lZWRfZGF0YSA9IGVsZl9nZXRkYXRhIChydW5zY24sIE5VTEwpOworCSAgICAgIHZlcm5lZWRfc3RyaWR4ID0gcnVuc2hkci0+c2hfbGluazsKKwkgICAgfQorCSAgZWxzZSBpZiAocnVuc2hkci0+c2hfdHlwZSA9PSBTSFRfR05VX3ZlcmRlZikKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWZpbmVkIHZlcnNpb25zLiAgKi8KKwkgICAgICB2ZXJkZWZfZGF0YSA9IGVsZl9nZXRkYXRhIChydW5zY24sIE5VTEwpOworCSAgICAgIHZlcmRlZl9zdHJpZHggPSBydW5zaGRyLT5zaF9saW5rOworCSAgICB9CisJICBlbHNlIGlmIChydW5zaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgKKwkgICAgICAmJiBydW5zaGRyLT5zaF9saW5rID09IGVsZl9uZHhzY24gKHNjbikpCisJICAgIC8qIEV4dGVuZGVkIHNlY3Rpb24gaW5kZXguICAqLworCSAgICB4bmR4X2RhdGEgPSBlbGZfZ2V0ZGF0YSAocnVuc2NuLCBOVUxMKTsKKwl9CisgICAgfQorCisgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KKyAgaWYgKGVsZl9nZXRzaHN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOworCisgIC8qIE5vdyB3ZSBjYW4gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlY3Rpb24uICAqLworICBuc3ltcyA9IGRhdGEtPmRfc2l6ZSAvIChjbGFzcyA9PSBFTEZDTEFTUzMyCisJCQkgID8gc2l6ZW9mIChFbGYzMl9TeW0pIDogc2l6ZW9mIChFbGY2NF9TeW0pKTsKKworICBwcmludGYgKG5nZXR0ZXh0ICgiXG5TeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyeTpcbiIsCisJCSAgICAiXG5TeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyaWVzOlxuIiwKKwkJICAgIG5zeW1zKSwKKwkgICh1bnNpZ25lZCBpbnQpIGVsZl9uZHhzY24gKHNjbiksCisJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLCBuc3ltcyk7CisgIHByaW50ZiAobmdldHRleHQgKCIgJWx1IGxvY2FsIHN5bWJvbCAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iLAorCQkgICAgIiAlbHUgbG9jYWwgc3ltYm9scyAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iLAorCQkgICAgc2hkci0+c2hfaW5mbyksCisJICAodW5zaWduZWQgbG9uZyBpbnQpIHNoZHItPnNoX2luZm8sCisJICAodW5zaWduZWQgaW50KSBzaGRyLT5zaF9saW5rLAorCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LAorCQkgICAgICBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKSwKKwkJCQkgICAgJmdsaW5rKS0+c2hfbmFtZSkpOworCisgIGZwdXRzX3VubG9ja2VkIChjbGFzcyA9PSBFTEZDTEFTUzMyCisJCSAgPyBnZXR0ZXh0ICgiXAorICBOdW06ICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIpCisJCSAgOiBnZXR0ZXh0ICgiXAorICBOdW06ICAgICAgICAgICAgVmFsdWUgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgICAgICBOZHggTmFtZVxuIiksCisJCSAgc3Rkb3V0KTsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IG5zeW1zOyArK2NudCkKKyAgICB7CisgICAgICBjaGFyIHR5cGVidWZbNjRdOworICAgICAgY2hhciBiaW5kYnVmWzY0XTsKKyAgICAgIGNoYXIgc2NuYnVmWzY0XTsKKyAgICAgIEVsZjMyX1dvcmQgeG5keDsKKyAgICAgIEdFbGZfU3ltIHN5bV9tZW07CisgICAgICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW1zaG5keCAoZGF0YSwgeG5keF9kYXRhLCBjbnQsICZzeW1fbWVtLCAmeG5keCk7CisKKyAgICAgIGlmIChzeW0gPT0gTlVMTCkKKwljb250aW51ZTsKKworICAgICAgLyogRGV0ZXJtaW5lIHRoZSByZWFsIHNlY3Rpb24gaW5kZXguICAqLworICAgICAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1hJTkRFWCkKKwl4bmR4ID0gc3ltLT5zdF9zaG5keDsKKworICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAorJTV1OiAlMCoiIFBSSXg2NCAiICU2IiBQUklkNjQgIiAlLTdzICUtNnMgJS05cyAlNnMgJXMiKSwKKwkgICAgICBjbnQsCisJICAgICAgY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDggOiAxNiwKKwkgICAgICBzeW0tPnN0X3ZhbHVlLAorCSAgICAgIHN5bS0+c3Rfc2l6ZSwKKwkgICAgICBlYmxfc3ltYm9sX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbyksCisJCQkJICAgIHR5cGVidWYsIHNpemVvZiAodHlwZWJ1ZikpLAorCSAgICAgIGVibF9zeW1ib2xfYmluZGluZ19uYW1lIChlYmwsIEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSwKKwkJCQkgICAgICAgYmluZGJ1Ziwgc2l6ZW9mIChiaW5kYnVmKSksCisJICAgICAgZ2V0X3Zpc2liaWxpdHlfdHlwZSAoR0VMRl9TVF9WSVNJQklMSVRZIChzeW0tPnN0X290aGVyKSksCisJICAgICAgZWJsX3NlY3Rpb25fbmFtZSAoZWJsLCBzeW0tPnN0X3NobmR4LCB4bmR4LCBzY25idWYsCisJCQkJc2l6ZW9mIChzY25idWYpLCBOVUxMLCBzaG51bSksCisJICAgICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOworCisgICAgICBpZiAodmVyc3ltX2RhdGEgIT0gTlVMTCkKKwl7CisJICAvKiBHZXQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworCSAgR0VsZl9WZXJzeW0gdmVyc3ltX21lbTsKKwkgIEdFbGZfVmVyc3ltICp2ZXJzeW07CisKKwkgIHZlcnN5bSA9IGdlbGZfZ2V0dmVyc3ltICh2ZXJzeW1fZGF0YSwgY250LCAmdmVyc3ltX21lbSk7CisKKwkgIGlmICh2ZXJzeW0gIT0gTlVMTCAmJiAoKCp2ZXJzeW0gJiAweDgwMDApICE9IDAgfHwgKnZlcnN5bSA+IDEpKQorCSAgICB7CisJICAgICAgYm9vbCBpc19ub2JpdHMgPSBmYWxzZTsKKwkgICAgICBib29sIGNoZWNrX2RlZiA9IHhuZHggIT0gU0hOX1VOREVGOworCisJICAgICAgaWYgKHhuZHggPCBTSE5fTE9SRVNFUlZFIHx8IHN5bS0+c3Rfc2huZHggPT0gU0hOX1hJTkRFWCkKKwkJeworCQkgIEdFbGZfU2hkciBzeW1zaGRyX21lbTsKKwkJICBHRWxmX1NoZHIgKnN5bXNoZHIgPQorCQkgICAgZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgeG5keCksICZzeW1zaGRyX21lbSk7CisKKwkJICBpc19ub2JpdHMgPSAoc3ltc2hkciAhPSBOVUxMCisJCQkgICAgICAgJiYgc3ltc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTKTsKKwkJfQorCisJICAgICAgaWYgKGlzX25vYml0cyB8fCAhIGNoZWNrX2RlZikKKwkJeworCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KKwkJICBHRWxmX1Zlcm5lZWQgdmVybmVlZF9tZW07CisJCSAgR0VsZl9WZXJuZWVkICp2ZXJuZWVkOworCQkgIEdFbGZfVmVybmF1eCB2ZXJuYXV4X21lbTsKKwkJICBHRWxmX1Zlcm5hdXggKnZlcm5hdXggPSBOVUxMOworCQkgIHNpemVfdCB2bl9vZmZzZXQgPSAwOworCisJCSAgdmVybmVlZCA9IGdlbGZfZ2V0dmVybmVlZCAodmVybmVlZF9kYXRhLCAwLCAmdmVybmVlZF9tZW0pOworCQkgIHdoaWxlICh2ZXJuZWVkICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIHNpemVfdCB2bmFfb2Zmc2V0ID0gdm5fb2Zmc2V0OworCisJCSAgICAgIHZlcm5hdXggPSBnZWxmX2dldHZlcm5hdXggKHZlcm5lZWRfZGF0YSwKKwkJCQkJCSB2bmFfb2Zmc2V0ICs9IHZlcm5lZWQtPnZuX2F1eCwKKwkJCQkJCSAmdmVybmF1eF9tZW0pOworCQkgICAgICB3aGlsZSAodmVybmF1eCAhPSBOVUxMCisJCQkgICAgICYmIHZlcm5hdXgtPnZuYV9vdGhlciAhPSAqdmVyc3ltCisJCQkgICAgICYmIHZlcm5hdXgtPnZuYV9uZXh0ICE9IDApCisJCQl7CisJCQkgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0LiAgKi8KKwkJCSAgdm5hX29mZnNldCArPSB2ZXJuYXV4LT52bmFfbmV4dDsKKworCQkJICB2ZXJuYXV4ID0gKHZlcm5hdXgtPnZuYV9uZXh0ID09IDAKKwkJCQkgICAgID8gTlVMTAorCQkJCSAgICAgOiBnZWxmX2dldHZlcm5hdXggKHZlcm5lZWRfZGF0YSwKKwkJCQkJCQl2bmFfb2Zmc2V0LAorCQkJCQkJCSZ2ZXJuYXV4X21lbSkpOworCQkJfQorCisJCSAgICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgZm91bmQgdGhlIHZlcnNpb24uICAqLworCQkgICAgICBpZiAodmVybmF1eCAhPSBOVUxMICYmIHZlcm5hdXgtPnZuYV9vdGhlciA9PSAqdmVyc3ltKQorCQkJLyogRm91bmQgaXQuICAqLworCQkJYnJlYWs7CisKKwkJICAgICAgdm5fb2Zmc2V0ICs9IHZlcm5lZWQtPnZuX25leHQ7CisJCSAgICAgIHZlcm5lZWQgPSAodmVybmVlZC0+dm5fbmV4dCA9PSAwCisJCQkJID8gTlVMTAorCQkJCSA6IGdlbGZfZ2V0dmVybmVlZCAodmVybmVlZF9kYXRhLCB2bl9vZmZzZXQsCisJCQkJCQkgICAgJnZlcm5lZWRfbWVtKSk7CisJCSAgICB9CisKKwkJICBpZiAodmVybmF1eCAhPSBOVUxMICYmIHZlcm5hdXgtPnZuYV9vdGhlciA9PSAqdmVyc3ltKQorCQkgICAgeworCQkgICAgICBwcmludGYgKCJAJXMgKCV1KSIsCisJCQkgICAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgdmVybmVlZF9zdHJpZHgsCisJCQkJCSAgdmVybmF1eC0+dm5hX25hbWUpLAorCQkJICAgICAgKHVuc2lnbmVkIGludCkgdmVybmF1eC0+dm5hX290aGVyKTsKKwkJICAgICAgY2hlY2tfZGVmID0gMDsKKwkJICAgIH0KKwkJICBlbHNlIGlmICghIGlzX25vYml0cykKKwkJICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiYmFkIGR5bmFtaWMgc3ltYm9sIikpOworCQkgIGVsc2UKKwkJICAgIGNoZWNrX2RlZiA9IDE7CisJCX0KKworCSAgICAgIGlmIChjaGVja19kZWYgJiYgKnZlcnN5bSAhPSAweDgwMDEpCisJCXsKKwkJICAvKiBXZSBtdXN0IHRlc3QgYm90aC4gICovCisJCSAgR0VsZl9WZXJkZWYgdmVyZGVmX21lbTsKKwkJICBHRWxmX1ZlcmRlZiAqdmVyZGVmOworCQkgIHNpemVfdCB2ZF9vZmZzZXQgPSAwOworCisJCSAgdmVyZGVmID0gZ2VsZl9nZXR2ZXJkZWYgKHZlcmRlZl9kYXRhLCAwLCAmdmVyZGVmX21lbSk7CisJCSAgd2hpbGUgKHZlcmRlZiAhPSBOVUxMKQorCQkgICAgeworCQkgICAgICBpZiAodmVyZGVmLT52ZF9uZHggPT0gKCp2ZXJzeW0gJiAweDdmZmYpKQorCQkJLyogRm91bmQgdGhlIGRlZmluaXRpb24uICAqLworCQkJYnJlYWs7CisKKwkJICAgICAgdmRfb2Zmc2V0ICs9IHZlcmRlZi0+dmRfbmV4dDsKKwkJICAgICAgdmVyZGVmID0gKHZlcmRlZi0+dmRfbmV4dCA9PSAwCisJCQkJPyBOVUxMCisJCQkJOiBnZWxmX2dldHZlcmRlZiAodmVyZGVmX2RhdGEsIHZkX29mZnNldCwKKwkJCQkJCSAgJnZlcmRlZl9tZW0pKTsKKwkJICAgIH0KKworCQkgIGlmICh2ZXJkZWYgIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgR0VsZl9WZXJkYXV4IHZlcmRhdXhfbWVtOworCQkgICAgICBHRWxmX1ZlcmRhdXggKnZlcmRhdXg7CisKKwkJICAgICAgdmVyZGF1eCA9IGdlbGZfZ2V0dmVyZGF1eCAodmVyZGVmX2RhdGEsCisJCQkJCQkgdmRfb2Zmc2V0ICsgdmVyZGVmLT52ZF9hdXgsCisJCQkJCQkgJnZlcmRhdXhfbWVtKTsKKworCQkgICAgICBpZiAodmVyZGF1eCAhPSBOVUxMKQorCQkJcHJpbnRmICgoKnZlcnN5bSAmIDB4ODAwMCkgPyAiQCVzIiA6ICJAQCVzIiwKKwkJCQllbGZfc3RycHRyIChlYmwtPmVsZiwgdmVyZGVmX3N0cmlkeCwKKwkJCQkJICAgIHZlcmRhdXgtPnZkYV9uYW1lKSk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKworICAgICAgcHV0Y2hhciAoJ1xuJyk7CisgICAgfQorfQorCisKKy8qIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworc3RhdGljIHZvaWQKK3ByaW50X3ZlcmluZm8gKEVibCAqZWJsKQoreworICAvKiBGaW5kIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHNlY3Rpb25zLiAgRm9yIHRoaXMgd2UgaGF2ZSB0bworICAgICBzZWFyY2ggdGhyb3VnaCB0aGUgc2VjdGlvbiB0YWJsZS4gICovCisgIEVsZl9TY24gKnNjbiA9IE5VTEw7CisKKyAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgLyogSGFuZGxlIHRoZSBzZWN0aW9uIGlmIGl0IGlzIHBhcnQgb2YgdGhlIHZlcnNpb25pbmcgaGFuZGxpbmcuICAqLworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIGlmIChzaGRyICE9IE5VTEwpCisJeworCSAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX0dOVV92ZXJuZWVkKQorCSAgICBoYW5kbGVfdmVybmVlZCAoZWJsLCBzY24sIHNoZHIpOworCSAgZWxzZSBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfR05VX3ZlcmRlZikKKwkgICAgaGFuZGxlX3ZlcmRlZiAoZWJsLCBzY24sIHNoZHIpOworCSAgZWxzZSBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfR05VX3ZlcnN5bSkKKwkgICAgaGFuZGxlX3ZlcnN5bSAoZWJsLCBzY24sIHNoZHIpOworCX0KKyAgICB9Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0X3Zlcl9mbGFncyAodW5zaWduZWQgaW50IGZsYWdzKQoreworICBzdGF0aWMgY2hhciBidWZbMzJdOworICBjaGFyICplbmRwOworCisgIGlmIChmbGFncyA9PSAwKQorICAgIHJldHVybiBnZXR0ZXh0ICgibm9uZSIpOworCisgIGlmIChmbGFncyAmIFZFUl9GTEdfQkFTRSkKKyAgICBlbmRwID0gc3RwY3B5IChidWYsICJCQVNFICIpOworICBlbHNlCisgICAgZW5kcCA9IGJ1ZjsKKworICBpZiAoZmxhZ3MgJiBWRVJfRkxHX1dFQUspCisgICAgeworICAgICAgaWYgKGVuZHAgIT0gYnVmKQorICAgICAgICBlbmRwID0gc3RwY3B5IChlbmRwLCAifCAiKTsKKworICAgICAgZW5kcCA9IHN0cGNweSAoZW5kcCwgIldFQUsgIik7CisgICAgfQorCisgIGlmIChmbGFncyAmIH4oVkVSX0ZMR19CQVNFIHwgVkVSX0ZMR19XRUFLKSkKKyAgICB7CisgICAgICBzdHJuY3B5IChlbmRwLCBnZXR0ZXh0ICgifCA8dW5rbm93bj4iKSwgYnVmICsgc2l6ZW9mIChidWYpIC0gZW5kcCk7CisgICAgICBidWZbc2l6ZW9mIChidWYpIC0gMV0gPSAnXDAnOworICAgIH0KKworICByZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfdmVybmVlZCAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKQoreworICBFbGZfRGF0YSAqZGF0YTsKKyAgaW50IGNsYXNzID0gZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpOworICBHRWxmX1NoZHIgZ2xpbms7CisgIGludCBjbnQ7CisgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgIHNpemVfdCBzaHN0cm5keDsKKworICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLworICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KKyAgaWYgKGVsZl9nZXRzaHN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOworCisgIHByaW50ZiAobmdldHRleHQgKCJcCitcblZlcnNpb24gbmVlZHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIEFkZHI6ICUjMCoiIFBSSXg2NCAiICBPZmZzZXQ6ICUjMDgiIFBSSXg2NCAiICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIsCisJCSAgICAiXAorXG5WZXJzaW9uIG5lZWRzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIEFkZHI6ICUjMCoiIFBSSXg2NCAiICBPZmZzZXQ6ICUjMDgiIFBSSXg2NCAiICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIsCisJCSAgICBzaGRyLT5zaF9pbmZvKSwKKwkgICh1bnNpZ25lZCBpbnQpIGVsZl9uZHhzY24gKHNjbiksCisJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLCBzaGRyLT5zaF9pbmZvLAorCSAgY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIHNoZHItPnNoX2FkZHIsCisJICBzaGRyLT5zaF9vZmZzZXQsCisJICAodW5zaWduZWQgaW50KSBzaGRyLT5zaF9saW5rLAorCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LAorCQkgICAgICBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKSwKKwkJCQkgICAgJmdsaW5rKS0+c2hfbmFtZSkpOworCisgIG9mZnNldCA9IDA7CisgIGZvciAoY250ID0gc2hkci0+c2hfaW5mbzsgLS1jbnQgPj0gMDsgKQorICAgIHsKKyAgICAgIEdFbGZfVmVybmVlZCBuZWVkbWVtOworICAgICAgR0VsZl9WZXJuZWVkICpuZWVkOworICAgICAgdW5zaWduZWQgaW50IGF1eG9mZnNldDsKKyAgICAgIGludCBjbnQyOworCisgICAgICAvKiBHZXQgdGhlIGRhdGEgYXQgdGhlIG5leHQgb2Zmc2V0LiAgKi8KKyAgICAgIG5lZWQgPSBnZWxmX2dldHZlcm5lZWQgKGRhdGEsIG9mZnNldCwgJm5lZWRtZW0pOworICAgICAgaWYgKG5lZWQgPT0gTlVMTCkKKwlicmVhazsKKworICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiICAlIzA2eDogVmVyc2lvbjogJWh1ICBGaWxlOiAlcyAgQ250OiAlaHVcbiIpLAorCSAgICAgIG9mZnNldCwgKHVuc2lnbmVkIHNob3J0IGludCkgbmVlZC0+dm5fdmVyc2lvbiwKKwkgICAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgbmVlZC0+dm5fZmlsZSksCisJICAgICAgKHVuc2lnbmVkIHNob3J0IGludCkgbmVlZC0+dm5fY250KTsKKworICAgICAgYXV4b2Zmc2V0ID0gb2Zmc2V0ICsgbmVlZC0+dm5fYXV4OworICAgICAgZm9yIChjbnQyID0gbmVlZC0+dm5fY250OyAtLWNudDIgPj0gMDsgKQorCXsKKwkgIEdFbGZfVmVybmF1eCBhdXhtZW07CisJICBHRWxmX1Zlcm5hdXggKmF1eDsKKworCSAgYXV4ID0gZ2VsZl9nZXR2ZXJuYXV4IChkYXRhLCBhdXhvZmZzZXQsICZhdXhtZW0pOworCSAgaWYgKGF1eCA9PSBOVUxMKQorCSAgICBicmVhazsKKworCSAgcHJpbnRmIChnZXR0ZXh0ICgiICAlIzA2eDogTmFtZTogJXMgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWh1XG4iKSwKKwkJICBhdXhvZmZzZXQsCisJCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmssIGF1eC0+dm5hX25hbWUpLAorCQkgIGdldF92ZXJfZmxhZ3MgKGF1eC0+dm5hX2ZsYWdzKSwKKwkJICAodW5zaWduZWQgc2hvcnQgaW50KSBhdXgtPnZuYV9vdGhlcik7CisKKwkgIGF1eG9mZnNldCArPSBhdXgtPnZuYV9uZXh0OworCX0KKworICAgICAgLyogRmluZCB0aGUgbmV4dCBvZmZzZXQuICAqLworICAgICAgb2Zmc2V0ICs9IG5lZWQtPnZuX25leHQ7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfdmVyZGVmIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpCit7CisgIEVsZl9EYXRhICpkYXRhOworICBpbnQgY2xhc3MgPSBnZWxmX2dldGNsYXNzIChlYmwtPmVsZik7CisgIEdFbGZfU2hkciBnbGluazsKKyAgaW50IGNudDsKKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKyAgc2l6ZV90IHNoc3RybmR4OworCisgIC8qIEdldCB0aGUgZGF0YSBvZiB0aGUgc2VjdGlvbi4gICovCisgIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLworICBpZiAoZWxmX2dldHNoc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7CisKKyAgcHJpbnRmIChuZ2V0dGV4dCAoIlwKK1xuVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiBBZGRyOiAlIzAqIiBQUkl4NjQgIiAgT2Zmc2V0OiAlIzA4IiBQUkl4NjQgIiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iLAorCQkgICAgIlwKK1xuVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIEFkZHI6ICUjMCoiIFBSSXg2NCAiICBPZmZzZXQ6ICUjMDgiIFBSSXg2NCAiICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIsCisJCSAgICBzaGRyLT5zaF9pbmZvKSwKKwkgICh1bnNpZ25lZCBpbnQpIGVsZl9uZHhzY24gKHNjbiksCisJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAorCSAgc2hkci0+c2hfaW5mbywKKwkgIGNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCBzaGRyLT5zaF9hZGRyLAorCSAgc2hkci0+c2hfb2Zmc2V0LAorCSAgKHVuc2lnbmVkIGludCkgc2hkci0+c2hfbGluaywKKwkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwKKwkJICAgICAgZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayksCisJCQkJICAgICZnbGluayktPnNoX25hbWUpKTsKKworICBvZmZzZXQgPSAwOworICBmb3IgKGNudCA9IHNoZHItPnNoX2luZm87IC0tY250ID49IDA7ICkKKyAgICB7CisgICAgICBHRWxmX1ZlcmRlZiBkZWZtZW07CisgICAgICBHRWxmX1ZlcmRlZiAqZGVmOworICAgICAgR0VsZl9WZXJkYXV4IGF1eG1lbTsKKyAgICAgIEdFbGZfVmVyZGF1eCAqYXV4OworICAgICAgdW5zaWduZWQgaW50IGF1eG9mZnNldDsKKyAgICAgIGludCBjbnQyOworCisgICAgICAvKiBHZXQgdGhlIGRhdGEgYXQgdGhlIG5leHQgb2Zmc2V0LiAgKi8KKyAgICAgIGRlZiA9IGdlbGZfZ2V0dmVyZGVmIChkYXRhLCBvZmZzZXQsICZkZWZtZW0pOworICAgICAgaWYgKGRlZiA9PSBOVUxMKQorCWJyZWFrOworCisgICAgICBhdXhvZmZzZXQgPSBvZmZzZXQgKyBkZWYtPnZkX2F1eDsKKyAgICAgIGF1eCA9IGdlbGZfZ2V0dmVyZGF1eCAoZGF0YSwgYXV4b2Zmc2V0LCAmYXV4bWVtKTsKKyAgICAgIGlmIChhdXggPT0gTlVMTCkKKwlicmVhazsKKworICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAorICAlIzA2eDogVmVyc2lvbjogJWhkICBGbGFnczogJXMgIEluZGV4OiAlaGQgIENudDogJWhkICBOYW1lOiAlc1xuIiksCisJICAgICAgb2Zmc2V0LCBkZWYtPnZkX3ZlcnNpb24sCisJICAgICAgZ2V0X3Zlcl9mbGFncyAoZGVmLT52ZF9mbGFncyksCisJICAgICAgZGVmLT52ZF9uZHgsCisJICAgICAgZGVmLT52ZF9jbnQsCisJICAgICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmssIGF1eC0+dmRhX25hbWUpKTsKKworICAgICAgYXV4b2Zmc2V0ICs9IGF1eC0+dmRhX25leHQ7CisgICAgICBmb3IgKGNudDIgPSAxOyBjbnQyIDwgZGVmLT52ZF9jbnQ7ICsrY250MikKKwl7CisJICBhdXggPSBnZWxmX2dldHZlcmRhdXggKGRhdGEsIGF1eG9mZnNldCwgJmF1eG1lbSk7CisJICBpZiAoYXV4ID09IE5VTEwpCisJICAgIGJyZWFrOworCisJICBwcmludGYgKGdldHRleHQgKCIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iKSwKKwkJICBhdXhvZmZzZXQsIGNudDIsCisJCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmssIGF1eC0+dmRhX25hbWUpKTsKKworCSAgYXV4b2Zmc2V0ICs9IGF1eC0+dmRhX25leHQ7CisJfQorCisgICAgICAvKiBGaW5kIHRoZSBuZXh0IG9mZnNldC4gICovCisgICAgICBvZmZzZXQgKz0gZGVmLT52ZF9uZXh0OworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraGFuZGxlX3ZlcnN5bSAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKQoreworICBFbGZfRGF0YSAqZGF0YTsKKyAgaW50IGNsYXNzID0gZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpOworICBFbGZfU2NuICp2ZXJzY247CisgIEdFbGZfU2hkciBnbGluazsKKyAgRWxmX1NjbiAqZGVmc2NuOworICBFbGZfU2NuICpuZWVkc2NuOworICBjb25zdCBjaGFyICoqdmVybmFtZTsKKyAgY29uc3QgY2hhciAqKmZpbGVuYW1lOworICBzaXplX3QgbnZlcm5hbWU7CisgIHVuc2lnbmVkIGludCBjbnQ7CisgIHNpemVfdCBzaHN0cm5keDsKKworICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLworICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KKyAgaWYgKGVsZl9nZXRzaHN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOworCisgIC8qIFdlIGhhdmUgdG8gZmluZCB0aGUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gYW5kIGV4dHJhY3QgdGhlCisgICAgIHZlcnNpb24gbmFtZXMuICAqLworICBkZWZzY24gPSBOVUxMOworICBuZWVkc2NuID0gTlVMTDsKKworICB2ZXJzY24gPSBOVUxMOworICB3aGlsZSAoKHZlcnNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgdmVyc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBHRWxmX1NoZHIgdmVyc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnZlcnNoZHIgPSBnZWxmX2dldHNoZHIgKHZlcnNjbiwgJnZlcnNoZHJfbWVtKTsKKworICAgICAgaWYgKHZlcnNoZHIgIT0gTlVMTCkKKwl7CisJICBpZiAodmVyc2hkci0+c2hfdHlwZSA9PSBTSFRfR05VX3ZlcmRlZikKKwkgICAgZGVmc2NuID0gdmVyc2NuOworCSAgZWxzZSBpZiAodmVyc2hkci0+c2hfdHlwZSA9PSBTSFRfR05VX3Zlcm5lZWQpCisJICAgIG5lZWRzY24gPSB2ZXJzY247CisJfQorICAgIH0KKworICBpZiAoZGVmc2NuICE9IE5VTEwgfHwgbmVlZHNjbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYSB2ZXJzaW9uIGluZm9ybWF0aW9uIChiZXR0ZXIgc2hvdWxkIGhhdmUpLiAgTm93IGdldAorCSB0aGUgdmVyc2lvbiBuYW1lcy4gIEZpcnN0IGZpbmQgdGhlIG1heGltdW0gdmVyc2lvbiBudW1iZXIuICAqLworICAgICAgbnZlcm5hbWUgPSAwOworICAgICAgaWYgKGRlZnNjbiAhPSBOVUxMKQorCXsKKwkgIC8qIFJ1biB0aHJvdWdoIHRoZSB2ZXJzaW9uIGRlZmluaXRpb25zIGFuZCBmaW5kIHRoZSBoaWdoZXN0CisJICAgICBpbmRleC4gICovCisJICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKKwkgIEVsZl9EYXRhICpkZWZkYXRhOworCSAgR0VsZl9TaGRyIGRlZnNoZHJtZW07CisJICBHRWxmX1NoZHIgKmRlZnNoZHI7CisKKwkgIGRlZmRhdGEgPSBlbGZfZ2V0ZGF0YSAoZGVmc2NuLCBOVUxMKTsKKwkgIGlmIChkZWZkYXRhID09IE5VTEwpCisJICAgIHJldHVybjsKKworCSAgZGVmc2hkciA9IGdlbGZfZ2V0c2hkciAoZGVmc2NuLCAmZGVmc2hkcm1lbSk7CisJICBpZiAoZGVmc2hkciA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwkgIGZvciAoY250ID0gMDsgY250IDwgZGVmc2hkci0+c2hfaW5mbzsgKytjbnQpCisJICAgIHsKKwkgICAgICBHRWxmX1ZlcmRlZiBkZWZtZW07CisJICAgICAgR0VsZl9WZXJkZWYgKmRlZjsKKworCSAgICAgIC8qIEdldCB0aGUgZGF0YSBhdCB0aGUgbmV4dCBvZmZzZXQuICAqLworCSAgICAgIGRlZiA9IGdlbGZfZ2V0dmVyZGVmIChkZWZkYXRhLCBvZmZzZXQsICZkZWZtZW0pOworCSAgICAgIGlmIChkZWYgPT0gTlVMTCkKKwkJYnJlYWs7CisKKwkgICAgICBudmVybmFtZSA9IE1BWCAobnZlcm5hbWUsIChzaXplX3QpIChkZWYtPnZkX25keCAmIDB4N2ZmZikpOworCisJICAgICAgb2Zmc2V0ICs9IGRlZi0+dmRfbmV4dDsKKwkgICAgfQorCX0KKyAgICAgIGlmIChuZWVkc2NuICE9IE5VTEwpCisJeworCSAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJICBFbGZfRGF0YSAqbmVlZGRhdGE7CisJICBHRWxmX1NoZHIgbmVlZHNoZHJtZW07CisJICBHRWxmX1NoZHIgKm5lZWRzaGRyOworCisJICBuZWVkZGF0YSA9IGVsZl9nZXRkYXRhIChuZWVkc2NuLCBOVUxMKTsKKwkgIGlmIChuZWVkZGF0YSA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwkgIG5lZWRzaGRyID0gZ2VsZl9nZXRzaGRyIChuZWVkc2NuLCAmbmVlZHNoZHJtZW0pOworCSAgaWYgKG5lZWRzaGRyID09IE5VTEwpCisJICAgIHJldHVybjsKKworCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBuZWVkc2hkci0+c2hfaW5mbzsgKytjbnQpCisJICAgIHsKKwkgICAgICBHRWxmX1Zlcm5lZWQgbmVlZG1lbTsKKwkgICAgICBHRWxmX1Zlcm5lZWQgKm5lZWQ7CisJICAgICAgdW5zaWduZWQgaW50IGF1eG9mZnNldDsKKwkgICAgICBpbnQgY250MjsKKworCSAgICAgIC8qIEdldCB0aGUgZGF0YSBhdCB0aGUgbmV4dCBvZmZzZXQuICAqLworCSAgICAgIG5lZWQgPSBnZWxmX2dldHZlcm5lZWQgKG5lZWRkYXRhLCBvZmZzZXQsICZuZWVkbWVtKTsKKwkgICAgICBpZiAobmVlZCA9PSBOVUxMKQorCQlicmVhazsKKworCSAgICAgIC8qIFJ1biB0aHJvdWdoIHRoZSBhdXhpbGlhcnkgZW50cmllcy4gICovCisJICAgICAgYXV4b2Zmc2V0ID0gb2Zmc2V0ICsgbmVlZC0+dm5fYXV4OworCSAgICAgIGZvciAoY250MiA9IG5lZWQtPnZuX2NudDsgLS1jbnQyID49IDA7ICkKKwkJeworCQkgIEdFbGZfVmVybmF1eCBhdXhtZW07CisJCSAgR0VsZl9WZXJuYXV4ICphdXg7CisKKwkJICBhdXggPSBnZWxmX2dldHZlcm5hdXggKG5lZWRkYXRhLCBhdXhvZmZzZXQsICZhdXhtZW0pOworCQkgIGlmIChhdXggPT0gTlVMTCkKKwkJICAgIGJyZWFrOworCisJCSAgbnZlcm5hbWUgPSBNQVggKG52ZXJuYW1lLAorCQkJCSAgKHNpemVfdCkgKGF1eC0+dm5hX290aGVyICYgMHg3ZmZmKSk7CisKKwkJICBhdXhvZmZzZXQgKz0gYXV4LT52bmFfbmV4dDsKKwkJfQorCisJICAgICAgb2Zmc2V0ICs9IG5lZWQtPnZuX25leHQ7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFRoaXMgaXMgdGhlIG51bWJlciBvZiB2ZXJzaW9ucyB3ZSBrbm93IGFib3V0LiAgKi8KKyAgICAgICsrbnZlcm5hbWU7CisKKyAgICAgIC8qIEFsbG9jYXRlIHRoZSBhcnJheS4gICovCisgICAgICB2ZXJuYW1lID0gKGNvbnN0IGNoYXIgKiopIGFsbG9jYSAobnZlcm5hbWUgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOworICAgICAgZmlsZW5hbWUgPSAoY29uc3QgY2hhciAqKikgYWxsb2NhIChudmVybmFtZSAqIHNpemVvZiAoY29uc3QgY2hhciAqKSk7CisKKyAgICAgIC8qIFJ1biB0aHJvdWdoIHRoZSBkYXRhIHN0cnVjdHVyZXMgYWdhaW4gYW5kIGNvbGxlY3QgdGhlIHN0cmluZ3MuICAqLworICAgICAgaWYgKGRlZnNjbiAhPSBOVUxMKQorCXsKKwkgIC8qIFJ1biB0aHJvdWdoIHRoZSB2ZXJzaW9uIGRlZmluaXRpb25zIGFuZCBmaW5kIHRoZSBoaWdoZXN0CisJICAgICBpbmRleC4gICovCisJICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKKwkgIEVsZl9EYXRhICpkZWZkYXRhOworCSAgR0VsZl9TaGRyIGRlZnNoZHJtZW07CisJICBHRWxmX1NoZHIgKmRlZnNoZHI7CisKKwkgIGRlZmRhdGEgPSBlbGZfZ2V0ZGF0YSAoZGVmc2NuLCBOVUxMKTsKKwkgIGlmIChkZWZkYXRhID09IE5VTEwpCisJICAgIHJldHVybjsKKworCSAgZGVmc2hkciA9IGdlbGZfZ2V0c2hkciAoZGVmc2NuLCAmZGVmc2hkcm1lbSk7CisJICBpZiAoZGVmc2hkciA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwkgIGZvciAoY250ID0gMDsgY250IDwgZGVmc2hkci0+c2hfaW5mbzsgKytjbnQpCisJICAgIHsKKwkgICAgICBHRWxmX1ZlcmRlZiBkZWZtZW07CisJICAgICAgR0VsZl9WZXJkZWYgKmRlZjsKKwkgICAgICBHRWxmX1ZlcmRhdXggYXV4bWVtOworCSAgICAgIEdFbGZfVmVyZGF1eCAqYXV4OworCisJICAgICAgLyogR2V0IHRoZSBkYXRhIGF0IHRoZSBuZXh0IG9mZnNldC4gICovCisJICAgICAgZGVmID0gZ2VsZl9nZXR2ZXJkZWYgKGRlZmRhdGEsIG9mZnNldCwgJmRlZm1lbSk7CisJICAgICAgaWYgKGRlZiA9PSBOVUxMKQorCQlicmVhazsKKworCSAgICAgIGF1eCA9IGdlbGZfZ2V0dmVyZGF1eCAoZGVmZGF0YSwgb2Zmc2V0ICsgZGVmLT52ZF9hdXgsICZhdXhtZW0pOworCSAgICAgIGlmIChhdXggPT0gTlVMTCkKKwkJYnJlYWs7CisKKwkgICAgICB2ZXJuYW1lW2RlZi0+dmRfbmR4ICYgMHg3ZmZmXQorCQk9IGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBkZWZzaGRyLT5zaF9saW5rLCBhdXgtPnZkYV9uYW1lKTsKKwkgICAgICBmaWxlbmFtZVtkZWYtPnZkX25keCAmIDB4N2ZmZl0gPSBOVUxMOworCisJICAgICAgb2Zmc2V0ICs9IGRlZi0+dmRfbmV4dDsKKwkgICAgfQorCX0KKyAgICAgIGlmIChuZWVkc2NuICE9IE5VTEwpCisJeworCSAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJICBFbGZfRGF0YSAqbmVlZGRhdGE7CisJICBHRWxmX1NoZHIgbmVlZHNoZHJtZW07CisJICBHRWxmX1NoZHIgKm5lZWRzaGRyOworCisJICBuZWVkZGF0YSA9IGVsZl9nZXRkYXRhIChuZWVkc2NuLCBOVUxMKTsKKwkgIGlmIChuZWVkZGF0YSA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwkgIG5lZWRzaGRyID0gZ2VsZl9nZXRzaGRyIChuZWVkc2NuLCAmbmVlZHNoZHJtZW0pOworCSAgaWYgKG5lZWRzaGRyID09IE5VTEwpCisJICAgIHJldHVybjsKKworCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBuZWVkc2hkci0+c2hfaW5mbzsgKytjbnQpCisJICAgIHsKKwkgICAgICBHRWxmX1Zlcm5lZWQgbmVlZG1lbTsKKwkgICAgICBHRWxmX1Zlcm5lZWQgKm5lZWQ7CisJICAgICAgdW5zaWduZWQgaW50IGF1eG9mZnNldDsKKwkgICAgICBpbnQgY250MjsKKworCSAgICAgIC8qIEdldCB0aGUgZGF0YSBhdCB0aGUgbmV4dCBvZmZzZXQuICAqLworCSAgICAgIG5lZWQgPSBnZWxmX2dldHZlcm5lZWQgKG5lZWRkYXRhLCBvZmZzZXQsICZuZWVkbWVtKTsKKwkgICAgICBpZiAobmVlZCA9PSBOVUxMKQorCQlicmVhazsKKworCSAgICAgIC8qIFJ1biB0aHJvdWdoIHRoZSBhdXhpbGlhcnkgZW50cmllcy4gICovCisJICAgICAgYXV4b2Zmc2V0ID0gb2Zmc2V0ICsgbmVlZC0+dm5fYXV4OworCSAgICAgIGZvciAoY250MiA9IG5lZWQtPnZuX2NudDsgLS1jbnQyID49IDA7ICkKKwkJeworCQkgIEdFbGZfVmVybmF1eCBhdXhtZW07CisJCSAgR0VsZl9WZXJuYXV4ICphdXg7CisKKwkJICBhdXggPSBnZWxmX2dldHZlcm5hdXggKG5lZWRkYXRhLCBhdXhvZmZzZXQsICZhdXhtZW0pOworCQkgIGlmIChhdXggPT0gTlVMTCkKKwkJICAgIGJyZWFrOworCisJCSAgdmVybmFtZVthdXgtPnZuYV9vdGhlciAmIDB4N2ZmZl0KKwkJICAgID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIG5lZWRzaGRyLT5zaF9saW5rLCBhdXgtPnZuYV9uYW1lKTsKKwkJICBmaWxlbmFtZVthdXgtPnZuYV9vdGhlciAmIDB4N2ZmZl0KKwkJICAgID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIG5lZWRzaGRyLT5zaF9saW5rLCBuZWVkLT52bl9maWxlKTsKKworCQkgIGF1eG9mZnNldCArPSBhdXgtPnZuYV9uZXh0OworCQl9CisKKwkgICAgICBvZmZzZXQgKz0gbmVlZC0+dm5fbmV4dDsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2ZXJuYW1lID0gTlVMTDsKKyAgICAgIG52ZXJuYW1lID0gMTsKKyAgICAgIGZpbGVuYW1lID0gTlVMTDsKKyAgICB9CisKKyAgLyogUHJpbnQgdGhlIGhlYWRlci4gICovCisgIHByaW50ZiAobmdldHRleHQgKCJcCitcblZlcnNpb24gc3ltYm9scyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4gQWRkcjogJSMwKiIgUFJJeDY0ICIgIE9mZnNldDogJSMwOCIgUFJJeDY0ICIgIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJyIsCisJCSAgICAiXAorXG5WZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4gQWRkcjogJSMwKiIgUFJJeDY0ICIgIE9mZnNldDogJSMwOCIgUFJJeDY0ICIgIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJyIsCisJCSAgICBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZSksCisJICAodW5zaWduZWQgaW50KSBlbGZfbmR4c2NuIChzY24pLAorCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKKwkgIChpbnQpIChzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZSksCisJICBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgc2hkci0+c2hfYWRkciwKKwkgIHNoZHItPnNoX29mZnNldCwKKwkgICh1bnNpZ25lZCBpbnQpIHNoZHItPnNoX2xpbmssCisJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsCisJCSAgICAgIGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspLAorCQkJCSAgICAmZ2xpbmspLT5zaF9uYW1lKSk7CisKKyAgLyogTm93IHdlIGNhbiBmaW5hbGx5IGxvb2sgYXQgdGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uICAqLworICBmb3IgKGNudCA9IDA7IGNudCA8IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOyArK2NudCkKKyAgICB7CisgICAgICBHRWxmX1ZlcnN5bSBzeW1tZW07CisgICAgICBHRWxmX1ZlcnN5bSAqc3ltOworICAgICAgc3NpemVfdCBuOworCisgICAgICBpZiAoY250ICUgMiA9PSAwKQorCXByaW50ZiAoIlxuICU0ZDoiLCBjbnQpOworCisgICAgICBzeW0gPSBnZWxmX2dldHZlcnN5bSAoZGF0YSwgY250LCAmc3ltbWVtKTsKKyAgICAgIGlmIChzeW0gPT0gTlVMTCkKKwlicmVhazsKKworICAgICAgc3dpdGNoICgqc3ltKQorCXsKKwljYXNlIDA6CisJICBmcHV0c191bmxvY2tlZCAoZ2V0dGV4dCAoIiAgIDAgKmxvY2FsKiAgICAgICAgICAgICAgICAgICAgICIpLAorCQkJICBzdGRvdXQpOworCSAgYnJlYWs7CisKKwljYXNlIDE6CisJICBmcHV0c191bmxvY2tlZCAoZ2V0dGV4dCAoIiAgIDEgKmdsb2JhbCogICAgICAgICAgICAgICAgICAgICIpLAorCQkJICBzdGRvdXQpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgbiA9IHByaW50ZiAoIiU0ZCVjJXMiLAorCQkgICAgICAqc3ltICYgMHg3ZmZmLCAqc3ltICYgMHg4MDAwID8gJ2gnIDogJyAnLAorCQkgICAgICAodW5zaWduZWQgaW50KSAoKnN5bSAmIDB4N2ZmZikgPCBudmVybmFtZQorCQkgICAgICA/IHZlcm5hbWVbKnN5bSAmIDB4N2ZmZl0gOiAiPz8/Iik7CisJICBpZiAoKHVuc2lnbmVkIGludCkgKCpzeW0gJiAweDdmZmYpIDwgbnZlcm5hbWUKKwkgICAgICAmJiBmaWxlbmFtZVsqc3ltICYgMHg3ZmZmXSAhPSBOVUxMKQorCSAgICBuICs9IHByaW50ZiAoIiglcykiLCBmaWxlbmFtZVsqc3ltICYgMHg3ZmZmXSk7CisJICBwcmludGYgKCIlKnMiLCBNQVggKDAsIDMzIC0gKGludCkgbiksICIgIik7CisJICBicmVhazsKKwl9CisgICAgfQorICBwdXRjaGFyICgnXG4nKTsKK30KKworCitzdGF0aWMgdm9pZAoraGFuZGxlX2hhc2ggKEVibCAqZWJsKQoreworICAvKiBGaW5kIHRoZSBzeW1ib2wgdGFibGUocykuICBGb3IgdGhpcyB3ZSBoYXZlIHRvIHNlYXJjaCB0aHJvdWdoIHRoZQorICAgICBzZWN0aW9uIHRhYmxlLiAgKi8KKyAgRWxmX1NjbiAqc2NuID0gTlVMTDsKKyAgc2l6ZV90IHNoc3RybmR4OworCisgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KKyAgaWYgKGVsZl9nZXRzaHN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOworCisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSB0aGUgc2VjdGlvbiBpZiBpdCBpcyBhIHN5bWJvbCB0YWJsZS4gICovCisgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKworICAgICAgaWYgKHNoZHIgIT0gTlVMTCAmJiBzaGRyLT5zaF90eXBlID09IFNIVF9IQVNIKQorCXsKKwkgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisJICBFbGYzMl9Xb3JkIG5idWNrZXQ7CisJICBFbGYzMl9Xb3JkIG5jaGFpbjsKKwkgIEVsZjMyX1dvcmQgKmJ1Y2tldDsKKwkgIEVsZjMyX1dvcmQgKmNoYWluOworCSAgdWludDMyX3QgKmxlbmd0aHM7CisJICB1aW50MzJfdCAqY291bnRzOworCSAgRWxmMzJfV29yZCBjbnQ7CisJICBFbGYzMl9Xb3JkIG1heGxlbmd0aCA9IDA7CisJICBFbGYzMl9Xb3JkIG5zeW1zID0gMDsKKwkgIHVpbnQ2NF90IG56ZXJvX2NvdW50cyA9IDA7CisJICBHRWxmX1NoZHIgZ2xpbms7CisKKwkgIGlmIChkYXRhID09IE5VTEwpCisJICAgIHsKKwkgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgZGF0YSBmb3Igc2VjdGlvbiAlZDogJXMiKSwKKwkJICAgICAoaW50KSBlbGZfbmR4c2NuIChzY24pLCBlbGZfZXJybXNnICgtMSkpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIG5idWNrZXQgPSAoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpWzBdOworCSAgbmNoYWluID0gKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVsxXTsKKwkgIGJ1Y2tldCA9ICYoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpWzJdOworCSAgY2hhaW4gPSAmKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVsyICsgbmJ1Y2tldF07CisKKwkgIHByaW50ZiAobmdldHRleHQgKCJcCitcbkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgYnVja2V0KTpcbiBBZGRyOiAlIzAqIiBQUkl4NjQgIiAgT2Zmc2V0OiAlIzA4IiBQUkl4NjQgIiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iLAorCQkJICAgICJcCitcbkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgYnVja2V0cyk6XG4gQWRkcjogJSMwKiIgUFJJeDY0ICIgIE9mZnNldDogJSMwOCIgUFJJeDY0ICIgIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIiwKKwkJCSAgICBuYnVja2V0KSwKKwkJICAodW5zaWduZWQgaW50KSBlbGZfbmR4c2NuIChzY24pLAorCQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCisJCSAgKGludCkgbmJ1Y2tldCwKKwkJICBnZWxmX2dldGNsYXNzIChlYmwtPmVsZikgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsCisJCSAgc2hkci0+c2hfYWRkciwKKwkJICBzaGRyLT5zaF9vZmZzZXQsCisJCSAgKHVuc2lnbmVkIGludCkgc2hkci0+c2hfbGluaywKKwkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsCisJCQkgICAgICBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLAorCQkJCQkJCXNoZHItPnNoX2xpbmspLAorCQkJCQkgICAgJmdsaW5rKS0+c2hfbmFtZSkpOworCisJICBsZW5ndGhzID0gKHVpbnQzMl90ICopIHhjYWxsb2MgKG5idWNrZXQsIHNpemVvZiAodWludDMyX3QpKTsKKworCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYnVja2V0OyArK2NudCkKKwkgICAgaWYgKGJ1Y2tldFtjbnRdICE9IDApCisJICAgICAgeworCQlFbGYzMl9Xb3JkIGlubmVyOworCisJCWlubmVyID0gYnVja2V0W2NudF07CisJCXdoaWxlIChpbm5lciA+IDAgJiYgaW5uZXIgPCBuY2hhaW4pCisJCSAgeworCQkgICAgKytuc3ltczsKKwkJICAgIGlmIChtYXhsZW5ndGggPCArK2xlbmd0aHNbY250XSkKKwkJICAgICAgKyttYXhsZW5ndGg7CisKKwkJICAgIGlubmVyID0gY2hhaW5baW5uZXJdOworCQkgIH0KKwkgICAgICB9CisKKwkgIGNvdW50cyA9ICh1aW50MzJfdCAqKSB4Y2FsbG9jIChtYXhsZW5ndGggKyAxLCBzaXplb2YgKHVpbnQzMl90KSk7CisKKwkgIGZvciAoY250ID0gMDsgY250IDwgbmJ1Y2tldDsgKytjbnQpCisJICAgICsrY291bnRzW2xlbmd0aHNbY250XV07CisKKwkgIGlmIChuYnVja2V0ID4gMCkKKwkgICAgeworCSAgICAgIHVpbnQ2NF90IHN1Y2Nlc3MgPSAwOworCSAgICAgIEVsZjMyX1dvcmQgYWNjOworCisJICAgICAgcHV0cyAoZ2V0dGV4dCAoIiBMZW5ndGggIE51bWJlciAgJSBvZiB0b3RhbCAgQ292ZXJhZ2UiKSk7CisJICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiICAgICAgMCAgJTYiIFBSSXUzMiAiICAgICAgJTUuMWYlJVxuIiksCisJCSAgICAgIGNvdW50c1swXSwgKGNvdW50c1swXSAqIDEwMC4wKSAvIG5idWNrZXQpOworCisJICAgICAgZm9yIChjbnQgPSAxOyBjbnQgPD0gbWF4bGVuZ3RoOyArK2NudCkKKwkJeworCQkgIG56ZXJvX2NvdW50cyArPSBjb3VudHNbY250XSAqIGNudDsKKwkJICBwcmludGYgKGdldHRleHQgKCJcCislN2QgICU2IiBQUkl1MzIgIiAgICAgICU1LjFmJSUgICAgJTUuMWYlJVxuIiksCisJCQkgIChpbnQpIGNudCwKKwkJCSAgY291bnRzW2NudF0sIChjb3VudHNbY250XSAqIDEwMC4wKSAvIG5idWNrZXQsCisJCQkgIChuemVyb19jb3VudHMgKiAxMDAuMCkgLyBuc3ltcyk7CisJCX0KKworCSAgICAgIGFjYyA9IDA7CisJICAgICAgZm9yIChjbnQgPSAxOyBjbnQgPD0gbWF4bGVuZ3RoOyArK2NudCkKKwkJeworCQkgIGFjYyArPSBjbnQ7CisJCSAgc3VjY2VzcyArPSBjb3VudHNbY250XSAqIGFjYzsKKwkJfQorCisJICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAorIEF2ZXJhZ2UgbnVtYmVyIG9mIHRlc3RzOiAgIHN1Y2Nlc3NmdWwgbG9va3VwOiAlZlxuXAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnN1Y2Nlc3NmdWwgbG9va3VwOiAlZlxuIiksCisJCSAgICAgIChkb3VibGUpIHN1Y2Nlc3MgLyAoZG91YmxlKSBuemVyb19jb3VudHMsCisJCSAgICAgIChkb3VibGUpIG56ZXJvX2NvdW50cyAvIChkb3VibGUpIG5idWNrZXQpOworCSAgICB9CisKKwkgIGZyZWUgKGNvdW50cyk7CisJICBmcmVlIChsZW5ndGhzKTsKKwl9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9saWJsaXN0IChFYmwgKmVibCkKK3sKKyAgLyogRmluZCB0aGUgbGlicmFyeSBsaXN0IHNlY3Rpb25zLiAgRm9yIHRoaXMgd2UgaGF2ZSB0byBzZWFyY2gKKyAgICAgdGhyb3VnaCB0aGUgc2VjdGlvbiB0YWJsZS4gICovCisgIEVsZl9TY24gKnNjbiA9IE5VTEw7CisKKyAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLworICBzaXplX3Qgc2hzdHJuZHg7CisgIGlmIChlbGZfZ2V0c2hzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKKworICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKworICAgICAgaWYgKHNoZHIgIT0gTlVMTCAmJiBzaGRyLT5zaF90eXBlID09IFNIVF9HTlVfTElCTElTVCkKKwl7CisJICBpbnQgbmVudHJpZXMgPSBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKKwkgIHByaW50ZiAobmdldHRleHQgKCJcCitcbkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiIGNvbnRhaW5zICVkIGVudHJ5OlxuIiwKKwkJCSAgICAiXAorXG5MaWJyYXJ5IGxpc3Qgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIiBjb250YWlucyAlZCBlbnRyaWVzOlxuIiwKKwkJCSAgICBuZW50cmllcyksCisJCSAgZWxmX25keHNjbiAoc2NuKSwKKwkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAorCQkgIHNoZHItPnNoX29mZnNldCwKKwkJICBuZW50cmllcyk7CisKKwkgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisJICBpZiAoZGF0YSA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwkgIHB1dHMgKGdldHRleHQgKCJcCisgICAgICAgTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgVGltZSBTdGFtcCAgICAgICAgICBDaGVja3N1bSBWZXJzaW9uIEZsYWdzIikpOworCisJICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBuZW50cmllczsgKytjbnQpCisJICAgIHsKKwkgICAgICBHRWxmX0xpYiBsaWJfbWVtOworCSAgICAgIEdFbGZfTGliICpsaWIgPSBnZWxmX2dldGxpYiAoZGF0YSwgY250LCAmbGliX21lbSk7CisJICAgICAgaWYgKGxpYiA9PSBOVUxMKQorCQljb250aW51ZTsKKworCSAgICAgIHRpbWVfdCB0ID0gKHRpbWVfdCkgbGliLT5sX3RpbWVfc3RhbXA7CisJICAgICAgc3RydWN0IHRtICp0bSA9IGdtdGltZSAoJnQpOworCSAgICAgIGlmICh0bSA9PSBOVUxMKQorCQljb250aW51ZTsKKworCSAgICAgIHByaW50ZiAoIiAgWyUyZF0gJS0yOXMgJTA0dS0lMDJ1LSUwMnVUJTAydTolMDJ1OiUwMnUgJTA4eCAlLTd1ICV1XG4iLAorCQkgICAgICBjbnQsIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rLCBsaWItPmxfbmFtZSksCisJCSAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiArIDEsIHRtLT50bV9tZGF5LAorCQkgICAgICB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYywKKwkJICAgICAgKHVuc2lnbmVkIGludCkgbGliLT5sX2NoZWNrc3VtLAorCQkgICAgICAodW5zaWduZWQgaW50KSBsaWItPmxfdmVyc2lvbiwKKwkJICAgICAgKHVuc2lnbmVkIGludCkgbGliLT5sX2ZsYWdzKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZHdhcmZfdGFnX3N0cmluZyAodW5zaWduZWQgaW50IHRhZykKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmtub3duX3RhZ3NbXSAgPQorICAgIHsKKyAgICAgIFtEV19UQUdfYXJyYXlfdHlwZV0gPSAiYXJyYXlfdHlwZSIsCisgICAgICBbRFdfVEFHX2NsYXNzX3R5cGVdID0gImNsYXNzX3R5cGUiLAorICAgICAgW0RXX1RBR19lbnRyeV9wb2ludF0gPSAiZW50cnlfcG9pbnQiLAorICAgICAgW0RXX1RBR19lbnVtZXJhdGlvbl90eXBlXSA9ICJlbnVtZXJhdGlvbl90eXBlIiwKKyAgICAgIFtEV19UQUdfZm9ybWFsX3BhcmFtZXRlcl0gPSAiZm9ybWFsX3BhcmFtZXRlciIsCisgICAgICBbRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uXSA9ICJpbXBvcnRlZF9kZWNsYXJhdGlvbiIsCisgICAgICBbRFdfVEFHX2xhYmVsXSA9ICJsYWJlbCIsCisgICAgICBbRFdfVEFHX2xleGljYWxfYmxvY2tdID0gImxleGljYWxfYmxvY2siLAorICAgICAgW0RXX1RBR19tZW1iZXJdID0gIm1lbWJlciIsCisgICAgICBbRFdfVEFHX3BvaW50ZXJfdHlwZV0gPSAicG9pbnRlcl90eXBlIiwKKyAgICAgIFtEV19UQUdfcmVmZXJlbmNlX3R5cGVdID0gInJlZmVyZW5jZV90eXBlIiwKKyAgICAgIFtEV19UQUdfY29tcGlsZV91bml0XSA9ICJjb21waWxlX3VuaXQiLAorICAgICAgW0RXX1RBR19zdHJpbmdfdHlwZV0gPSAic3RyaW5nX3R5cGUiLAorICAgICAgW0RXX1RBR19zdHJ1Y3R1cmVfdHlwZV0gPSAic3RydWN0dXJlX3R5cGUiLAorICAgICAgW0RXX1RBR19zdWJyb3V0aW5lX3R5cGVdID0gInN1YnJvdXRpbmVfdHlwZSIsCisgICAgICBbRFdfVEFHX3R5cGVkZWZdID0gInR5cGVkZWYiLAorICAgICAgW0RXX1RBR191bmlvbl90eXBlXSA9ICJ1bmlvbl90eXBlIiwKKyAgICAgIFtEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVyc10gPSAidW5zcGVjaWZpZWRfcGFyYW1ldGVycyIsCisgICAgICBbRFdfVEFHX3ZhcmlhbnRdID0gInZhcmlhbnQiLAorICAgICAgW0RXX1RBR19jb21tb25fYmxvY2tdID0gImNvbW1vbl9ibG9jayIsCisgICAgICBbRFdfVEFHX2NvbW1vbl9pbmNsdXNpb25dID0gImNvbW1vbl9pbmNsdXNpb24iLAorICAgICAgW0RXX1RBR19pbmhlcml0YW5jZV0gPSAiaW5oZXJpdGFuY2UiLAorICAgICAgW0RXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmVdID0gImlubGluZWRfc3Vicm91dGluZSIsCisgICAgICBbRFdfVEFHX21vZHVsZV0gPSAibW9kdWxlIiwKKyAgICAgIFtEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlXSA9ICJwdHJfdG9fbWVtYmVyX3R5cGUiLAorICAgICAgW0RXX1RBR19zZXRfdHlwZV0gPSAic2V0X3R5cGUiLAorICAgICAgW0RXX1RBR19zdWJyYW5nZV90eXBlXSA9ICJzdWJyYW5nZV90eXBlIiwKKyAgICAgIFtEV19UQUdfd2l0aF9zdG10XSA9ICJ3aXRoX3N0bXQiLAorICAgICAgW0RXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb25dID0gImFjY2Vzc19kZWNsYXJhdGlvbiIsCisgICAgICBbRFdfVEFHX2Jhc2VfdHlwZV0gPSAiYmFzZV90eXBlIiwKKyAgICAgIFtEV19UQUdfY2F0Y2hfYmxvY2tdID0gImNhdGNoX2Jsb2NrIiwKKyAgICAgIFtEV19UQUdfY29uc3RfdHlwZV0gPSAiY29uc3RfdHlwZSIsCisgICAgICBbRFdfVEFHX2NvbnN0YW50XSA9ICJjb25zdGFudCIsCisgICAgICBbRFdfVEFHX2VudW1lcmF0b3JdID0gImVudW1lcmF0b3IiLAorICAgICAgW0RXX1RBR19maWxlX3R5cGVdID0gImZpbGVfdHlwZSIsCisgICAgICBbRFdfVEFHX2ZyaWVuZF0gPSAiZnJpZW5kIiwKKyAgICAgIFtEV19UQUdfbmFtZWxpc3RdID0gIm5hbWVsaXN0IiwKKyAgICAgIFtEV19UQUdfbmFtZWxpc3RfaXRlbV0gPSAibmFtZWxpc3RfaXRlbSIsCisgICAgICBbRFdfVEFHX3BhY2tlZF90eXBlXSA9ICJwYWNrZWRfdHlwZSIsCisgICAgICBbRFdfVEFHX3N1YnByb2dyYW1dID0gInN1YnByb2dyYW0iLAorICAgICAgW0RXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtXSA9ICJ0ZW1wbGF0ZV90eXBlX3BhcmFtIiwKKyAgICAgIFtEV19UQUdfdGVtcGxhdGVfdmFsdWVfcGFyYW1dID0gInRlbXBsYXRlX3ZhbHVlX3BhcmFtIiwKKyAgICAgIFtEV19UQUdfdGhyb3duX3R5cGVdID0gInRocm93bl90eXBlIiwKKyAgICAgIFtEV19UQUdfdHJ5X2Jsb2NrXSA9ICJ0cnlfYmxvY2siLAorICAgICAgW0RXX1RBR192YXJpYW50X3BhcnRdID0gInZhcmlhbnRfcGFydCIsCisgICAgICBbRFdfVEFHX3ZhcmlhYmxlXSA9ICJ2YXJpYWJsZSIsCisgICAgICBbRFdfVEFHX3ZvbGF0aWxlX3R5cGVdID0gInZvbGF0aWxlX3R5cGUiLAorICAgICAgW0RXX1RBR19kd2FyZl9wcm9jZWR1cmVdID0gImR3YXJmX3Byb2NlZHVyZSIsCisgICAgICBbRFdfVEFHX3Jlc3RyaWN0X3R5cGVdID0gInJlc3RyaWN0X3R5cGUiLAorICAgICAgW0RXX1RBR19pbnRlcmZhY2VfdHlwZV0gPSAiaW50ZXJmYWNlX3R5cGUiLAorICAgICAgW0RXX1RBR19uYW1lc3BhY2VdID0gIm5hbWVzcGFjZSIsCisgICAgICBbRFdfVEFHX2ltcG9ydGVkX21vZHVsZV0gPSAiaW1wb3J0ZWRfbW9kdWxlIiwKKyAgICAgIFtEV19UQUdfdW5zcGVjaWZpZWRfdHlwZV0gPSAidW5zcGVjaWZpZWRfdHlwZSIsCisgICAgICBbRFdfVEFHX3BhcnRpYWxfdW5pdF0gPSAicGFydGlhbF91bml0IiwKKyAgICAgIFtEV19UQUdfaW1wb3J0ZWRfdW5pdF0gPSAiaW1wb3J0ZWRfdW5pdCIsCisgICAgICBbRFdfVEFHX3Vuc3BlY2lmaWVkX3R5cGVdID0gInVuc3BlY2lmaWVkX3R5cGUiLAorICAgICAgW0RXX1RBR19wYXJ0aWFsX3VuaXRdID0gInBhcnRpYWxfdW5pdCIsCisgICAgICBbRFdfVEFHX2ltcG9ydGVkX3VuaXRdID0gImltcG9ydGVkX3VuaXQiLAorICAgICAgW0RXX1RBR19tdXRhYmxlX3R5cGVdID0gIm11dGFibGVfdHlwZSIsCisgICAgfTsKKyAgY29uc3QgdW5zaWduZWQgaW50IG5rbm93bl90YWdzID0gKHNpemVvZiAoa25vd25fdGFncykKKwkJCQkgICAgLyBzaXplb2YgKGtub3duX3RhZ3NbMF0pKTsKKyAgc3RhdGljIGNoYXIgYnVmWzQwXTsKKyAgY29uc3QgY2hhciAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAodGFnIDwgbmtub3duX3RhZ3MpCisgICAgcmVzdWx0ID0ga25vd25fdGFnc1t0YWddOworCisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAvKiBUaGVyZSBhcmUgYSBmZXcga25vd24gZXh0ZW5zaW9ucy4gICovCisgICAgc3dpdGNoICh0YWcpCisgICAgICB7CisgICAgICBjYXNlIERXX1RBR19NSVBTX2xvb3A6CisJcmVzdWx0ID0gIk1JUFNfbG9vcCI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRFdfVEFHX2Zvcm1hdF9sYWJlbDoKKwlyZXN1bHQgPSAiZm9ybWF0X2xhYmVsIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGU6CisJcmVzdWx0ID0gImZ1bmN0aW9uX3RlbXBsYXRlIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19UQUdfY2xhc3NfdGVtcGxhdGU6CisJcmVzdWx0ID0gImNsYXNzX3RlbXBsYXRlIjsKKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKwlpZiAodGFnIDwgRFdfVEFHX2xvX3VzZXIpCisJICBzbnByaW50ZiAoYnVmLCBzaXplb2YgYnVmLCBnZXR0ZXh0ICgidW5rbm93biB0YWcgJWh4IiksIHRhZyk7CisJZWxzZQorCSAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZ2V0dGV4dCAoInVua25vd24gdXNlciB0YWcgJWh4IiksIHRhZyk7CisJcmVzdWx0ID0gYnVmOworCWJyZWFrOworICAgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZHdhcmZfYXR0cl9zdHJpbmcgKHVuc2lnbmVkIGludCBhdHRybnVtKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqa25vd25fYXR0cnNbXSA9CisgICAgeworICAgICAgW0RXX0FUX3NpYmxpbmddID0gInNpYmxpbmciLAorICAgICAgW0RXX0FUX2xvY2F0aW9uXSA9ICJsb2NhdGlvbiIsCisgICAgICBbRFdfQVRfbmFtZV0gPSAibmFtZSIsCisgICAgICBbRFdfQVRfb3JkZXJpbmddID0gIm9yZGVyaW5nIiwKKyAgICAgIFtEV19BVF9zdWJzY3JfZGF0YV0gPSAic3Vic2NyX2RhdGEiLAorICAgICAgW0RXX0FUX2J5dGVfc2l6ZV0gPSAiYnl0ZV9zaXplIiwKKyAgICAgIFtEV19BVF9iaXRfb2Zmc2V0XSA9ICJiaXRfb2Zmc2V0IiwKKyAgICAgIFtEV19BVF9iaXRfc2l6ZV0gPSAiYml0X3NpemUiLAorICAgICAgW0RXX0FUX2VsZW1lbnRfbGlzdF0gPSAiZWxlbWVudF9saXN0IiwKKyAgICAgIFtEV19BVF9zdG10X2xpc3RdID0gInN0bXRfbGlzdCIsCisgICAgICBbRFdfQVRfbG93X3BjXSA9ICJsb3dfcGMiLAorICAgICAgW0RXX0FUX2hpZ2hfcGNdID0gImhpZ2hfcGMiLAorICAgICAgW0RXX0FUX2xhbmd1YWdlXSA9ICJsYW5ndWFnZSIsCisgICAgICBbRFdfQVRfbWVtYmVyXSA9ICJtZW1iZXIiLAorICAgICAgW0RXX0FUX2Rpc2NyXSA9ICJkaXNjciIsCisgICAgICBbRFdfQVRfZGlzY3JfdmFsdWVdID0gImRpc2NyX3ZhbHVlIiwKKyAgICAgIFtEV19BVF92aXNpYmlsaXR5XSA9ICJ2aXNpYmlsaXR5IiwKKyAgICAgIFtEV19BVF9pbXBvcnRdID0gImltcG9ydCIsCisgICAgICBbRFdfQVRfc3RyaW5nX2xlbmd0aF0gPSAic3RyaW5nX2xlbmd0aCIsCisgICAgICBbRFdfQVRfY29tbW9uX3JlZmVyZW5jZV0gPSAiY29tbW9uX3JlZmVyZW5jZSIsCisgICAgICBbRFdfQVRfY29tcF9kaXJdID0gImNvbXBfZGlyIiwKKyAgICAgIFtEV19BVF9jb25zdF92YWx1ZV0gPSAiY29uc3RfdmFsdWUiLAorICAgICAgW0RXX0FUX2NvbnRhaW5pbmdfdHlwZV0gPSAiY29udGFpbmluZ190eXBlIiwKKyAgICAgIFtEV19BVF9kZWZhdWx0X3ZhbHVlXSA9ICJkZWZhdWx0X3ZhbHVlIiwKKyAgICAgIFtEV19BVF9pbmxpbmVdID0gImlubGluZSIsCisgICAgICBbRFdfQVRfaXNfb3B0aW9uYWxdID0gImlzX29wdGlvbmFsIiwKKyAgICAgIFtEV19BVF9sb3dlcl9ib3VuZF0gPSAibG93ZXJfYm91bmQiLAorICAgICAgW0RXX0FUX3Byb2R1Y2VyXSA9ICJwcm9kdWNlciIsCisgICAgICBbRFdfQVRfcHJvdG90eXBlZF0gPSAicHJvdG90eXBlZCIsCisgICAgICBbRFdfQVRfcmV0dXJuX2FkZHJdID0gInJldHVybl9hZGRyIiwKKyAgICAgIFtEV19BVF9zdGFydF9zY29wZV0gPSAic3RhcnRfc2NvcGUiLAorICAgICAgW0RXX0FUX3N0cmlkZV9zaXplXSA9ICJzdHJpZGVfc2l6ZSIsCisgICAgICBbRFdfQVRfdXBwZXJfYm91bmRdID0gInVwcGVyX2JvdW5kIiwKKyAgICAgIFtEV19BVF9hYnN0cmFjdF9vcmlnaW5dID0gImFic3RyYWN0X29yaWdpbiIsCisgICAgICBbRFdfQVRfYWNjZXNzaWJpbGl0eV0gPSAiYWNjZXNzaWJpbGl0eSIsCisgICAgICBbRFdfQVRfYWRkcmVzc19jbGFzc10gPSAiYWRkcmVzc19jbGFzcyIsCisgICAgICBbRFdfQVRfYXJ0aWZpY2lhbF0gPSAiYXJ0aWZpY2lhbCIsCisgICAgICBbRFdfQVRfYmFzZV90eXBlc10gPSAiYmFzZV90eXBlcyIsCisgICAgICBbRFdfQVRfY2FsbGluZ19jb252ZW50aW9uXSA9ICJjYWxsaW5nX2NvbnZlbnRpb24iLAorICAgICAgW0RXX0FUX2NvdW50XSA9ICJjb3VudCIsCisgICAgICBbRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb25dID0gImRhdGFfbWVtYmVyX2xvY2F0aW9uIiwKKyAgICAgIFtEV19BVF9kZWNsX2NvbHVtbl0gPSAiZGVjbF9jb2x1bW4iLAorICAgICAgW0RXX0FUX2RlY2xfZmlsZV0gPSAiZGVjbF9maWxlIiwKKyAgICAgIFtEV19BVF9kZWNsX2xpbmVdID0gImRlY2xfbGluZSIsCisgICAgICBbRFdfQVRfZGVjbGFyYXRpb25dID0gImRlY2xhcmF0aW9uIiwKKyAgICAgIFtEV19BVF9kaXNjcl9saXN0XSA9ICJkaXNjcl9saXN0IiwKKyAgICAgIFtEV19BVF9lbmNvZGluZ10gPSAiZW5jb2RpbmciLAorICAgICAgW0RXX0FUX2V4dGVybmFsXSA9ICJleHRlcm5hbCIsCisgICAgICBbRFdfQVRfZnJhbWVfYmFzZV0gPSAiZnJhbWVfYmFzZSIsCisgICAgICBbRFdfQVRfZnJpZW5kXSA9ICJmcmllbmQiLAorICAgICAgW0RXX0FUX2lkZW50aWZpZXJfY2FzZV0gPSAiaWRlbnRpZmllcl9jYXNlIiwKKyAgICAgIFtEV19BVF9tYWNyb19pbmZvXSA9ICJtYWNyb19pbmZvIiwKKyAgICAgIFtEV19BVF9uYW1lbGlzdF9pdGVtc10gPSAibmFtZWxpc3RfaXRlbXMiLAorICAgICAgW0RXX0FUX3ByaW9yaXR5XSA9ICJwcmlvcml0eSIsCisgICAgICBbRFdfQVRfc2VnbWVudF0gPSAic2VnbWVudCIsCisgICAgICBbRFdfQVRfc3BlY2lmaWNhdGlvbl0gPSAic3BlY2lmaWNhdGlvbiIsCisgICAgICBbRFdfQVRfc3RhdGljX2xpbmtdID0gInN0YXRpY19saW5rIiwKKyAgICAgIFtEV19BVF90eXBlXSA9ICJ0eXBlIiwKKyAgICAgIFtEV19BVF91c2VfbG9jYXRpb25dID0gInVzZV9sb2NhdGlvbiIsCisgICAgICBbRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyXSA9ICJ2YXJpYWJsZV9wYXJhbWV0ZXIiLAorICAgICAgW0RXX0FUX3ZpcnR1YWxpdHldID0gInZpcnR1YWxpdHkiLAorICAgICAgW0RXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uXSA9ICJ2dGFibGVfZWxlbV9sb2NhdGlvbiIsCisgICAgICBbRFdfQVRfYWxsb2NhdGVkXSA9ICJhbGxvY2F0ZWQiLAorICAgICAgW0RXX0FUX2Fzc29jaWF0ZWRdID0gImFzc29jaWF0ZWQiLAorICAgICAgW0RXX0FUX2RhdGFfbG9jYXRpb25dID0gImRhdGFfbG9jYXRpb24iLAorICAgICAgW0RXX0FUX3N0cmlkZV0gPSAic3RyaWRlIiwKKyAgICAgIFtEV19BVF9lbnRyeV9wY10gPSAiZW50cnlfcGMiLAorICAgICAgW0RXX0FUX3VzZV9VVEY4XSA9ICJ1c2VfVVRGOCIsCisgICAgICBbRFdfQVRfZXh0ZW5zaW9uXSA9ICJleHRlbnNpb24iLAorICAgICAgW0RXX0FUX3Jhbmdlc10gPSAicmFuZ2VzIiwKKyAgICAgIFtEV19BVF90cmFtcG9saW5lXSA9ICJ0cmFtcG9saW5lIiwKKyAgICAgIFtEV19BVF9jYWxsX2NvbHVtbl0gPSAiY2FsbF9jb2x1bW4iLAorICAgICAgW0RXX0FUX2NhbGxfZmlsZV0gPSAiY2FsbF9maWxlIiwKKyAgICAgIFtEV19BVF9jYWxsX2xpbmVdID0gImNhbGxfbGluZSIsCisgICAgICBbRFdfQVRfZGVzY3JpcHRpb25dID0gImRlc2NyaXB0aW9uIgorICAgIH07CisgIGNvbnN0IHVuc2lnbmVkIGludCBua25vd25fYXR0cnMgPSAoc2l6ZW9mIChrbm93bl9hdHRycykKKwkJCQkgICAgIC8gc2l6ZW9mIChrbm93bl9hdHRyc1swXSkpOworICBzdGF0aWMgY2hhciBidWZbNDBdOworICBjb25zdCBjaGFyICpyZXN1bHQgPSBOVUxMOworCisgIGlmIChhdHRybnVtIDwgbmtub3duX2F0dHJzKQorICAgIHJlc3VsdCA9IGtub3duX2F0dHJzW2F0dHJudW1dOworCisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAvKiBUaGVyZSBhcmUgYSBmZXcga25vd24gZXh0ZW5zaW9ucy4gICovCisgICAgc3dpdGNoIChhdHRybnVtKQorICAgICAgeworICAgICAgY2FzZSBEV19BVF9NSVBTX2ZkZToKKwlyZXN1bHQgPSAiTUlQU19mZGUiOworCWJyZWFrOworCisgICAgICBjYXNlIERXX0FUX01JUFNfbG9vcF9iZWdpbjoKKwlyZXN1bHQgPSAiTUlQU19sb29wX2JlZ2luIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19BVF9NSVBTX3RhaWxfbG9vcF9iZWdpbjoKKwlyZXN1bHQgPSAiTUlQU190YWlsX2xvb3BfYmVnaW4iOworCWJyZWFrOworCisgICAgICBjYXNlIERXX0FUX01JUFNfZXBpbG9nX2JlZ2luOgorCXJlc3VsdCA9ICJNSVBTX2VwaWxvZ19iZWdpbiI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3I6CisJcmVzdWx0ID0gIk1JUFNfbG9vcF91bnJvbGxfZmFjdG9yIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19BVF9NSVBTX3NvZnR3YXJlX3BpcGVsaW5lX2RlcHRoOgorCXJlc3VsdCA9ICJNSVBTX3NvZnR3YXJlX3BpcGVsaW5lX2RlcHRoIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZToKKwlyZXN1bHQgPSAiTUlQU19saW5rYWdlX25hbWUiOworCWJyZWFrOworCisgICAgICBjYXNlIERXX0FUX01JUFNfc3RyaWRlOgorCXJlc3VsdCA9ICJNSVBTX3N0cmlkZSI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lOgorCXJlc3VsdCA9ICJNSVBTX2Fic3RyYWN0X25hbWUiOworCWJyZWFrOworCisgICAgICBjYXNlIERXX0FUX01JUFNfY2xvbmVfb3JpZ2luOgorCXJlc3VsdCA9ICJNSVBTX2Nsb25lX29yaWdpbiI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRFdfQVRfTUlQU19oYXNfaW5saW5lczoKKwlyZXN1bHQgPSAiTUlQU19oYXNfaW5saW5lcyI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRFdfQVRfTUlQU19zdHJpZGVfYnl0ZToKKwlyZXN1bHQgPSAiTUlQU19zdHJpZGVfYnl0ZSI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRFdfQVRfTUlQU19zdHJpZGVfZWxlbToKKwlyZXN1bHQgPSAiTUlQU19zdHJpZGVfZWxlbSI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRFdfQVRfTUlQU19wdHJfZG9wZXR5cGU6CisJcmVzdWx0ID0gIk1JUFNfcHRyX2RvcGV0eXBlIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19BVF9NSVBTX2FsbG9jYXRhYmxlX2RvcGV0eXBlOgorCXJlc3VsdCA9ICJNSVBTX2FsbG9jYXRhYmxlX2RvcGV0eXBlIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19BVF9NSVBTX2Fzc3VtZWRfc2hhcGVfZG9wZXR5cGU6CisJcmVzdWx0ID0gIk1JUFNfYXNzdW1lZF9zaGFwZV9kb3BldHlwZSI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRFdfQVRfTUlQU19hc3N1bWVkX3NpemU6CisJcmVzdWx0ID0gIk1JUFNfYXNzdW1lZF9zaXplIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19BVF9zZl9uYW1lczoKKwlyZXN1bHQgPSAic2ZfbmFtZXMiOworCWJyZWFrOworCisgICAgICBjYXNlIERXX0FUX3NyY19pbmZvOgorCXJlc3VsdCA9ICJzcmNfaW5mbyI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRFdfQVRfbWFjX2luZm86CisJcmVzdWx0ID0gIm1hY19pbmZvIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19BVF9zcmNfY29vcmRzOgorCXJlc3VsdCA9ICJzcmNfY29vcmRzIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19BVF9ib2R5X2JlZ2luOgorCXJlc3VsdCA9ICJib2R5X2JlZ2luIjsKKwlicmVhazsKKworICAgICAgY2FzZSBEV19BVF9ib2R5X2VuZDoKKwlyZXN1bHQgPSAiYm9keV9lbmQiOworCWJyZWFrOworCisgICAgICBkZWZhdWx0OgorCWlmIChhdHRybnVtIDwgRFdfQVRfbG9fdXNlcikKKwkgIHNucHJpbnRmIChidWYsIHNpemVvZiBidWYsIGdldHRleHQgKCJ1bmtub3duIGF0dHJpYnV0ZSAlaHgiKSwKKwkJICAgIGF0dHJudW0pOworCWVsc2UKKwkgIHNucHJpbnRmIChidWYsIHNpemVvZiBidWYsIGdldHRleHQgKCJ1bmtub3duIHVzZXIgYXR0cmlidXRlICVoeCIpLAorCQkgICAgYXR0cm51bSk7CisJcmVzdWx0ID0gYnVmOworCWJyZWFrOworICAgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZHdhcmZfZm9ybV9zdHJpbmcgKHVuc2lnbmVkIGludCBmb3JtKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqa25vd25fZm9ybXNbXSA9CisgICAgeworICAgICAgW0RXX0ZPUk1fYWRkcl0gPSAiYWRkciIsCisgICAgICBbRFdfRk9STV9ibG9jazJdID0gImJsb2NrMiIsCisgICAgICBbRFdfRk9STV9ibG9jazRdID0gImJsb2NrNCIsCisgICAgICBbRFdfRk9STV9kYXRhMl0gPSAiZGF0YTIiLAorICAgICAgW0RXX0ZPUk1fZGF0YTRdID0gImRhdGE0IiwKKyAgICAgIFtEV19GT1JNX2RhdGE4XSA9ICJkYXRhOCIsCisgICAgICBbRFdfRk9STV9zdHJpbmddID0gInN0cmluZyIsCisgICAgICBbRFdfRk9STV9ibG9ja10gPSAiYmxvY2siLAorICAgICAgW0RXX0ZPUk1fYmxvY2sxXSA9ICJibG9jazEiLAorICAgICAgW0RXX0ZPUk1fZGF0YTFdID0gImRhdGExIiwKKyAgICAgIFtEV19GT1JNX2ZsYWddID0gImZsYWciLAorICAgICAgW0RXX0ZPUk1fc2RhdGFdID0gInNkYXRhIiwKKyAgICAgIFtEV19GT1JNX3N0cnBdID0gInN0cnAiLAorICAgICAgW0RXX0ZPUk1fdWRhdGFdID0gInVkYXRhIiwKKyAgICAgIFtEV19GT1JNX3JlZl9hZGRyXSA9ICJyZWZfYWRkciIsCisgICAgICBbRFdfRk9STV9yZWYxXSA9ICJyZWYxIiwKKyAgICAgIFtEV19GT1JNX3JlZjJdID0gInJlZjIiLAorICAgICAgW0RXX0ZPUk1fcmVmNF0gPSAicmVmNCIsCisgICAgICBbRFdfRk9STV9yZWY4XSA9ICJyZWY4IiwKKyAgICAgIFtEV19GT1JNX3JlZl91ZGF0YV0gPSAicmVmX3VkYXRhIiwKKyAgICAgIFtEV19GT1JNX2luZGlyZWN0XSA9ICJpbmRpcmVjdCIKKyAgICB9OworICBjb25zdCB1bnNpZ25lZCBpbnQgbmtub3duX2Zvcm1zID0gKHNpemVvZiAoa25vd25fZm9ybXMpCisJCQkJICAgICAvIHNpemVvZiAoa25vd25fZm9ybXNbMF0pKTsKKyAgc3RhdGljIGNoYXIgYnVmWzQwXTsKKyAgY29uc3QgY2hhciAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAoZm9ybSA8IG5rbm93bl9mb3JtcykKKyAgICByZXN1bHQgPSBrbm93bl9mb3Jtc1tmb3JtXTsKKworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZ2V0dGV4dCAoInVua25vd24gZm9ybSAlIiBQUkl4NjQpLAorCSAgICAgICh1aW50NjRfdCkgZm9ybSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCitkd2FyZl9sYW5nX3N0cmluZyAodW5zaWduZWQgaW50IGxhbmcpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICprbm93bltdID0KKyAgICB7CisgICAgICBbRFdfTEFOR19DODldID0gIklTTyBDODkiLAorICAgICAgW0RXX0xBTkdfQ10gPSAiQyIsCisgICAgICBbRFdfTEFOR19BZGE4M10gPSAiQWRhODMiLAorICAgICAgW0RXX0xBTkdfQ19wbHVzX3BsdXMgXSA9ICJDKysiLAorICAgICAgW0RXX0xBTkdfQ29ib2w3NF0gPSAiQ29ib2w3NCIsCisgICAgICBbRFdfTEFOR19Db2JvbDg1XSA9ICJDb2JvbDg1IiwKKyAgICAgIFtEV19MQU5HX0ZvcnRyYW43N10gPSAiRm9ydHJhbjc3IiwKKyAgICAgIFtEV19MQU5HX0ZvcnRyYW45MF0gPSAiRm9ydHJhbjkwIiwKKyAgICAgIFtEV19MQU5HX1Bhc2NhbDgzXSA9ICJQYXNjYWw4MyIsCisgICAgICBbRFdfTEFOR19Nb2R1bGEyXSA9ICJNb2R1bGEyIiwKKyAgICAgIFtEV19MQU5HX0phdmFdID0gIkphdmEiLAorICAgICAgW0RXX0xBTkdfQzk5XSA9ICJJU08gQzk5IiwKKyAgICAgIFtEV19MQU5HX0FkYTk1XSA9ICJBZGE5NSIsCisgICAgICBbRFdfTEFOR19Gb3J0cmFuOTVdID0gIkZvcnRyYW45NSIsCisgICAgICBbRFdfTEFOR19QTDFdID0gIlBMMSIKKyAgICB9OworCisgIGlmIChsYW5nIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkKKyAgICByZXR1cm4ga25vd25bbGFuZ107CisgIGVsc2UgaWYgKGxhbmcgPT0gRFdfTEFOR19NaXBzX0Fzc2VtYmxlcikKKyAgICAvKiBUaGlzIGxhbmd1YWdlIHRhZyBpcyB1c2VkIGZvciBhc3NlbWJsZXIgaW4gZ2VuZXJhbC4gICovCisgICAgcmV0dXJuICJBc3NlbWJsZXIiOworCisgIGlmIChsYW5nID49IERXX0xBTkdfbG9fdXNlciAmJiBsYW5nIDw9IERXX0xBTkdfaGlfdXNlcikKKyAgICB7CisgICAgICBzdGF0aWMgY2hhciBidWZbMzBdOworICAgICAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAibG9fdXNlcisldSIsIGxhbmcgLSBEV19MQU5HX2xvX3VzZXIpOworICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgcmV0dXJuICI/Pz8iOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2R3YXJmX2lubGluZV9zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqa25vd25bXSA9CisgICAgeworICAgICAgW0RXX0lOTF9ub3RfaW5saW5lZF0gPSAibm90X2lubGluZWQiLAorICAgICAgW0RXX0lOTF9pbmxpbmVkXSA9ICJpbmxpbmVkIiwKKyAgICAgIFtEV19JTkxfZGVjbGFyZWRfbm90X2lubGluZWRdID0gImRlY2xhcmVkX25vdF9pbmxpbmVkIiwKKyAgICAgIFtEV19JTkxfZGVjbGFyZWRfaW5saW5lZF0gPSAiZGVjbGFyZWRfaW5saW5lZCIKKyAgICB9OworCisgIGlmIChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkKKyAgICByZXR1cm4ga25vd25bY29kZV07CisKKyAgcmV0dXJuICI/Pz8iOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2R3YXJmX2VuY29kaW5nX3N0cmluZyAodW5zaWduZWQgaW50IGNvZGUpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICprbm93bltdID0KKyAgICB7CisgICAgICBbRFdfQVRFX3ZvaWRdID0gInZvaWQiLAorICAgICAgW0RXX0FURV9hZGRyZXNzXSA9ICJhZGRyZXNzIiwKKyAgICAgIFtEV19BVEVfYm9vbGVhbl0gPSAiYm9vbGVhbiIsCisgICAgICBbRFdfQVRFX2NvbXBsZXhfZmxvYXRdID0gImNvbXBsZXhfZmxvYXQiLAorICAgICAgW0RXX0FURV9mbG9hdF0gPSAiZmxvYXQiLAorICAgICAgW0RXX0FURV9zaWduZWRdID0gInNpZ25lZCIsCisgICAgICBbRFdfQVRFX3NpZ25lZF9jaGFyXSA9ICJzaWduZWRfY2hhciIsCisgICAgICBbRFdfQVRFX3Vuc2lnbmVkXSA9ICJ1bnNpZ25lZCIsCisgICAgICBbRFdfQVRFX3Vuc2lnbmVkX2NoYXJdID0gInVuc2lnbmVkX2NoYXIiLAorICAgICAgW0RXX0FURV9pbWFnaW5hcnlfZmxvYXRdID0gImltYWdpbmFyeV9mbG9hdCIKKyAgICB9OworCisgIGlmIChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkKKyAgICByZXR1cm4ga25vd25bY29kZV07CisKKyAgaWYgKGNvZGUgPj0gRFdfQVRFX2xvX3VzZXIgJiYgY29kZSA8PSBEV19BVEVfaGlfdXNlcikKKyAgICB7CisgICAgICBzdGF0aWMgY2hhciBidWZbMzBdOworICAgICAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAibG9fdXNlcisldSIsIGNvZGUgLSBEV19BVEVfbG9fdXNlcik7CisgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICByZXR1cm4gIj8/PyI7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZHdhcmZfYWNjZXNzX3N0cmluZyAodW5zaWduZWQgaW50IGNvZGUpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICprbm93bltdID0KKyAgICB7CisgICAgICBbRFdfQUNDRVNTX3B1YmxpY10gPSAicHVibGljIiwKKyAgICAgIFtEV19BQ0NFU1NfcHJvdGVjdGVkXSA9ICJwcm90ZWN0ZWQiLAorICAgICAgW0RXX0FDQ0VTU19wcml2YXRlXSA9ICJwcml2YXRlIgorICAgIH07CisKKyAgaWYgKGNvZGUgPCBzaXplb2YgKGtub3duKSAvIHNpemVvZiAoa25vd25bMF0pKQorICAgIHJldHVybiBrbm93bltjb2RlXTsKKworICByZXR1cm4gIj8/PyI7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZHdhcmZfdmlzaWJpbGl0eV9zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqa25vd25bXSA9CisgICAgeworICAgICAgW0RXX1ZJU19sb2NhbF0gPSAibG9jYWwiLAorICAgICAgW0RXX1ZJU19leHBvcnRlZF0gPSAiZXhwb3J0ZWQiLAorICAgICAgW0RXX1ZJU19xdWFsaWZpZWRdID0gInF1YWxpZmllZCIKKyAgICB9OworCisgIGlmIChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkKKyAgICByZXR1cm4ga25vd25bY29kZV07CisKKyAgcmV0dXJuICI/Pz8iOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2R3YXJmX3ZpcnR1YWxpdHlfc3RyaW5nICh1bnNpZ25lZCBpbnQgY29kZSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmtub3duW10gPQorICAgIHsKKyAgICAgIFtEV19WSVJUVUFMSVRZX25vbmVdID0gIm5vbmUiLAorICAgICAgW0RXX1ZJUlRVQUxJVFlfdmlydHVhbF0gPSAidmlydHVhbCIsCisgICAgICBbRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWxdID0gInB1cmVfdmlydHVhbCIKKyAgICB9OworCisgIGlmIChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkKKyAgICByZXR1cm4ga25vd25bY29kZV07CisKKyAgcmV0dXJuICI/Pz8iOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2R3YXJmX2lkZW50aWZpZXJfY2FzZV9zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqa25vd25bXSA9CisgICAgeworICAgICAgW0RXX0lEX2Nhc2Vfc2Vuc2l0aXZlXSA9ICJzZW5zaXRpdmUiLAorICAgICAgW0RXX0lEX3VwX2Nhc2VdID0gInVwX2Nhc2UiLAorICAgICAgW0RXX0lEX2Rvd25fY2FzZV0gPSAiZG93bl9jYXNlIiwKKyAgICAgIFtEV19JRF9jYXNlX2luc2Vuc2l0aXZlXSA9ICJpbnNlbnNpdGl2ZSIKKyAgICB9OworCisgIGlmIChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkKKyAgICByZXR1cm4ga25vd25bY29kZV07CisKKyAgcmV0dXJuICI/Pz8iOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2R3YXJmX2NhbGxpbmdfY29udmVudGlvbl9zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqa25vd25bXSA9CisgICAgeworICAgICAgW0RXX0NDX25vcm1hbF0gPSAibm9ybWFsIiwKKyAgICAgIFtEV19DQ19wcm9ncmFtXSA9ICJwcm9ncmFtIiwKKyAgICAgIFtEV19DQ19ub2NhbGxdID0gIm5vY2FsbCIsCisgICAgfTsKKworICBpZiAoY29kZSA8IHNpemVvZiAoa25vd24pIC8gc2l6ZW9mIChrbm93blswXSkpCisgICAgcmV0dXJuIGtub3duW2NvZGVdOworCisgIGlmIChjb2RlID49IERXX0NDX2xvX3VzZXIgJiYgY29kZSA8PSBEV19DQ19oaV91c2VyKQorICAgIHsKKyAgICAgIHN0YXRpYyBjaGFyIGJ1ZlszMF07CisgICAgICBzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1ZiksICJsb191c2VyKyV1IiwgY29kZSAtIERXX0NDX2xvX3VzZXIpOworICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgcmV0dXJuICI/Pz8iOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2R3YXJmX29yZGVyaW5nX3N0cmluZyAodW5zaWduZWQgaW50IGNvZGUpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICprbm93bltdID0KKyAgICB7CisgICAgICBbRFdfT1JEX3Jvd19tYWpvcl0gPSAicm93X21ham9yIiwKKyAgICAgIFtEV19PUkRfY29sX21ham9yXSA9ICJjb2xfbWFqb3IiCisgICAgfTsKKworICBpZiAoY29kZSA8IHNpemVvZiAoa25vd24pIC8gc2l6ZW9mIChrbm93blswXSkpCisgICAgcmV0dXJuIGtub3duW2NvZGVdOworCisgIHJldHVybiAiPz8/IjsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCitkd2FyZl9kaXNjcl9saXN0X3N0cmluZyAodW5zaWduZWQgaW50IGNvZGUpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICprbm93bltdID0KKyAgICB7CisgICAgICBbRFdfRFNDX2xhYmVsXSA9ICJsYWJlbCIsCisgICAgICBbRFdfRFNDX3JhbmdlXSA9ICJyYW5nZSIKKyAgICB9OworCisgIGlmIChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkKKyAgICByZXR1cm4ga25vd25bY29kZV07CisKKyAgcmV0dXJuICI/Pz8iOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9vcHMgKER3YXJmICpkYmcsIGludCBpbmRlbnQsIGludCBpbmRlbnRyZXN0LAorCSAgIHVuc2lnbmVkIGludCBhZGRyc2l6ZSwgRHdhcmZfV29yZCBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICprbm93bltdID0KKyAgICB7CisgICAgICBbRFdfT1BfYWRkcl0gPSAiYWRkciIsCisgICAgICBbRFdfT1BfZGVyZWZdID0gImRlcmVmIiwKKyAgICAgIFtEV19PUF9jb25zdDF1XSA9ICJjb25zdDF1IiwKKyAgICAgIFtEV19PUF9jb25zdDFzXSA9ICJjb25zdDFzIiwKKyAgICAgIFtEV19PUF9jb25zdDJ1XSA9ICJjb25zdDJ1IiwKKyAgICAgIFtEV19PUF9jb25zdDJzXSA9ICJjb25zdDJzIiwKKyAgICAgIFtEV19PUF9jb25zdDR1XSA9ICJjb25zdDR1IiwKKyAgICAgIFtEV19PUF9jb25zdDRzXSA9ICJjb25zdDRzIiwKKyAgICAgIFtEV19PUF9jb25zdDh1XSA9ICJjb25zdDh1IiwKKyAgICAgIFtEV19PUF9jb25zdDhzXSA9ICJjb25zdDhzIiwKKyAgICAgIFtEV19PUF9jb25zdHVdID0gImNvbnN0dSIsCisgICAgICBbRFdfT1BfY29uc3RzXSA9ICJjb25zdHMiLAorICAgICAgW0RXX09QX2R1cF0gPSAiZHVwIiwKKyAgICAgIFtEV19PUF9kcm9wXSA9ICJkcm9wIiwKKyAgICAgIFtEV19PUF9vdmVyXSA9ICJvdmVyIiwKKyAgICAgIFtEV19PUF9waWNrXSA9ICJwaWNrIiwKKyAgICAgIFtEV19PUF9zd2FwXSA9ICJzd2FwIiwKKyAgICAgIFtEV19PUF9yb3RdID0gInJvdCIsCisgICAgICBbRFdfT1BfeGRlcmVmXSA9ICJ4ZGVyZWYiLAorICAgICAgW0RXX09QX2Fic10gPSAiYWJzIiwKKyAgICAgIFtEV19PUF9hbmRdID0gImFuZCIsCisgICAgICBbRFdfT1BfZGl2XSA9ICJkaXYiLAorICAgICAgW0RXX09QX21pbnVzXSA9ICJtaW51cyIsCisgICAgICBbRFdfT1BfbW9kXSA9ICJtb2QiLAorICAgICAgW0RXX09QX211bF0gPSAibXVsIiwKKyAgICAgIFtEV19PUF9uZWddID0gIm5lZyIsCisgICAgICBbRFdfT1Bfbm90XSA9ICJub3QiLAorICAgICAgW0RXX09QX29yXSA9ICJvciIsCisgICAgICBbRFdfT1BfcGx1c10gPSAicGx1cyIsCisgICAgICBbRFdfT1BfcGx1c191Y29uc3RdID0gInBsdXNfdWNvbnN0IiwKKyAgICAgIFtEV19PUF9zaGxdID0gInNobCIsCisgICAgICBbRFdfT1Bfc2hyXSA9ICJzaHIiLAorICAgICAgW0RXX09QX3NocmFdID0gInNocmEiLAorICAgICAgW0RXX09QX3hvcl0gPSAieG9yIiwKKyAgICAgIFtEV19PUF9icmFdID0gImJyYSIsCisgICAgICBbRFdfT1BfZXFdID0gImVxIiwKKyAgICAgIFtEV19PUF9nZV0gPSAiZ2UiLAorICAgICAgW0RXX09QX2d0XSA9ICJndCIsCisgICAgICBbRFdfT1BfbGVdID0gImxlIiwKKyAgICAgIFtEV19PUF9sdF0gPSAibHQiLAorICAgICAgW0RXX09QX25lXSA9ICJuZSIsCisgICAgICBbRFdfT1Bfc2tpcF0gPSAic2tpcCIsCisgICAgICBbRFdfT1BfbGl0MF0gPSAibGl0MCIsCisgICAgICBbRFdfT1BfbGl0MV0gPSAibGl0MSIsCisgICAgICBbRFdfT1BfbGl0Ml0gPSAibGl0MiIsCisgICAgICBbRFdfT1BfbGl0M10gPSAibGl0MyIsCisgICAgICBbRFdfT1BfbGl0NF0gPSAibGl0NCIsCisgICAgICBbRFdfT1BfbGl0NV0gPSAibGl0NSIsCisgICAgICBbRFdfT1BfbGl0Nl0gPSAibGl0NiIsCisgICAgICBbRFdfT1BfbGl0N10gPSAibGl0NyIsCisgICAgICBbRFdfT1BfbGl0OF0gPSAibGl0OCIsCisgICAgICBbRFdfT1BfbGl0OV0gPSAibGl0OSIsCisgICAgICBbRFdfT1BfbGl0MTBdID0gImxpdDEwIiwKKyAgICAgIFtEV19PUF9saXQxMV0gPSAibGl0MTEiLAorICAgICAgW0RXX09QX2xpdDEyXSA9ICJsaXQxMiIsCisgICAgICBbRFdfT1BfbGl0MTNdID0gImxpdDEzIiwKKyAgICAgIFtEV19PUF9saXQxNF0gPSAibGl0MTQiLAorICAgICAgW0RXX09QX2xpdDE1XSA9ICJsaXQxNSIsCisgICAgICBbRFdfT1BfbGl0MTZdID0gImxpdDE2IiwKKyAgICAgIFtEV19PUF9saXQxN10gPSAibGl0MTciLAorICAgICAgW0RXX09QX2xpdDE4XSA9ICJsaXQxOCIsCisgICAgICBbRFdfT1BfbGl0MTldID0gImxpdDE5IiwKKyAgICAgIFtEV19PUF9saXQyMF0gPSAibGl0MjAiLAorICAgICAgW0RXX09QX2xpdDIxXSA9ICJsaXQyMSIsCisgICAgICBbRFdfT1BfbGl0MjJdID0gImxpdDIyIiwKKyAgICAgIFtEV19PUF9saXQyM10gPSAibGl0MjMiLAorICAgICAgW0RXX09QX2xpdDI0XSA9ICJsaXQyNCIsCisgICAgICBbRFdfT1BfbGl0MjVdID0gImxpdDI1IiwKKyAgICAgIFtEV19PUF9saXQyNl0gPSAibGl0MjYiLAorICAgICAgW0RXX09QX2xpdDI3XSA9ICJsaXQyNyIsCisgICAgICBbRFdfT1BfbGl0MjhdID0gImxpdDI4IiwKKyAgICAgIFtEV19PUF9saXQyOV0gPSAibGl0MjkiLAorICAgICAgW0RXX09QX2xpdDMwXSA9ICJsaXQzMCIsCisgICAgICBbRFdfT1BfbGl0MzFdID0gImxpdDMxIiwKKyAgICAgIFtEV19PUF9yZWcwXSA9ICJyZWcwIiwKKyAgICAgIFtEV19PUF9yZWcxXSA9ICJyZWcxIiwKKyAgICAgIFtEV19PUF9yZWcyXSA9ICJyZWcyIiwKKyAgICAgIFtEV19PUF9yZWczXSA9ICJyZWczIiwKKyAgICAgIFtEV19PUF9yZWc0XSA9ICJyZWc0IiwKKyAgICAgIFtEV19PUF9yZWc1XSA9ICJyZWc1IiwKKyAgICAgIFtEV19PUF9yZWc2XSA9ICJyZWc2IiwKKyAgICAgIFtEV19PUF9yZWc3XSA9ICJyZWc3IiwKKyAgICAgIFtEV19PUF9yZWc4XSA9ICJyZWc4IiwKKyAgICAgIFtEV19PUF9yZWc5XSA9ICJyZWc5IiwKKyAgICAgIFtEV19PUF9yZWcxMF0gPSAicmVnMTAiLAorICAgICAgW0RXX09QX3JlZzExXSA9ICJyZWcxMSIsCisgICAgICBbRFdfT1BfcmVnMTJdID0gInJlZzEyIiwKKyAgICAgIFtEV19PUF9yZWcxM10gPSAicmVnMTMiLAorICAgICAgW0RXX09QX3JlZzE0XSA9ICJyZWcxNCIsCisgICAgICBbRFdfT1BfcmVnMTVdID0gInJlZzE1IiwKKyAgICAgIFtEV19PUF9yZWcxNl0gPSAicmVnMTYiLAorICAgICAgW0RXX09QX3JlZzE3XSA9ICJyZWcxNyIsCisgICAgICBbRFdfT1BfcmVnMThdID0gInJlZzE4IiwKKyAgICAgIFtEV19PUF9yZWcxOV0gPSAicmVnMTkiLAorICAgICAgW0RXX09QX3JlZzIwXSA9ICJyZWcyMCIsCisgICAgICBbRFdfT1BfcmVnMjFdID0gInJlZzIxIiwKKyAgICAgIFtEV19PUF9yZWcyMl0gPSAicmVnMjIiLAorICAgICAgW0RXX09QX3JlZzIzXSA9ICJyZWcyMyIsCisgICAgICBbRFdfT1BfcmVnMjRdID0gInJlZzI0IiwKKyAgICAgIFtEV19PUF9yZWcyNV0gPSAicmVnMjUiLAorICAgICAgW0RXX09QX3JlZzI2XSA9ICJyZWcyNiIsCisgICAgICBbRFdfT1BfcmVnMjddID0gInJlZzI3IiwKKyAgICAgIFtEV19PUF9yZWcyOF0gPSAicmVnMjgiLAorICAgICAgW0RXX09QX3JlZzI5XSA9ICJyZWcyOSIsCisgICAgICBbRFdfT1BfcmVnMzBdID0gInJlZzMwIiwKKyAgICAgIFtEV19PUF9yZWczMV0gPSAicmVnMzEiLAorICAgICAgW0RXX09QX2JyZWcwXSA9ICJicmVnMCIsCisgICAgICBbRFdfT1BfYnJlZzFdID0gImJyZWcxIiwKKyAgICAgIFtEV19PUF9icmVnMl0gPSAiYnJlZzIiLAorICAgICAgW0RXX09QX2JyZWczXSA9ICJicmVnMyIsCisgICAgICBbRFdfT1BfYnJlZzRdID0gImJyZWc0IiwKKyAgICAgIFtEV19PUF9icmVnNV0gPSAiYnJlZzUiLAorICAgICAgW0RXX09QX2JyZWc2XSA9ICJicmVnNiIsCisgICAgICBbRFdfT1BfYnJlZzddID0gImJyZWc3IiwKKyAgICAgIFtEV19PUF9icmVnOF0gPSAiYnJlZzgiLAorICAgICAgW0RXX09QX2JyZWc5XSA9ICJicmVnOSIsCisgICAgICBbRFdfT1BfYnJlZzEwXSA9ICJicmVnMTAiLAorICAgICAgW0RXX09QX2JyZWcxMV0gPSAiYnJlZzExIiwKKyAgICAgIFtEV19PUF9icmVnMTJdID0gImJyZWcxMiIsCisgICAgICBbRFdfT1BfYnJlZzEzXSA9ICJicmVnMTMiLAorICAgICAgW0RXX09QX2JyZWcxNF0gPSAiYnJlZzE0IiwKKyAgICAgIFtEV19PUF9icmVnMTVdID0gImJyZWcxNSIsCisgICAgICBbRFdfT1BfYnJlZzE2XSA9ICJicmVnMTYiLAorICAgICAgW0RXX09QX2JyZWcxN10gPSAiYnJlZzE3IiwKKyAgICAgIFtEV19PUF9icmVnMThdID0gImJyZWcxOCIsCisgICAgICBbRFdfT1BfYnJlZzE5XSA9ICJicmVnMTkiLAorICAgICAgW0RXX09QX2JyZWcyMF0gPSAiYnJlZzIwIiwKKyAgICAgIFtEV19PUF9icmVnMjFdID0gImJyZWcyMSIsCisgICAgICBbRFdfT1BfYnJlZzIyXSA9ICJicmVnMjIiLAorICAgICAgW0RXX09QX2JyZWcyM10gPSAiYnJlZzIzIiwKKyAgICAgIFtEV19PUF9icmVnMjRdID0gImJyZWcyNCIsCisgICAgICBbRFdfT1BfYnJlZzI1XSA9ICJicmVnMjUiLAorICAgICAgW0RXX09QX2JyZWcyNl0gPSAiYnJlZzI2IiwKKyAgICAgIFtEV19PUF9icmVnMjddID0gImJyZWcyNyIsCisgICAgICBbRFdfT1BfYnJlZzI4XSA9ICJicmVnMjgiLAorICAgICAgW0RXX09QX2JyZWcyOV0gPSAiYnJlZzI5IiwKKyAgICAgIFtEV19PUF9icmVnMzBdID0gImJyZWczMCIsCisgICAgICBbRFdfT1BfYnJlZzMxXSA9ICJicmVnMzEiLAorICAgICAgW0RXX09QX3JlZ3hdID0gInJlZ3giLAorICAgICAgW0RXX09QX2ZicmVnXSA9ICJmYnJlZyIsCisgICAgICBbRFdfT1BfYnJlZ3hdID0gImJyZWd4IiwKKyAgICAgIFtEV19PUF9waWVjZV0gPSAicGllY2UiLAorICAgICAgW0RXX09QX2RlcmVmX3NpemVdID0gImRlcmVmX3NpemUiLAorICAgICAgW0RXX09QX3hkZXJlZl9zaXplXSA9ICJ4ZGVyZWZfc2l6ZSIsCisgICAgICBbRFdfT1Bfbm9wXSA9ICJub3AiLAorICAgICAgW0RXX09QX3B1c2hfb2JqZWN0X2FkZHJlc3NdID0gInB1c2hfb2JqZWN0X2FkZHJlc3MiLAorICAgICAgW0RXX09QX2NhbGwyXSA9ICJjYWxsMiIsCisgICAgICBbRFdfT1BfY2FsbDRdID0gImNhbGw0IiwKKyAgICAgIFtEV19PUF9jYWxsX3JlZl0gPSAiY2FsbF9yZWYiLAorICAgIH07CisKKyAgRHdhcmZfV29yZCBvZmZzZXQgPSAwOworICB3aGlsZSAobGVuLS0gPiAwKQorICAgIHsKKyAgICAgIHNpemVfdCBvcCA9ICpkYXRhKys7CisKKyAgICAgIHN3aXRjaCAob3ApCisJeworCWNhc2UgRFdfT1BfY2FsbF9yZWY6CisJY2FzZSBEV19PUF9hZGRyOjsKKwkgIC8qIEFkZHJlc3Mgb3BlcmFuZC4gICovCisJICBEd2FyZl9Xb3JkIGFkZHI7CisJICBpZiAoYWRkcnNpemUgPT0gNCkKKwkgICAgYWRkciA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBkYXRhKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFzc2VydCAoYWRkcnNpemUgPT0gOCk7CisJICAgICAgYWRkciA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCBkYXRhKTsKKwkgICAgfQorCSAgZGF0YSArPSBhZGRyc2l6ZTsKKwkgIGxlbiAtPSBhZGRyc2l6ZTsKKworCSAgcHJpbnRmICgiJSpzWyU0IiBQUkl1TUFYICJdICVzICUiIFBSSXVNQVggIlxuIiwKKwkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCisJCSAga25vd25bb3BdID86ICI/Pz8iLCAodWludG1heF90KSBhZGRyKTsKKwkgIG9mZnNldCArPSAxICsgYWRkcnNpemU7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfZGVyZWZfc2l6ZToJCS8qIFhYWCBDb3JyZWN0PyAgKi8KKwljYXNlIERXX09QX3hkZXJlZl9zaXplOgkJLyogWFhYIENvcnJlY3Q/ICAqLworCWNhc2UgRFdfT1BfcGljazoKKwljYXNlIERXX09QX2NvbnN0MXU6CisJICBwcmludGYgKCIlKnNbJTQiIFBSSXVNQVggIl0gJXMgJSIgUFJJdTggIlxuIiwKKwkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCisJCSAga25vd25bb3BdID86ICI/Pz8iLCAqKCh1aW50OF90ICopIGRhdGEpKTsKKwkgICsrZGF0YTsKKwkgIC0tbGVuOworCSAgb2Zmc2V0ICs9IDI7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3QydToKKwkgIHByaW50ZiAoIiUqc1slNCIgUFJJdU1BWCAiXSAlcyAlIiBQUkl1MTYgIlxuIiwKKwkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCisJCSAga25vd25bb3BdID86ICI/Pz8iLCByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGF0YSkpOworCSAgbGVuIC09IDI7CisJICBkYXRhICs9IDI7CisJICBvZmZzZXQgKz0gMzsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9jb25zdDR1OgorCSAgcHJpbnRmICgiJSpzWyU0IiBQUkl1TUFYICJdICVzICUiIFBSSXUzMiAiXG4iLAorCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwKKwkJICBrbm93bltvcF0gPzogIj8/PyIsIHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBkYXRhKSk7CisJICBsZW4gLT0gNDsKKwkgIGRhdGEgKz0gNDsKKwkgIG9mZnNldCArPSA1OworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2NvbnN0OHU6CisJICBwcmludGYgKCIlKnNbJTQiIFBSSXVNQVggIl0gJXMgJSIgUFJJdTY0ICJcbiIsCisJCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAorCQkgIGtub3duW29wXSA/OiAiPz8/IiwgcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpKTsKKwkgIGxlbiAtPSA4OworCSAgZGF0YSArPSA4OworCSAgb2Zmc2V0ICs9IDk7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3QxczoKKwkgIHByaW50ZiAoIiUqc1slNCIgUFJJdU1BWCAiXSAlcyAlIiBQUklkOCAiXG4iLAorCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwKKwkJICBrbm93bltvcF0gPzogIj8/PyIsICooKGludDhfdCAqKSBkYXRhKSk7CisJICArK2RhdGE7CisJICAtLWxlbjsKKwkgIG9mZnNldCArPSAyOworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2NvbnN0MnM6CisJICBwcmludGYgKCIlKnNbJTQiIFBSSXVNQVggIl0gJXMgJSIgUFJJZDE2ICJcbiIsCisJCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAorCQkgIGtub3duW29wXSA/OiAiPz8/IiwgcmVhZF8yc2J5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpKTsKKwkgIGxlbiAtPSAyOworCSAgZGF0YSArPSAyOworCSAgb2Zmc2V0ICs9IDM7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3Q0czoKKwkgIHByaW50ZiAoIiUqc1slNCIgUFJJdU1BWCAiXSAlcyAlIiBQUklkMzIgIlxuIiwKKwkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCisJCSAga25vd25bb3BdID86ICI/Pz8iLCByZWFkXzRzYnl0ZV91bmFsaWduZWQgKGRiZywgZGF0YSkpOworCSAgbGVuIC09IDQ7CisJICBkYXRhICs9IDQ7CisJICBvZmZzZXQgKz0gNTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9jb25zdDhzOgorCSAgcHJpbnRmICgiJSpzWyU0IiBQUkl1TUFYICJdICVzICUiIFBSSWQ2NCAiXG4iLAorCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwKKwkJICBrbm93bltvcF0gPzogIj8/PyIsIHJlYWRfOHNieXRlX3VuYWxpZ25lZCAoZGJnLCBkYXRhKSk7CisJICBsZW4gLT0gODsKKwkgIGRhdGEgKz0gODsKKwkgIG9mZnNldCArPSA5OworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX3BpZWNlOgkJLyogWFhYIENvcnJlY3Q/ICAqLworCWNhc2UgRFdfT1BfcmVneDoKKwljYXNlIERXX09QX3BsdXNfdWNvbnN0OgorCWNhc2UgRFdfT1BfY29uc3R1OjsKKwkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0ID0gZGF0YTsKKwkgIHVuc2lnbmVkIGludCB1bGViOworCSAgZ2V0X3VsZWIxMjggKHVsZWIsIGRhdGEpOworCSAgcHJpbnRmICgiJSpzWyU0IiBQUkl1TUFYICJdICVzICV1XG4iLAorCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwKKwkJICBrbm93bltvcF0gPzogIj8/PyIsIHVsZWIpOworCSAgbGVuIC09IGRhdGEgLSBzdGFydDsKKwkgIG9mZnNldCArPSAxICsgKGRhdGEgLSBzdGFydCk7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfZmJyZWc6CisJY2FzZSBEV19PUF9icmVnMCAuLi4gRFdfT1BfYnJlZzMxOgorCWNhc2UgRFdfT1BfY29uc3RzOgorCSAgc3RhcnQgPSBkYXRhOworCSAgdW5zaWduZWQgaW50IHNsZWI7CisJICBnZXRfc2xlYjEyOCAoc2xlYiwgZGF0YSk7CisJICBwcmludGYgKCIlKnNbJTQiIFBSSXVNQVggIl0gJXMgJWRcbiIsCisJCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAorCQkgIGtub3duW29wXSA/OiAiPz8/Iiwgc2xlYik7CisJICBsZW4gLT0gZGF0YSAtIHN0YXJ0OworCSAgb2Zmc2V0ICs9IDEgKyAoZGF0YSAtIHN0YXJ0KTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9icmVneDoKKwkgIHN0YXJ0ID0gZGF0YTsKKwkgIGdldF91bGViMTI4ICh1bGViLCBkYXRhKTsKKwkgIGdldF9zbGViMTI4IChzbGViLCBkYXRhKTsKKwkgIHByaW50ZiAoIiUqc1slNCIgUFJJdU1BWCAiXSAlcyAldSAlZFxuIiwKKwkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCisJCSAga25vd25bb3BdID86ICI/Pz8iLCB1bGViLCBzbGViKTsKKwkgIGxlbiAtPSBkYXRhIC0gc3RhcnQ7CisJICBvZmZzZXQgKz0gMSArIChkYXRhIC0gc3RhcnQpOworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2NhbGwyOgorCWNhc2UgRFdfT1BfY2FsbDQ6CisJY2FzZSBEV19PUF9za2lwOgorCWNhc2UgRFdfT1BfYnJhOgorCSAgcHJpbnRmICgiJSpzWyU0IiBQUkl1TUFYICJdICVzICUiIFBSSXVNQVggIlxuIiwKKwkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCisJCSAga25vd25bb3BdID86ICI/Pz8iLAorCQkgICh1aW50bWF4X3QpIChvZmZzZXQgKyByZWFkXzJzYnl0ZV91bmFsaWduZWQgKGRiZywgZGF0YSkpKTsKKwkgIGxlbiAtPSAyOworCSAgZGF0YSArPSAyOworCSAgb2Zmc2V0ICs9IDM7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICAvKiBObyBPcGVyYW5kLiAgKi8KKwkgIHByaW50ZiAoIiUqc1slNCIgUFJJdU1BWCAiXSAlc1xuIiwKKwkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCisJCSAga25vd25bb3BdID86ICI/Pz8iKTsKKwkgICsrb2Zmc2V0OworCSAgYnJlYWs7CisJfQorCisgICAgICBpbmRlbnQgPSBpbmRlbnRyZXN0OworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfZGVidWdfYWJicmV2X3NlY3Rpb24gKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgICBHRWxmX0VoZHIgKmVoZHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgIEVsZl9TY24gKnNjbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICAgR0VsZl9TaGRyICpzaGRyLCBEd2FyZiAqZGJnKQoreworICBwcmludGYgKGdldHRleHQgKCJcbkRXQVJGIHNlY3Rpb24gJyVzJyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiOlxuIgorCQkgICAiIFsgQ29kZV1cbiIpLAorCSAgIi5kZWJ1Z19hYmJyZXYiLCAodWludDY0X3QpIHNoZHItPnNoX29mZnNldCk7CisKKyAgRHdhcmZfT2ZmIG9mZnNldCA9IDA7CisgIHdoaWxlIChvZmZzZXQgPCBzaGRyLT5zaF9zaXplKQorICAgIHsKKyAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIlxuQWJicmV2aWF0aW9uIHNlY3Rpb24gYXQgb2Zmc2V0ICUiIFBSSXU2NCAiOlxuIiksCisJICAgICAgb2Zmc2V0KTsKKworICAgICAgd2hpbGUgKDEpCisJeworCSAgc2l6ZV90IGxlbmd0aDsKKwkgIER3YXJmX0FiYnJldiBhYmJyZXY7CisKKwkgIGludCByZXMgPSBkd2FyZl9vZmZhYmJyZXYgKGRiZywgb2Zmc2V0LCAmbGVuZ3RoLCAmYWJicmV2KTsKKwkgIGlmIChyZXMgIT0gMCkKKwkgICAgeworCSAgICAgIGlmIChyZXMgPCAwKQorCQl7CisJCSAgcHJpbnRmIChnZXR0ZXh0ICgiXAorICoqKiBlcnJvciB3aGlsZSByZWFkaW5nIGFiYnJldmlhdGlvbjogJXNcbiIpLAorCQkJICBkd2FyZl9lcnJtc2cgKC0xKSk7CisJCSAgcmV0dXJuOworCQl9CisKKwkgICAgICAvKiBUaGlzIGlzIHRoZSBOVUwgYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgKi8KKwkgICAgICArK29mZnNldDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBXZSBrbm93IHRoZXNlIGNhbGxzIGNhbiBuZXZlciBmYWlsLiAgKi8KKwkgIHVuc2lnbmVkIGludCBjb2RlID0gZHdhcmZfZ2V0YWJicmV2Y29kZSAoJmFiYnJldik7CisJICB1bnNpZ25lZCBpbnQgdGFnID0gZHdhcmZfZ2V0YWJicmV2dGFnICgmYWJicmV2KTsKKwkgIGludCBoYXNfY2hpbGRyZW4gPSBkd2FyZl9hYmJyZXZoYXNjaGlsZHJlbiAoJmFiYnJldik7CisKKwkgIHByaW50ZiAoZ2V0dGV4dCAoIiBbJTV1XSBvZmZzZXQ6ICUiIFBSSWQ2NAorCQkJICAgIiwgY2hpbGRyZW46ICVzLCB0YWc6ICVzXG4iKSwKKwkJICBjb2RlLCAoaW50NjRfdCkgb2Zmc2V0LAorCQkgIGhhc19jaGlsZHJlbiA/IGdldHRleHQgKCJ5ZXMiKSA6IGdldHRleHQgKCJubyIpLAorCQkgIGR3YXJmX3RhZ19zdHJpbmcgKHRhZykpOworCisJICBzaXplX3QgY250ID0gMDsKKwkgIHVuc2lnbmVkIGludCBuYW1lOworCSAgdW5zaWduZWQgaW50IGZvcm07CisJICBEd2FyZl9PZmYgZW5vZmZzZXQ7CisJICB3aGlsZSAoZHdhcmZfZ2V0YWJicmV2YXR0ciAoJmFiYnJldiwgY250LAorCQkJCSAgICAgICZuYW1lLCAmZm9ybSwgJmVub2Zmc2V0KSA9PSAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiICAgICAgICAgIGF0dHI6ICVzLCBmb3JtOiAlcywgb2Zmc2V0OiAlIyIgUFJJeDY0ICJcbiIsCisJCSAgICAgIGR3YXJmX2F0dHJfc3RyaW5nIChuYW1lKSwgZHdhcmZfZm9ybV9zdHJpbmcgKGZvcm0pLAorCQkgICAgICAodWludDY0X3QpIGVub2Zmc2V0KTsKKworCSAgICAgICsrY250OworCSAgICB9CisKKwkgIG9mZnNldCArPSBsZW5ndGg7CisJfQorICAgIH0KK30KKworCisvKiBQcmludCBjb250ZW50IG9mIERXQVJGIC5kZWJ1Z19hcmFuZ2VzIHNlY3Rpb24uICBXZSBmb3J0dW5hdGVseSBkbworICAgbm90IGhhdmUgdG8ga25vdyBhIGJpdCBhYm91dCB0aGUgc3RydWN0dXJlIG9mIHRoZSBzZWN0aW9uLCBsaWJkd2FyZgorICAgdGFrZXMgY2FyZSBvZiBpdC4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfZGVidWdfYXJhbmdlc19zZWN0aW9uIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICAgIEdFbGZfRWhkciAqZWhkciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICAgIEVsZl9TY24gKnNjbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICAgIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKK3sKKyAgRHdhcmZfQXJhbmdlcyAqYXJhbmdlczsKKyAgc2l6ZV90IGNudDsKKyAgaWYgKGR3YXJmX2dldGFyYW5nZXMgKGRiZywgJmFyYW5nZXMsICZjbnQpICE9IDApCisgICAgeworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IC5kZWJ1Z19hcmFuZ2VzIGNvbnRlbnQ6ICVzIiksCisJICAgICBkd2FyZl9lcnJtc2cgKC0xKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHByaW50ZiAobmdldHRleHQgKCJcCitcbkRXQVJGIHNlY3Rpb24gJyVzJyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIsCisJCSAgICAiXAorXG5EV0FSRiBzZWN0aW9uICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIiBjb250YWlucyAlenUgZW50cmllczpcbiIsCisJCSAgICBjbnQpLAorCSAgIi5kZWJ1Z19hcmFuZ2VzIiwgKHVpbnQ2NF90KSBzaGRyLT5zaF9vZmZzZXQsIGNudCk7CisKKyAgLyogQ29tcHV0ZSBmbG9vcihsb2cxNihjbnQpKS4gICovCisgIHNpemVfdCB0bXAgPSBjbnQ7CisgIGludCBkaWdpdHMgPSAxOworICB3aGlsZSAodG1wID49IDE2KQorICAgIHsKKyAgICAgICsrZGlnaXRzOworICAgICAgdG1wID4+PSA0OworICAgIH0KKworICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGNudDsgKytuKQorICAgIHsKKyAgICAgIER3YXJmX0FyYW5nZSAqcnVucCA9IGR3YXJmX29uZWFyYW5nZSAoYXJhbmdlcywgbik7CisgICAgICBpZiAocnVucCA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBnZXQgYXJhbmdlICV6dTogJXNcbiIsIG4sIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIER3YXJmX0FkZHIgc3RhcnQ7CisgICAgICBEd2FyZl9Xb3JkIGxlbmd0aDsKKyAgICAgIER3YXJmX09mZiBvZmZzZXQ7CisKKyAgICAgIGlmIChkd2FyZl9nZXRhcmFuZ2VpbmZvIChydW5wLCAmc3RhcnQsICZsZW5ndGgsICZvZmZzZXQpICE9IDApCisJcHJpbnRmIChnZXR0ZXh0ICgiIFslKnp1XSA/Pz9cbiIpLCBkaWdpdHMsIG4pOworICAgICAgZWxzZQorCXByaW50ZiAoZ2V0dGV4dCAoIiBbJSp6dV0gc3RhcnQ6ICUwIyoiIFBSSXg2NAorCQkJICIsIGxlbmd0aDogJTUiIFBSSXU2NCAiLCBDVSBESUUgb2Zmc2V0OiAlNiIKKwkJCSBQUklkNjQgIlxuIiksCisJCWRpZ2l0cywgbiwgZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsCisJCSh1aW50NjRfdCkgc3RhcnQsICh1aW50NjRfdCkgbGVuZ3RoLCAoaW50NjRfdCkgb2Zmc2V0KTsKKyAgICB9Cit9CisKKy8qIFByaW50IGNvbnRlbnQgb2YgRFdBUkYgLmRlYnVnX3JhbmdlcyBzZWN0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9kZWJ1Z19yYW5nZXNfc2VjdGlvbiAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgIEdFbGZfRWhkciAqZWhkciwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIsCisJCQkgICAgRHdhcmYgKmRiZykKK3sKKyAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfcmF3ZGF0YSAoc2NuLCBOVUxMKTsKKworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCAuZGVidWdfcmFuZ2VzIGNvbnRlbnQ6ICVzIiksCisJICAgICBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBwcmludGYgKGdldHRleHQgKCJcCitcbkRXQVJGIHNlY3Rpb24gJyVzJyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiOlxuIiksCisJICAiLmRlYnVnX3JhbmdlcyIsICh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0KTsKKworICBzaXplX3QgYWRkcmVzc19zaXplID0gZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDQgOiA4OworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICB1bnNpZ25lZCBjaGFyICpyZWFkcCA9IGRhdGEtPmRfYnVmOworICB3aGlsZSAocmVhZHAgPCAodW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZiArIGRhdGEtPmRfc2l6ZSkKKyAgICB7CisgICAgICBwdHJkaWZmX3Qgb2Zmc2V0ID0gcmVhZHAgLSAodW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZjsKKworICAgICAgaWYgKGRhdGEtPmRfc2l6ZSAtIG9mZnNldCA8IGFkZHJlc3Nfc2l6ZSAqIDIpCisJeworCSAgcHJpbnRmICgiIFslNnR4XSAgPElOVkFMSUQgREFUQT5cbiIsIG9mZnNldCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIER3YXJmX0FkZHIgYmVnaW47CisgICAgICBEd2FyZl9BZGRyIGVuZDsKKyAgICAgIGlmIChhZGRyZXNzX3NpemUgPT0gOCkKKwl7CisJICBiZWdpbiA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOworCSAgZW5kID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJlZ2luID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7CisJICBlbmQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKKwkgIGlmIChiZWdpbiA9PSAoRHdhcmZfQWRkcikgKHVpbnQzMl90KSAtMSkKKwkgICAgYmVnaW4gPSAoRHdhcmZfQWRkcikgLTFsOworCX0KKworICAgICAgaWYgKGJlZ2luID09IChEd2FyZl9BZGRyKSAtMWwpIC8qIEJhc2UgYWRkcmVzcyBlbnRyeS4gICovCisJcHJpbnRmICgiIFslNnR4XSAgYmFzZSBhZGRyZXNzICUjMCoiIFBSSXhNQVggIlxuIiwgb2Zmc2V0LAorCQkyICsgKGludCkgKGFkZHJlc3Nfc2l6ZSAqIDIpLCAodWludG1heF90KSBlbmQpOworICAgICAgZWxzZSBpZiAoYmVnaW4gPT0gMCAmJiBlbmQgPT0gMCkgLyogRW5kIG9mIGxpc3QgZW50cnkuICAqLworCWZpcnN0ID0gdHJ1ZTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBoYXZlIGFuIGFkZHJlc3MgcmFuZ2UgZW50cnkuICAqLworCSAgaWYgKGZpcnN0KQkJLyogRmlyc3QgYWRkcmVzcyByYW5nZSBlbnRyeSBpbiBhIGxpc3QuICAqLworCSAgICBwcmludGYgKCIgWyU2dHhdICAlIzAqIiBQUkl4TUFYICIuLiUjMCoiIFBSSXhNQVggIlxuIiwgb2Zmc2V0LAorCQkgICAgMiArIChpbnQpIChhZGRyZXNzX3NpemUgKiAyKSwgKHVpbnRtYXhfdCkgYmVnaW4sCisJCSAgICAyICsgKGludCkgKGFkZHJlc3Nfc2l6ZSAqIDIpLCAodWludG1heF90KSBlbmQpOworCSAgZWxzZQorCSAgICBwcmludGYgKCIgICAgICAgICAgICUjMCoiIFBSSXhNQVggIi4uJSMwKiIgUFJJeE1BWCAiXG4iLAorCQkgICAgMiArIChpbnQpIChhZGRyZXNzX3NpemUgKiAyKSwgKHVpbnRtYXhfdCkgYmVnaW4sCisJCSAgICAyICsgKGludCkgKGFkZHJlc3Nfc2l6ZSAqIDIpLCAodWludG1heF90KSBlbmQpOworCisJICBmaXJzdCA9IGZhbHNlOworCX0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24gKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgIEdFbGZfRWhkciAqZWhkciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICBFbGZfU2NuICpzY24gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgR0VsZl9TaGRyICpzaGRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgIER3YXJmICpkYmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworfQorCisKK3N0cnVjdCBhdHRyY2JfYXJncworeworICBEd2FyZiAqZGJnOworICBpbnQgbGV2ZWw7CisgIHVuc2lnbmVkIGludCBhZGRyc2l6ZTsKKyAgRHdhcmZfT2ZmIGN1X29mZnNldDsKK307CisKKworc3RhdGljIGludAorYXR0cl9jYWxsYmFjayAoRHdhcmZfQXR0cmlidXRlICphdHRycCwgdm9pZCAqYXJnKQoreworICBzdHJ1Y3QgYXR0cmNiX2FyZ3MgKmNiYXJncyA9IChzdHJ1Y3QgYXR0cmNiX2FyZ3MgKikgYXJnOworICBjb25zdCBpbnQgbGV2ZWwgPSBjYmFyZ3MtPmxldmVsOworCisgIHVuc2lnbmVkIGludCBhdHRyID0gZHdhcmZfd2hhdGF0dHIgKGF0dHJwKTsKKyAgaWYgKHVubGlrZWx5IChhdHRyID09IDApKQorICAgIHsKKyAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBhdHRyaWJ1dGUgY29kZTogJXMiKSwKKwkgICAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKKyAgICB9CisKKyAgdW5zaWduZWQgaW50IGZvcm0gPSBkd2FyZl93aGF0Zm9ybSAoYXR0cnApOworICBpZiAodW5saWtlbHkgKGZvcm0gPT0gMCkpCisgICAgeworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBmb3JtOiAlcyIpLAorCSAgICAgZHdhcmZfZXJybXNnICgtMSkpOworICAgICAgcmV0dXJuIERXQVJGX0NCX0FCT1JUOworICAgIH0KKworICBzd2l0Y2ggKGZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9hZGRyOjsKKyAgICAgIER3YXJmX0FkZHIgYWRkcjsKKyAgICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZm9ybWFkZHIgKGF0dHJwLCAmYWRkcikgIT0gMCkpCisJeworCWF0dHJ2YWxfb3V0OgorCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSB2YWx1ZTogJXMiKSwKKwkJIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKKwl9CisgICAgICBwcmludGYgKCIgICAgICAgICAgICUqcyUtMjBzICUjMCoiIFBSSXhNQVggIlxuIiwKKwkgICAgICAoaW50KSAobGV2ZWwgKiAyKSwgIiIsIGR3YXJmX2F0dHJfc3RyaW5nIChhdHRyKSwKKwkgICAgICAyICsgKGludCkgKGNiYXJncy0+YWRkcnNpemUgKiAyKSwgKHVpbnRtYXhfdCkgYWRkcik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9pbmRpcmVjdDoKKyAgICBjYXNlIERXX0ZPUk1fc3RycDoKKyAgICBjYXNlIERXX0ZPUk1fc3RyaW5nOjsKKyAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IGR3YXJmX2Zvcm1zdHJpbmcgKGF0dHJwKTsKKyAgICAgIGlmICh1bmxpa2VseSAoc3RyID09IE5VTEwpKQorCWdvdG8gYXR0cnZhbF9vdXQ7CisgICAgICBwcmludGYgKCIgICAgICAgICAgICUqcyUtMjBzIFwiJXNcIlxuIiwKKwkgICAgICAoaW50KSAobGV2ZWwgKiAyKSwgIiIsIGR3YXJmX2F0dHJfc3RyaW5nIChhdHRyKSwgc3RyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgorICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6CisgICAgY2FzZSBEV19GT1JNX3JlZjg6CisgICAgY2FzZSBEV19GT1JNX3JlZjQ6CisgICAgY2FzZSBEV19GT1JNX3JlZjI6CisgICAgY2FzZSBEV19GT1JNX3JlZjE6OworICAgICAgRHdhcmZfT2ZmIHJlZjsKKyAgICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZm9ybXJlZiAoYXR0cnAsICZyZWYpICE9IDApKQorCWdvdG8gYXR0cnZhbF9vdXQ7CisKKyAgICAgIHByaW50ZiAoIiAgICAgICAgICAgJSpzJS0yMHMgWyU2IiBQUkl4TUFYICJdXG4iLAorCSAgICAgIChpbnQpIChsZXZlbCAqIDIpLCAiIiwgZHdhcmZfYXR0cl9zdHJpbmcgKGF0dHIpLAorCSAgICAgICh1aW50bWF4X3QpIChyZWYgKyBjYmFyZ3MtPmN1X29mZnNldCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fdWRhdGE6CisgICAgY2FzZSBEV19GT1JNX3NkYXRhOgorICAgIGNhc2UgRFdfRk9STV9kYXRhODoKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6CisgICAgY2FzZSBEV19GT1JNX2RhdGEyOgorICAgIGNhc2UgRFdfRk9STV9kYXRhMTo7CisgICAgICBEd2FyZl9Xb3JkIG51bTsKKyAgICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZm9ybXVkYXRhIChhdHRycCwgJm51bSkgIT0gMCkpCisJZ290byBhdHRydmFsX291dDsKKworICAgICAgY29uc3QgY2hhciAqdmFsdWVzdHIgPSBOVUxMOworICAgICAgc3dpdGNoIChhdHRyKQorCXsKKwljYXNlIERXX0FUX2xvY2F0aW9uOgorCWNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246CisJY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjoKKwljYXNlIERXX0FUX3N0cmluZ19sZW5ndGg6CisJY2FzZSBEV19BVF91c2VfbG9jYXRpb246CisJY2FzZSBEV19BVF9mcmFtZV9iYXNlOgorCWNhc2UgRFdfQVRfcmV0dXJuX2FkZHI6CisJY2FzZSBEV19BVF9zdGF0aWNfbGluazoKKwkgIHByaW50ZiAoIiAgICAgICAgICAgJSpzJS0yMHMgbG9jYXRpb24gbGlzdCBbJTYiIFBSSXhNQVggIl1cbiIsCisJCSAgKGludCkgKGxldmVsICogMiksICIiLCBkd2FyZl9hdHRyX3N0cmluZyAoYXR0ciksCisJCSAgKHVpbnRtYXhfdCkgbnVtKTsKKwkgIHJldHVybiBEV0FSRl9DQl9PSzsKKworCWNhc2UgRFdfQVRfcmFuZ2VzOgorCSAgcHJpbnRmICgiICAgICAgICAgICAlKnMlLTIwcyByYW5nZSBsaXN0IFslNiIgUFJJeE1BWCAiXVxuIiwKKwkJICAoaW50KSAobGV2ZWwgKiAyKSwgIiIsIGR3YXJmX2F0dHJfc3RyaW5nIChhdHRyKSwKKwkJICAodWludG1heF90KSBudW0pOworCSAgcmV0dXJuIERXQVJGX0NCX09LOworCisJY2FzZSBEV19BVF9sYW5ndWFnZToKKwkgIHZhbHVlc3RyID0gZHdhcmZfbGFuZ19zdHJpbmcgKG51bSk7CisJICBicmVhazsKKwljYXNlIERXX0FUX2VuY29kaW5nOgorCSAgdmFsdWVzdHIgPSBkd2FyZl9lbmNvZGluZ19zdHJpbmcgKG51bSk7CisJICBicmVhazsKKwljYXNlIERXX0FUX2FjY2Vzc2liaWxpdHk6CisJICB2YWx1ZXN0ciA9IGR3YXJmX2FjY2Vzc19zdHJpbmcgKG51bSk7CisJICBicmVhazsKKwljYXNlIERXX0FUX3Zpc2liaWxpdHk6CisJICB2YWx1ZXN0ciA9IGR3YXJmX3Zpc2liaWxpdHlfc3RyaW5nIChudW0pOworCSAgYnJlYWs7CisJY2FzZSBEV19BVF92aXJ0dWFsaXR5OgorCSAgdmFsdWVzdHIgPSBkd2FyZl92aXJ0dWFsaXR5X3N0cmluZyAobnVtKTsKKwkgIGJyZWFrOworCWNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOgorCSAgdmFsdWVzdHIgPSBkd2FyZl9pZGVudGlmaWVyX2Nhc2Vfc3RyaW5nIChudW0pOworCSAgYnJlYWs7CisJY2FzZSBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb246CisJICB2YWx1ZXN0ciA9IGR3YXJmX2NhbGxpbmdfY29udmVudGlvbl9zdHJpbmcgKG51bSk7CisJICBicmVhazsKKwljYXNlIERXX0FUX2lubGluZToKKwkgIHZhbHVlc3RyID0gZHdhcmZfaW5saW5lX3N0cmluZyAobnVtKTsKKwkgIGJyZWFrOworCWNhc2UgRFdfQVRfb3JkZXJpbmc6CisJICB2YWx1ZXN0ciA9IGR3YXJmX29yZGVyaW5nX3N0cmluZyAobnVtKTsKKwkgIGJyZWFrOworCWNhc2UgRFdfQVRfZGlzY3JfbGlzdDoKKwkgIHZhbHVlc3RyID0gZHdhcmZfZGlzY3JfbGlzdF9zdHJpbmcgKG51bSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgLyogTm90aGluZy4gICovCisJICBicmVhazsKKwl9CisKKyAgICAgIGlmICh2YWx1ZXN0ciA9PSBOVUxMKQorCXByaW50ZiAoIiAgICAgICAgICAgJSpzJS0yMHMgJSIgUFJJdU1BWCAiXG4iLAorCQkoaW50KSAobGV2ZWwgKiAyKSwgIiIsIGR3YXJmX2F0dHJfc3RyaW5nIChhdHRyKSwKKwkJKHVpbnRtYXhfdCkgbnVtKTsKKyAgICAgIGVsc2UKKwlwcmludGYgKCIgICAgICAgICAgICUqcyUtMjBzICVzICglIiBQUkl1TUFYICIpXG4iLAorCQkoaW50KSAobGV2ZWwgKiAyKSwgIiIsIGR3YXJmX2F0dHJfc3RyaW5nIChhdHRyKSwKKwkJdmFsdWVzdHIsICh1aW50bWF4X3QpIG51bSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9mbGFnOjsKKyAgICAgIGJvb2wgZmxhZzsKKyAgICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZm9ybWZsYWcgKGF0dHJwLCAmZmxhZykgIT0gMCkpCisJZ290byBhdHRydmFsX291dDsKKworICAgICAgcHJpbnRmICgiICAgICAgICAgICAlKnMlLTIwcyAlc1xuIiwKKwkgICAgICAoaW50KSAobGV2ZWwgKiAyKSwgIiIsIGR3YXJmX2F0dHJfc3RyaW5nIChhdHRyKSwKKwkgICAgICBubF9sYW5naW5mbyAoZmxhZyA/IFlFU1NUUiA6IE5PU1RSKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrMjoKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgorICAgIGNhc2UgRFdfRk9STV9ibG9jazo7CisgICAgICBEd2FyZl9CbG9jayBibG9jazsKKyAgICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZm9ybWJsb2NrIChhdHRycCwgJmJsb2NrKSAhPSAwKSkKKwlnb3RvIGF0dHJ2YWxfb3V0OworCisgICAgICBwcmludGYgKCIgICAgICAgICAgICUqcyUtMjBzICUiIFBSSXhNQVggIiBieXRlIGJsb2NrXG4iLAorCSAgICAgIChpbnQpIChsZXZlbCAqIDIpLCAiIiwgZHdhcmZfYXR0cl9zdHJpbmcgKGF0dHIpLAorCSAgICAgICh1aW50bWF4X3QpIGJsb2NrLmxlbmd0aCk7CisKKyAgICAgIHN3aXRjaCAoYXR0cikKKwl7CisJY2FzZSBEV19BVF9sb2NhdGlvbjoKKwljYXNlIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uOgorCWNhc2UgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb246CisJY2FzZSBEV19BVF9zdHJpbmdfbGVuZ3RoOgorCWNhc2UgRFdfQVRfdXNlX2xvY2F0aW9uOgorCWNhc2UgRFdfQVRfZnJhbWVfYmFzZToKKwljYXNlIERXX0FUX3JldHVybl9hZGRyOgorCWNhc2UgRFdfQVRfc3RhdGljX2xpbms6CisJICBwcmludF9vcHMgKGNiYXJncy0+ZGJnLCAxMiArIGxldmVsICogMiwgMTIgKyBsZXZlbCAqIDIsCisJCSAgICAgY2JhcmdzLT5hZGRyc2l6ZSwgYmxvY2subGVuZ3RoLCBibG9jay5kYXRhKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50ZiAoIiAgICAgICAgICAgJSpzJS0yMHMgW2Zvcm06ICVkXSA/Pz9cbiIsCisJICAgICAgKGludCkgKGxldmVsICogMiksICIiLCBkd2FyZl9hdHRyX3N0cmluZyAoYXR0ciksCisJICAgICAgKGludCkgZm9ybSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIERXQVJGX0NCX09LOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9kZWJ1Z19pbmZvX3NlY3Rpb24gKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgR0VsZl9FaGRyICplaGRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgRWxmX1NjbiAqc2NuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgR0VsZl9TaGRyICpzaGRyLCBEd2FyZiAqZGJnKQoreworICBwcmludGYgKGdldHRleHQgKCJcCitcbkRXQVJGIHNlY3Rpb24gJyVzJyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiOlxuIFtPZmZzZXRdXG4iKSwKKwkgICIuZGVidWdfaW5mbyIsICh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0KTsKKworICAvKiBJZiB0aGUgc2VjdGlvbiBpcyBlbXB0eSB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nLiAgKi8KKyAgaWYgKHNoZHItPnNoX3NpemUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaW50IG1heGRpZXMgPSAyMDsKKyAgRHdhcmZfRGllICpkaWVzID0gKER3YXJmX0RpZSAqKSB4bWFsbG9jIChtYXhkaWVzICogc2l6ZW9mIChEd2FyZl9EaWUpKTsKKworICBEd2FyZl9PZmYgb2Zmc2V0ID0gMDsKKworICAvKiBOZXcgY29tcGlsYXRpb24gdW5pdC4gICovCisgIHNpemVfdCBjdWhsOworICAvL0R3YXJmX0hhbGYgdmVyc2lvbjsKKyAgRHdhcmZfT2ZmIGFiYnJvZmZzZXQ7CisgIHVpbnQ4X3QgYWRkcnNpemU7CisgIHVpbnQ4X3Qgb2Zmc2l6ZTsKKyAgRHdhcmZfT2ZmIG5leHRjdTsKKyBuZXh0X2N1OgorICBpZiAoZHdhcmZfbmV4dGN1IChkYmcsIG9mZnNldCwgJm5leHRjdSwgJmN1aGwsICZhYmJyb2Zmc2V0LCAmYWRkcnNpemUsCisJCSAgICAmb2Zmc2l6ZSkgIT0gMCkKKyAgICBnb3RvIGRvX3JldHVybjsKKworICBwcmludGYgKGdldHRleHQgKCIgQ29tcGlsYXRpb24gdW5pdCBhdCBvZmZzZXQgJSIgUFJJdTY0ICI6XG4iCisJCSAgICIgVmVyc2lvbjogJSIgUFJJdTE2ICIsIEFiYnJldmlhdGlvbiBzZWN0aW9uIG9mZnNldDogJSIKKwkJICAgUFJJdTY0ICIsIEFkZHJlc3Mgc2l6ZTogJSIgUFJJdTggIiwgT2Zmc2V0IHNpemU6ICUiIFBSSXU4ICJcbiIpLAorCSAgKHVpbnQ2NF90KSBvZmZzZXQsIC8qdmVyc2lvbiovMiwgYWJicm9mZnNldCwgYWRkcnNpemUsIG9mZnNpemUpOworCisKKyAgc3RydWN0IGF0dHJjYl9hcmdzIGFyZ3M7CisgIGFyZ3MuZGJnID0gZGJnOworICBhcmdzLmFkZHJzaXplID0gYWRkcnNpemU7CisgIGFyZ3MuY3Vfb2Zmc2V0ID0gb2Zmc2V0OworCisgIG9mZnNldCArPSBjdWhsOworCisgIGludCBsZXZlbCA9IDA7CisKKyAgaWYgKHVubGlrZWx5IChkd2FyZl9vZmZkaWUgKGRiZywgb2Zmc2V0LCAmZGllc1tsZXZlbF0pID09IE5VTEwpKQorICAgIHsKKyAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBESUUgYXQgb2Zmc2V0ICUiIFBSSXU2NAorCQkJICAgICIgaW4gc2VjdGlvbiAnJXMnOiAlcyIpLAorCSAgICAgKHVpbnQ2NF90KSBvZmZzZXQsICIuZGVidWdfaW5mbyIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGdvdG8gZG9fcmV0dXJuOworICAgIH0KKworICBkbworICAgIHsKKyAgICAgIG9mZnNldCA9IGR3YXJmX2RpZW9mZnNldCAoJmRpZXNbbGV2ZWxdKTsKKyAgICAgIGlmIChvZmZzZXQgPT0gfjB1bCkKKwl7CisJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgRElFIG9mZnNldDogJXMiKSwKKwkJIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkgIGdvdG8gZG9fcmV0dXJuOworCX0KKworICAgICAgaW50IHRhZyA9IGR3YXJmX3RhZyAoJmRpZXNbbGV2ZWxdKTsKKyAgICAgIGlmICh0YWcgPT0gRFdfVEFHX2ludmFsaWQpCisJeworCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IHRhZyBvZiBESUUgYXQgb2Zmc2V0ICUiIFBSSXU2NAorCQkJCSIgaW4gc2VjdGlvbiAnJXMnOiAlcyIpLAorCQkgKHVpbnQ2NF90KSBvZmZzZXQsICIuZGVidWdfaW5mbyIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkgIGdvdG8gZG9fcmV0dXJuOworCX0KKworI2lmIDEKKyAgICAgIGNvbnN0IGNoYXIgKnRhZ3N0ciA9IGR3YXJmX3RhZ19zdHJpbmcgKHRhZyk7CisjZWxzZQorICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxvd3RhZ3NbXSA9CisJeworCSAgW0RXX1RBR19hcnJheV90eXBlXSA9ICJhcnJheV90eXBlIiwKKwkgIFtEV19UQUdfY2xhc3NfdHlwZV0gPSAiY2xhc3NfdHlwZSIsCisJICBbRFdfVEFHX2VudHJ5X3BvaW50XSA9ICJlbnRyeV9wb2ludCIsCisJICBbRFdfVEFHX2VudW1lcmF0aW9uX3R5cGVdID0gImVudW1lcmF0aW9uX3R5cGUiLAorCSAgW0RXX1RBR19mb3JtYWxfcGFyYW1ldGVyXSA9ICJmb3JtYWxfcGFyYW1ldGVyIiwKKwkgIFtEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb25dID0gImltcG9ydGVkX2RlY2xhcmF0aW9uIiwKKwkgIFtEV19UQUdfbGFiZWxdID0gImxhYmVsIiwKKwkgIFtEV19UQUdfbGV4aWNhbF9ibG9ja10gPSAibGV4aWNhbF9ibG9jayIsCisJICBbRFdfVEFHX21lbWJlcl0gPSAibWVtYmVyIiwKKwkgIFtEV19UQUdfcG9pbnRlcl90eXBlXSA9ICJwb2ludGVyX3R5cGUiLAorCSAgW0RXX1RBR19yZWZlcmVuY2VfdHlwZV0gPSAicmVmZXJlbmNlX3R5cGUiLAorCSAgW0RXX1RBR19jb21waWxlX3VuaXRdID0gImNvbXBpbGVfdW5pdCIsCisJICBbRFdfVEFHX3N0cmluZ190eXBlXSA9ICJzdHJpbmdfdHlwZSIsCisJICBbRFdfVEFHX3N0cnVjdHVyZV90eXBlXSA9ICJzdHJ1Y3R1cmVfdHlwZSIsCisJICBbRFdfVEFHX3N1YnJvdXRpbmVfdHlwZV0gPSAic3Vicm91dGluZV90eXBlIiwKKwkgIFtEV19UQUdfdHlwZWRlZl0gPSAidHlwZWRlZiIsCisJICBbRFdfVEFHX3VuaW9uX3R5cGVdID0gInVuaW9uX3R5cGUiLAorCSAgW0RXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzXSA9ICJ1bnNwZWNpZmllZF9wYXJhbWV0ZXJzIiwKKwkgIFtEV19UQUdfdmFyaWFudF0gPSAidmFyaWFudCIsCisJICBbRFdfVEFHX2NvbW1vbl9ibG9ja10gPSAiY29tbW9uX2Jsb2NrIiwKKwkgIFtEV19UQUdfY29tbW9uX2luY2x1c2lvbl0gPSAiY29tbW9uX2luY2x1c2lvbiIsCisJICBbRFdfVEFHX2luaGVyaXRhbmNlXSA9ICJpbmhlcml0YW5jZSIsCisJICBbRFdfVEFHX2lubGluZWRfc3Vicm91dGluZV0gPSAiaW5saW5lZF9zdWJyb3V0aW5lIiwKKwkgIFtEV19UQUdfbW9kdWxlXSA9ICJtb2R1bGUiLAorCSAgW0RXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGVdID0gInB0cl90b19tZW1iZXJfdHlwZSIsCisJICBbRFdfVEFHX3NldF90eXBlXSA9ICJzZXRfdHlwZSIsCisJICBbRFdfVEFHX3N1YnJhbmdlX3R5cGVdID0gInN1YnJhbmdlX3R5cGUiLAorCSAgW0RXX1RBR193aXRoX3N0bXRdID0gIndpdGhfc3RtdCIsCisJICBbRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbl0gPSAiYWNjZXNzX2RlY2xhcmF0aW9uIiwKKwkgIFtEV19UQUdfYmFzZV90eXBlXSA9ICJiYXNlX3R5cGUiLAorCSAgW0RXX1RBR19jYXRjaF9ibG9ja10gPSAiY2F0Y2hfYmxvY2siLAorCSAgW0RXX1RBR19jb25zdF90eXBlXSA9ICJjb25zdF90eXBlIiwKKwkgIFtEV19UQUdfY29uc3RhbnRdID0gImNvbnN0YW50IiwKKwkgIFtEV19UQUdfZW51bWVyYXRvcl0gPSAiZW51bWVyYXRvciIsCisJICBbRFdfVEFHX2ZpbGVfdHlwZV0gPSAiZmlsZV90eXBlIiwKKwkgIFtEV19UQUdfZnJpZW5kXSA9ICJmcmllbmQiLAorCSAgW0RXX1RBR19uYW1lbGlzdF0gPSAibmFtZWxpc3QiLAorCSAgW0RXX1RBR19uYW1lbGlzdF9pdGVtXSA9ICJuYW1lbGlzdF9pdGVtIiwKKwkgIFtEV19UQUdfcGFja2VkX3R5cGVdID0gInBhY2tlZF90eXBlIiwKKwkgIFtEV19UQUdfc3VicHJvZ3JhbV0gPSAic3VicHJvZ3JhbSIsCisJICBbRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW1dID0gInRlbXBsYXRlX3R5cGVfcGFyYW0iLAorCSAgW0RXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbV0gPSAidGVtcGxhdGVfdmFsdWVfcGFyYW0iLAorCSAgW0RXX1RBR190aHJvd25fdHlwZV0gPSAidGhyb3duX3R5cGUiLAorCSAgW0RXX1RBR190cnlfYmxvY2tdID0gInRyeV9ibG9jayIsCisJICBbRFdfVEFHX3ZhcmlhbnRfcGFydF0gPSAidmFyaWFudF9wYXJ0IiwKKwkgIFtEV19UQUdfdmFyaWFibGVdID0gInZhcmlhYmxlIiwKKwkgIFtEV19UQUdfdm9sYXRpbGVfdHlwZV0gPSAidm9sYXRpbGVfdHlwZSIKKwl9OworCisgICAgICBjb25zdCBjaGFyICp0YWdzdHI7CisgICAgICBzd2l0Y2ggKHRhZykKKwl7CisJY2FzZSBEV19UQUdfbG9fdXNlcjoKKwkgIHRhZ3N0ciA9ICJsb191c2VyIjsKKwkgIGJyZWFrOworCisJY2FzZSBEV19UQUdfTUlQU19sb29wOgorCSAgdGFnc3RyID0gIk1JUFNfbG9vcCI7CisJICBicmVhazsKKworCWNhc2UgRFdfVEFHX2Zvcm1hdF9sYWJlbDoKKwkgIHRhZ3N0ciA9ICJmb3JtYXRfbGFiZWwiOworCSAgYnJlYWs7CisKKwljYXNlIERXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZToKKwkgIHRhZ3N0ciA9ICJmdW5jdGlvbl90ZW1wbGF0ZSI7CisJICBicmVhazsKKworCWNhc2UgRFdfVEFHX2NsYXNzX3RlbXBsYXRlOgorCSAgdGFnc3RyID0gImNsYXNzX3RlbXBsYXRlIjsKKwkgIGJyZWFrOworCWNhc2UgRFdfVEFHX2hpX3VzZXI6CisJICB0YWdzdHIgPSAiaGlfdXNlciI7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBpZiAodGFnIDwgKGludCkgKHNpemVvZiAobG93dGFncykgLyBzaXplb2YgKGxvd3RhZ3NbMF0pKSkKKwkgICAgdGFnc3RyID0gbG93dGFnc1t0YWddOworCSAgZWxzZQorCSAgICB0YWdzdHIgPSAiPz8/IjsKKwkgIGJyZWFrOworCX0KKyNlbmRpZgorCisgICAgICBwcmludGYgKCIgWyU2IiBQUkl4NjQgIl0gICUqcyVzXG4iLAorCSAgICAgICh1aW50NjRfdCkgb2Zmc2V0LCAoaW50KSAobGV2ZWwgKiAyKSwgIiIsIHRhZ3N0cik7CisKKyAgICAgIC8qIFByaW50IHRoZSBhdHRyaWJ1dGUgdmFsdWVzLiAgKi8KKyAgICAgIGFyZ3MubGV2ZWwgPSBsZXZlbDsKKyAgICAgICh2b2lkKSBkd2FyZl9nZXRhdHRycyAoJmRpZXNbbGV2ZWxdLCBhdHRyX2NhbGxiYWNrLCAmYXJncywgMCk7CisKKyAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIG5leHQgbGV2ZWwncyBESUUuICAqLworICAgICAgaWYgKGxldmVsICsgMSA9PSBtYXhkaWVzKQorCWRpZXMgPSAoRHdhcmZfRGllICopIHhyZWFsbG9jIChkaWVzLAorCQkJCSAgICAgICAobWF4ZGllcyArPSAxMCkKKwkJCQkgICAgICAgKiBzaXplb2YgKER3YXJmX0RpZSkpOworCisgICAgICBpbnQgcmVzID0gZHdhcmZfY2hpbGQgKCZkaWVzW2xldmVsXSwgJmRpZXNbbGV2ZWwgKyAxXSk7CisgICAgICBpZiAocmVzID4gMCkKKwl7CisJICB3aGlsZSAoKHJlcyA9IGR3YXJmX3NpYmxpbmdvZiAoJmRpZXNbbGV2ZWxdLCAmZGllc1tsZXZlbF0pKSA9PSAxKQorCSAgICBpZiAobGV2ZWwtLSA9PSAwKQorCSAgICAgIGJyZWFrOworCisJICBpZiAocmVzID09IC0xKQorCSAgICB7CisJICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IG5leHQgRElFOiAlc1xuIiksCisJCSAgICAgZHdhcmZfZXJybXNnICgtMSkpOworCSAgICAgIGdvdG8gZG9fcmV0dXJuOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAodW5saWtlbHkgKHJlcyA8IDApKQorCXsKKwkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBuZXh0IERJRTogJXMiKSwKKwkJIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkgIGdvdG8gZG9fcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwkrK2xldmVsOworICAgIH0KKyAgd2hpbGUgKGxldmVsID49IDApOworCisgIG9mZnNldCA9IG5leHRjdTsKKyAgaWYgKG9mZnNldCAhPSAwKQorICAgICBnb3RvIG5leHRfY3U7CisKKyBkb19yZXR1cm46CisgIGZyZWUgKGRpZXMpOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9kZWJ1Z19saW5lX3NlY3Rpb24gKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKK3sKKyAgcHJpbnRmIChnZXR0ZXh0ICgiXAorXG5EV0FSRiBzZWN0aW9uICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIjpcbiIpLAorCSAgIi5kZWJ1Z19saW5lIiwgKHVpbnQ2NF90KSBzaGRyLT5zaF9vZmZzZXQpOworCisgIGlmIChzaGRyLT5zaF9zaXplID09IDApCisgICAgcmV0dXJuOworCisgIC8qIFRoZXJlIGlzIG5vIGZ1bmN0aW9uYWxpdHkgaW4gbGliZHcgdG8gcmVhZCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlCisgICAgIHdheSBpdCBpcyByZXByZXNlbnRlZCBoZXJlLiAgSGFyZGNvZGUgdGhlIGRlY29kZXIuICAqLworICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmRfYnVmID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IGxpbmUgZGF0YSBzZWN0aW9uIGRhdGE6ICVzIiksCisJICAgICBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW5lcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW5lZW5kcDsKKworICB3aGlsZSAobGluZXAKKwkgPCAobGluZWVuZHAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZiArIGRhdGEtPmRfc2l6ZSkpCisgICAgeworICAgICAgc2l6ZV90IHN0YXJ0X29mZnNldCA9IGxpbmVwIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWY7CisKKyAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIlxuVGFibGUgYXQgb2Zmc2V0ICVadTpcbiIpLCBzdGFydF9vZmZzZXQpOworCisgICAgICBEd2FyZl9Xb3JkIHVuaXRfbGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7CisgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gNDsKKyAgICAgIGlmICh1bmxpa2VseSAodW5pdF9sZW5ndGggPT0gMHhmZmZmZmZmZikpCisJeworCSAgaWYgKHVubGlrZWx5IChsaW5lcCArIDggPiBsaW5lZW5kcCkpCisJICAgIHsKKwkgICAgaW52YWxpZF9kYXRhOgorCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiaW52YWxpZCBkYXRhIGluIHNlY3Rpb24gWyV6dV0gJyVzJyIpLAorCQkgICAgIGVsZl9uZHhzY24gKHNjbiksICIuZGVidWdfbGluZSIpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgdW5pdF9sZW5ndGggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKKwkgIGxlbmd0aCA9IDg7CisJfQorCisgICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgZW5vdWdoIHJvb20gaW4gdGhlIHNlY3Rpb24uICAqLworICAgICAgaWYgKHVuaXRfbGVuZ3RoIDwgMiArIGxlbmd0aCArIDUgKiAxCisJICB8fCB1bmxpa2VseSAobGluZXAgKyB1bml0X2xlbmd0aCA+IGxpbmVlbmRwKSkKKwlnb3RvIGludmFsaWRfZGF0YTsKKyAgICAgIGxpbmVlbmRwID0gbGluZXAgKyB1bml0X2xlbmd0aDsKKworICAgICAgLyogVGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaGVhZGVyIGlzIHRoZSB2ZXJzaW9uIGlkZW50aWZpZXIuICAqLworICAgICAgdWludF9mYXN0MTZfdCB2ZXJzaW9uID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7CisKKyAgICAgIC8qIE5leHQgY29tZXMgdGhlIGhlYWRlciBsZW5ndGguICAqLworICAgICAgRHdhcmZfV29yZCBoZWFkZXJfbGVuZ3RoOworICAgICAgaWYgKGxlbmd0aCA9PSA0KQorCWhlYWRlcl9sZW5ndGggPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKKyAgICAgIGVsc2UKKwloZWFkZXJfbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7CisgICAgICAvL2NvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlcl9zdGFydCA9IGxpbmVwOworCisgICAgICAvKiBOZXh0IHRoZSBtaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aC4gICovCisgICAgICB1aW50X2Zhc3Q4X3QgbWluaW11bV9pbnN0cl9sZW4gPSAqbGluZXArKzsKKworICAgICAgICAvKiBUaGVuIHRoZSBmbGFnIGRldGVybWluaW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBpc19zdG10CisJICAgcmVnaXN0ZXIuICAqLworICAgICAgdWludF9mYXN0OF90IGRlZmF1bHRfaXNfc3RtdCA9ICpsaW5lcCsrOworCisgICAgICAvKiBOb3cgdGhlIGxpbmUgYmFzZS4gICovCisgICAgICBpbnRfZmFzdDhfdCBsaW5lX2Jhc2UgPSAqKChjb25zdCBpbnRfZmFzdDhfdCAqKSBsaW5lcCk7CisgICAgICArK2xpbmVwOworCisgICAgICAvKiBBbmQgdGhlIGxpbmUgcmFuZ2UuICAqLworICAgICAgdWludF9mYXN0OF90IGxpbmVfcmFuZ2UgPSAqbGluZXArKzsKKworICAgICAgLyogVGhlIG9wY29kZSBiYXNlLiAgKi8KKyAgICAgIHVpbnRfZmFzdDhfdCBvcGNvZGVfYmFzZSA9ICpsaW5lcCsrOworCisgICAgICAvKiBQcmludCB3aGF0IHdlIGdvdCBzbyBmYXIuICAqLworICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXG4iCisJCSAgICAgICAiIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAlIiBQUkl1NjQgIlxuIgorCQkgICAgICAgIiBEV0FSRiB2ZXJzaW9uOiAgICAgICAgICAgICAgJSIgUFJJdUZBU1QxNiAiXG4iCisJCSAgICAgICAiIFByb2xvZ3VlIGxlbmd0aDogICAgICAgICAgICAlIiBQUkl1NjQgIlxuIgorCQkgICAgICAgIiBNaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aDogJSIgUFJJdUZBU1Q4ICJcbiIKKwkJICAgICAgICIgSW5pdGlhbCB2YWx1ZSBpZiAnJXMnOiAlIiBQUkl1RkFTVDggIlxuIgorCQkgICAgICAgIiBMaW5lIGJhc2U6ICAgICAgICAgICAgICAgICAgJSIgUFJJZEZBU1Q4ICJcbiIKKwkJICAgICAgICIgTGluZSByYW5nZTogICAgICAgICAgICAgICAgICUiIFBSSXVGQVNUOCAiXG4iCisJCSAgICAgICAiIE9wY29kZSBiYXNlOiAgICAgICAgICAgICAgICAlIiBQUkl1RkFTVDggIlxuIgorCQkgICAgICAgIlxuIgorCQkgICAgICAgIk9wY29kZXM6XG4iKSwKKwkgICAgICAodWludDY0X3QpIHVuaXRfbGVuZ3RoLCB2ZXJzaW9uLCAodWludDY0X3QpIGhlYWRlcl9sZW5ndGgsCisJICAgICAgbWluaW11bV9pbnN0cl9sZW4sICJpc19zdG10IiwgZGVmYXVsdF9pc19zdG10LCBsaW5lX2Jhc2UsCisJICAgICAgbGluZV9yYW5nZSwgb3Bjb2RlX2Jhc2UpOworCisgICAgICBpZiAodW5saWtlbHkgKGxpbmVwICsgb3Bjb2RlX2Jhc2UgLSAxID49IGxpbmVlbmRwKSkKKwlnb3RvIGludmFsaWRfZGF0YTsKKyAgICAgIGludCBvcGNvZGVfYmFzZV9sMTAgPSAxOworICAgICAgdW5zaWduZWQgaW50IHRtcCA9IG9wY29kZV9iYXNlOworICAgICAgd2hpbGUgKHRtcCA+IDEwKQorCXsKKwkgIHRtcCAvPSAxMDsKKwkgICsrb3Bjb2RlX2Jhc2VfbDEwOworCX0KKyAgICAgIGNvbnN0IHVpbnQ4X3QgKnN0YW5kYXJkX29wY29kZV9sZW5ndGhzID0gbGluZXAgLSAxOworICAgICAgZm9yICh1aW50X2Zhc3Q4X3QgY250ID0gMTsgY250IDwgb3Bjb2RlX2Jhc2U7ICsrY250KQorCXByaW50ZiAobmdldHRleHQgKCIgIFslKiIgUFJJdUZBU1Q4ICJdICAlaGh1IGFyZ3VtZW50XG4iLAorCQkJICAiICBbJSoiIFBSSXVGQVNUOCAiXSAgJWhodSBhcmd1bWVudHNcbiIsCisJCQkgIChpbnQpIGxpbmVwW2NudCAtIDFdKSwKKwkJb3Bjb2RlX2Jhc2VfbDEwLCBjbnQsIGxpbmVwW2NudCAtIDFdKTsKKyAgICAgIGxpbmVwICs9IG9wY29kZV9iYXNlIC0gMTsKKyAgICAgIGlmICh1bmxpa2VseSAobGluZXAgPj0gbGluZWVuZHApKQorCWdvdG8gaW52YWxpZF9kYXRhOworCisgICAgICBwdXRzIChnZXR0ZXh0ICgiXG5EaXJlY3RvcnkgdGFibGU6IikpOworICAgICAgd2hpbGUgKCpsaW5lcCAhPSAwKQorCXsKKwkgIHVuc2lnbmVkIGNoYXIgKmVuZHAgPSBtZW1jaHIgKGxpbmVwLCAnXDAnLCBsaW5lZW5kcCAtIGxpbmVwKTsKKwkgIGlmIChlbmRwID09IE5VTEwpCisJICAgIGdvdG8gaW52YWxpZF9kYXRhOworCisJICBwcmludGYgKCIgJXNcbiIsIChjaGFyICopIGxpbmVwKTsKKworCSAgbGluZXAgPSBlbmRwICsgMTsKKwl9CisgICAgICAvKiBTa2lwIHRoZSBmaW5hbCBOVUwgYnl0ZS4gICovCisgICAgICArK2xpbmVwOworCisgICAgICBpZiAodW5saWtlbHkgKGxpbmVwID49IGxpbmVlbmRwKSkKKwlnb3RvIGludmFsaWRfZGF0YTsKKyAgICAgIHB1dHMgKGdldHRleHQgKCJcbkZpbGUgbmFtZSB0YWJsZTpcbiIKKwkJICAgICAiIEVudHJ5IERpciAgIFRpbWUgICAgICBTaXplICAgICAgTmFtZSIpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGNudCA9IDE7ICpsaW5lcCAhPSAwOyArK2NudCkKKwl7CisJICAvKiBGaXJzdCBjb21lcyB0aGUgZmlsZSBuYW1lLiAgKi8KKwkgIGNoYXIgKmZuYW1lID0gKGNoYXIgKikgbGluZXA7CisJICB1bnNpZ25lZCBjaGFyICplbmRwID0gbWVtY2hyIChmbmFtZSwgJ1wwJywgbGluZWVuZHAgLSBsaW5lcCk7CisJICBpZiAoZW5kcCA9PSBOVUxMKQorCSAgICBnb3RvIGludmFsaWRfZGF0YTsKKwkgIGxpbmVwID0gZW5kcCArIDE7CisKKwkgIC8qIFRoZW4gdGhlIGluZGV4LiAgKi8KKwkgIHVuc2lnbmVkIGludCBkaXJpZHg7CisJICBnZXRfdWxlYjEyOCAoZGlyaWR4LCBsaW5lcCk7CisKKwkgIC8qIE5leHQgY29tZXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lLiAgKi8KKwkgIHVuc2lnbmVkIGludCBtdGltZTsKKwkgIGdldF91bGViMTI4IChtdGltZSwgbGluZXApOworCisJICAvKiBGaW5hbGx5IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuICAqLworCSAgdW5zaWduZWQgaW50IGZzaXplOworCSAgZ2V0X3VsZWIxMjggKGZzaXplLCBsaW5lcCk7CisKKwkgIHByaW50ZiAoIiAlLTV1ICUtNXUgJS05dSAlLTl1ICVzXG4iLAorCQkgIGNudCwgZGlyaWR4LCBtdGltZSwgZnNpemUsIGZuYW1lKTsKKwl9CisgICAgICAvKiBTa2lwIHRoZSBmaW5hbCBOVUwgYnl0ZS4gICovCisgICAgICArK2xpbmVwOworCisgICAgICBwdXRzIChnZXR0ZXh0ICgiXG5MaW5lIG51bWJlciBzdGF0ZW1lbnRzOiIpKTsKKyAgICAgIER3YXJmX1dvcmQgYWRkcmVzcyA9IDA7CisgICAgICBzaXplX3QgbGluZSA9IDE7CisgICAgICB1aW50X2Zhc3Q4X3QgaXNfc3RtdCA9IGRlZmF1bHRfaXNfc3RtdDsKKworICAgICAgLyogRGVmYXVsdCBhZGRyZXNzIHZhbHVlLCBpbiBjYXNlIHdlIGRvIG5vdCBmaW5kIHRoZSBDVS4gICovCisgICAgICBzaXplX3QgYWRkcmVzc19zaXplCisJPSBlbGZfZ2V0aWRlbnQgKGVibC0+ZWxmLCBOVUxMKVtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDQgOiA4OworCisgICAgICAvKiBEZXRlcm1pbmUgdGhlIENVIHRoaXMgYmxvY2sgaXMgZm9yLiAgKi8KKyAgICAgIER3YXJmX09mZiBjdW9mZnNldDsKKyAgICAgIER3YXJmX09mZiBuY3VvZmZzZXQgPSAwOworICAgICAgc2l6ZV90IGhzaXplOworICAgICAgd2hpbGUgKGR3YXJmX25leHRjdSAoZGJnLCBjdW9mZnNldCA9IG5jdW9mZnNldCwgJm5jdW9mZnNldCwgJmhzaXplLAorCQkJICAgTlVMTCwgTlVMTCwgTlVMTCkgPT0gMCkKKwl7CisJICBEd2FyZl9EaWUgY3VkaWU7CisJICBpZiAoZHdhcmZfb2ZmZGllIChkYmcsIGN1b2Zmc2V0ICsgaHNpemUsICZjdWRpZSkgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisJICBEd2FyZl9BdHRyaWJ1dGUgc3RtdF9saXN0OworCSAgaWYgKGR3YXJmX2F0dHIgKCZjdWRpZSwgRFdfQVRfc3RtdF9saXN0LCAmc3RtdF9saXN0KSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwkgIER3YXJmX1dvcmQgbGluZW9mZjsKKwkgIGlmIChkd2FyZl9mb3JtdWRhdGEgKCZzdG10X2xpc3QsICZsaW5lb2ZmKSAhPSAwKQorCSAgICBjb250aW51ZTsKKwkgIGlmIChsaW5lb2ZmID09IHN0YXJ0X29mZnNldCkKKwkgICAgeworCSAgICAgIC8qIEZvdW5kIHRoZSBDVS4gICovCisJICAgICAgYWRkcmVzc19zaXplID0gY3VkaWUuY3UtPmFkZHJlc3Nfc2l6ZTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgd2hpbGUgKGxpbmVwIDwgbGluZWVuZHApCisJeworCSAgdW5zaWduZWQgaW50IHUxMjg7CisJICBpbnQgczEyODsKKworCSAgLyogUmVhZCB0aGUgb3Bjb2RlLiAgKi8KKwkgIHVuc2lnbmVkIGludCBvcGNvZGUgPSAqbGluZXArKzsKKworCSAgLyogSXMgdGhpcyBhIHNwZWNpYWwgb3Bjb2RlPyAgKi8KKwkgIGlmIChsaWtlbHkgKG9wY29kZSA+PSBvcGNvZGVfYmFzZSkpCisJICAgIHsKKwkgICAgICAvKiBZZXMuICBIYW5kbGluZyB0aGlzIGlzIHF1aXRlIGVhc3kgc2luY2UgdGhlIG9wY29kZSB2YWx1ZQorCQkgaXMgY29tcHV0ZWQgd2l0aAorCisJCSBvcGNvZGUgPSAoZGVzaXJlZCBsaW5lIGluY3JlbWVudCAtIGxpbmVfYmFzZSkKKwkJICAgICAgICAgICArIChsaW5lX3JhbmdlICogYWRkcmVzcyBhZHZhbmNlKSArIG9wY29kZV9iYXNlCisJICAgICAgKi8KKwkgICAgICBpbnQgbGluZV9pbmNyZW1lbnQgPSAobGluZV9iYXNlCisJCQkJICAgICsgKG9wY29kZSAtIG9wY29kZV9iYXNlKSAlIGxpbmVfcmFuZ2UpOworCSAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzX2luY3JlbWVudCA9IChtaW5pbXVtX2luc3RyX2xlbgorCQkJCQkJKiAoKG9wY29kZSAtIG9wY29kZV9iYXNlKQorCQkJCQkJICAgLyBsaW5lX3JhbmdlKSk7CisKKwkgICAgICAvKiBQZXJmb3JtIHRoZSBpbmNyZW1lbnRzLiAgKi8KKwkgICAgICBsaW5lICs9IGxpbmVfaW5jcmVtZW50OworCSAgICAgIGFkZHJlc3MgKz0gYWRkcmVzc19pbmNyZW1lbnQ7CisKKwkgICAgICBwcmludGYgKGdldHRleHQgKCJcCisgc3BlY2lhbCBvcGNvZGUgJXU6IGFkZHJlc3MrJXUgPSAlIyIgUFJJeDY0ICIsIGxpbmUlK2QgPSAlenVcbiIpLAorCQkgICAgICBvcGNvZGUsIGFkZHJlc3NfaW5jcmVtZW50LCAodWludDY0X3QpIGFkZHJlc3MsCisJCSAgICAgIGxpbmVfaW5jcmVtZW50LCBsaW5lKTsKKwkgICAgfQorCSAgZWxzZSBpZiAob3Bjb2RlID09IDApCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGFuIGV4dGVuZGVkIG9wY29kZS4gICovCisJICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCArIDIgPiBsaW5lZW5kcCkpCisJCWdvdG8gaW52YWxpZF9kYXRhOworCisJICAgICAgLyogVGhlIGxlbmd0aC4gICovCisJICAgICAgdW5zaWduZWQgaW50IGxlbiA9ICpsaW5lcCsrOworCisJICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCArIGxlbiA+IGxpbmVlbmRwKSkKKwkJZ290byBpbnZhbGlkX2RhdGE7CisKKwkgICAgICAvKiBUaGUgc3ViLW9wY29kZS4gICovCisJICAgICAgb3Bjb2RlID0gKmxpbmVwKys7CisKKwkgICAgICBwcmludGYgKGdldHRleHQgKCIgZXh0ZW5kZWQgb3Bjb2RlICV1OiAiKSwgb3Bjb2RlKTsKKworCSAgICAgIHN3aXRjaCAob3Bjb2RlKQorCQl7CisJCWNhc2UgRFdfTE5FX2VuZF9zZXF1ZW5jZToKKwkJICBwdXRzIChnZXR0ZXh0ICgiZW5kIG9mIHNlcXVlbmNlIikpOworCisJCSAgLyogUmVzZXQgdGhlIHJlZ2lzdGVycyB3ZSBjYXJlIGFib3V0LiAgKi8KKwkJICBhZGRyZXNzID0gMDsKKwkJICBsaW5lID0gMTsKKwkJICBpc19zdG10ID0gZGVmYXVsdF9pc19zdG10OworCQkgIGJyZWFrOworCisJCWNhc2UgRFdfTE5FX3NldF9hZGRyZXNzOgorCQkgIGlmIChhZGRyZXNzX3NpemUgPT0gNCkKKwkJICAgIGFkZHJlc3MgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKKwkJICBlbHNlCisJCSAgICBhZGRyZXNzID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7CisJCSAgcHJpbnRmIChnZXR0ZXh0ICgic2V0IGFkZHJlc3MgdG8gJSMiIFBSSXg2NCAiXG4iKSwKKwkJCSAgKHVpbnQ2NF90KSBhZGRyZXNzKTsKKwkJICBicmVhazsKKworCQljYXNlIERXX0xORV9kZWZpbmVfZmlsZToKKwkJICB7CisJCSAgICBjaGFyICpmbmFtZSA9IChjaGFyICopIGxpbmVwOworCQkgICAgdW5zaWduZWQgY2hhciAqZW5kcCA9IG1lbWNociAobGluZXAsICdcMCcsCisJCQkJCQkgIGxpbmVlbmRwIC0gbGluZXApOworCQkgICAgaWYgKGVuZHAgPT0gTlVMTCkKKwkJICAgICAgZ290byBpbnZhbGlkX2RhdGE7CisJCSAgICBsaW5lcCA9IGVuZHAgKyAxOworCisJCSAgICB1bnNpZ25lZCBpbnQgZGlyaWR4OworCQkgICAgZ2V0X3VsZWIxMjggKGRpcmlkeCwgbGluZXApOworCQkgICAgRHdhcmZfV29yZCBtdGltZTsKKwkJICAgIGdldF91bGViMTI4IChtdGltZSwgbGluZXApOworCQkgICAgRHdhcmZfV29yZCBmaWxlbGVuZ3RoOworCQkgICAgZ2V0X3VsZWIxMjggKGZpbGVsZW5ndGgsIGxpbmVwKTsKKworCQkgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAorZGVmaW5lIG5ldyBmaWxlOiBkaXI9JXUsIG10aW1lPSUiIFBSSXU2NCAiLCBsZW5ndGg9JSIgUFJJdTY0ICIsIG5hbWU9JXNcbiIpLAorCQkJICAgIGRpcmlkeCwgKHVpbnQ2NF90KSBtdGltZSwgKHVpbnQ2NF90KSBmaWxlbGVuZ3RoLAorCQkJICAgIGZuYW1lKTsKKwkJICB9CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICAvKiBVbmtub3duLCBpZ25vcmUgaXQuICAqLworCQkgIHB1dHMgKGdldHRleHQgKCJ1bmtub3duIG9wY29kZSIpKTsKKwkJICBsaW5lcCArPSBsZW4gLSAxOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKG9wY29kZSA8PSBEV19MTlNfc2V0X2VwaWxvZ19iZWdpbikKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSBrbm93biBzdGFuZGFyZCBvcGNvZGUuICAqLworCSAgICAgIHN3aXRjaCAob3Bjb2RlKQorCQl7CisJCWNhc2UgRFdfTE5TX2NvcHk6CisJCSAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLworCQkgIHB1dHMgKGdldHRleHQgKCIgY29weSIpKTsKKwkJICBicmVhazsKKworCQljYXNlIERXX0xOU19hZHZhbmNlX3BjOgorCQkgIC8qIFRha2VzIG9uZSB1bGViMTI4IHBhcmFtZXRlciB3aGljaCBpcyBhZGRlZCB0byB0aGUKKwkJICAgICBhZGRyZXNzLiAgKi8KKwkJICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXApOworCQkgIGFkZHJlc3MgKz0gbWluaW11bV9pbnN0cl9sZW4gKiB1MTI4OworCQkgIHByaW50ZiAoZ2V0dGV4dCAoIlwKKyBhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJSMiIFBSSXg2NCAiXG4iKSwKKwkJCSAgdTEyOCwgKHVpbnQ2NF90KSBhZGRyZXNzKTsKKwkJICBicmVhazsKKworCQljYXNlIERXX0xOU19hZHZhbmNlX2xpbmU6CisJCSAgLyogVGFrZXMgb25lIHNsZWIxMjggcGFyYW1ldGVyIHdoaWNoIGlzIGFkZGVkIHRvIHRoZQorCQkgICAgIGxpbmUuICAqLworCQkgIGdldF9zbGViMTI4IChzMTI4LCBsaW5lcCk7CisJCSAgbGluZSArPSBzMTI4OworCQkgIHByaW50ZiAoZ2V0dGV4dCAoIlwKKyBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgJWQgdG8gJSIgUFJJZDY0ICJcbiIpLAorCQkJICBzMTI4LCAoaW50NjRfdCkgbGluZSk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTlNfc2V0X2ZpbGU6CisJCSAgLyogVGFrZXMgb25lIHVsZWIxMjggcGFyYW1ldGVyIHdoaWNoIGlzIHN0b3JlZCBpbiBmaWxlLiAgKi8KKwkJICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXApOworCQkgIHByaW50ZiAoZ2V0dGV4dCAoIiBzZXQgZmlsZSB0byAlIiBQUkl1NjQgIlxuIiksCisJCQkgICh1aW50NjRfdCkgdTEyOCk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTlNfc2V0X2NvbHVtbjoKKwkJICAvKiBUYWtlcyBvbmUgdWxlYjEyOCBwYXJhbWV0ZXIgd2hpY2ggaXMgc3RvcmVkIGluIGNvbHVtbi4gICovCisJCSAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDEpKQorCQkgICAgZ290byBpbnZhbGlkX2RhdGE7CisKKwkJICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXApOworCQkgIHByaW50ZiAoZ2V0dGV4dCAoIiBzZXQgY29sdW1uIHRvICUiIFBSSXU2NCAiXG4iKSwKKwkJCSAgKHVpbnQ2NF90KSB1MTI4KTsKKwkJICBicmVhazsKKworCQljYXNlIERXX0xOU19uZWdhdGVfc3RtdDoKKwkJICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCisJCSAgaXNfc3RtdCA9IDEgLSBpc19zdG10OworCQkgIHByaW50ZiAoZ2V0dGV4dCAoIiBzZXQgJyVzJyB0byAlIiBQUkl1RkFTVDggIlxuIiksCisJCQkgICJpc19zdG10IiwgaXNfc3RtdCk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgorCQkgIC8qIFRha2VzIG5vIGFyZ3VtZW50LiAgKi8KKwkJICBwdXRzIChnZXR0ZXh0ICgiIHNldCBiYXNpYyBibG9jayBmbGFnIikpOworCQkgIGJyZWFrOworCisJCWNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYzoKKwkJICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCisJCSAgdTEyOCA9IChtaW5pbXVtX2luc3RyX2xlbgorCQkJICAqICgoMjU1IC0gb3Bjb2RlX2Jhc2UpIC8gbGluZV9yYW5nZSkpOworCQkgIGFkZHJlc3MgKz0gdTEyODsKKwkJICBwcmludGYgKGdldHRleHQgKCJcCisgYWR2YW5jZSBhZGRyZXNzIGJ5IGNvbnN0YW50ICV1IHRvICUjIiBQUkl4NjQgIlxuIiksCisJCQkgIHUxMjgsICh1aW50NjRfdCkgYWRkcmVzcyk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYzoKKwkJICAvKiBUYWtlcyBvbmUgMTYgYml0IHBhcmFtZXRlciB3aGljaCBpcyBhZGRlZCB0byB0aGUKKwkJICAgICBhZGRyZXNzLiAgKi8KKwkJICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMSkpCisJCSAgICBnb3RvIGludmFsaWRfZGF0YTsKKworCQkgIHUxMjggPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKKwkJICBhZGRyZXNzICs9IHUxMjg7CisJCSAgcHJpbnRmIChnZXR0ZXh0ICgiXAorIGFkdmFuY2UgYWRkcmVzcyBieSBmaXhlZCB2YWx1ZSAldSB0byAlIyIgUFJJeDY0ICJcbiIpLAorCQkJICB1MTI4LCAodWludDY0X3QpIGFkZHJlc3MpOworCQkgIGJyZWFrOworCisJCWNhc2UgRFdfTE5TX3NldF9wcm9sb2d1ZV9lbmQ6CisJCSAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLworCQkgIHB1dHMgKGdldHRleHQgKCIgc2V0IHByb2xvZ3VlIGVuZCBmbGFnIikpOworCQkgIGJyZWFrOworCisJCWNhc2UgRFdfTE5TX3NldF9lcGlsb2dfYmVnaW46CisJCSAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLworCQkgIHB1dHMgKGdldHRleHQgKCIgc2V0IGVwaWxvZ3VlIGJlZ2luIGZsYWciKSk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIG5ldyBvcGNvZGUgdGhlIGdlbmVyYXRvciBidXQgbm90IHdlIGtub3cgYWJvdXQuCisJCSBSZWFkIHRoZSBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCBpdCBidXQgdGhlbiBkaXNjYXJkCisJCSBldmVyeXRoaW5nLiAgUmVhZCBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgb3Bjb2RlLiAgKi8KKwkgICAgICBwcmludGYgKG5nZXR0ZXh0ICgiIHVua25vd24gb3Bjb2RlIHdpdGggJSIgUFJJdTggIiBwYXJhbWV0ZXI6IiwKKwkJCQkiIHVua25vd24gb3Bjb2RlIHdpdGggJSIgUFJJdTggIiBwYXJhbWV0ZXJzOiIsCisJCQkJc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSksCisJCSAgICAgIHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0pOworCSAgICAgIGZvciAoaW50IG4gPSBzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdOyBuID4gMDsgLS1uKQorCQl7CisJCSAgZ2V0X3VsZWIxMjggKHUxMjgsIGxpbmVwKTsKKwkJICBpZiAobiAhPSBzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdKQorCQkgICAgcHV0Y191bmxvY2tlZCAoJywnLCBzdGRvdXQpOworCQkgIHByaW50ZiAoIiAldSIsIHUxMjgpOworCQl9CisKKwkgICAgICAvKiBOZXh0IHJvdW5kLCBpZ25vcmUgdGhpcyBvcGNvZGUuICAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBUaGVyZSBtdXN0IG9ubHkgYmUgb25lIGRhdGEgYmxvY2suICAqLworICBhc3NlcnQgKGVsZl9nZXRkYXRhIChzY24sIGRhdGEpID09IE5VTEwpOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9kZWJ1Z19sb2Nfc2VjdGlvbiAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJIEdFbGZfRWhkciAqZWhkciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgRWxmX1NjbiAqc2NuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSBHRWxmX1NoZHIgKnNoZHIsCisJCQkgRHdhcmYgKmRiZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIEVsZl9EYXRhICpkYXRhID0gZWxmX3Jhd2RhdGEgKHNjbiwgTlVMTCk7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgLmRlYnVnX2xvYyBjb250ZW50OiAlcyIpLAorCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcHJpbnRmIChnZXR0ZXh0ICgiXAorXG5EV0FSRiBzZWN0aW9uICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIjpcbiIpLAorCSAgIi5kZWJ1Z19sb2MiLCAodWludDY0X3QpIHNoZHItPnNoX29mZnNldCk7CisKKyAgc2l6ZV90IGFkZHJlc3Nfc2l6ZSA9IGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIgPyA0IDogODsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgdW5zaWduZWQgY2hhciAqcmVhZHAgPSBkYXRhLT5kX2J1ZjsKKyAgd2hpbGUgKHJlYWRwIDwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWYgKyBkYXRhLT5kX3NpemUpCisgICAgeworICAgICAgcHRyZGlmZl90IG9mZnNldCA9IHJlYWRwIC0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWY7CisKKyAgICAgIGlmIChkYXRhLT5kX3NpemUgLSBvZmZzZXQgPCBhZGRyZXNzX3NpemUgKiAyKQorCXsKKwkgIHByaW50ZiAoIiBbJTZ0eF0gIDxJTlZBTElEIERBVEE+XG4iLCBvZmZzZXQpOworCSAgYnJlYWs7CisJfQorCisgICAgICBEd2FyZl9BZGRyIGJlZ2luOworICAgICAgRHdhcmZfQWRkciBlbmQ7CisgICAgICBpZiAoYWRkcmVzc19zaXplID09IDgpCisJeworCSAgYmVnaW4gPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKKwkgIGVuZCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiZWdpbiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOworCSAgZW5kID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7CisJICBpZiAoYmVnaW4gPT0gKER3YXJmX0FkZHIpICh1aW50MzJfdCkgLTEpCisJICAgIGJlZ2luID0gKER3YXJmX0FkZHIpIC0xbDsKKwl9CisKKyAgICAgIGlmIChiZWdpbiA9PSAoRHdhcmZfQWRkcikgLTFsKSAvKiBCYXNlIGFkZHJlc3MgZW50cnkuICAqLworCXByaW50ZiAoIiBbJTZ0eF0gIGJhc2UgYWRkcmVzcyAlIzAqIiBQUkl4TUFYICJcbiIsIG9mZnNldCwKKwkJMiArIChpbnQpIChhZGRyZXNzX3NpemUgKiAyKSwgKHVpbnRtYXhfdCkgZW5kKTsKKyAgICAgIGVsc2UgaWYgKGJlZ2luID09IDAgJiYgZW5kID09IDApIC8qIEVuZCBvZiBsaXN0IGVudHJ5LiAgKi8KKwlmaXJzdCA9IHRydWU7CisgICAgICBlbHNlCisJeworCSAgLyogV2UgaGF2ZSBhIGxvY2F0aW9uIGV4cHJlc3Npb24gZW50cnkuICAqLworCSAgdWludF9mYXN0MTZfdCBsZW4gPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKKworCSAgaWYgKGZpcnN0KQkJLyogRmlyc3QgZW50cnkgaW4gYSBsaXN0LiAgKi8KKwkgICAgcHJpbnRmICgiIFslNnR4XSAgJSMwKiIgUFJJeE1BWCAiLi4lIzAqIiBQUkl4TUFYLAorCQkgICAgb2Zmc2V0LAorCQkgICAgMiArIChpbnQpIChhZGRyZXNzX3NpemUgKiAyKSwgKHVpbnRtYXhfdCkgYmVnaW4sCisJCSAgICAyICsgKGludCkgKGFkZHJlc3Nfc2l6ZSAqIDIpLCAodWludG1heF90KSBlbmQpOworCSAgZWxzZQorCSAgICBwcmludGYgKCIgICAgICAgICAgICUjMCoiIFBSSXhNQVggIi4uJSMwKiIgUFJJeE1BWCwKKwkJICAgIDIgKyAoaW50KSAoYWRkcmVzc19zaXplICogMiksICh1aW50bWF4X3QpIGJlZ2luLAorCQkgICAgMiArIChpbnQpIChhZGRyZXNzX3NpemUgKiAyKSwgKHVpbnRtYXhfdCkgZW5kKTsKKworCSAgcHJpbnRfb3BzIChkYmcsIDEsIDE4ICsgKGFkZHJlc3Nfc2l6ZSAqIDQpLAorCQkgICAgIGFkZHJlc3Nfc2l6ZSwgbGVuLCByZWFkcCk7CisKKwkgIGZpcnN0ID0gZmFsc2U7CisJICByZWFkcCArPSBsZW47CisJfQorICAgIH0KK30KKworc3RydWN0IG1hY19jdWxpc3QKK3sKKyAgRHdhcmZfRGllIGRpZTsKKyAgRHdhcmZfT2ZmIG9mZnNldDsKKyAgRHdhcmZfRmlsZXMgKmZpbGVzOworICBzdHJ1Y3QgbWFjX2N1bGlzdCAqbmV4dDsKK307CisKKworc3RhdGljIGludAorbWFjX2NvbXBhcmUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKyAgc3RydWN0IG1hY19jdWxpc3QgKm0xID0gKHN0cnVjdCBtYWNfY3VsaXN0ICopIHAxOworICBzdHJ1Y3QgbWFjX2N1bGlzdCAqbTIgPSAoc3RydWN0IG1hY19jdWxpc3QgKikgcDI7CisKKyAgaWYgKG0xLT5vZmZzZXQgPCBtMi0+b2Zmc2V0KQorICAgIHJldHVybiAtMTsKKyAgaWYgKG0xLT5vZmZzZXQgPiBtMi0+b2Zmc2V0KQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfZGVidWdfbWFjaW5mb19zZWN0aW9uIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICAgIEdFbGZfRWhkciAqZWhkciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICAgIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyLCBEd2FyZiAqZGJnKQoreworICBwcmludGYgKGdldHRleHQgKCJcCitcbkRXQVJGIHNlY3Rpb24gJyVzJyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiOlxuIiksCisJICAiLmRlYnVnX21hY2luZm8iLCAodWludDY0X3QpIHNoZHItPnNoX29mZnNldCk7CisgIHB1dGNfdW5sb2NrZWQgKCdcbicsIHN0ZG91dCk7CisKKyAgLyogVGhlcmUgaXMgbm8gZnVuY3Rpb24gaW4gbGliZHcgdG8gaXRlcmF0ZSBvdmVyIHRoZSByYXcgY29udGVudCBvZgorICAgICB0aGUgc2VjdGlvbiBidXQgaXQgaXMgZWFzeSBlbm91Z2ggdG8gZG8uICAqLworICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmRfYnVmID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IG1hY3JvIGluZm9ybWF0aW9uIHNlY3Rpb24gZGF0YTogJXMiKSwKKwkgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEdldCB0aGUgc291cmNlIGZpbGUgaW5mb3JtYXRpb24gZm9yIGFsbCBDVXMuICAqLworICBEd2FyZl9PZmYgb2Zmc2V0OworICBEd2FyZl9PZmYgbmN1ID0gMDsKKyAgc2l6ZV90IGhzaXplOworICBzdHJ1Y3QgbWFjX2N1bGlzdCAqY3VsaXN0ID0gTlVMTDsKKyAgc2l6ZV90IG5jdWxpc3QgPSAwOworICB3aGlsZSAoZHdhcmZfbmV4dGN1IChkYmcsIG9mZnNldCA9IG5jdSwgJm5jdSwgJmhzaXplLCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKQorICAgIHsKKyAgICAgIER3YXJmX0RpZSBjdWRpZTsKKyAgICAgIGlmIChkd2FyZl9vZmZkaWUgKGRiZywgb2Zmc2V0ICsgaHNpemUsICZjdWRpZSkgPT0gTlVMTCkKKwljb250aW51ZTsKKworICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgICBpZiAoZHdhcmZfYXR0ciAoJmN1ZGllLCBEV19BVF9tYWNyb19pbmZvLCAmYXR0cikgPT0gTlVMTCkKKwljb250aW51ZTsKKworICAgICAgRHdhcmZfV29yZCBtYWNvZmY7CisgICAgICBpZiAoZHdhcmZfZm9ybXVkYXRhICgmYXR0ciwgJm1hY29mZikgIT0gMCkKKwljb250aW51ZTsKKworICAgICAgc3RydWN0IG1hY19jdWxpc3QgKm5ld3AgPSAoc3RydWN0IG1hY19jdWxpc3QgKikgYWxsb2NhIChzaXplb2YgKCpuZXdwKSk7CisgICAgICBuZXdwLT5kaWUgPSBjdWRpZTsKKyAgICAgIG5ld3AtPm9mZnNldCA9IG1hY29mZjsKKyAgICAgIG5ld3AtPmZpbGVzID0gTlVMTDsKKyAgICAgIG5ld3AtPm5leHQgPSBjdWxpc3Q7CisgICAgICBjdWxpc3QgPSBuZXdwOworICAgICAgKytuY3VsaXN0OworICAgIH0KKworICAvKiBDb252ZXJ0IHRoZSBsaXN0IGludG8gYW4gYXJyYXkgZm9yIGVhc2llciBjb25zdW1wdGlvbi4gICovCisgIHN0cnVjdCBtYWNfY3VsaXN0ICpjdXMgPSAoc3RydWN0IG1hY19jdWxpc3QgKikgYWxsb2NhICgobmN1bGlzdCArIDEpCisJCQkJCQkJICogc2l6ZW9mICgqY3VzKSk7CisgIC8qIEFkZCBzZW50aW5lbC4gICovCisgIGN1c1tuY3VsaXN0XS5vZmZzZXQgPSBkYXRhLT5kX3NpemU7CisgIGlmIChuY3VsaXN0ID4gMCkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBjbnQgPSBuY3VsaXN0IC0gMTsgY3VsaXN0ICE9IE5VTEw7IC0tY250KQorCXsKKwkgIGFzc2VydCAoY250IDwgbmN1bGlzdCk7CisJICBjdXNbY250XSA9ICpjdWxpc3Q7CisJICBjdWxpc3QgPSBjdWxpc3QtPm5leHQ7CisJfQorCisgICAgICAvKiBTb3J0IHRoZSBhcnJheSBhY2NvcmRpbmcgdG8gdGhlIG9mZnNldCBpbiB0aGUgLmRlYnVnX21hY2luZm8KKwkgc2VjdGlvbi4gIE5vdGUgd2Uga2VlcCB0aGUgc2VudGluZWwgYXQgdGhlIGVuZC4gICovCisgICAgICBxc29ydCAoY3VzLCBuY3VsaXN0LCBzaXplb2YgKCpjdXMpLCBtYWNfY29tcGFyZSk7CisgICAgfQorCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlYWRwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWY7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlYWRlbmRwID0gcmVhZHAgKyBkYXRhLT5kX3NpemU7CisgIGludCBsZXZlbCA9IDE7CisKKyAgd2hpbGUgKHJlYWRwIDwgcmVhZGVuZHApCisgICAgeworICAgICAgdW5zaWduZWQgaW50IG9wY29kZSA9ICpyZWFkcCsrOworICAgICAgdW5zaWduZWQgaW50IHUxMjg7CisgICAgICB1bnNpZ25lZCBpbnQgdTEyOF8yOworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kcDsKKworICAgICAgc3dpdGNoIChvcGNvZGUpCisJeworCWNhc2UgRFdfTUFDSU5GT19kZWZpbmU6CisJY2FzZSBEV19NQUNJTkZPX3VuZGVmOgorCWNhc2UgRFdfTUFDSU5GT192ZW5kb3JfZXh0OgorCSAgLyogIEZvciB0aGUgZmlyc3QgdHdvIG9wY29kZXMgdGhlIHBhcmFtZXRlcnMgYXJlCisJICAgICAgICBsaW5lLCBzdHJpbmcKKwkgICAgICBGb3IgdGhlIGxhdHRlcgorCSAgICAgICAgbnVtYmVyLCBzdHJpbmcuCisJICAgICAgV2UgY2FuIHRyZWF0IHRoZXNlIGNhc2VzIHRvZ2V0aGVyLiAgKi8KKwkgIGdldF91bGViMTI4ICh1MTI4LCByZWFkcCk7CisKKwkgIGVuZHAgPSBtZW1jaHIgKHJlYWRwLCAnXDAnLCByZWFkZW5kcCAtIHJlYWRwKTsKKwkgIGlmIChlbmRwID09IE5VTEwpCisJICAgIHsKKwkgICAgICBwcmludGYgKGdldHRleHQgKCJcCislKnMqKiogbm9uLXRlcm1pbmF0ZWQgc3RyaW5nIGF0IGVuZCBvZiBzZWN0aW9uIiksCisJCSAgICAgIGxldmVsLCAiIik7CisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIGlmIChvcGNvZGUgPT0gRFdfTUFDSU5GT19kZWZpbmUpCisJICAgIHByaW50ZiAoIiUqcyNkZWZpbmUgJXMsIGxpbmUgJXVcbiIsCisJCSAgICBsZXZlbCwgIiIsIChjaGFyICopIHJlYWRwLCB1MTI4KTsKKwkgIGVsc2UgaWYgKG9wY29kZSA9PSBEV19NQUNJTkZPX3VuZGVmKQorCSAgICBwcmludGYgKCIlKnMjdW5kZWYgJXMsIGxpbmUgJXVcbiIsCisJCSAgICBsZXZlbCwgIiIsIChjaGFyICopIHJlYWRwLCB1MTI4KTsKKwkgIGVsc2UKKwkgICAgcHJpbnRmICgiICN2ZW5kb3ItZXh0ICVzLCBudW1iZXIgJXVcbiIsIChjaGFyICopIHJlYWRwLCB1MTI4KTsKKworCSAgcmVhZHAgPSBlbmRwICsgMTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19NQUNJTkZPX3N0YXJ0X2ZpbGU6CisJICAvKiBUaGUgdHdvIHBhcmFtZXRlcnMgYXJlIGxpbmUgYW5kIGZpbGUgaW5kZXgsIGluIHRoaXMgb3JkZXIuICAqLworCSAgZ2V0X3VsZWIxMjggKHUxMjgsIHJlYWRwKTsKKwkgIGdldF91bGViMTI4ICh1MTI4XzIsIHJlYWRwKTsKKworCSAgLyogRmluZCB0aGUgQ1UgRElFIGZvciB0aGlzIGZpbGUuICAqLworCSAgc2l6ZV90IG1hY29mZiA9IHJlYWRwIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWY7CisJICBjb25zdCBjaGFyICpmbmFtZSA9ICI/Pz8iOworCSAgaWYgKG1hY29mZiA+PSBjdXNbMF0ub2Zmc2V0KQorCSAgICB7CisJICAgICAgd2hpbGUgKG1hY29mZiA+PSBjdXNbMV0ub2Zmc2V0KQorCQkrK2N1czsKKworCSAgICAgIGlmIChjdXNbMF0uZmlsZXMgPT0gTlVMTAorCQkmJiBkd2FyZl9nZXRzcmNmaWxlcyAoJmN1c1swXS5kaWUsICZjdXNbMF0uZmlsZXMsIE5VTEwpICE9IDApCisJCWN1c1swXS5maWxlcyA9IChEd2FyZl9GaWxlcyAqKSAtMWw7CisKKwkgICAgICBpZiAoY3VzWzBdLmZpbGVzICE9IChEd2FyZl9GaWxlcyAqKSAtMWwpCisJCWZuYW1lID0gKGR3YXJmX2ZpbGVzcmMgKGN1c1swXS5maWxlcywgdTEyOF8yLCBOVUxMLCBOVUxMKQorCQkJID86ICI/Pz8iKTsKKwkgICAgfQorCisJICBwcmludGYgKCIlKnNzdGFydF9maWxlICV1LCBbJXVdICVzXG4iLAorCQkgIGxldmVsLCAiIiwgdTEyOCwgdTEyOF8yLCBmbmFtZSk7CisJICArK2xldmVsOworCSAgYnJlYWs7CisKKwljYXNlIERXX01BQ0lORk9fZW5kX2ZpbGU6CisJICAtLWxldmVsOworCSAgcHJpbnRmICgiJSpzZW5kX2ZpbGVcbiIsIGxldmVsLCAiIik7CisJICAvKiBOb3RoaW5nIG1vcmUgdG8gZG8uICAqLworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgLy8gWFhYIGdjYyBzZWVtcyB0byBnZW5lcmF0ZSBmaWxlcyB3aXRoIGEgdHJhaWxpbmcgemVyby4KKwkgIGlmIChvcGNvZGUgIT0gMCB8fCByZWFkcCAhPSByZWFkZW5kcCkKKwkgICAgcHJpbnRmICgiJSpzKioqIGludmFsaWQgb3Bjb2RlICV1XG4iLCBsZXZlbCwgIiIsIG9wY29kZSk7CisJICBicmVhazsKKwl9CisgICAgfQorfQorCisKKy8qIENhbGxiYWNrIGZvciBwcmludGluZyBnbG9iYWwgbmFtZXMuICAqLworc3RhdGljIGludAorcHJpbnRfcHVibmFtZXMgKER3YXJmICpkYmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBEd2FyZl9HbG9iYWwgKmdsb2JhbCwKKwkJdm9pZCAqYXJnKQoreworICBpbnQgKm5wID0gKGludCAqKSBhcmc7CisKKyAgcHJpbnRmIChnZXR0ZXh0ICgiIFslNWRdIERJRSBvZmZzZXQ6ICU2IiBQUklkNjQKKwkJICAgIiwgQ1UgRElFIG9mZnNldDogJTYiIFBSSWQ2NCAiLCBuYW1lOiAlc1xuIiksCisJICAoKm5wKSsrLCBnbG9iYWwtPmRpZV9vZmZzZXQsIGdsb2JhbC0+Y3Vfb2Zmc2V0LCBnbG9iYWwtPm5hbWUpOworCisgIHJldHVybiAwOworfQorCisKKy8qIFByaW50IHRoZSBrbm93biBleHBvcnRlZCBzeW1ib2xzIGluIHRoZSBEV0FSRiBzZWN0aW9uICcuZGVidWdfcHVibmFtZXMnLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9kZWJ1Z19wdWJuYW1lc19zZWN0aW9uIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgICAgICBHRWxmX0VoZHIgKmVoZHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICAgICAgRWxmX1NjbiAqc2NuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSAgICAgIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKK3sKKyAgcHJpbnRmIChnZXR0ZXh0ICgiXG5EV0FSRiBzZWN0aW9uICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIjpcbiIpLAorCSAgIi5kZWJ1Z19wdWJuYW1lcyIsICh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0KTsKKworICBpbnQgbiA9IDA7CisgICh2b2lkKSBkd2FyZl9nZXRwdWJuYW1lcyAoZGJnLCBwcmludF9wdWJuYW1lcywgJm4sIDApOworfQorCisvKiBQcmludCB0aGUgY29udGVudCBvZiB0aGUgRFdBUkYgc3RyaW5nIHNlY3Rpb24gJy5kZWJ1Z19zdHInLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9kZWJ1Z19zdHJfc2VjdGlvbiAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJIEdFbGZfRWhkciAqZWhkciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisJCQkgRWxmX1NjbiAqc2NuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKKwkJCSBHRWxmX1NoZHIgKnNoZHIsIER3YXJmICpkYmcpCit7CisgIC8qIENvbXB1dGUgZmxvb3IobG9nMTYoc2hkci0+c2hfc2l6ZSkpLiAgKi8KKyAgR0VsZl9BZGRyIHRtcCA9IHNoZHItPnNoX3NpemU7CisgIGludCBkaWdpdHMgPSAxOworICB3aGlsZSAodG1wID49IDE2KQorICAgIHsKKyAgICAgICsrZGlnaXRzOworICAgICAgdG1wID4+PSA0OworICAgIH0KKyAgZGlnaXRzID0gTUFYICg0LCBkaWdpdHMpOworCisgIHByaW50ZiAoZ2V0dGV4dCAoIlxuRFdBUkYgc2VjdGlvbiAnJXMnIGF0IG9mZnNldCAlIyIgUFJJeDY0ICI6XG4iCisJCSAgICIgJSpzICBTdHJpbmdcbiIpLAorCSAgIi5kZWJ1Z19zdHIiLCAodWludDY0X3QpIHNoZHItPnNoX29mZnNldCwKKwkgIC8qIFRSQU5TOiB0aGUgZGVidWdzdHJ8IHByZWZpeCBtYWtlcyB0aGUgc3RyaW5nIHVuaXF1ZS4gICovCisJICBkaWdpdHMgKyAyLCBzZ2V0dGV4dCAoImRlYnVnc3RyfE9mZnNldCIpKTsKKworICBEd2FyZl9PZmYgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8IHNoZHItPnNoX3NpemUpCisgICAgeworICAgICAgc2l6ZV90IGxlbjsKKyAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IGR3YXJmX2dldHN0cmluZyAoZGJnLCBvZmZzZXQsICZsZW4pOworICAgICAgaWYgKHN0ciA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoZ2V0dGV4dCAoIiAqKiogZXJyb3Igd2hpbGUgcmVhZGluZyBzdHJpbmdzOiAlc1xuIiksCisJCSAgZHdhcmZfZXJybXNnICgtMSkpOworCSAgYnJlYWs7CisJfQorCisgICAgICBwcmludGYgKCIgWyUqIiBQUkl4NjQgIl0gIFwiJXNcIlxuIiwgZGlnaXRzLCAodWludDY0X3QpIG9mZnNldCwgc3RyKTsKKworICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9kZWJ1ZyAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkcikKK3sKKyAgLyogRmluZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBzZWN0aW9ucy4gIEZvciB0aGlzIHdlIGhhdmUgdG8KKyAgICAgc2VhcmNoIHRocm91Z2ggdGhlIHNlY3Rpb24gdGFibGUuICAqLworICBEd2FyZiAqZGJnOworICBFbGZfU2NuICpzY247CisgIHNpemVfdCBzaHN0cm5keDsKKworICAvKiBCZWZvcmUgd2Ugc3RhcnQgdGhlIHJlYWwgd29yayBnZXQgYSBkZWJ1ZyBjb250ZXh0IGRlc2NyaXB0b3IuICAqLworICBkYmcgPSBkd2FyZl9iZWdpbl9lbGYgKGVibC0+ZWxmLCBEV0FSRl9DX1JFQUQsIE5VTEwpOworICBpZiAoZGJnID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IGRlYnVnIGNvbnRleHQgZGVzY3JpcHRvcjogJXMiKSwKKwkgICAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLworICBpZiAoZWxmX2dldHNoc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7CisKKyAgc2NuID0gTlVMTDsKKyAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgLyogSGFuZGxlIHRoZSBzZWN0aW9uIGlmIGl0IGlzIHBhcnQgb2YgdGhlIHZlcnNpb25pbmcgaGFuZGxpbmcuICAqLworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIGlmIChzaGRyICE9IE5VTEwgfHwgc2hkci0+c2hfdHlwZSAhPSBTSFRfUFJPR0JJVFMpCisJeworCSAgc3RhdGljIGNvbnN0IHN0cnVjdAorCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICBlbnVtIHNlY3Rpb25fZSBiaXRtYXNrOworCSAgICB2b2lkICgqZnApIChFYmwgKiwgR0VsZl9FaGRyICosIEVsZl9TY24gKiwgR0VsZl9TaGRyICosIER3YXJmICopOworCSAgfSBkZWJ1Z19zZWN0aW9uc1tdID0KKwkgICAgeworI2RlZmluZSBORVdfU0VDVElPTihuYW1lKSBcCisJICAgICAgeyAiLmRlYnVnXyIgI25hbWUsIHNlY3Rpb25fIyNuYW1lLCBwcmludF9kZWJ1Z18jI25hbWUjI19zZWN0aW9uIH0KKwkgICAgICBORVdfU0VDVElPTiAoYWJicmV2KSwKKwkgICAgICBORVdfU0VDVElPTiAoYXJhbmdlcyksCisJICAgICAgTkVXX1NFQ1RJT04gKGZyYW1lKSwKKwkgICAgICBORVdfU0VDVElPTiAoaW5mbyksCisJICAgICAgTkVXX1NFQ1RJT04gKGxpbmUpLAorCSAgICAgIE5FV19TRUNUSU9OIChsb2MpLAorCSAgICAgIE5FV19TRUNUSU9OIChwdWJuYW1lcyksCisJICAgICAgTkVXX1NFQ1RJT04gKHN0ciksCisJICAgICAgTkVXX1NFQ1RJT04gKG1hY2luZm8pLAorCSAgICAgIE5FV19TRUNUSU9OIChyYW5nZXMpLAorCSAgICAgIHsgIi5laF9mcmFtZSIsIHNlY3Rpb25fZnJhbWUsIHByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24gfQorCSAgICB9OworCSAgY29uc3QgaW50IG5kZWJ1Z19zZWN0aW9ucyA9IChzaXplb2YgKGRlYnVnX3NlY3Rpb25zKQorCQkJCSAgICAgICAvIHNpemVvZiAoZGVidWdfc2VjdGlvbnNbMF0pKTsKKwkgIGNvbnN0IGNoYXIgKm5hbWUgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsCisJCQkJCSBzaGRyLT5zaF9uYW1lKTsKKwkgIGludCBuOworCisJICBmb3IgKG4gPSAwOyBuIDwgbmRlYnVnX3NlY3Rpb25zOyArK24pCisJICAgIGlmIChzdHJjbXAgKG5hbWUsIGRlYnVnX3NlY3Rpb25zW25dLm5hbWUpID09IDApCisJICAgICAgeworCQlpZiAocHJpbnRfZGVidWdfc2VjdGlvbnMgJiBkZWJ1Z19zZWN0aW9uc1tuXS5iaXRtYXNrKQorCQkgIGRlYnVnX3NlY3Rpb25zW25dLmZwIChlYmwsIGVoZHIsIHNjbiwgc2hkciwgZGJnKTsKKwkJYnJlYWs7CisJICAgICAgfQorCX0KKyAgICB9CisKKyAgLyogV2UgYXJlIGRvbmUgd2l0aCB0aGUgRFdBUkYgaGFuZGxpbmcuICAqLworICBkd2FyZl9lbmQgKGRiZyk7Cit9CisKKworc3RhdGljIHZvaWQKK2hhbmRsZV9ub3RlcyAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkcikKK3sKKyAgaW50IGNsYXNzID0gZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpOworICBzaXplX3QgY250OworCisgIC8qIFdlIGhhdmUgdG8gbG9vayB0aHJvdWdoIHRoZSBwcm9ncmFtIGhlYWRlciB0byBmaW5kIHRoZSBub3RlCisgICAgIHNlY3Rpb25zLiAgVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUuICAqLworICBmb3IgKGNudCA9IDA7IGNudCA8IGVoZHItPmVfcGhudW07ICsrY250KQorICAgIHsKKyAgICAgIEdFbGZfUGhkciBtZW07CisgICAgICBHRWxmX1BoZHIgKnBoZHIgPSBnZWxmX2dldHBoZHIgKGVibC0+ZWxmLCBjbnQsICZtZW0pOworCisgICAgICBpZiAocGhkciA9PSBOVUxMIHx8IHBoZHItPnBfdHlwZSAhPSBQVF9OT1RFKQorCS8qIE5vdCB3aGF0IHdlIGFyZSBsb29raW5nIGZvci4gICovCisJY29udGludWU7CisKKyAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIlwKK1xuTm90ZSBzZWdtZW50IG9mICUiIFBSSWQ2NCAiIGJ5dGVzIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiOlxuIiksCisJICAgICAgcGhkci0+cF9maWxlc3osIHBoZHItPnBfb2Zmc2V0KTsKKworICAgICAgY2hhciAqbm90ZW1lbSA9IGdlbGZfcmF3Y2h1bmsgKGVibC0+ZWxmLCBwaGRyLT5wX29mZnNldCwgcGhkci0+cF9maWxlc3opOworICAgICAgaWYgKG5vdGVtZW0gPT0gTlVMTCkKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAorCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvbjogJXMiKSwKKwkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKworICAgICAgZnB1dHNfdW5sb2NrZWQgKGdldHRleHQgKCIgIE93bmVyICAgICAgICAgIERhdGEgc2l6ZSAgVHlwZVxuIiksIHN0ZG91dCk7CisKKworICAgICAgLyogSGFuZGxlIHRoZSBub3RlIHNlY3Rpb24gY29udGVudC4gIEl0IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlCisJIGVudHJpZXMgZWFjaCBvZiB3aGljaCBjb25zaXN0cyBvZiBmaXZlIHBhcnRzOgorCisJIC0gYSAzMi1iaXQgbmFtZSBsZW5ndGgKKwkgLSBhIDMyLWJpdCBkZXNjcmlwdG9yIGxlbmd0aAorCSAtIGEgMzItYml0IHR5cGUgZmllbGQKKwkgLSB0aGUgTlVMLXRlcm1pbmF0ZWQgbmFtZSwgbGVuZ3RoIGFzIHNwZWNpZmllZCBpbiB0aGUgZmlyc3QgZmllbGQKKwkgLSB0aGUgZGVzY3JpcHRvciwgbGVuZ3RoIGFzIHNwZWNpZmllZCBpbiB0aGUgc2Vjb25kIGZpZWxkCisKKwkgVGhlIHZhcmlhYmxlIHNpemVkIGZpZWxkcyBhcmUgcGFkZGVkIHRvIDMyLSBvciA2NC1iaXRzCisJIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgMzItIG9yIDY0LWJpdCBFTEYgZmlsZS4KKyAgICAgICovCisgICAgICAvLyBYWFggV2hpY2ggNjQtYml0IGFyY2hzIG5lZWQgOC1ieXRlIGFsaWdubWVudD8gIHg4Ni02NCBkb2VzIG5vdC4KKyAgICAgIHNpemVfdCBhbGlnbiA9IGNsYXNzID09IEVMRkNMQVNTMzIgPyA0IDogNDsgLy8gWFhYIDg7CisjZGVmaW5lIEFMSUdORURfTEVOKGxlbikgKCgobGVuKSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSkpCisKKyAgICAgIHNpemVfdCBpZHggPSAwOworICAgICAgd2hpbGUgKGlkeCA8IHBoZHItPnBfZmlsZXN6KQorCXsKKwkgIC8qIFhYWCBIYW5kbGUgNjQtYml0IG5vdGUgc2VjdGlvbiBlbnRyaWVzIGNvcnJlY3RseS4gICovCisJICBzdHJ1Y3QKKwkgIHsKKwkgICAgdWludDMyX3QgbmFtZXN6OworCSAgICB1aW50MzJfdCBkZXNjc3o7CisJICAgIHVpbnQzMl90IHR5cGU7CisJICAgIGNoYXIgbmFtZVswXTsKKwkgIH0gKm5vdGVlbnRyeSA9IChfX3R5cGVvZiAobm90ZWVudHJ5KSkgKG5vdGVtZW0gKyBpZHgpOworCisJICBpZiAoaWR4ICsgMTIgPiBwaGRyLT5wX2ZpbGVzegorCSAgICAgIHx8IChpZHggKyAxMiArIEFMSUdORURfTEVOIChub3RlZW50cnktPm5hbWVzeikKKwkJICArIEFMSUdORURfTEVOIChub3RlZW50cnktPmRlc2NzeikgPiBwaGRyLT5wX2ZpbGVzeikpCisJICAgIC8qIFRoaXMgZW50cnkgaXNuJ3QgY29tcGxldGVseSBjb250YWluZWQgaW4gdGhlIG5vdGUKKwkgICAgICAgc2VjdGlvbi4gIElnbm9yZSBpdC4gICovCisJICAgIGJyZWFrOworCisJICBjaGFyIGJ1ZlsxMDBdOworCSAgY2hhciBidWYyWzEwMF07CisJICBwcmludGYgKGdldHRleHQgKCIgICUtMTMuKnMgICU5IiBQUklkMzIgIiAgJXNcbiIpLAorCQkgIChpbnQpIG5vdGVlbnRyeS0+bmFtZXN6LCBub3RlZW50cnktPm5hbWUsCisJCSAgbm90ZWVudHJ5LT5kZXNjc3osCisJCSAgZWhkci0+ZV90eXBlID09IEVUX0NPUkUKKwkJICA/IGVibF9jb3JlX25vdGVfdHlwZV9uYW1lIChlYmwsIG5vdGVlbnRyeS0+dHlwZSwKKwkJCQkJICAgICBidWYsIHNpemVvZiAoYnVmKSkKKwkJICA6IGVibF9vYmplY3Rfbm90ZV90eXBlX25hbWUgKGVibCwgbm90ZWVudHJ5LT50eXBlLAorCQkJCQkgICAgICAgYnVmMiwgc2l6ZW9mIChidWYyKSkpOworCisJICAvKiBGaWx0ZXIgb3V0IGludmFsaWQgZW50cmllcy4gICovCisJICBpZiAobWVtY2hyIChub3RlZW50cnktPm5hbWUsICdcMCcsIG5vdGVlbnRyeS0+bmFtZXN6KSAhPSBOVUxMCisJICAgICAgLyogWFhYIEZvciBub3cgaGVscCBicm9rZW4gTGludXgga2VybmVscy4gICovCisJICAgICAgfHwgMSkKKwkgICAgeworCSAgICAgIGlmIChlaGRyLT5lX3R5cGUgPT0gRVRfQ09SRSkKKwkJZWJsX2NvcmVfbm90ZSAoZWJsLCBub3RlZW50cnktPm5hbWUsIG5vdGVlbnRyeS0+dHlwZSwKKwkJCSAgICAgICBub3RlZW50cnktPmRlc2NzeiwKKwkJCSAgICAgICAmbm90ZWVudHJ5LT5uYW1lW0FMSUdORURfTEVOIChub3RlZW50cnktPm5hbWVzeildKTsKKwkgICAgICBlbHNlCisJCWVibF9vYmplY3Rfbm90ZSAoZWJsLCBub3RlZW50cnktPm5hbWUsIG5vdGVlbnRyeS0+dHlwZSwKKwkJCQkgbm90ZWVudHJ5LT5kZXNjc3osCisJCQkJICZub3RlZW50cnktPm5hbWVbQUxJR05FRF9MRU4gKG5vdGVlbnRyeS0+bmFtZXN6KV0pOworCSAgICB9CisKKwkgIC8qIE1vdmUgdG8gdGhlIG5leHQgZW50cnkuICAqLworCSAgaWR4ICs9ICgxMiArIEFMSUdORURfTEVOIChub3RlZW50cnktPm5hbWVzeikKKwkJICArIEFMSUdORURfTEVOIChub3RlZW50cnktPmRlc2NzeikpOworCX0KKworICAgICAgZ2VsZl9mcmVlY2h1bmsgKGVibC0+ZWxmLCBub3RlbWVtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvc2VjdGlvbmhhc2guYyBiL3NyYy9zZWN0aW9uaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDFjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2VjdGlvbmhhc2guYwpAQCAtMCwwICsxLDY5IEBACisvKiBTZWN0aW9uIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGVsZi1rbm93bGVkZ2UuaD4KKyNpbmNsdWRlIDxsZC5oPgorCisKKy8qIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHNlY3Rpb25zLiAgKi8KK3N0YXRpYyBpbnQKK3NjbmhlYWRfY29tcGFyZSAoc3RydWN0IHNjbmhlYWQgKm9uZSwgc3RydWN0IHNjbmhlYWQgKnR3bykKK3sKKyAgaW50IHJlc3VsdCA9IHN0cmNtcCAob25lLT5uYW1lLCB0d28tPm5hbWUpOworCisgIGlmIChyZXN1bHQgPT0gMCkKKyAgICB7CisgICAgICByZXN1bHQgPSBvbmUtPnR5cGUgLSB0d28tPnR5cGU7CisKKyAgICAgIGlmIChyZXN1bHQgPT0gMCkKKwl7CisJICBHRWxmX1N4d29yZCBkaWZmID0gKFNIX0ZMQUdTX0lNUE9SVEFOVCAob25lLT5mbGFncykKKwkJCSAgICAgLSBTSF9GTEFHU19JTVBPUlRBTlQgKHR3by0+ZmxhZ3MpKTsKKwkgIHJlc3VsdCA9IGRpZmYgPCAwID8gLTEgOiBkaWZmID09IDAgPyAwIDogMTsKKworCSAgaWYgKHJlc3VsdCA9PSAwKQorCSAgICB7CisJICAgICAgcmVzdWx0ID0gb25lLT5lbnRzaXplIC0gdHdvLT5lbnRzaXplOworCisJICAgICAgaWYgKHJlc3VsdCA9PSAwKQorCQl7CisJCSAgcmVzdWx0ID0gKG9uZS0+Z3JwX3NpZ25hdHVyZSA9PSBOVUxMCisJCQkgICAgPyAodHdvLT5ncnBfc2lnbmF0dXJlID09IE5VTEwgPyAwIDogLTEpCisJCQkgICAgOiAodHdvLT5ncnBfc2lnbmF0dXJlID09IE5VTEwKKwkJCSAgICAgICA/IDEgOiBzdHJjbXAgKG9uZS0+Z3JwX3NpZ25hdHVyZSwKKwkJCQkJICAgICB0d28tPmdycF9zaWduYXR1cmUpKSk7CisKKwkJICBpZiAocmVzdWx0ID09IDApCisJCSAgICByZXN1bHQgPSBvbmUtPmtpbmQgLSB0d28tPmtpbmQ7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBzZWN0aW9uIGhhc2ggdGFibGUuICAqLworI2RlZmluZSBUWVBFIHN0cnVjdCBzY25oZWFkICoKKyNkZWZpbmUgTkFNRSBsZF9zZWN0aW9uX3RhYgorI2RlZmluZSBJVEVSQVRFIDEKKyNkZWZpbmUgQ09NUEFSRShhLCBiKSBzY25oZWFkX2NvbXBhcmUgKGEsIGIpCisKKyNpbmNsdWRlICIuLi9saWIvZHluYW1pY3NpemVoYXNoLmMiCmRpZmYgLS1naXQgYS9zcmMvc2VjdGlvbmhhc2guaCBiL3NyYy9zZWN0aW9uaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYmNiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2VjdGlvbmhhc2guaApAQCAtMCwwICsxLDIzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZm5kZWYgU0VDVElPTkhBU0hfSAorI2RlZmluZSBTRUNUSU9OSEFTSF9ICTEKKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBzZWN0aW9uIGhhc2ggdGFibGUuICAqLworI2RlZmluZSBUWVBFIHN0cnVjdCBzY25oZWFkICoKKyNkZWZpbmUgTkFNRSBsZF9zZWN0aW9uX3RhYgorI2RlZmluZSBJVEVSQVRFIDEKKyNpbmNsdWRlIDxkeW5hbWljc2l6ZWhhc2guaD4KKworI2VuZGlmCS8qIHNlY3Rpb25oYXNoLmggKi8KZGlmZiAtLWdpdCBhL3NyYy9zaXplLmMgYi9zcmMvc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYzdiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2l6ZS5jCkBAIC0wLDAgKzEsNjgyIEBACisvKiBQcmludCBzaXplIGluZm9ybWF0aW9uIGZyb20gRUxGIGZpbGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhcmdwLmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPGxpYmludGwuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxtY2hlY2suaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpb19leHQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPHN5c3RlbS5oPgorCisKKy8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCitzdGF0aWMgdm9pZCBwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7Cit2b2lkICgqYXJncF9wcm9ncmFtX3ZlcnNpb25faG9vaykgKEZJTEUgKiwgc3RydWN0IGFyZ3Bfc3RhdGUgKikgPSBwcmludF92ZXJzaW9uOworCisvKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLworY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzID0gUEFDS0FHRV9CVUdSRVBPUlQ7CisKKworLyogVmFsdWVzIGZvciB0aGUgcGFyYW1ldGVycyB3aGljaCBoYXZlIG5vIHNob3J0IGZvcm0uICAqLworI2RlZmluZSBPUFRfRk9STUFUCTB4MTAwCisjZGVmaW5lIE9QVF9SQURJWAkweDEwMQorCisvKiBEZWZpbml0aW9ucyBvZiBhcmd1bWVudHMgZm9yIGFyZ3AgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KK3sKKyAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiT3V0cHV0IGZvcm1hdDoiKSwgMCB9LAorICB7ICJmb3JtYXQiLCBPUFRfRk9STUFULCAiRk9STUFUIiwgMCwKKyAgICBOXygiVXNlIHRoZSBvdXRwdXQgZm9ybWF0IEZPUk1BVC4gIEZPUk1BVCBjYW4gYmUgYGJzZCcgb3IgYHN5c3YnLiAgIgorICAgICAgICJUaGUgZGVmYXVsdCBpcyBgYnNkJyIpLCAwIH0sCisgIHsgTlVMTCwgJ0EnLCBOVUxMLCAwLCBOXygiU2FtZSBhcyBgLS1mb3JtYXQ9c3lzdiciKSwgMCB9LAorICB7IE5VTEwsICdCJywgTlVMTCwgMCwgTl8oIlNhbWUgYXMgYC0tZm9ybWF0PWJzZCciKSwgMCB9LAorICB7ICJyYWRpeCIsIE9QVF9SQURJWCwgIlJBRElYIiwgMCwgTl8oIlVzZSBSQURJWCBmb3IgcHJpbnRpbmcgc3ltYm9sIHZhbHVlcyIpLAorICAgIDB9LAorICB7IE5VTEwsICdkJywgTlVMTCwgMCwgTl8oIlNhbWUgYXMgYC0tcmFkaXg9MTAnIiksIDAgfSwKKyAgeyBOVUxMLCAnbycsIE5VTEwsIDAsIE5fKCJTYW1lIGFzIGAtLXJhZGl4PTgnIiksIDAgfSwKKyAgeyBOVUxMLCAneCcsIE5VTEwsIDAsIE5fKCJTYW1lIGFzIGAtLXJhZGl4PTE2JyIpLCAwIH0sCisgIHsgTlVMTCwgJ2YnLCBOVUxMLCAwLAorICAgIE5fKCJTaW1pbGFyIHRvIGAtLWZvcm1hdD1zeXN2JyBvdXRwdXQgYnV0IGluIG9uZSBsaW5lIiksIDAgfSwKKworICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgb3B0aW9uczoiKSwgMCB9LAorICB7IE5VTEwsICdGJywgTlVMTCwgMCwKKyAgICBOXygiUHJpbnQgc2l6ZSBhbmQgcGVybWlzc2lvbiBmbGFncyBmb3IgbG9hZGFibGUgc2VnbWVudHMiKSwgMCB9LAorICB7ICJ0b3RhbHMiLCAndCcsIE5VTEwsIDAsIE5fKCJEaXNwbGF5IHRoZSB0b3RhbCBzaXplcyAoYnNkIG9ubHkpIiksIDAgfSwKKyAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KK307CisKKy8qIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uICAqLworc3RhdGljIGNvbnN0IGNoYXIgZG9jW10gPSBOXygiXAorTGlzdCBzZWN0aW9uIHNpemVzIG9mIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iKTsKKworLyogU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgYXJnc19kb2NbXSA9IE5fKCJbRklMRS4uLl0iKTsKKworLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCitzdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Cit7CisgIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworCisvKiBQcmludCBzeW1ib2xzIGluIGZpbGUgbmFtZWQgRk5BTUUuICAqLworc3RhdGljIGludCBwcm9jZXNzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lKTsKKworLyogSGFuZGxlIGNvbnRlbnQgb2YgYXJjaGl2ZS4gICovCitzdGF0aWMgaW50IGhhbmRsZV9hciAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSk7CisKKy8qIEhhbmRsZSBFTEYgZmlsZS4gICovCitzdGF0aWMgdm9pZCBoYW5kbGVfZWxmIChFbGYgKmVsZiwgY29uc3QgY2hhciAqZnVsbG5hbWUsIGNvbnN0IGNoYXIgKmZuYW1lKTsKKworLyogU2hvdyB0b3RhbCBzaXplLiAgKi8KK3N0YXRpYyB2b2lkIHNob3dfYnNkX3RvdGFscyAodm9pZCk7CisKKyNkZWZpbmUgSU5URVJOQUxfRVJST1IoZm5hbWUpIFwKKyAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoIiVzOiBJTlRFUk5BTCBFUlJPUiAlZCAoJXMtJXMpOiAlcyIpLCAgICAgIFwKKwkgZm5hbWUsIF9fTElORV9fLCBWRVJTSU9OLCBfX0RBVEVfXywgZWxmX2Vycm1zZyAoLTEpKQorCisKKy8qIFVzZXItc2VsZWN0YWJsZSBvcHRpb25zLiAgKi8KKworLyogVGhlIHNlbGVjdGVkIG91dHB1dCBmb3JtYXQuICAqLworc3RhdGljIGVudW0KK3sKKyAgZm9ybWF0X2JzZCA9IDAsCisgIGZvcm1hdF9zeXN2LAorICBmb3JtYXRfc3lzdl9vbmVfbGluZSwKKyAgZm9ybWF0X3NlZ21lbnRzCit9IGZvcm1hdDsKKworLyogUmFkaXggZm9yIHByaW50ZWQgbnVtYmVycy4gICovCitzdGF0aWMgZW51bQoreworICByYWRpeF9kZWNpbWFsID0gMCwKKyAgcmFkaXhfaGV4LAorICByYWRpeF9vY3RhbAorfSByYWRpeDsKKworCisvKiBNYXBwaW5nIG9mIHJhZGl4IGFuZCBiaW5hcnkgY2xhc3MgdG8gbGVuZ3RoLiAgKi8KK3N0YXRpYyBjb25zdCBpbnQgbGVuZ3RoX21hcFsyXVszXSA9Cit7CisgIFtFTEZDTEFTUzMyIC0gMV0gPQorICB7CisgICAgW3JhZGl4X2hleF0gPSA4LAorICAgIFtyYWRpeF9kZWNpbWFsXSA9IDEwLAorICAgIFtyYWRpeF9vY3RhbF0gPSAxMQorICB9LAorICBbRUxGQ0xBU1M2NCAtIDFdID0KKyAgeworICAgIFtyYWRpeF9oZXhdID0gMTYsCisgICAgW3JhZGl4X2RlY2ltYWxdID0gMjAsCisgICAgW3JhZGl4X29jdGFsXSA9IDIyCisgIH0KK307CisKKy8qIFRydWUgaWYgdG90YWwgc2l6ZXMgc2hvdWxkIGJlIHByaW50ZWQuICAqLworc3RhdGljIGJvb2wgdG90YWxzOworLyogVG8gcHJpbnQgdGhlIHRvdGFsIHNpemVzIGluIGEgcmVhc29uYWJsZSBmb3JtYXQgcmVtZW1iZXIgdGhlIGhpZ2VzdAorICAgImNsYXNzIiBvZiBFTEYgYmluYXJpZXMgcHJvY2Vzc2VkLiAgKi8KK3N0YXRpYyBpbnQgdG90YWxzX2NsYXNzOworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJlbWFpbmluZzsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgLyogTWFrZSBtZW1vcnkgbGVhayBkZXRlY3Rpb24gcG9zc2libGUuICAqLworICBtdHJhY2UgKCk7CisKKyAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLworICBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworICBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKyAgX19mc2V0bG9ja2luZyAoc3RkZXJyLCBGU0VUTE9DS0lOR19CWUNBTExFUik7CisKKyAgLyogU2V0IGxvY2FsZS4gICovCisgIHNldGxvY2FsZSAoTENfQUxMLCAiIik7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBtZXNzYWdlIGNhdGFsb2cgY2FuIGJlIGZvdW5kLiAgKi8KKyAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjYXRhbG9nLiAgKi8KKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgLyogUGFyc2UgYW5kIHByb2Nlc3MgYXJndW1lbnRzLiAgKi8KKyAgYXJncF9wYXJzZSAoJmFyZ3AsIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsIE5VTEwpOworCisKKyAgLyogVGVsbCB0aGUgbGlicmFyeSB3aGljaCB2ZXJzaW9uIHdlIGFyZSBleHBlY3RpbmcuICAqLworICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7CisKKyAgaWYgKHJlbWFpbmluZyA9PSBhcmdjKQorICAgIC8qIFRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgbmFtZSBzbyB3ZSB1c2UgYS5vdXQuICAqLworICAgIHJlc3VsdCA9IHByb2Nlc3NfZmlsZSAoImEub3V0Iik7CisgIGVsc2UKKyAgICAvKiBQcm9jZXNzIGFsbCB0aGUgcmVtYWluaW5nIGZpbGVzLiAgKi8KKyAgICBkbworICAgICAgcmVzdWx0IHw9IHByb2Nlc3NfZmlsZSAoYXJndltyZW1haW5pbmddKTsKKyAgICB3aGlsZSAoKytyZW1haW5pbmcgPCBhcmdjKTsKKworICAvKiBQcmludCB0aGUgdG90YWwgc2l6ZXMgYnV0IG9ubHkgaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgQlNEIGFuZCBhdAorICAgICBsZWFzdCBvbmUgZmlsZSBoYXMgYmVlbiBjb3JyZWN0bHkgcmVhZCAoaS5lLiwgd2UgcmVjb2duaXplZCB0aGUKKyAgICAgY2xhc3MpLiAgKi8KKyAgaWYgKHRvdGFscyAmJiBmb3JtYXQgPT0gZm9ybWF0X2JzZCAmJiB0b3RhbHNfY2xhc3MgIT0gMCkKKyAgICBzaG93X2JzZF90b3RhbHMgKCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBQcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfdmVyc2lvbiAoRklMRSAqc3RyZWFtLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBmcHJpbnRmIChzdHJlYW0sICJzaXplICglcykgJXNcbiIsIFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIlwKK0NvcHlyaWdodCAoQykgJXMgUmVkIEhhdCwgSW5jLlxuXAorVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk9cblwKK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuXAorIiksICIyMDA1Iik7CisgIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIldyaXR0ZW4gYnkgJXMuXG4iKSwgIlVscmljaCBEcmVwcGVyIik7Cit9CisKKworLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KK3N0YXRpYyBlcnJvcl90CitwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywKKwkgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBzd2l0Y2ggKGtleSkKKyAgICB7CisgICAgY2FzZSAnZCc6CisgICAgICByYWRpeCA9IHJhZGl4X2RlY2ltYWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2YnOgorICAgICAgZm9ybWF0ID0gZm9ybWF0X3N5c3Zfb25lX2xpbmU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ28nOgorICAgICAgcmFkaXggPSByYWRpeF9vY3RhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneCc6CisgICAgICByYWRpeCA9IHJhZGl4X2hleDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQSc6CisgICAgICBmb3JtYXQgPSBmb3JtYXRfc3lzdjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQic6CisgICAgICBmb3JtYXQgPSBmb3JtYXRfYnNkOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdGJzoKKyAgICAgIGZvcm1hdCA9IGZvcm1hdF9zZWdtZW50czsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRfRk9STUFUOgorICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiYnNkIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgImJlcmtlbGV5IikgPT0gMCkKKwlmb3JtYXQgPSBmb3JtYXRfYnNkOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJzeXN2IikgPT0gMCkKKwlmb3JtYXQgPSBmb3JtYXRfc3lzdjsKKyAgICAgIGVsc2UKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiSW52YWxpZCBmb3JtYXQ6ICVzIiksIGFyZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUX1JBRElYOgorICAgICAgaWYgKHN0cmNtcCAoYXJnLCAieCIpID09IDAgfHwgc3RyY21wIChhcmcsICIxNiIpID09IDApCisJcmFkaXggPSByYWRpeF9oZXg7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImQiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAiMTAiKSA9PSAwKQorCXJhZGl4ID0gcmFkaXhfZGVjaW1hbDsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibyIpID09IDAgfHwgc3RyY21wIChhcmcsICI4IikgPT0gMCkKKwlyYWRpeCA9IHJhZGl4X29jdGFsOworICAgICAgZWxzZQorCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJJbnZhbGlkIHJhZGl4OiAlcyIpLCBhcmcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd0JzoKKyAgICAgIHRvdGFscyA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKKyAgICB9CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUpCit7CisgIC8qIE9wZW4gdGhlIGZpbGUgYW5kIGRldGVybWluZSB0aGUgdHlwZS4gICovCisgIGludCBmZDsKKyAgRWxmICplbGY7CisKKyAgLyogT3BlbiB0aGUgZmlsZS4gICovCisgIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuICclcyIpLCBmbmFtZSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogTm93IGdldCB0aGUgRUxGIGRlc2NyaXB0b3IuICAqLworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOworICBpZiAoZWxmICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGVsZl9raW5kIChlbGYpID09IEVMRl9LX0VMRikKKwl7CisJICBoYW5kbGVfZWxmIChlbGYsIE5VTEwsIGZuYW1lKTsKKworCSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKKwkgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKworCSAgaWYgKGNsb3NlIChmZCkgIT0gMCkKKwkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSBjbG9zZSAnJXMnIiksIGZuYW1lKTsKKworCSAgcmV0dXJuIDA7CisJfQorICAgICAgZWxzZQorCXJldHVybiBoYW5kbGVfYXIgKGZkLCBlbGYsIE5VTEwsIGZuYW1lKTsKKworICAgICAgLyogV2UgY2Fubm90IGhhbmRsZSB0aGlzIHR5cGUuICBDbG9zZSB0aGUgZGVzY3JpcHRvciBhbnl3YXkuICAqLworICAgICAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKKwlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworICAgIH0KKworICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzOiBmaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIpLCBmbmFtZSk7CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyogUHJpbnQgdGhlIEJTRC1zdHlsZSBoZWFkZXIuICBUaGlzIGlzIGRvbmUgZXhhY3RseSBvbmNlLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9oZWFkZXIgKEVsZiAqZWxmKQoreworICBzdGF0aWMgaW50IGRvbmU7CisKKyAgaWYgKCEgZG9uZSkKKyAgICB7CisgICAgICBpbnQgZGRpZ2l0cyA9IGxlbmd0aF9tYXBbZ2VsZl9nZXRjbGFzcyAoZWxmKSAtIDFdW3JhZGl4X2RlY2ltYWxdOworICAgICAgaW50IHhkaWdpdHMgPSBsZW5ndGhfbWFwW2dlbGZfZ2V0Y2xhc3MgKGVsZikgLSAxXVtyYWRpeF9oZXhdOworCisgICAgICBwcmludGYgKCIlKnMgJSpzICUqcyAlKnMgJSpzICVzXG4iLAorCSAgICAgIGRkaWdpdHMgLSAyLCBzZ2V0dGV4dCAoImJzZHx0ZXh0IiksCisJICAgICAgZGRpZ2l0cyAtIDIsIHNnZXR0ZXh0ICgiYnNkfGRhdGEiKSwKKwkgICAgICBkZGlnaXRzIC0gMiwgc2dldHRleHQgKCJic2R8YnNzIiksCisJICAgICAgZGRpZ2l0cyAtIDIsIHNnZXR0ZXh0ICgiYnNkfGRlYyIpLAorCSAgICAgIHhkaWdpdHMgLSAyLCBzZ2V0dGV4dCAoImJzZHxoZXgiKSwKKwkgICAgICBzZ2V0dGV4dCAoImJzZHxmaWxlbmFtZSIpKTsKKworICAgICAgZG9uZSA9IDE7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQKK2hhbmRsZV9hciAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKyAgRWxmICpzdWJlbGY7CisgIEVsZl9DbWQgY21kID0gRUxGX0NfUkVBRF9NTUFQOworICBzaXplX3QgcHJlZml4X2xlbiA9IHByZWZpeCA9PSBOVUxMID8gMCA6IHN0cmxlbiAocHJlZml4KTsKKyAgc2l6ZV90IGZuYW1lX2xlbiA9IHN0cmxlbiAoZm5hbWUpICsgMTsKKyAgY2hhciBuZXdfcHJlZml4W3ByZWZpeF9sZW4gKyAxICsgZm5hbWVfbGVuXTsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGNoYXIgKmNwID0gbmV3X3ByZWZpeDsKKworICAvKiBDcmVhdGUgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgZmlsZS4gICovCisgIGlmIChwcmVmaXggIT0gTlVMTCkKKyAgICB7CisgICAgICBjcCA9IG1lbXBjcHkgKGNwLCBwcmVmaXgsIHByZWZpeF9sZW4pOworICAgICAgKmNwKysgPSAnOic7CisgICAgfQorICBtZW1jcHkgKGNwLCBmbmFtZSwgZm5hbWVfbGVuKTsKKworICAvKiBQcm9jZXNzIGFsbCB0aGUgZmlsZXMgY29udGFpbmVkIGluIHRoZSBhcmNoaXZlLiAgKi8KKyAgd2hpbGUgKChzdWJlbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIGVsZikpICE9IE5VTEwpCisgICAgeworICAgICAgLyogVGhlIHRoZSBoZWFkZXIgZm9yIHRoaXMgZWxlbWVudC4gICovCisgICAgICBFbGZfQXJoZHIgKmFyaGRyID0gZWxmX2dldGFyaGRyIChzdWJlbGYpOworCisgICAgICBpZiAoZWxmX2tpbmQgKHN1YmVsZikgPT0gRUxGX0tfRUxGKQorCWhhbmRsZV9lbGYgKHN1YmVsZiwgbmV3X3ByZWZpeCwgYXJoZHItPmFyX25hbWUpOworICAgICAgZWxzZSBpZiAoZWxmX2tpbmQgKHN1YmVsZikgPT0gRUxGX0tfQVIpCisJcmVzdWx0IHw9IGhhbmRsZV9hciAoZmQsIHN1YmVsZiwgbmV3X3ByZWZpeCwgYXJoZHItPmFyX25hbWUpOworICAgICAgLyogZWxzZSBzaWduYWwgZXJyb3I/Pz8gKi8KKworICAgICAgLyogR2V0IG5leHQgYXJjaGl2ZSBlbGVtZW50LiAgKi8KKyAgICAgIGNtZCA9IGVsZl9uZXh0IChzdWJlbGYpOworICAgICAgaWYgKGVsZl9lbmQgKHN1YmVsZikgIT0gMCkKKwlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworICAgIH0KKworICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQorICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisKKyAgaWYgKGNsb3NlIChmZCkgIT0gMCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoIndoaWxlIGNsb3NpbmcgYCVzJyIpLCBmbmFtZSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBTaG93IHNpemVzIGluIFN5c1YgZm9ybWF0LiAgKi8KK3N0YXRpYyB2b2lkCitzaG93X3N5c3YgKEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAorCSAgIGNvbnN0IGNoYXIgKmZ1bGxuYW1lKQoreworICBzaXplX3Qgc2hzdHJuZHg7CisgIEVsZl9TY24gKnNjbiA9IE5VTEw7CisgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgaW50IG1heGxlbiA9IDEwOworICBpbnQgZGlnaXRzID0gbGVuZ3RoX21hcFtnZWxmX2dldGNsYXNzIChlbGYpIC0gMV1bcmFkaXhdOworICBjb25zdCBjaGFyICpmbXRzdHI7CisgIEdFbGZfT2ZmIHRvdGFsID0gMDsKKworICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCisgIGlmIChlbGZfZ2V0c2hzdHJuZHggKGVsZiwgJnNoc3RybmR4KSA8IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7CisKKyAgLyogRmlyc3Qgcm91bmQgb3ZlciB0aGUgc2VjdGlvbnM6IGRldGVybWluZSB0aGUgbG9uZ2VzdCBzZWN0aW9uIG5hbWUuICAqLworICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIGlmIChzaGRyID09IE5VTEwpCisJSU5URVJOQUxfRVJST1IgKGZ1bGxuYW1lKTsKKworICAgICAgLyogSWdub3JlIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgbm90IHVzZWQgYXQgcnVudGltZS4gICovCisgICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQorCW1heGxlbiA9IE1BWCAobWF4bGVuLAorCQkgICAgICAoaW50KSBzdHJsZW4gKGVsZl9zdHJwdHIgKGVsZiwgc2hzdHJuZHgsCisJCQkJCQlzaGRyLT5zaF9uYW1lKSkpOworICAgIH0KKworICBmcHV0c191bmxvY2tlZCAoZm5hbWUsIHN0ZG91dCk7CisgIGlmIChwcmVmaXggIT0gTlVMTCkKKyAgICBwcmludGYgKGdldHRleHQgKCIgKGV4ICVzKSIpLCBwcmVmaXgpOworICBwcmludGYgKCI6XG4lLSpzICUqcyAlKnNcbiIsCisJICBtYXhsZW4sIHNnZXR0ZXh0ICgic3lzdnxzZWN0aW9uIiksCisJICBkaWdpdHMgLSAyLCBzZ2V0dGV4dCAoInN5c3Z8c2l6ZSIpLAorCSAgZGlnaXRzLCBzZ2V0dGV4dCAoInN5c3Z8YWRkciIpKTsKKworICBpZiAocmFkaXggPT0gcmFkaXhfaGV4KQorICAgIGZtdHN0ciA9ICIlLSpzICUqIiBQUkl4NjQgIiAlKiIgUFJJeDY0ICJcbiI7CisgIGVsc2UgaWYgKHJhZGl4ID09IHJhZGl4X2RlY2ltYWwpCisgICAgZm10c3RyID0gIiUtKnMgJSoiIFBSSWQ2NCAiICUqIiBQUklkNjQgIlxuIjsKKyAgZWxzZQorICAgIGZtdHN0ciA9ICIlLSpzICUqIiBQUklvNjQgIiAlKiIgUFJJbzY0ICJcbiI7CisKKyAgLyogSXRlcmF0ZSBvdmVyIGFsbCBzZWN0aW9ucy4gICovCisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKworICAgICAgLyogSWdub3JlIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgbm90IHVzZWQgYXQgcnVudGltZS4gICovCisgICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoZm10c3RyLAorCQkgIG1heGxlbiwgZWxmX3N0cnB0ciAoZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCisJCSAgZGlnaXRzIC0gMiwgc2hkci0+c2hfc2l6ZSwKKwkJICBkaWdpdHMsIHNoZHItPnNoX2FkZHIpOworCisJICB0b3RhbCArPSBzaGRyLT5zaF9zaXplOworCX0KKyAgICB9CisKKyAgaWYgKHJhZGl4ID09IHJhZGl4X2hleCkKKyAgICBwcmludGYgKCIlLSpzICUqIiBQUkl4NjQgIlxuXG5cbiIsIG1heGxlbiwgc2dldHRleHQgKCJzeXN2fFRvdGFsIiksCisJICAgIGRpZ2l0cyAtIDIsIHRvdGFsKTsKKyAgZWxzZSBpZiAocmFkaXggPT0gcmFkaXhfZGVjaW1hbCkKKyAgICBwcmludGYgKCIlLSpzICUqIiBQUklkNjQgIlxuXG5cbiIsIG1heGxlbiwgc2dldHRleHQgKCJzeXN2fFRvdGFsIiksCisJICAgIGRpZ2l0cyAtIDIsIHRvdGFsKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIiUtKnMgJSoiIFBSSW82NCAiXG5cblxuIiwgbWF4bGVuLCBzZ2V0dGV4dCAoInN5c3Z8VG90YWwiKSwKKwkgICAgZGlnaXRzIC0gMiwgdG90YWwpOworfQorCisKKy8qIFNob3cgc2l6ZXMgaW4gU3lzViBmb3JtYXQgaW4gb25lIGxpbmUuICAqLworc3RhdGljIHZvaWQKK3Nob3dfc3lzdl9vbmVfbGluZSAoRWxmICplbGYpCit7CisgIHNpemVfdCBzaHN0cm5keDsKKyAgRWxmX1NjbiAqc2NuID0gTlVMTDsKKyAgR0VsZl9TaGRyIHNoZHJfbWVtOworICBjb25zdCBjaGFyICpmbXRzdHI7CisgIEdFbGZfT2ZmIHRvdGFsID0gMDsKKyAgaW50IGZpcnN0ID0gMTsKKworICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCisgIGlmIChlbGZfZ2V0c2hzdHJuZHggKGVsZiwgJnNoc3RybmR4KSA8IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7CisKKyAgaWYgKHJhZGl4ID09IHJhZGl4X2hleCkKKyAgICBmbXRzdHIgPSAiJSIgUFJJeDY0ICIoJXMpIjsKKyAgZWxzZSBpZiAocmFkaXggPT0gcmFkaXhfZGVjaW1hbCkKKyAgICBmbXRzdHIgPSAiJSIgUFJJZDY0ICIoJXMpIjsKKyAgZWxzZQorICAgIGZtdHN0ciA9ICIlIiBQUklvNjQgIiglcykiOworCisgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgc2VjdGlvbnMuICAqLworICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCisgICAgeworICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisKKyAgICAgIC8qIElnbm9yZSBhbGwgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCB1c2VkIGF0IHJ1bnRpbWUuICAqLworICAgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgaWYgKCEgZmlyc3QpCisJZnB1dHNfdW5sb2NrZWQgKCIgKyAiLCBzdGRvdXQpOworICAgICAgZmlyc3QgPSAwOworCisgICAgICBwcmludGYgKGZtdHN0ciwgc2hkci0+c2hfc2l6ZSwKKwkgICAgICBlbGZfc3RycHRyIChlbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSk7CisKKyAgICAgIHRvdGFsICs9IHNoZHItPnNoX3NpemU7CisgICAgfQorCisgIGlmIChyYWRpeCA9PSByYWRpeF9oZXgpCisgICAgcHJpbnRmICgiID0gJSMiIFBSSXg2NCAiXG4iLCB0b3RhbCk7CisgIGVsc2UgaWYgKHJhZGl4ID09IHJhZGl4X2RlY2ltYWwpCisgICAgcHJpbnRmICgiID0gJSIgUFJJZDY0ICJcbiIsIHRvdGFsKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIiA9ICUiIFBSSW82NCAiXG4iLCB0b3RhbCk7Cit9CisKKworLyogVmFyaWFibGVzIHRvIGFkZCB1cCB0aGUgc2l6ZXMgb2YgYWxsIGZpbGVzLiAgKi8KK3N0YXRpYyB1aW50bWF4X3QgdG90YWxfdGV4dHNpemU7CitzdGF0aWMgdWludG1heF90IHRvdGFsX2RhdGFzaXplOworc3RhdGljIHVpbnRtYXhfdCB0b3RhbF9ic3NzaXplOworCisKKy8qIFNob3cgc2l6ZXMgaW4gQlNEIGZvcm1hdC4gICovCitzdGF0aWMgdm9pZAorc2hvd19ic2QgKEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAorCSAgY29uc3QgY2hhciAqZnVsbG5hbWUpCit7CisgIEVsZl9TY24gKnNjbiA9IE5VTEw7CisgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgR0VsZl9PZmYgdGV4dHNpemUgPSAwOworICBHRWxmX09mZiBkYXRhc2l6ZSA9IDA7CisgIEdFbGZfT2ZmIGJzc3NpemUgPSAwOworICBpbnQgZGRpZ2l0cyA9IGxlbmd0aF9tYXBbZ2VsZl9nZXRjbGFzcyAoZWxmKSAtIDFdW3JhZGl4X2RlY2ltYWxdOworICBpbnQgeGRpZ2l0cyA9IGxlbmd0aF9tYXBbZ2VsZl9nZXRjbGFzcyAoZWxmKSAtIDFdW3JhZGl4X2hleF07CisKKyAgLyogSXRlcmF0ZSBvdmVyIGFsbCBzZWN0aW9ucy4gICovCisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwlJTlRFUk5BTF9FUlJPUiAoZnVsbG5hbWUpOworCisgICAgICAvKiBJZ25vcmUgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgbWFya2VkIGFzIGxvYWRlZC4gICovCisgICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX1dSSVRFKSA9PSAwKQorCXRleHRzaXplICs9IHNoZHItPnNoX3NpemU7CisgICAgICBlbHNlIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9OT0JJVFMpCisJYnNzc2l6ZSArPSBzaGRyLT5zaF9zaXplOworICAgICAgZWxzZQorCWRhdGFzaXplICs9IHNoZHItPnNoX3NpemU7CisgICAgfQorCisgIHByaW50ZiAoIiUqIiBQUklkNjQgIiAlKiIgUFJJZDY0ICIgJSoiIFBSSWQ2NCAiICUqIiBQUklkNjQgIiAlKiIKKwkgIFBSSXg2NCAiICVzIiwKKwkgIGRkaWdpdHMgLSAyLCB0ZXh0c2l6ZSwKKwkgIGRkaWdpdHMgLSAyLCBkYXRhc2l6ZSwKKwkgIGRkaWdpdHMgLSAyLCBic3NzaXplLAorCSAgZGRpZ2l0cyAtIDIsIHRleHRzaXplICsgZGF0YXNpemUgKyBic3NzaXplLAorCSAgeGRpZ2l0cyAtIDIsIHRleHRzaXplICsgZGF0YXNpemUgKyBic3NzaXplLAorCSAgZm5hbWUpOworICBpZiAocHJlZml4ICE9IE5VTEwpCisgICAgcHJpbnRmIChnZXR0ZXh0ICgiIChleCAlcykiKSwgcHJlZml4KTsKKyAgZnB1dHNfdW5sb2NrZWQgKCJcbiIsIHN0ZG91dCk7CisKKyAgdG90YWxfdGV4dHNpemUgKz0gdGV4dHNpemU7CisgIHRvdGFsX2RhdGFzaXplICs9IGRhdGFzaXplOworICB0b3RhbF9ic3NzaXplICs9IGJzc3NpemU7CisKKyAgdG90YWxzX2NsYXNzID0gTUFYICh0b3RhbHNfY2xhc3MsIGdlbGZfZ2V0Y2xhc3MgKGVsZikpOworfQorCisKKy8qIFNob3cgdG90YWwgc2l6ZS4gICovCitzdGF0aWMgdm9pZAorc2hvd19ic2RfdG90YWxzICh2b2lkKQoreworICBpbnQgZGRpZ2l0cyA9IGxlbmd0aF9tYXBbdG90YWxzX2NsYXNzIC0gMV1bcmFkaXhfZGVjaW1hbF07CisgIGludCB4ZGlnaXRzID0gbGVuZ3RoX21hcFt0b3RhbHNfY2xhc3MgLSAxXVtyYWRpeF9oZXhdOworCisgIHByaW50ZiAoIiUqIiBQUkl1TUFYICIgJSoiIFBSSXVNQVggIiAlKiIgUFJJdU1BWCAiICUqIiBQUkl1TUFYICIgJSoiCisJICBQUkl4TUFYICIgJXMiLAorCSAgZGRpZ2l0cyAtIDIsIHRvdGFsX3RleHRzaXplLAorCSAgZGRpZ2l0cyAtIDIsIHRvdGFsX2RhdGFzaXplLAorCSAgZGRpZ2l0cyAtIDIsIHRvdGFsX2Jzc3NpemUsCisJICBkZGlnaXRzIC0gMiwgdG90YWxfdGV4dHNpemUgKyB0b3RhbF9kYXRhc2l6ZSArIHRvdGFsX2Jzc3NpemUsCisJICB4ZGlnaXRzIC0gMiwgdG90YWxfdGV4dHNpemUgKyB0b3RhbF9kYXRhc2l6ZSArIHRvdGFsX2Jzc3NpemUsCisJICBnZXR0ZXh0ICgiKFRPVEFMUylcbiIpKTsKK30KKworCisvKiBTaG93IHNpemUgYW5kIHBlcm1pc3Npb24gb2YgbG9hZGFibGUgc2VnbWVudHMuICAqLworc3RhdGljIHZvaWQKK3Nob3dfc2VnbWVudHMgKEVsZiAqZWxmLCBjb25zdCBjaGFyICpmdWxsbmFtZSkKK3sKKyAgR0VsZl9FaGRyIGVoZHJfbWVtOworICBHRWxmX0VoZHIgKmVoZHI7CisgIHNpemVfdCBjbnQ7CisgIEdFbGZfT2ZmIHRvdGFsID0gMDsKKyAgaW50IGZpcnN0ID0gMTsKKworICBlaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7CisgIGlmIChlaGRyID09IE5VTEwpCisgICAgSU5URVJOQUxfRVJST1IgKGZ1bGxuYW1lKTsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IGVoZHItPmVfcGhudW07ICsrY250KQorICAgIHsKKyAgICAgIEdFbGZfUGhkciBwaGRyX21lbTsKKyAgICAgIEdFbGZfUGhkciAqcGhkcjsKKworICAgICAgcGhkciA9IGdlbGZfZ2V0cGhkciAoZWxmLCBjbnQsICZwaGRyX21lbSk7CisgICAgICBpZiAocGhkciA9PSBOVUxMKQorCUlOVEVSTkFMX0VSUk9SIChmdWxsbmFtZSk7CisKKyAgICAgIGlmIChwaGRyLT5wX3R5cGUgIT0gUFRfTE9BRCkKKwkvKiBPbmx5IGxvYWQgc2VnbWVudHMuICAqLworCWNvbnRpbnVlOworCisgICAgICBpZiAoISBmaXJzdCkKKwlmcHV0c191bmxvY2tlZCAoIiArICIsIHN0ZG91dCk7CisgICAgICBmaXJzdCA9IDA7CisKKyAgICAgIHByaW50ZiAocmFkaXggPT0gcmFkaXhfaGV4ID8gIiUiIFBSSXg2NCAiKCVjJWMlYykiCisJICAgICAgOiAocmFkaXggPT0gcmFkaXhfZGVjaW1hbCA/ICIlIiBQUklkNjQgIiglYyVjJWMpIgorCQkgOiAiJSIgUFJJbzY0ICIoJWMlYyVjKSIpLAorCSAgICAgIHBoZHItPnBfbWVtc3osCisJICAgICAgKHBoZHItPnBfZmxhZ3MgJiBQRl9SKSA9PSAwID8gJy0nIDogJ3InLAorCSAgICAgIChwaGRyLT5wX2ZsYWdzICYgUEZfVykgPT0gMCA/ICctJyA6ICd3JywKKwkgICAgICAocGhkci0+cF9mbGFncyAmIFBGX1gpID09IDAgPyAnLScgOiAneCcpOworCisgICAgICB0b3RhbCArPSBwaGRyLT5wX21lbXN6OworICAgIH0KKworICBpZiAocmFkaXggPT0gcmFkaXhfaGV4KQorICAgIHByaW50ZiAoIiA9ICUjIiBQUkl4NjQgIlxuIiwgdG90YWwpOworICBlbHNlIGlmIChyYWRpeCA9PSByYWRpeF9kZWNpbWFsKQorICAgIHByaW50ZiAoIiA9ICUiIFBSSWQ2NCAiXG4iLCB0b3RhbCk7CisgIGVsc2UKKyAgICBwcmludGYgKCIgPSAlIiBQUklvNjQgIlxuIiwgdG90YWwpOworfQorCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfZWxmIChFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKyAgc2l6ZV90IHByZWZpeF9sZW4gPSBwcmVmaXggPT0gTlVMTCA/IDAgOiBzdHJsZW4gKHByZWZpeCk7CisgIHNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKSArIDE7CisgIGNoYXIgZnVsbG5hbWVbcHJlZml4X2xlbiArIDEgKyBmbmFtZV9sZW5dOworICBjaGFyICpjcCA9IGZ1bGxuYW1lOworCisgIC8qIENyZWF0ZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSBmaWxlLiAgKi8KKyAgaWYgKHByZWZpeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNwID0gbWVtcGNweSAoY3AsIHByZWZpeCwgcHJlZml4X2xlbik7CisgICAgICAqY3ArKyA9ICc6JzsKKyAgICB9CisgIG1lbWNweSAoY3AsIGZuYW1lLCBmbmFtZV9sZW4pOworCisgIGlmIChmb3JtYXQgPT0gZm9ybWF0X3N5c3YpCisgICAgc2hvd19zeXN2IChlbGYsIHByZWZpeCwgZm5hbWUsIGZ1bGxuYW1lKTsKKyAgZWxzZSBpZiAoZm9ybWF0ID09IGZvcm1hdF9zeXN2X29uZV9saW5lKQorICAgIHNob3dfc3lzdl9vbmVfbGluZSAoZWxmKTsKKyAgZWxzZSBpZiAoZm9ybWF0ID09IGZvcm1hdF9zZWdtZW50cykKKyAgICBzaG93X3NlZ21lbnRzIChlbGYsIGZ1bGxuYW1lKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50X2hlYWRlciAoZWxmKTsKKworICAgICAgc2hvd19ic2QgKGVsZiwgcHJlZml4LCBmbmFtZSwgZnVsbG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9zdHJpcC5jIGIvc3JjL3N0cmlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0NTEzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdHJpcC5jCkBAIC0wLDAgKzEsMTc1MCBAQAorLyogRGlzY2FyZCBzZWN0aW9uIG5vdCB1c2VkIGF0IHJ1bnRpbWUgZnJvbSBvYmplY3QgZmlsZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhcmdwLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxlcnJvci5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPGxpYmludGwuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxtY2hlY2suaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpb19leHQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8ZWxmLWtub3dsZWRnZS5oPgorI2luY2x1ZGUgPGxpYmVibC5oPgorI2luY2x1ZGUgPHN5c3RlbS5oPgorCisKKy8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCitzdGF0aWMgdm9pZCBwcmludF92ZXJzaW9uIChGSUxFICpzdHJlYW0sIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7Cit2b2lkICgqYXJncF9wcm9ncmFtX3ZlcnNpb25faG9vaykgKEZJTEUgKiwgc3RydWN0IGFyZ3Bfc3RhdGUgKikgPSBwcmludF92ZXJzaW9uOworCisvKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLworY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzID0gUEFDS0FHRV9CVUdSRVBPUlQ7CisKKworLyogVmFsdWVzIGZvciB0aGUgcGFyYW1ldGVycyB3aGljaCBoYXZlIG5vIHNob3J0IGZvcm0uICAqLworI2RlZmluZSBPUFRfUkVNT1ZFX0NPTU1FTlQJMHgxMDAKKyNkZWZpbmUgT1BUX1BFUk1JU1NJVkUJCTB4MTAxCisKKworLyogRGVmaW5pdGlvbnMgb2YgYXJndW1lbnRzIGZvciBhcmdwIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Cit7CisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTl8oIk91dHB1dCBzZWxlY3Rpb246IiksIDAgfSwKKyAgeyBOVUxMLCAnbycsICJGSUxFIiwgMCwgTl8oIlBsYWNlIHN0cmlwcGVkIG91dHB1dCBpbnRvIEZJTEUiKSwgMCB9LAorICB7IE5VTEwsICdmJywgIkZJTEUiLCAwLCBOXygiRXh0cmFjdCB0aGUgcmVtb3ZlZCBzZWN0aW9ucyBpbnRvIEZJTEUiKSwgMCB9LAorICB7IE5VTEwsICdGJywgIkZJTEUiLCAwLCBOXygiRW1iZWQgbmFtZSBGSUxFIGluc3RlYWQgb2YgLWYgYXJndW1lbnQiKSwgMCB9LAorCisgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTl8oIk91dHB1dCBvcHRpb25zOiIpLCAwIH0sCisgIHsgInN0cmlwLWRlYnVnIiwgJ2cnLCBOVUxMLCAwLCBOXygiUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9scyIpLCAwIH0sCisgIHsgInByZXNlcnZlLWRhdGVzIiwgJ3AnLCBOVUxMLCAwLAorICAgIE5fKCJDb3B5IG1vZGlmaWVkL2FjY2VzcyB0aW1lc3RhbXBzIHRvIHRoZSBvdXRwdXQiKSwgMCB9LAorICB7ICJyZW1vdmUtY29tbWVudCIsIE9QVF9SRU1PVkVfQ09NTUVOVCwgTlVMTCwgMCwKKyAgICBOXygiUmVtb3ZlIC5jb21tZW50IHNlY3Rpb24iKSwgMCB9LAorICB7ICJwZXJtaXNzaXZlIiwgT1BUX1BFUk1JU1NJVkUsIE5VTEwsIDAsCisgICAgTl8oIlJlbGF4IGEgZmV3IHJ1bGVzIHRvIGhhbmRsZSBzbGlnaHRseSBicm9rZW4gRUxGIGZpbGVzIiksIDAgfSwKKyAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KK307CisKKy8qIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uICAqLworc3RhdGljIGNvbnN0IGNoYXIgZG9jW10gPSBOXygiRGlzY2FyZCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzLiIpOworCisvKiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4gICovCitzdGF0aWMgY29uc3QgY2hhciBhcmdzX2RvY1tdID0gTl8oIltGSUxFLi4uXSIpOworCisvKiBQcm90b3R5cGUgZm9yIG9wdGlvbiBoYW5kbGVyLiAgKi8KK3N0YXRpYyBlcnJvcl90IHBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpOworCisvKiBEYXRhIHN0cnVjdHVyZSB0byBjb21tdW5pY2F0ZSB3aXRoIGFyZ3AgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgYXJncCBhcmdwID0KK3sKKyAgb3B0aW9ucywgcGFyc2Vfb3B0LCBhcmdzX2RvYywgZG9jLCBOVUxMLCBOVUxMLCBOVUxMCit9OworCisKKy8qIFByaW50IHN5bWJvbHMgaW4gZmlsZSBuYW1lZCBGTkFNRS4gICovCitzdGF0aWMgaW50IHByb2Nlc3NfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUpOworCisvKiBIYW5kbGUgb25lIEVMRiBmaWxlLiAgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2VsZiAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LAorCQkgICAgICAgY29uc3QgY2hhciAqZm5hbWUsIG1vZGVfdCBtb2RlLCBzdHJ1Y3QgdGltZXZhbCB0dnBbMl0pOworCisvKiBIYW5kbGUgYWxsIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZS4gICovCitzdGF0aWMgaW50IGhhbmRsZV9hciAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwKKwkJICAgICAgc3RydWN0IHRpbWV2YWwgdHZwWzJdKTsKKworI2RlZmluZSBJTlRFUk5BTF9FUlJPUihmbmFtZSkgXAorICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiJXM6IElOVEVSTkFMIEVSUk9SICVkICglcy0lcyk6ICVzIiksICAgICAgXAorCSBmbmFtZSwgX19MSU5FX18sIFZFUlNJT04sIF9fREFURV9fLCBlbGZfZXJybXNnICgtMSkpCisKKworLyogTmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKm91dHB1dF9mbmFtZTsKKworLyogTmFtZSBvZiB0aGUgZGVidWcgb3V0cHV0IGZpbGUuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRlYnVnX2ZuYW1lOworCisvKiBOYW1lIHRvIHByZXRlbmQgdGhlIGRlYnVnIG91dHB1dCBmaWxlIGhhcy4gICovCitzdGF0aWMgY29uc3QgY2hhciAqZGVidWdfZm5hbWVfZW1iZWQ7CisKKy8qIElmIHRydWUgb3V0cHV0IGZpbGVzIHNoYWxsIGhhdmUgc2FtZSBkYXRlIGFzIHRoZSBpbnB1dCBmaWxlLiAgKi8KK3N0YXRpYyBib29sIHByZXNlcnZlX2RhdGVzOworCisvKiBJZiB0cnVlIC5jb21tZW50IHNlY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZC4gICovCitzdGF0aWMgYm9vbCByZW1vdmVfY29tbWVudDsKKworLyogSWYgdHJ1ZSByZW1vdmUgYWxsIGRlYnVnIHNlY3Rpb25zLiAgKi8KK3N0YXRpYyBib29sIHJlbW92ZV9kZWJ1ZzsKKworLyogSWYgdHJ1ZSByZWxheCBzb21lIEVMRiBydWxlcyBmb3IgaW5wdXQgZmlsZXMuICAqLworc3RhdGljIGJvb2wgcGVybWlzc2l2ZTsKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByZW1haW5pbmc7CisgIGludCByZXN1bHQgPSAwOworCisgIC8qIE1ha2UgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIHBvc3NpYmxlLiAgKi8KKyAgbXRyYWNlICgpOworCisgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KKyAgX19mc2V0bG9ja2luZyAoc3RkaW4sIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKKyAgX19mc2V0bG9ja2luZyAoc3Rkb3V0LCBGU0VUTE9DS0lOR19CWUNBTExFUik7CisgIF9fZnNldGxvY2tpbmcgKHN0ZGVyciwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworCisgIC8qIFNldCBsb2NhbGUuICAqLworICBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBjYXRhbG9nIGNhbiBiZSBmb3VuZC4gICovCisgIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOworCisgIC8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgY2F0YWxvZy4gICovCisgIHRleHRkb21haW4gKFBBQ0tBR0UpOworCisgIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gICovCisgIGlmIChhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCkgIT0gMCkKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworCisgIC8qIFRlbGwgdGhlIGxpYnJhcnkgd2hpY2ggdmVyc2lvbiB3ZSBhcmUgZXhwZWN0aW5nLiAgKi8KKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIGlmIChyZW1haW5pbmcgPT0gYXJnYykKKyAgICAvKiBUaGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIG5hbWUgc28gd2UgdXNlIGEub3V0LiAgKi8KKyAgICByZXN1bHQgPSBwcm9jZXNzX2ZpbGUgKCJhLm91dCIpOworICBlbHNlCisgICAgeworICAgICAgLyogSWYgd2UgaGF2ZSBzZWVuIHRoZSAnLW8nIG9yICctZicgb3B0aW9uIHRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUKKwkgaW5wdXQgZmlsZS4gICovCisgICAgICBpZiAoKG91dHB1dF9mbmFtZSAhPSBOVUxMIHx8IGRlYnVnX2ZuYW1lICE9IE5VTEwpCisJICAmJiByZW1haW5pbmcgKyAxIDwgYXJnYykKKwllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiXAorT25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkIHRvZ2V0aGVyIHdpdGggJy1vJyBhbmQgJy1mJyIpKTsKKworICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIHJlbWFpbmluZyBmaWxlcy4gICovCisgICAgICBkbworCXJlc3VsdCB8PSBwcm9jZXNzX2ZpbGUgKGFyZ3ZbcmVtYWluaW5nXSk7CisgICAgICB3aGlsZSAoKytyZW1haW5pbmcgPCBhcmdjKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBQcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfdmVyc2lvbiAoRklMRSAqc3RyZWFtLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBmcHJpbnRmIChzdHJlYW0sICJzdHJpcCAoJXMpICVzXG4iLCBQQUNLQUdFX05BTUUsIFZFUlNJT04pOworICBmcHJpbnRmIChzdHJlYW0sIGdldHRleHQgKCJcCitDb3B5cmlnaHQgKEMpICVzIFJlZCBIYXQsIEluYy5cblwKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PXG5cCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cblwKKyIpLCAiMjAwNSIpOworICBmcHJpbnRmIChzdHJlYW0sIGdldHRleHQgKCJXcml0dGVuIGJ5ICVzLlxuIiksICJVbHJpY2ggRHJlcHBlciIpOworfQorCisKKy8qIEhhbmRsZSBwcm9ncmFtIGFyZ3VtZW50cy4gICovCitzdGF0aWMgZXJyb3JfdAorcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsCisJICAgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgc3dpdGNoIChrZXkpCisgICAgeworICAgIGNhc2UgJ2YnOgorICAgICAgaWYgKGRlYnVnX2ZuYW1lICE9IE5VTEwpCisJeworCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCItZiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIikpOworCSAgcmV0dXJuIEVJTlZBTDsKKwl9CisgICAgICBkZWJ1Z19mbmFtZSA9IGFyZzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnRic6CisgICAgICBpZiAoZGVidWdfZm5hbWVfZW1iZWQgIT0gTlVMTCkKKwl7CisJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIi1GIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiKSk7CisJICByZXR1cm4gRUlOVkFMOworCX0KKyAgICAgIGRlYnVnX2ZuYW1lX2VtYmVkID0gYXJnOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdvJzoKKyAgICAgIGlmIChvdXRwdXRfZm5hbWUgIT0gTlVMTCkKKwl7CisJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIi1vIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiKSk7CisJICByZXR1cm4gRUlOVkFMOworCX0KKyAgICAgIG91dHB1dF9mbmFtZSA9IGFyZzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncCc6CisgICAgICBwcmVzZXJ2ZV9kYXRlcyA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUX1JFTU9WRV9DT01NRU5UOgorICAgICAgcmVtb3ZlX2NvbW1lbnQgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdnJzoKKyAgICAgIHJlbW92ZV9kZWJ1ZyA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUX1BFUk1JU1NJVkU6CisgICAgICBwZXJtaXNzaXZlID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorcHJvY2Vzc19maWxlIChjb25zdCBjaGFyICpmbmFtZSkKK3sKKyAgLyogSWYgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgbW9kaWZ5IGFuZCBhY2Nlc3MgdGltZXN0YW1wcyBnZXQgdGhlbQorICAgICBub3cuICBXZSBjYW5ub3QgdXNlIGZzdGF0KCkgYWZ0ZXIgb3BlbmluZyB0aGUgZmlsZSBzaW5jZSB0aGUgb3BlbgorICAgICB3b3VsZCBjaGFuZ2UgdGhlIGFjY2VzcyB0aW1lLiAgKi8KKyAgc3RydWN0IHN0YXQ2NCBwcmVfc3Q7CisgIHN0cnVjdCB0aW1ldmFsIHR2WzJdOworIGFnYWluOgorICBpZiAocHJlc2VydmVfZGF0ZXMpCisgICAgeworICAgICAgaWYgKHN0YXQ2NCAoZm5hbWUsICZwcmVfc3QpICE9IDApCisJeworCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSBcIiVzXCIiKSwgZm5hbWUpOworCSAgcmV0dXJuIDE7CisJfQorCisgICAgICAvKiBJZiB3ZSBoYXZlIHRvIHByZXNlcnZlIHRoZSB0aW1lc3RhbXAsIHdlIG5lZWQgaXQgaW4gdGhlCisJIGZvcm1hdCB1dGltZXMoKSB1bmRlcnN0YW5kcy4gICovCisgICAgICBUSU1FU1BFQ19UT19USU1FVkFMICgmdHZbMF0sICZwcmVfc3Quc3RfYXRpbSk7CisgICAgICBUSU1FU1BFQ19UT19USU1FVkFMICgmdHZbMV0sICZwcmVfc3Quc3RfbXRpbSk7CisgICAgfQorCisgIC8qIE9wZW4gdGhlIGZpbGUuICAqLworICBpbnQgZmQgPSBvcGVuIChmbmFtZSwgT19SRFdSKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoIndoaWxlIG9wZW5pbmcgXCIlc1wiIiksIGZuYW1lKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBXZSBhbHdheXMgdXNlIGZzdGF0KCkgZXZlbiBpZiB3ZSBjYWxsZWQgc3RhdCgpIGJlZm9yZS4gIFRoaXMgaXMKKyAgICAgZG9uZSB0byBtYWtlIHN1cmUgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHN0YXQoKSBpcyBmb3IgdGhlCisgICAgIHNhbWUgZmlsZS4gICovCisgIHN0cnVjdCBzdGF0NjQgc3Q7CisgIGlmIChmc3RhdDY0IChmZCwgJnN0KSAhPSAwKQorICAgIHsKKyAgICAgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBzdGF0IGlucHV0IGZpbGUgXCIlc1wiIiksIGZuYW1lKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgLyogUGFyYW5vaWQgbW9kZSBvbi4gICovCisgIGlmIChwcmVzZXJ2ZV9kYXRlcworICAgICAgJiYgKHN0LnN0X2lubyAhPSBwcmVfc3Quc3RfaW5vIHx8IHN0LnN0X2RldiAhPSBwcmVfc3Quc3RfZGV2KSkKKyAgICB7CisgICAgICAvKiBXZSBkZXRlY3RlZCBhIHJhY2UuICBUcnkgYWdhaW4uICAqLworICAgICAgY2xvc2UgKGZkKTsKKyAgICAgIGdvdG8gYWdhaW47CisgICAgfQorCisgIC8qIE5vdyBnZXQgdGhlIEVMRiBkZXNjcmlwdG9yLiAgKi8KKyAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRFdSLCBOVUxMKTsKKyAgaW50IHJlc3VsdDsKKyAgc3dpdGNoIChlbGZfa2luZCAoZWxmKSkKKyAgICB7CisgICAgY2FzZSBFTEZfS19FTEY6CisgICAgICByZXN1bHQgPSBoYW5kbGVfZWxmIChmZCwgZWxmLCBOVUxMLCBmbmFtZSwgc3Quc3RfbW9kZSAmIEFDQ0VTU1BFUk1TLAorCQkJICAgcHJlc2VydmVfZGF0ZXMgPyB0diA6IE5VTEwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRl9LX0FSOgorICAgICAgLyogSXQgaXMgbm90IHBvc3NpYmxlIHRvIHN0cmlwIHRoZSBjb250ZW50IG9mIGFuIGFyY2hpdmUgZGlyZWN0CisJIHRoZSBvdXRwdXQgdG8gYSBzcGVjaWZpYyBmaWxlLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAob3V0cHV0X2ZuYW1lICE9IE5VTEwpKQorCXsKKwkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXM6IGNhbm5vdCB1c2UgLW8gd2hlbiBzdHJpcHBpbmcgYXJjaGl2ZSIpLAorCQkgZm5hbWUpOworCSAgcmVzdWx0ID0gMTsKKwl9CisgICAgICBlbHNlCisJcmVzdWx0ID0gaGFuZGxlX2FyIChmZCwgZWxmLCBOVUxMLCBmbmFtZSwgcHJlc2VydmVfZGF0ZXMgPyB0diA6IE5VTEwpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlczogRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiKSwgZm5hbWUpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAodW5saWtlbHkgKGVsZl9lbmQgKGVsZikgIT0gMCkpCisgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKworICBjbG9zZSAoZmQpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogTWF4aW11bSBzaXplIG9mIGFycmF5IGFsbG9jYXRlZCBvbiBzdGFjay4gICovCisjZGVmaW5lIE1BWF9TVEFDS19BTExPQwkoNDAwICogMTAyNCkKKworc3RhdGljIGludAoraGFuZGxlX2VsZiAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwKKwkgICAgbW9kZV90IG1vZGUsIHN0cnVjdCB0aW1ldmFsIHR2cFsyXSkKK3sKKyAgc2l6ZV90IHByZWZpeF9sZW4gPSBwcmVmaXggPT0gTlVMTCA/IDAgOiBzdHJsZW4gKHByZWZpeCk7CisgIHNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKSArIDE7CisgIGNoYXIgKmZ1bGxuYW1lID0gYWxsb2NhIChwcmVmaXhfbGVuICsgMSArIGZuYW1lX2xlbik7CisgIGNoYXIgKmNwID0gZnVsbG5hbWU7CisgIEVsZiAqbmV3ZWxmOworICBFbGYgKmRlYnVnZWxmID0gTlVMTDsKKyAgY2hhciAqdG1wX2RlYnVnX2ZuYW1lID0gTlVMTDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIEdFbGZfRWhkciBlaGRyX21lbTsKKyAgR0VsZl9FaGRyICplaGRyOworICBzaXplX3Qgc2hzdHJuZHg7CisgIHNpemVfdCBzaG51bTsKKyAgc3RydWN0IHNoZHJfaW5mbworICB7CisgICAgRWxmX1NjbiAqc2NuOworICAgIEdFbGZfU2hkciBzaGRyOworICAgIEVsZl9EYXRhICpkYXRhOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgRWxmMzJfV29yZCBpZHg7CQkvKiBJbmRleCBpbiBuZXcgZmlsZS4gICovCisgICAgRWxmMzJfV29yZCBvbGRfc2hfbGluazsJLyogT3JpZ2luYWwgdmFsdWUgb2Ygc2hkci5zaF9saW5rLiAgKi8KKyAgICBFbGYzMl9Xb3JkIHN5bXRhYl9pZHg7CisgICAgRWxmMzJfV29yZCB2ZXJzaW9uX2lkeDsKKyAgICBFbGYzMl9Xb3JkIGdyb3VwX2lkeDsKKyAgICBFbGYzMl9Xb3JkIGdyb3VwX2NudDsKKyAgICBFbGZfU2NuICpuZXdzY247CisgICAgc3RydWN0IEVibF9TdHJlbnQgKnNlOworICAgIEVsZjMyX1dvcmQgKm5ld3N5bWlkeDsKKyAgfSAqc2hkcl9pbmZvID0gTlVMTDsKKyAgRWxmX1NjbiAqc2NuOworICBzaXplX3QgY250OworICBzaXplX3QgaWR4OworICBib29sIGNoYW5nZXM7CisgIEdFbGZfRWhkciBuZXdlaGRyX21lbTsKKyAgR0VsZl9FaGRyICpuZXdlaGRyOworICBHRWxmX0VoZHIgZGVidWdlaGRyX21lbTsKKyAgR0VsZl9FaGRyICpkZWJ1Z2VoZHI7CisgIHN0cnVjdCBFYmxfU3RydGFiICpzaHN0ID0gTlVMTDsKKyAgRWxmX0RhdGEgZGVidWdsaW5rX2NyY19kYXRhOworICBib29sIGFueV9zeW10YWJfY2hhbmdlcyA9IGZhbHNlOworICBFbGZfRGF0YSAqc2hzdHJ0YWJfZGF0YSA9IE5VTEw7CisKKyAgLyogQ3JlYXRlIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGZpbGUuICAqLworICBpZiAocHJlZml4ICE9IE5VTEwpCisgICAgeworICAgICAgY3AgPSBtZW1wY3B5IChjcCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKKyAgICAgICpjcCsrID0gJzonOworICAgIH0KKyAgbWVtY3B5IChjcCwgZm5hbWUsIGZuYW1lX2xlbik7CisKKyAgLyogSWYgd2UgYXJlIG5vdCByZXBsYWNpbmcgdGhlIGlucHV0IGZpbGUgb3BlbiBhIG5ldyBmaWxlIGhlcmUuICAqLworICBpZiAob3V0cHV0X2ZuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgZmQgPSBvcGVuIChvdXRwdXRfZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQsIG1vZGUpOworICAgICAgaWYgKHVubGlrZWx5IChmZCA9PSAtMSkpCisJeworCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IG9wZW4gJyVzJyIpLCBvdXRwdXRfZm5hbWUpOworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICBpbnQgZGVidWdfZmQgPSAtMTsKKworICAvKiBHZXQgdGhlIEVCTCBoYW5kbGluZy4gIFRoZSAtZyBvcHRpb24gaXMgY3VycmVudGx5IHRoZSBvbmx5IHJlYXNvbgorICAgICB3ZSBuZWVkIEVCTCBzbyBkb250IG9wZW4gdGhlIGJhY2tlbmQgdW5sZXNzIG5lY2Vzc2FyeS4gICovCisgIEVibCAqZWJsID0gTlVMTDsKKyAgaWYgKHJlbW92ZV9kZWJ1ZykKKyAgICB7CisgICAgICBlYmwgPSBlYmxfb3BlbmJhY2tlbmQgKGVsZik7CisgICAgICBpZiAoZWJsID09IE5VTEwpCisJeworCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IG9wZW4gRUJMIGJhY2tlbmQiKSk7CisJICByZXN1bHQgPSAxOworCSAgZ290byBmYWlsOworCX0KKyAgICB9CisKKyAgLyogT3BlbiB0aGUgYWRkaXRpb25hbCBmaWxlIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHN0b3JlZCBpbi4gICovCisgIGlmIChkZWJ1Z19mbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIG5hbWUuICBXZSBkbyBub3Qgd2FudCB0byBvdmVyd3JpdGUKKwkgdGhlIGRlYnVnIGZpbGUgaWYgdGhlIGZpbGUgd291bGQgbm90IGNvbnRhaW4gYW55CisJIGluZm9ybWF0aW9uLiAgKi8KKyAgICAgIHNpemVfdCBkZWJ1Z19mbmFtZV9sZW4gPSBzdHJsZW4gKGRlYnVnX2ZuYW1lKTsKKyAgICAgIHRtcF9kZWJ1Z19mbmFtZSA9IChjaGFyICopIGFsbG9jYSAoZGVidWdfZm5hbWVfbGVuICsgc2l6ZW9mICgiLlhYWFhYWCIpKTsKKyAgICAgIHN0cmNweSAobWVtcGNweSAodG1wX2RlYnVnX2ZuYW1lLCBkZWJ1Z19mbmFtZSwgZGVidWdfZm5hbWVfbGVuKSwKKwkgICAgICAiLlhYWFhYWCIpOworCisgICAgICBkZWJ1Z19mZCA9IG1rc3RlbXAgKHRtcF9kZWJ1Z19mbmFtZSk7CisgICAgICBpZiAodW5saWtlbHkgKGRlYnVnX2ZkID09IC0xKSkKKwl7CisJICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgb3BlbiAnJXMnIiksIGRlYnVnX2ZuYW1lKTsKKwkgIHJlc3VsdCA9IDE7CisJICBnb3RvIGZhaWw7CisJfQorICAgIH0KKworICAvKiBHZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIG9sZCBmaWxlLiAgKi8KKyAgZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOworICBpZiAoZWhkciA9PSBOVUxMKQorICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisKKyAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLworICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaHN0cm5keCAoZWxmLCAmc2hzdHJuZHgpIDwgMCkpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7CisKKyAgLyogV2Ugbm93IGNyZWF0ZSBhIG5ldyBFTEYgZGVzY3JpcHRvciBmb3IgdGhlIHNhbWUgZmlsZS4gIFdlCisgICAgIGNvbnN0cnVjdCBpdCBhbG1vc3QgZXhhY3RseSBpbiB0aGUgc2FtZSB3YXkgd2l0aCBzb21lIGluZm9ybWF0aW9uCisgICAgIGRyb3BwZWQuICAqLworICBpZiAob3V0cHV0X2ZuYW1lICE9IE5VTEwpCisgICAgbmV3ZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfV1JJVEVfTU1BUCwgTlVMTCk7CisgIGVsc2UKKyAgICBuZXdlbGYgPSBlbGZfY2xvbmUgKGVsZiwgRUxGX0NfRU1QVFkpOworCisgIGlmICh1bmxpa2VseSAoZ2VsZl9uZXdlaGRyIChuZXdlbGYsIGdlbGZfZ2V0Y2xhc3MgKGVsZikpID09IDApCisgICAgICB8fCAoZWhkci0+ZV90eXBlICE9IEVUX1JFTAorCSAgJiYgdW5saWtlbHkgKGdlbGZfbmV3cGhkciAobmV3ZWxmLCBlaGRyLT5lX3BobnVtKSA9PSAwKSkpCisgICAgeworICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlICclcyc6ICVzIiksCisJICAgICBvdXRwdXRfZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIC8qIENvcHkgb3ZlciB0aGUgb2xkIHByb2dyYW0gaGVhZGVyIGlmIG5lZWRlZC4gICovCisgIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMKQorICAgIGZvciAoY250ID0gMDsgY250IDwgZWhkci0+ZV9waG51bTsgKytjbnQpCisgICAgICB7CisJR0VsZl9QaGRyIHBoZHJfbWVtOworCUdFbGZfUGhkciAqcGhkcjsKKworCXBoZHIgPSBnZWxmX2dldHBoZHIgKGVsZiwgY250LCAmcGhkcl9tZW0pOworCWlmIChwaGRyID09IE5VTEwKKwkgICAgfHwgdW5saWtlbHkgKGdlbGZfdXBkYXRlX3BoZHIgKG5ld2VsZiwgY250LCBwaGRyKSA9PSAwKSkKKwkgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisgICAgICB9CisKKyAgaWYgKGRlYnVnX2ZuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgLyogQWxzbyBjcmVhdGUgYW4gRUxGIGRlc2NyaXB0b3IgZm9yIHRoZSBkZWJ1ZyBmaWxlICovCisgICAgICBkZWJ1Z2VsZiA9IGVsZl9iZWdpbiAoZGVidWdfZmQsIEVMRl9DX1dSSVRFX01NQVAsIE5VTEwpOworICAgICAgaWYgKHVubGlrZWx5IChnZWxmX25ld2VoZHIgKGRlYnVnZWxmLCBnZWxmX2dldGNsYXNzIChlbGYpKSA9PSAwKQorCSAgfHwgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwKKwkgICAgICAmJiB1bmxpa2VseSAoZ2VsZl9uZXdwaGRyIChkZWJ1Z2VsZiwgZWhkci0+ZV9waG51bSkgPT0gMCkpKQorCXsKKwkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBuZXcgZmlsZSAnJXMnOiAlcyIpLAorCQkgZGVidWdfZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7CisJICBnb3RvIGZhaWxfY2xvc2U7CisJfQorCisgICAgICAvKiBDb3B5IG92ZXIgdGhlIG9sZCBwcm9ncmFtIGhlYWRlciBpZiBuZWVkZWQuICAqLworICAgICAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwpCisJZm9yIChjbnQgPSAwOyBjbnQgPCBlaGRyLT5lX3BobnVtOyArK2NudCkKKwkgIHsKKwkgICAgR0VsZl9QaGRyIHBoZHJfbWVtOworCSAgICBHRWxmX1BoZHIgKnBoZHI7CisKKwkgICAgcGhkciA9IGdlbGZfZ2V0cGhkciAoZWxmLCBjbnQsICZwaGRyX21lbSk7CisJICAgIGlmIChwaGRyID09IE5VTEwKKwkJfHwgdW5saWtlbHkgKGdlbGZfdXBkYXRlX3BoZHIgKGRlYnVnZWxmLCBjbnQsIHBoZHIpID09IDApKQorCSAgICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisJICB9CisgICAgfQorCisgIC8qIE51bWJlciBvZiBzZWN0aW9ucy4gICovCisgIGlmICh1bmxpa2VseSAoZWxmX2dldHNobnVtIChlbGYsICZzaG51bSkgPCAwKSkKKyAgICB7CisgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIHNlY3Rpb25zOiAlcyIpLAorCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGdvdG8gZmFpbF9jbG9zZTsKKyAgICB9CisKKyAgLyogU3RvcmFnZSBmb3Igc2VjdGlvbiBpbmZvcm1hdGlvbi4gIFdlIGxlYXZlIHJvb20gZm9yIHR3byBtb3JlCisgICAgIGVudHJpZXMgc2luY2Ugd2UgdW5jb25kaXRpb25hbGx5IGNyZWF0ZSBhIHNlY3Rpb24gaGVhZGVyIHN0cmluZworICAgICB0YWJsZS4gIE1heWJlIHNvbWUgd2VpcmQgdG9vbCBjcmVhdGVkIGFuIEVMRiBmaWxlIHdpdGhvdXQgb25lLgorICAgICBUaGUgb3RoZXIgb25lIGlzIHVzZWQgZm9yIHRoZSBkZWJ1ZyBsaW5rIHNlY3Rpb24uICAqLworICBpZiAoKHNobnVtICsgMikgKiBzaXplb2YgKHN0cnVjdCBzaGRyX2luZm8pID4gTUFYX1NUQUNLX0FMTE9DKQorICAgIHNoZHJfaW5mbyA9IChzdHJ1Y3Qgc2hkcl9pbmZvICopIHhjYWxsb2MgKHNobnVtICsgMiwKKwkJCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc2hkcl9pbmZvKSk7CisgIGVsc2UKKyAgICB7CisgICAgICBzaGRyX2luZm8gPSAoc3RydWN0IHNoZHJfaW5mbyAqKSBhbGxvY2EgKChzaG51bSArIDIpCisJCQkJCSAgICAgICAqIHNpemVvZiAoc3RydWN0IHNoZHJfaW5mbykpOworICAgICAgbWVtc2V0IChzaGRyX2luZm8sICdcMCcsIChzaG51bSArIDIpICogc2l6ZW9mIChzdHJ1Y3Qgc2hkcl9pbmZvKSk7CisgICAgfQorCisgIC8qIFByZXBhcmUgc2VjdGlvbiBpbmZvcm1hdGlvbiBkYXRhIHN0cnVjdHVyZS4gICovCisgIHNjbiA9IE5VTEw7CisgIGNudCA9IDE7CisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUaGlzIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSAoaS5lLiwgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkKKwkgaG9sZXMgaW4gdGhlIG51bWJlcmluZykuICAqLworICAgICAgYXNzZXJ0IChlbGZfbmR4c2NuIChzY24pID09IGNudCk7CisKKyAgICAgIHNoZHJfaW5mb1tjbnRdLnNjbiA9IHNjbjsKKworICAgICAgLyogR2V0IHRoZSBoZWFkZXIuICAqLworICAgICAgaWYgKGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9pbmZvW2NudF0uc2hkcikgPT0gTlVMTCkKKwlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworCisgICAgICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24uICAqLworICAgICAgc2hkcl9pbmZvW2NudF0ubmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgc2hzdHJuZHgsCisJCQkJCXNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbmFtZSk7CisgICAgICBpZiAoc2hkcl9pbmZvW2NudF0ubmFtZSA9PSBOVUxMKQorCXsKKwkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiaWxsZm9ybWVkIGZpbGUgJyVzJyIpLCBmbmFtZSk7CisJICBnb3RvIGZhaWxfY2xvc2U7CisJfQorCisgICAgICAvKiBNYXJrIHRoZW0gYXMgcHJlc2VudCBidXQgbm90IHlldCBpbnZlc3RpZ2F0ZWQuICAqLworICAgICAgc2hkcl9pbmZvW2NudF0uaWR4ID0gMTsKKworICAgICAgLyogUmVtZW1iZXIgdGhlIHNoZHIuc2hfbGluayB2YWx1ZS4gICovCisgICAgICBzaGRyX2luZm9bY250XS5vbGRfc2hfbGluayA9IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbGluazsKKworICAgICAgLyogU2VjdGlvbnMgaW4gZmlsZXMgb3RoZXIgdGhhbiByZWxvY2F0YWJsZSBvYmplY3QgZmlsZXMgd2hpY2gKKwkgYXJlIG5vdCBsb2FkZWQgY2FuIGJlIGZyZWVseSBtb3ZlZCBieSB1cy4gIEluIHJlbG9jYXRhYmxlCisJIG9iamVjdCBmaWxlcyBldmVyeXRoaW5nIGNhbiBiZSBtb3ZlZC4gICovCisgICAgICBpZiAoZWhkci0+ZV90eXBlID09IEVUX1JFTAorCSAgfHwgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpID09IDApCisJc2hkcl9pbmZvW2NudF0uc2hkci5zaF9vZmZzZXQgPSAwOworCisgICAgICAvKiBJZiB0aGlzIGlzIGFuIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggdGFibGUgc3RvcmUgYW4KKwkgYXBwcm9wcmlhdGUgcmVmZXJlbmNlLiAgKi8KKyAgICAgIGlmICh1bmxpa2VseSAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgpKQorCXsKKwkgIGFzc2VydCAoc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbGlua10uc3ltdGFiX2lkeCA9PSAwKTsKKwkgIHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmtdLnN5bXRhYl9pZHggPSBjbnQ7CisJfQorICAgICAgZWxzZSBpZiAodW5saWtlbHkgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfR1JPVVApKQorCXsKKwkgIEVsZjMyX1dvcmQgKmdycHJlZjsKKwkgIHNpemVfdCBpbm5lcjsKKworCSAgLyogQ3Jvc3MtcmVmZXJlbmNlIHRoZSBzZWN0aW9ucyBjb250YWluZWQgaW4gdGhlIHNlY3Rpb24KKwkgICAgIGdyb3VwLiAgKi8KKwkgIHNoZHJfaW5mb1tjbnRdLmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2hkcl9pbmZvW2NudF0uc2NuLCBOVUxMKTsKKwkgIGlmIChzaGRyX2luZm9bY250XS5kYXRhID09IE5VTEwpCisJICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisKKwkgIC8qIFhYWCBGaXggZm9yIHVuYWxpZ25lZCBhY2Nlc3MuICAqLworCSAgZ3JwcmVmID0gKEVsZjMyX1dvcmQgKikgc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9idWY7CisJICBmb3IgKGlubmVyID0gMTsKKwkgICAgICAgaW5uZXIgPCBzaGRyX2luZm9bY250XS5kYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpOworCSAgICAgICArK2lubmVyKQorCSAgICBzaGRyX2luZm9bZ3JwcmVmW2lubmVyXV0uZ3JvdXBfaWR4ID0gY250OworCisJICBpZiAoaW5uZXIgPT0gMSB8fCAoaW5uZXIgPT0gMiAmJiAoZ3JwcmVmWzBdICYgR1JQX0NPTURBVCkgPT0gMCkpCisJICAgIC8qIElmIHRoZSBzZWN0aW9uIGdyb3VwIGNvbnRhaW5zIG9ubHkgb25lIGVsZW1lbnQgYW5kIHRoaXMKKwkgICAgICAgaXMgbiBDT01EQVQgc2VjdGlvbiB3ZSBjYW4gZHJvcCBpdCByaWdodCBhd2F5LiAgKi8KKwkgICAgc2hkcl9pbmZvW2NudF0uaWR4ID0gMDsKKwkgIGVsc2UKKwkgICAgc2hkcl9pbmZvW2NudF0uZ3JvdXBfY250ID0gaW5uZXIgLSAxOworCX0KKyAgICAgIGVsc2UgaWYgKHVubGlrZWx5IChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX0dOVV92ZXJzeW0pKQorCXsKKwkgIGFzc2VydCAoc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbGlua10udmVyc2lvbl9pZHggPT0gMCk7CisJICBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rXS52ZXJzaW9uX2lkeCA9IGNudDsKKwl9CisKKyAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgZ3JvdXAgbWFrZSBzdXJlIGl0IGlzIG5vdAorCSBkaXNjYXJkZWQgcmlnaHQgYXdheS4gICovCisgICAgICBpZiAoKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfZmxhZ3MgJiBTSEZfR1JPVVApICE9IDApCisJeworCSAgYXNzZXJ0IChzaGRyX2luZm9bY250XS5ncm91cF9pZHggIT0gMCk7CisKKwkgIGlmIChzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uZ3JvdXBfaWR4XS5pZHggPT0gMCkKKwkgICAgeworCSAgICAgIC8qIFRoZSBzZWN0aW9uIGdyb3VwIHNlY3Rpb24gd2lsbCBiZSByZW1vdmVkLiAgKi8KKwkgICAgICBzaGRyX2luZm9bY250XS5ncm91cF9pZHggPSAwOworCSAgICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfZmxhZ3MgJj0gflNIRl9HUk9VUDsKKwkgICAgfQorCX0KKworICAgICAgLyogSW5jcmVtZW50IHRoZSBjb3VudGVyLiAgKi8KKyAgICAgICsrY250OworICAgIH0KKworICAvKiBOb3cgZGV0ZXJtaW5lIHdoaWNoIHNlY3Rpb25zIGNhbiBnbyBhd2F5LiAgVGhlIGdlbmVyYWwgcnVsZSBpcyB0aGF0CisgICAgIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgbm90IHVzZWQgYXQgcnVudGltZSBhcmUgc3RyaXBwZWQgb3V0LiAgQnV0CisgICAgIHRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zOgorCisgICAgIC0gc3BlY2lhbCBzZWN0aW9ucyBuYW1lZCAiLmNvbW1lbnQiIGFuZCAiLm5vdGUiIGFyZSBrZXB0CisgICAgIC0gT1Mgb3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHNlY3Rpb25zIGFyZSBrZXB0IHNpbmNlIHdlIG1pZ2h0IG5vdAorICAgICAgIGtub3cgaG93IHRvIGhhbmRsZSB0aGVtCisgICAgIC0gaWYgYSBzZWN0aW9uIGlzIHJlZmVycmVkIHRvIGZyb20gYSBzZWN0aW9uIHdoaWNoIGlzIG5vdCByZW1vdmVkCisgICAgICAgaW4gdGhlIHNoX2xpbmsgb3Igc2hfaW5mbyBlbGVtZW50IGl0IGNhbm5vdCBiZSByZW1vdmVkIGVpdGhlcgorICAqLworICBmb3IgKGNudCA9IDE7IGNudCA8IHNobnVtOyArK2NudCkKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBzZWN0aW9uIGNhbiBiZSByZW1vdmVkLiAgKi8KKyAgICBpZiAoZWJsX3NlY3Rpb25fc3RyaXBfcCAoZWJsLCBlaGRyLCAmc2hkcl9pbmZvW2NudF0uc2hkciwKKwkJCSAgICAgc2hkcl9pbmZvW2NudF0ubmFtZSwgcmVtb3ZlX2NvbW1lbnQsCisJCQkgICAgIHJlbW92ZV9kZWJ1ZykpCisgICAgICB7CisJLyogRm9yIG5vdyBhc3N1bWUgdGhpcyBzZWN0aW9uIHdpbGwgYmUgcmVtb3ZlZC4gICovCisJc2hkcl9pbmZvW2NudF0uaWR4ID0gMDsKKworCWlkeCA9IHNoZHJfaW5mb1tjbnRdLmdyb3VwX2lkeDsKKwl3aGlsZSAoaWR4ICE9IDApCisJICB7CisJICAgIC8qIElmIHRoZSByZWZlcmVuY2VzIHNlY3Rpb24gZ3JvdXAgaXMgYSBub3JtYWwgc2VjdGlvbgorCSAgICAgICBncm91cCBhbmQgaGFzIG9uZSBlbGVtZW50IHJlbWFpbmluZywgb3IgaWYgaXQgaXMgYW4KKwkgICAgICAgZW1wdHkgQ09NREFUIHNlY3Rpb24gZ3JvdXAgaXQgaXMgcmVtb3ZlZC4gICovCisJICAgIGJvb2wgaXNfY29tZGF0OworCisJICAgIC8qIFRoZSBzZWN0aW9uIGdyb3VwIGRhdGEgaXMgYWxyZWFkeSBsb2FkZWQuICAqLworCSAgICBhc3NlcnQgKHNoZHJfaW5mb1tpZHhdLmRhdGEgIT0gTlVMTCk7CisKKwkgICAgaXNfY29tZGF0ID0gKCgoRWxmMzJfV29yZCAqKSBzaGRyX2luZm9baWR4XS5kYXRhLT5kX2J1ZilbMF0KKwkJCSAmIEdSUF9DT01EQVQpICE9IDA7CisKKwkgICAgLS1zaGRyX2luZm9baWR4XS5ncm91cF9jbnQ7CisJICAgIGlmICgoIWlzX2NvbWRhdCAmJiBzaGRyX2luZm9baWR4XS5ncm91cF9jbnQgPT0gMSkKKwkJfHwgKGlzX2NvbWRhdCAmJiBzaGRyX2luZm9baWR4XS5ncm91cF9jbnQgPT0gMCkpCisJICAgICAgeworCQlzaGRyX2luZm9baWR4XS5pZHggPSAwOworCQkvKiBDb250aW51ZSByZWN1cnNpdmVseS4gICovCisJCWlkeCA9IHNoZHJfaW5mb1tpZHhdLmdyb3VwX2lkeDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBicmVhazsKKwkgIH0KKyAgICAgIH0KKworICAvKiBNYXJrIHRoZSBTSFRfTlVMTCBzZWN0aW9uIGFzIGhhbmRsZWQuICAqLworICBzaGRyX2luZm9bMF0uaWR4ID0gMjsKKworCisgIC8qIEhhbmRsZSBleGNlcHRpb25zOiBzZWN0aW9uIGdyb3VwcyBhbmQgY3Jvc3MtcmVmZXJlbmNlcy4gIFdlIG1pZ2h0CisgICAgIGhhdmUgdG8gcmVwZWF0IHRoaXMgYSBmZXcgdGltZXMgc2luY2UgdGhlIHJlc2V0dGluZyBvZiB0aGUgZmxhZworICAgICBtaWdodCBwcm9wYWdhdGUuICAqLworICBkbworICAgIHsKKyAgICAgIGNoYW5nZXMgPSBmYWxzZTsKKworICAgICAgZm9yIChjbnQgPSAxOyBjbnQgPCBzaG51bTsgKytjbnQpCisJeworCSAgaWYgKHNoZHJfaW5mb1tjbnRdLmlkeCA9PSAwKQorCSAgICB7CisJICAgICAgLyogSWYgYSByZWxvY2F0aW9uIHNlY3Rpb24gaXMgbWFya2VkIGFzIGJlaW5nIHJlbW92ZWQgbWFrZQorCQkgc3VyZSB0aGUgc2VjdGlvbiBpdCBpcyByZWxvY2F0aW5nIGlzIHJlbW92ZWQsIHRvby4gICovCisJICAgICAgaWYgKChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAorCQkgICB8fCBzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX1JFTEEpCisJCSAgJiYgc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnNoZHIuc2hfaW5mb10uaWR4ICE9IDApCisJCXNoZHJfaW5mb1tjbnRdLmlkeCA9IDE7CisJICAgIH0KKworCSAgaWYgKHNoZHJfaW5mb1tjbnRdLmlkeCA9PSAxKQorCSAgICB7CisJICAgICAgLyogVGhlIGNvbnRlbnQgb2Ygc3ltYm9sIHRhYmxlcyB3ZSBkb24ndCByZW1vdmUgbXVzdCBub3QKKwkJIHJlZmVyZW5jZSBhbnkgc2VjdGlvbiB3aGljaCB3ZSBkbyByZW1vdmUuICBPdGhlcndpc2UKKwkJIHdlIGNhbm5vdCByZW1vdmUgdGhlIHNlY3Rpb24uICAqLworCSAgICAgIGlmIChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX0RZTlNZTQorCQkgIHx8IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfU1lNVEFCKQorCQl7CisJCSAgRWxmX0RhdGEgKnN5bWRhdGE7CisJCSAgRWxmX0RhdGEgKnhuZHhkYXRhOworCQkgIHNpemVfdCBlbHNpemU7CisKKwkJICAvKiBNYWtlIHN1cmUgdGhlIGRhdGEgaXMgbG9hZGVkLiAgKi8KKwkJICBpZiAoc2hkcl9pbmZvW2NudF0uZGF0YSA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBzaGRyX2luZm9bY250XS5kYXRhCisJCQk9IGVsZl9nZXRkYXRhIChzaGRyX2luZm9bY250XS5zY24sIE5VTEwpOworCQkgICAgICBpZiAoc2hkcl9pbmZvW2NudF0uZGF0YSA9PSBOVUxMKQorCQkJSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKwkJICAgIH0KKwkJICBzeW1kYXRhID0gc2hkcl9pbmZvW2NudF0uZGF0YTsKKworCQkgIC8qIElmIHRoZXJlIGlzIGFuIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggdGFibGUgbG9hZCBpdAorCQkgICAgIGFzIHdlbGwuICAqLworCQkgIGlmIChzaGRyX2luZm9bY250XS5zeW10YWJfaWR4ICE9IDAKKwkJICAgICAgJiYgc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnN5bXRhYl9pZHhdLmRhdGEgPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgYXNzZXJ0IChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX1NZTVRBQik7CisKKwkJICAgICAgc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnN5bXRhYl9pZHhdLmRhdGEKKwkJCT0gZWxmX2dldGRhdGEgKHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zeW10YWJfaWR4XS5zY24sCisJCQkJICAgICAgIE5VTEwpOworCQkgICAgICBpZiAoc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnN5bXRhYl9pZHhdLmRhdGEgPT0gTlVMTCkKKwkJCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisJCSAgICB9CisJCSAgeG5keGRhdGEgPSBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc3ltdGFiX2lkeF0uZGF0YTsKKworCQkgIC8qIEdvIHRocm91Z2ggYWxsIHN5bWJvbHMgYW5kIG1ha2Ugc3VyZSB0aGUgc2VjdGlvbiB0aGV5CisJCSAgICAgcmVmZXJlbmNlIGlzIG5vdCByZW1vdmVkLiAgKi8KKwkJICBlbHNpemUgPSBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NZTSwgMSwgZWhkci0+ZV92ZXJzaW9uKTsKKworCQkgIGZvciAoc2l6ZV90IGlubmVyID0gMDsKKwkJICAgICAgIGlubmVyIDwgc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplIC8gZWxzaXplOworCQkgICAgICAgKytpbm5lcikKKwkJICAgIHsKKwkJICAgICAgR0VsZl9TeW0gc3ltX21lbTsKKwkJICAgICAgRWxmMzJfV29yZCB4bmR4OworCQkgICAgICBHRWxmX1N5bSAqc3ltOworCQkgICAgICBzaXplX3Qgc2NuaWR4OworCisJCSAgICAgIHN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKHN5bWRhdGEsIHhuZHhkYXRhLCBpbm5lciwKKwkJCQkJICAgICAgJnN5bV9tZW0sICZ4bmR4KTsKKwkJICAgICAgaWYgKHN5bSA9PSBOVUxMKQorCQkJSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKworCQkgICAgICBzY25pZHggPSBzeW0tPnN0X3NobmR4OworCQkgICAgICBpZiAoc2NuaWR4ID09IFNITl9VTkRFRiB8fCBzY25pZHggPj0gc2hudW0KKwkJCSAgfHwgKHNjbmlkeCA+PSBTSE5fTE9SRVNFUlZFCisJCQkgICAgICAmJiBzY25pZHggPD0gU0hOX0hJUkVTRVJWRQorCQkJICAgICAgJiYgc2NuaWR4ICE9IFNITl9YSU5ERVgpCisJCQkgIC8qIERvbid0IGNvdW50IGluIHRoZSBzZWN0aW9uIHN5bWJvbHMuICAqLworCQkJICB8fCBHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCisJCQkvKiBUaGlzIGlzIG5vIHNlY3Rpb24gaW5kZXgsIGxlYXZlIGl0IGFsb25lLiAgKi8KKwkJCWNvbnRpbnVlOworCQkgICAgICBlbHNlIGlmIChzY25pZHggPT0gU0hOX1hJTkRFWCkKKwkJCXNjbmlkeCA9IHhuZHg7CisKKwkJICAgICAgaWYgKHNoZHJfaW5mb1tzY25pZHhdLmlkeCA9PSAwKQorCQkJeworCQkJICAvKiBNYXJrIHRoaXMgc2VjdGlvbiBhcyB1c2VkLiAgKi8KKwkJCSAgc2hkcl9pbmZvW3NjbmlkeF0uaWR4ID0gMTsKKwkJCSAgY2hhbmdlcyB8PSBzY25pZHggPCBjbnQ7CisJCQl9CisJCSAgICB9CisJCX0KKworCSAgICAgIC8qIENyb3NzIHJlZmVyZW5jaW5nIGhhcHBlbnM6CisJCSAtIGZvciB0aGUgY2FzZXMgdGhlIEVMRiBzcGVjaWZpY2F0aW9uIHNheXMuICBUaGF0IGFyZQorCQkgICArIFNIVF9EWU5BTUlDIGluIHNoX2xpbmsgdG8gc3RyaW5nIHRhYmxlCisJCSAgICsgU0hUX0hBU0ggaW4gc2hfbGluayB0byBzeW1ib2wgdGFibGUKKwkJICAgKyBTSFRfUkVMIGFuZCBTSFRfUkVMQSBpbiBzaF9saW5rIHRvIHN5bWJvbCB0YWJsZQorCQkgICArIFNIVF9TWU1UQUIgYW5kIFNIVF9EWU5TWU0gaW4gc2hfbGluayB0byBzdHJpbmcgdGFibGUKKwkJICAgKyBTSFRfR1JPVVAgaW4gc2hfbGluayB0byBzeW1ib2wgdGFibGUKKwkJICAgKyBTSFRfU1lNVEFCX1NITkRYIGluIHNoX2xpbmsgdG8gc3ltYm9sIHRhYmxlCisJCSAgIE90aGVyIChPUyBvciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMpIHNlY3Rpb25zIG1pZ2h0IGFzCisJCSAgIHdlbGwgdXNlIHRoaXMgZmllbGQgc28gd2UgcHJvY2VzcyBpdCB1bmNvbmRpdGlvbmFsbHkuCisJCSAtIHJlZmVyZW5jZXMgaW5zaWRlIHNlY3Rpb24gZ3JvdXBzCisJCSAtIHNwZWNpYWxseSBtYXJrZWQgcmVmZXJlbmNlcyBpbiBzaF9pbmZvIGlmIHRoZSBTSEZfSU5GT19MSU5LCisJCSBmbGFnIGlzIHNldAorCSAgICAgICovCisKKwkgICAgICBpZiAoc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbGlua10uaWR4ID09IDApCisJCXsKKwkJICBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rXS5pZHggPSAxOworCQkgIGNoYW5nZXMgfD0gc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rIDwgY250OworCQl9CisKKwkgICAgICAvKiBIYW5kbGUgcmVmZXJlbmNlcyB0aHJvdWdoIHNoX2luZm8uICAqLworCSAgICAgIGlmIChTSF9JTkZPX0xJTktfUCAoJnNoZHJfaW5mb1tjbnRdLnNoZHIpCisJCSAgJiYgc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnNoZHIuc2hfaW5mb10uaWR4ID09IDApCisJCXsKKwkJICBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9pbmZvXS5pZHggPSAxOworCQkgIGNoYW5nZXMgfD0gc2hkcl9pbmZvW2NudF0uc2hkci5zaF9pbmZvIDwgY250OworCQl9CisKKwkgICAgICAvKiBNYXJrIHRoZSBzZWN0aW9uIGFzIGludmVzdGlnYXRlZC4gICovCisJICAgICAgc2hkcl9pbmZvW2NudF0uaWR4ID0gMjsKKwkgICAgfQorCX0KKyAgICB9CisgIHdoaWxlIChjaGFuZ2VzKTsKKworICAvKiBDb3B5IHRoZSByZW1vdmVkIHNlY3Rpb25zIHRvIHRoZSBkZWJ1ZyBvdXRwdXQgZmlsZS4KKyAgICAgVGhlIG9uZXMgdGhhdCBhcmUgbm90IHJlbW92ZWQgaW4gdGhlIHN0cmlwcGVkIGZpbGUgYXJlIFNIVF9OT0JJVFMuICAqLworICBpZiAoZGVidWdfZm5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKGNudCA9IDE7IGNudCA8IHNobnVtOyArK2NudCkKKwl7CisJICBFbGZfRGF0YSAqZGVidWdkYXRhOworCSAgR0VsZl9TaGRyIGRlYnVnc2hkcjsKKwkgIGJvb2wgZGlzY2FyZF9zZWN0aW9uOworCisJICBzY24gPSBlbGZfbmV3c2NuIChkZWJ1Z2VsZik7CisJICBpZiAoc2NuID09IE5VTEwpCisJICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJCSAgIGdldHRleHQgKCJ3aGlsZSBnZW5lcmF0aW5nIG91dHB1dCBmaWxlOiAlcyIpLAorCQkgICBlbGZfZXJybXNnICgtMSkpOworCisJICBkaXNjYXJkX3NlY3Rpb24gPSBzaGRyX2luZm9bY250XS5pZHggPiAwICYmIGNudCAhPSBlaGRyLT5lX3Noc3RybmR4OworCisJICAvKiBTZXQgdGhlIHNlY3Rpb24gaGVhZGVyIGluIHRoZSBuZXcgZmlsZS4gICovCisJICBkZWJ1Z3NoZHIgPSBzaGRyX2luZm9bY250XS5zaGRyOworCSAgaWYgKGRpc2NhcmRfc2VjdGlvbikKKwkgICAgZGVidWdzaGRyLnNoX3R5cGUgPSBTSFRfTk9CSVRTOworCisJICBpZiAodW5saWtlbHkgKGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgJmRlYnVnc2hkcikpID09IDApCisJICAgIC8qIFRoZXJlIGNhbm5vdCBiZSBhbnkgb3ZlcmZsb3dzLiAgKi8KKwkgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKworCSAgLyogR2V0IHRoZSBkYXRhIGZyb20gdGhlIG9sZCBmaWxlIGlmIG5lY2Vzc2FyeS4gKi8KKwkgIGlmIChzaGRyX2luZm9bY250XS5kYXRhID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzaGRyX2luZm9bY250XS5kYXRhID0gZWxmX2dldGRhdGEgKHNoZHJfaW5mb1tjbnRdLnNjbiwgTlVMTCk7CisJICAgICAgaWYgKHNoZHJfaW5mb1tjbnRdLmRhdGEgPT0gTlVMTCkKKwkJSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKwkgICAgfQorCisJICAvKiBTZXQgdGhlIGRhdGEuICBUaGlzIGlzIGRvbmUgYnkgY29weWluZyBmcm9tIHRoZSBvbGQgZmlsZS4gICovCisJICBkZWJ1Z2RhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKKwkgIGlmIChkZWJ1Z2RhdGEgPT0gTlVMTCkKKwkgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKworCSAgLyogQ29weSB0aGUgc3RydWN0dXJlLiAgVGhpcyBkYXRhIG1heSBiZSBtb2RpZmllZCBpbiBwbGFjZQorCSAgICAgYmVmb3JlIHdlIHdyaXRlIG91dCB0aGUgZmlsZS4gICovCisJICAqZGVidWdkYXRhID0gKnNoZHJfaW5mb1tjbnRdLmRhdGE7CisJICBpZiAoZGlzY2FyZF9zZWN0aW9uKQorCSAgICBkZWJ1Z2RhdGEtPmRfYnVmID0gTlVMTDsKKwl9CisKKyAgICAgIC8qIEZpbmlzaCB0aGUgRUxGIGhlYWRlci4gIEZpbGwgaW4gdGhlIGZpZWxkcyBub3QgaGFuZGxlZCBieQorCSBsaWJlbGYgZnJvbSB0aGUgb2xkIGZpbGUuICAqLworICAgICAgZGVidWdlaGRyID0gZ2VsZl9nZXRlaGRyIChkZWJ1Z2VsZiwgJmRlYnVnZWhkcl9tZW0pOworICAgICAgaWYgKGRlYnVnZWhkciA9PSBOVUxMKQorCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisKKyAgICAgIG1lbWNweSAoZGVidWdlaGRyLT5lX2lkZW50LCBlaGRyLT5lX2lkZW50LCBFSV9OSURFTlQpOworICAgICAgZGVidWdlaGRyLT5lX3R5cGUgPSBlaGRyLT5lX3R5cGU7CisgICAgICBkZWJ1Z2VoZHItPmVfbWFjaGluZSA9IGVoZHItPmVfbWFjaGluZTsKKyAgICAgIGRlYnVnZWhkci0+ZV92ZXJzaW9uID0gZWhkci0+ZV92ZXJzaW9uOworICAgICAgZGVidWdlaGRyLT5lX2VudHJ5ID0gZWhkci0+ZV9lbnRyeTsKKyAgICAgIGRlYnVnZWhkci0+ZV9mbGFncyA9IGVoZHItPmVfZmxhZ3M7CisgICAgICBkZWJ1Z2VoZHItPmVfc2hzdHJuZHggPSBlaGRyLT5lX3Noc3RybmR4OworCisgICAgICBpZiAodW5saWtlbHkgKGdlbGZfdXBkYXRlX2VoZHIgKGRlYnVnZWxmLCBkZWJ1Z2VoZHIpKSA9PSAwKQorCXsKKwkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXM6IGVycm9yIHdoaWxlIGNyZWF0aW5nIEVMRiBoZWFkZXI6ICVzIiksCisJCSBkZWJ1Z19mbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKKwkgIHJlc3VsdCA9IDE7CisJICBnb3RvIGZhaWxfY2xvc2U7CisJfQorICAgIH0KKworICAvKiBNYXJrIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgYXMgdW51c2VkLCB3ZSB3aWxsIGNyZWF0ZQorICAgICBhIG5ldyBvbmUuICAqLworICBzaGRyX2luZm9bc2hzdHJuZHhdLmlkeCA9IDA7CisKKyAgLyogV2UgbmVlZCBhIHN0cmluZyB0YWJsZSBmb3IgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCisgIHNoc3QgPSBlYmxfc3RydGFiaW5pdCAodHJ1ZSk7CisgIGlmIChzaHN0ID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSBwcmVwYXJpbmcgb3V0cHV0IGZvciAnJXMnIiksCisJICAgb3V0cHV0X2ZuYW1lID86IGZuYW1lKTsKKworICAvKiBBc3NpZ24gbmV3IHNlY3Rpb24gbnVtYmVycy4gICovCisgIHNoZHJfaW5mb1swXS5pZHggPSAwOworICBmb3IgKGNudCA9IGlkeCA9IDE7IGNudCA8IHNobnVtOyArK2NudCkKKyAgICBpZiAoc2hkcl9pbmZvW2NudF0uaWR4ID4gMCkKKyAgICAgIHsKKwlzaGRyX2luZm9bY250XS5pZHggPSBpZHgrKzsKKworCS8qIENyZWF0ZSBhIG5ldyBzZWN0aW9uLiAgKi8KKwlzaGRyX2luZm9bY250XS5uZXdzY24gPSBlbGZfbmV3c2NuIChuZXdlbGYpOworCWlmIChzaGRyX2luZm9bY250XS5uZXdzY24gPT0gTlVMTCkKKwkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJ3aGlsZSBnZW5lcmF0aW5nIG91dHB1dCBmaWxlOiAlcyIpLAorCQkgZWxmX2Vycm1zZyAoLTEpKTsKKworCWFzc2VydCAoZWxmX25keHNjbiAoc2hkcl9pbmZvW2NudF0ubmV3c2NuKSA9PSBzaGRyX2luZm9bY250XS5pZHgpOworCisJLyogQWRkIHRoaXMgbmFtZSB0byB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlLiAgKi8KKwlzaGRyX2luZm9bY250XS5zZSA9IGVibF9zdHJ0YWJhZGQgKHNoc3QsIHNoZHJfaW5mb1tjbnRdLm5hbWUsIDApOworICAgICAgfQorCisgIC8qIFRlc3Qgd2hldGhlciB3ZSBhcmUgZG9pbmcgYW55dGhpbmcgYXQgYWxsLiAgKi8KKyAgaWYgKGNudCA9PSBpZHgpCisgICAgLyogTm9wZSwgYWxsIHJlbW92YWJsZSBzZWN0aW9ucyBhcmUgYWxyZWFkeSBnb25lLiAgKi8KKyAgICBnb3RvIGZhaWxfY2xvc2U7CisKKyAgLyogQ3JlYXRlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGZpbGUgd2l0aCB0aGUgZGVidWcgaW5mby4gICovCisgIGlmIChkZWJ1Z19mbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNoYXIgKmRlYnVnX2Jhc2VuYW1lOworICAgICAgb2ZmX3QgY3JjX29mZnNldDsKKworICAgICAgLyogQWRkIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgc2VjdGlvbiBuYW1lLiAgKi8KKyAgICAgIHNoZHJfaW5mb1tjbnRdLnNlID0gZWJsX3N0cnRhYmFkZCAoc2hzdCwgIi5nbnVfZGVidWdsaW5rIiwgMTUpOworICAgICAgc2hkcl9pbmZvW2NudF0uaWR4ID0gaWR4Kys7CisKKyAgICAgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLworICAgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID0gU0hUX1BST0dCSVRTOworICAgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9mbGFncyA9IDA7CisgICAgICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2FkZHIgPSAwOworICAgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rID0gU0hOX1VOREVGOworICAgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9pbmZvID0gU0hOX1VOREVGOworICAgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9lbnRzaXplID0gMDsKKyAgICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfYWRkcmFsaWduID0gNDsKKyAgICAgIC8qIFdlIHNldCB0aGUgb2Zmc2V0IHRvIHplcm8gaGVyZS4gIEJlZm9yZSB3ZSB3cml0ZSB0aGUgRUxGIGZpbGUgdGhlCisJIGZpZWxkIG11c3QgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIFRoaXMgaXMgZG9uZSBpbiB0aGUgZmluYWwKKwkgbG9vcCBvdmVyIGFsbCBzZWN0aW9uLiAgVGhlbiB3ZSBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkLiAgKi8KKyAgICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfb2Zmc2V0ID0gMDsKKworICAgICAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uLiAgKi8KKyAgICAgIHNoZHJfaW5mb1tjbnRdLm5ld3NjbiA9IGVsZl9uZXdzY24gKG5ld2VsZik7CisgICAgICBpZiAoc2hkcl9pbmZvW2NudF0ubmV3c2NuID09IE5VTEwpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKKwkgICAgICAgZ2V0dGV4dCAoIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzZWN0aW9uOiAlcyIpLAorCSAgICAgICBlbGZfZXJybXNnICgtMSkpOworICAgICAgYXNzZXJ0IChlbGZfbmR4c2NuIChzaGRyX2luZm9bY250XS5uZXdzY24pID09IHNoZHJfaW5mb1tjbnRdLmlkeCk7CisKKyAgICAgIHNoZHJfaW5mb1tjbnRdLmRhdGEgPSBlbGZfbmV3ZGF0YSAoc2hkcl9pbmZvW2NudF0ubmV3c2NuKTsKKyAgICAgIGlmIChzaGRyX2luZm9bY250XS5kYXRhID09IE5VTEwpCisJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoImNhbm5vdCBhbGxvY2F0ZSBzZWN0aW9uIGRhdGE6ICVzIiksCisJICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgICAgIGRlYnVnX2Jhc2VuYW1lID0gYmFzZW5hbWUgKGRlYnVnX2ZuYW1lX2VtYmVkID86IGRlYnVnX2ZuYW1lKTsKKyAgICAgIGNyY19vZmZzZXQgPSBzdHJsZW4gKGRlYnVnX2Jhc2VuYW1lKSArIDE7CisgICAgICAvKiBBbGlnbiB0byA0IGJ5dGUgYm91bmRhcnkgKi8KKyAgICAgIGNyY19vZmZzZXQgPSAoKGNyY19vZmZzZXQgLSAxKSAmIH4zKSArIDQ7CisKKyAgICAgIHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfYWxpZ24gPSA0OworICAgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9zaXplID0gc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplCisJPSBjcmNfb2Zmc2V0ICsgNDsKKyAgICAgIHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfYnVmID0geGNhbGxvYyAoMSwgc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplKTsKKworICAgICAgc3RyY3B5IChzaGRyX2luZm9bY250XS5kYXRhLT5kX2J1ZiwgZGVidWdfYmFzZW5hbWUpOworCisgICAgICAvKiBDYWNoZSB0aGlzIEVsZl9EYXRhIGRlc2NyaWJpbmcgdGhlIENSQzMyIHdvcmQgaW4gdGhlIHNlY3Rpb24uCisJIFdlJ2xsIGZpbGwgdGhpcyBpbiB3aGVuIHdlIGhhdmUgd3JpdHRlbiB0aGUgZGVidWcgZmlsZS4gICovCisgICAgICBkZWJ1Z2xpbmtfY3JjX2RhdGEgPSAqc2hkcl9pbmZvW2NudF0uZGF0YTsKKyAgICAgIGRlYnVnbGlua19jcmNfZGF0YS5kX2J1ZiA9ICgoY2hhciAqKSBkZWJ1Z2xpbmtfY3JjX2RhdGEuZF9idWYKKwkJCQkgICsgY3JjX29mZnNldCk7CisgICAgICBkZWJ1Z2xpbmtfY3JjX2RhdGEuZF9zaXplID0gNDsKKworICAgICAgLyogT25lIG1vcmUgc2VjdGlvbiBkb25lLiAgKi8KKyAgICAgICsrY250OworICAgIH0KKworICAvKiBJbmRleCBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW4gdGhlIHNoZHJfaW5mbyBhcnJheS4gICovCisgIHNpemVfdCBzaGRyaWR4ID0gY250OworCisgIC8qIEFkZCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24gbmFtZS4gICovCisgIHNoZHJfaW5mb1tjbnRdLnNlID0gZWJsX3N0cnRhYmFkZCAoc2hzdCwgIi5zaHN0cnRhYiIsIDEwKTsKKyAgc2hkcl9pbmZvW2NudF0uaWR4ID0gaWR4OworCisgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLworICBzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPSBTSFRfU1RSVEFCOworICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2ZsYWdzID0gMDsKKyAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9hZGRyID0gMDsKKyAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rID0gU0hOX1VOREVGOworICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2luZm8gPSBTSE5fVU5ERUY7CisgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfZW50c2l6ZSA9IDA7CisgIC8qIFdlIHNldCB0aGUgb2Zmc2V0IHRvIHplcm8gaGVyZS4gIEJlZm9yZSB3ZSB3cml0ZSB0aGUgRUxGIGZpbGUgdGhlCisgICAgIGZpZWxkIG11c3QgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIFRoaXMgaXMgZG9uZSBpbiB0aGUgZmluYWwKKyAgICAgbG9vcCBvdmVyIGFsbCBzZWN0aW9uLiAgVGhlbiB3ZSBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkLiAgKi8KKyAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9vZmZzZXQgPSAwOworICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2FkZHJhbGlnbiA9IDE7CisKKyAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uLiAgKi8KKyAgc2hkcl9pbmZvW2NudF0ubmV3c2NuID0gZWxmX25ld3NjbiAobmV3ZWxmKTsKKyAgaWYgKHNoZHJfaW5mb1tjbnRdLm5ld3NjbiA9PSBOVUxMKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzZWN0aW9uOiAlcyIpLAorCSAgIGVsZl9lcnJtc2cgKC0xKSk7CisgIGFzc2VydCAoZWxmX25keHNjbiAoc2hkcl9pbmZvW2NudF0ubmV3c2NuKSA9PSBpZHgpOworCisgIC8qIEZpbmFsaXplIHRoZSBzdHJpbmcgdGFibGUgYW5kIGZpbGwgaW4gdGhlIGNvcnJlY3QgaW5kaWNlcyBpbiB0aGUKKyAgICAgc2VjdGlvbiBoZWFkZXJzLiAgKi8KKyAgc2hzdHJ0YWJfZGF0YSA9IGVsZl9uZXdkYXRhIChzaGRyX2luZm9bY250XS5uZXdzY24pOworICBpZiAoc2hzdHJ0YWJfZGF0YSA9PSBOVUxMKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCisJICAgZ2V0dGV4dCAoIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIiksCisJICAgZWxmX2Vycm1zZyAoLTEpKTsKKyAgZWJsX3N0cnRhYmZpbmFsaXplIChzaHN0LCBzaHN0cnRhYl9kYXRhKTsKKworICAvKiBXZSBoYXZlIHRvIHNldCB0aGUgc2VjdGlvbiBzaXplLiAgKi8KKyAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9zaXplID0gc2hzdHJ0YWJfZGF0YS0+ZF9zaXplOworCisgIC8qIFVwZGF0ZSB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCisgIEdFbGZfT2ZmIGxhc3RvZmZzZXQgPSAwOworICBmb3IgKGNudCA9IDE7IGNudCA8PSBzaGRyaWR4OyArK2NudCkKKyAgICBpZiAoc2hkcl9pbmZvW2NudF0uaWR4ID4gMCkKKyAgICAgIHsKKwlFbGZfRGF0YSAqbmV3ZGF0YTsKKworCXNjbiA9IGVsZl9nZXRzY24gKG5ld2VsZiwgc2hkcl9pbmZvW2NudF0uaWR4KTsKKwlhc3NlcnQgKHNjbiAhPSBOVUxMKTsKKworCS8qIFVwZGF0ZSB0aGUgbmFtZS4gICovCisJc2hkcl9pbmZvW2NudF0uc2hkci5zaF9uYW1lID0gZWJsX3N0cnRhYm9mZnNldCAoc2hkcl9pbmZvW2NudF0uc2UpOworCisJLyogVXBkYXRlIHRoZSBzZWN0aW9uIGhlYWRlciBmcm9tIHRoZSBpbnB1dCBmaWxlLiAgU29tZSBmaWVsZHMKKwkgICBtaWdodCBiZSBzZWN0aW9uIGluZGVjZXMgd2hpY2ggbm93IGhhdmUgdG8gYmUgYWRqdXN0ZWQuICAqLworCWlmIChzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmsgIT0gMCkKKwkgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbGluayA9CisJICAgIHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmtdLmlkeDsKKworCWlmIChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX0dST1VQKQorCSAgeworCSAgICBhc3NlcnQgKHNoZHJfaW5mb1tjbnRdLmRhdGEgIT0gTlVMTCk7CisKKwkgICAgRWxmMzJfV29yZCAqZ3JwcmVmID0gKEVsZjMyX1dvcmQgKikgc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9idWY7CisJICAgIGZvciAoc2l6ZV90IGlubmVyID0gMDsKKwkJIGlubmVyIDwgc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplIC8gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKKwkJICsraW5uZXIpCisJICAgICAgZ3JwcmVmW2lubmVyXSA9IHNoZHJfaW5mb1tncnByZWZbaW5uZXJdXS5pZHg7CisJICB9CisKKwkvKiBIYW5kbGUgdGhlIFNIVF9SRUwsIFNIVF9SRUxBLCBhbmQgU0hGX0lORk9fTElOSyBmbGFnLiAgKi8KKwlpZiAoU0hfSU5GT19MSU5LX1AgKCZzaGRyX2luZm9bY250XS5zaGRyKSkKKwkgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfaW5mbyA9CisJICAgIHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zaGRyLnNoX2luZm9dLmlkeDsKKworCS8qIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBvbGQgZmlsZSBpZiBuZWNlc3NhcnkuICBXZSBhbHJlYWR5CisgICAgICAgICAgIGNyZWF0ZWQgdGhlIGRhdGEgZm9yIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLworCWlmIChjbnQgPCBzaG51bSkKKwkgIHsKKwkgICAgaWYgKHNoZHJfaW5mb1tjbnRdLmRhdGEgPT0gTlVMTCkKKwkgICAgICB7CisJCXNoZHJfaW5mb1tjbnRdLmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2hkcl9pbmZvW2NudF0uc2NuLCBOVUxMKTsKKwkJaWYgKHNoZHJfaW5mb1tjbnRdLmRhdGEgPT0gTlVMTCkKKwkJICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworCSAgICAgIH0KKworCSAgICAvKiBTZXQgdGhlIGRhdGEuICBUaGlzIGlzIGRvbmUgYnkgY29weWluZyBmcm9tIHRoZSBvbGQgZmlsZS4gICovCisJICAgIG5ld2RhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKKwkgICAgaWYgKG5ld2RhdGEgPT0gTlVMTCkKKwkgICAgICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworCisJICAgIC8qIENvcHkgdGhlIHN0cnVjdHVyZS4gICovCisJICAgICpuZXdkYXRhID0gKnNoZHJfaW5mb1tjbnRdLmRhdGE7CisKKwkgICAgLyogV2Uga25vdyB0aGUgc2l6ZS4gICovCisJICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfc2l6ZSA9IHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfc2l6ZTsKKworCSAgICAvKiBXZSBoYXZlIHRvIGFkanVzdCBzeW10b2wgdGFibGVzLiAgVGhlIHN0X3NobmR4IG1lbWJlciBtaWdodAorCSAgICAgICBoYXZlIHRvIGJlIHVwZGF0ZWQuICAqLworCSAgICBpZiAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9EWU5TWU0KKwkJfHwgc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9TWU1UQUIpCisJICAgICAgeworCQlFbGZfRGF0YSAqdmVyc2lvbmRhdGEgPSBOVUxMOworCQlFbGZfRGF0YSAqc2huZHhkYXRhID0gTlVMTDsKKworCQlzaXplX3QgZWxzaXplID0gZ2VsZl9mc2l6ZSAoZWxmLCBFTEZfVF9TWU0sIDEsCisJCQkJCSAgICBlaGRyLT5lX3ZlcnNpb24pOworCisJCWlmIChzaGRyX2luZm9bY250XS5zeW10YWJfaWR4ICE9IDApCisJCSAgeworCQkgICAgYXNzZXJ0IChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX1NZTVRBQl9TSE5EWCk7CisJCSAgICAvKiBUaGlzIHNlY3Rpb24gaGFzIGV4dGVuZGVkIHNlY3Rpb24gaW5mb3JtYXRpb24uCisJCSAgICAgICBXZSBoYXZlIHRvIG1vZGlmeSB0aGF0IGluZm9ybWF0aW9uLCB0b28uICAqLworCQkgICAgc2huZHhkYXRhID0gZWxmX2dldGRhdGEgKHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zeW10YWJfaWR4XS5zY24sCisJCQkJCSAgICAgTlVMTCk7CisKKwkJICAgIGFzc2VydCAoKHZlcnNpb25kYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpKQorCQkJICAgID49IHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfc2l6ZSAvIGVsc2l6ZSk7CisJCSAgfQorCisJCWlmIChzaGRyX2luZm9bY250XS52ZXJzaW9uX2lkeCAhPSAwKQorCQkgIHsKKwkJICAgIGFzc2VydCAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9EWU5TWU0pOworCQkgICAgLyogVGhpcyBzZWN0aW9uIGhhcyBhc3NvY2lhdGVkIHZlcnNpb24KKwkJICAgICAgIGluZm9ybWF0aW9uLiAgV2UgaGF2ZSB0byBtb2RpZnkgdGhhdAorCQkgICAgICAgaW5mb3JtYXRpb24sIHRvby4gICovCisJCSAgICB2ZXJzaW9uZGF0YSA9IGVsZl9nZXRkYXRhIChzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0udmVyc2lvbl9pZHhdLnNjbiwKKwkJCQkJICAgICAgIE5VTEwpOworCisJCSAgICBhc3NlcnQgKCh2ZXJzaW9uZGF0YS0+ZF9zaXplIC8gc2l6ZW9mIChHRWxmX1ZlcnN5bSkpCisJCQkgICAgPj0gc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplIC8gZWxzaXplKTsKKwkJICB9CisKKwkJc2hkcl9pbmZvW2NudF0ubmV3c3ltaWR4CisJCSAgPSAoRWxmMzJfV29yZCAqKSB4Y2FsbG9jIChzaGRyX2luZm9bY250XS5kYXRhLT5kX3NpemUKKwkJCQkJICAgIC8gZWxzaXplLCBzaXplb2YgKEVsZjMyX1dvcmQpKTsKKworCQlib29sIGxhc3Rfd2FzX2xvY2FsID0gdHJ1ZTsKKwkJc2l6ZV90IGRlc3RpZHg7CisJCXNpemVfdCBpbm5lcjsKKwkJZm9yIChkZXN0aWR4ID0gaW5uZXIgPSAxOworCQkgICAgIGlubmVyIDwgc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplIC8gZWxzaXplOworCQkgICAgICsraW5uZXIpCisJCSAgeworCQkgICAgRWxmMzJfV29yZCBzZWM7CisJCSAgICBHRWxmX1N5bSBzeW1fbWVtOworCQkgICAgRWxmMzJfV29yZCB4c2huZHg7CisJCSAgICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW1zaG5keCAoc2hkcl9pbmZvW2NudF0uZGF0YSwKKwkJCQkJCSAgICAgIHNobmR4ZGF0YSwgaW5uZXIsCisJCQkJCQkgICAgICAmc3ltX21lbSwgJnhzaG5keCk7CisJCSAgICBpZiAoc3ltID09IE5VTEwpCisJCSAgICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisKKwkJICAgIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRgorCQkJfHwgKHN5bS0+c3Rfc2huZHggPj0gc2hudW0KKwkJCSAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9YSU5ERVgpKQorCQkgICAgICB7CisJCQkvKiBUaGlzIGlzIG5vIHNlY3Rpb24gaW5kZXgsIGxlYXZlIGl0IGFsb25lCisJCQkgICB1bmxlc3MgaXQgaXMgbW92ZWQuICAqLworCQkJaWYgKGRlc3RpZHggIT0gaW5uZXIKKwkJCSAgICAmJiBnZWxmX3VwZGF0ZV9zeW1zaG5keCAoc2hkcl9pbmZvW2NudF0uZGF0YSwKKwkJCQkJCSAgICAgc2huZHhkYXRhLAorCQkJCQkJICAgICBkZXN0aWR4LCBzeW0sCisJCQkJCQkgICAgIHhzaG5keCkgPT0gMCkKKwkJCSAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKworCQkJc2hkcl9pbmZvW2NudF0ubmV3c3ltaWR4W2lubmVyXSA9IGRlc3RpZHgrKzsKKworCQkJaWYgKGxhc3Rfd2FzX2xvY2FsCisJCQkgICAgJiYgR0VMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKKwkJCSAgeworCQkJICAgIGxhc3Rfd2FzX2xvY2FsID0gZmFsc2U7CisJCQkgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9pbmZvID0gZGVzdGlkeCAtIDE7CisJCQkgIH0KKworCQkJY29udGludWU7CisJCSAgICAgIH0KKworCQkgICAgLyogR2V0IHRoZSBmdWxsIHNlY3Rpb24gaW5kZXgsIGlmIG5lY2Vzc2FyeSBmcm9tIHRoZQorCQkgICAgICAgWElOREVYIHRhYmxlLiAgKi8KKwkJICAgIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9YSU5ERVgpCisJCSAgICAgIHNlYyA9IHNoZHJfaW5mb1tzeW0tPnN0X3NobmR4XS5pZHg7CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCWFzc2VydCAoc2huZHhkYXRhICE9IE5VTEwpOworCisJCQlzZWMgPSBzaGRyX2luZm9beHNobmR4XS5pZHg7CisJCSAgICAgIH0KKworCQkgICAgaWYgKHNlYyAhPSAwKQorCQkgICAgICB7CisJCQlHRWxmX1NlY3Rpb24gbnNobmR4OworCQkJRWxmMzJfV29yZCBueHNobmR4OworCisJCQlpZiAoc2VjIDwgU0hOX0xPUkVTRVJWRSkKKwkJCSAgeworCQkJICAgIG5zaG5keCA9IHNlYzsKKwkJCSAgICBueHNobmR4ID0gMDsKKwkJCSAgfQorCQkJZWxzZQorCQkJICB7CisJCQkgICAgbnNobmR4ID0gU0hOX1hJTkRFWDsKKwkJCSAgICBueHNobmR4ID0gc2VjOworCQkJICB9CisKKwkJCWFzc2VydCAoc2VjIDwgU0hOX0xPUkVTRVJWRSB8fCBzaG5keGRhdGEgIT0gTlVMTCk7CisKKwkJCWlmICgoaW5uZXIgIT0gZGVzdGlkeCB8fCBuc2huZHggIT0gc3ltLT5zdF9zaG5keAorCQkJICAgICB8fCAoc2huZHhkYXRhICE9IE5VTEwgJiYgbnhzaG5keCAhPSB4c2huZHgpKQorCQkJICAgICYmIChzeW0tPnN0X3NobmR4ID0gbnNobmR4LAorCQkJCWdlbGZfdXBkYXRlX3N5bXNobmR4IChzaGRyX2luZm9bY250XS5kYXRhLAorCQkJCQkJICAgICAgc2huZHhkYXRhLAorCQkJCQkJICAgICAgZGVzdGlkeCwgc3ltLAorCQkJCQkJICAgICAgbnhzaG5keCkgPT0gMCkpCisJCQkgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisKKwkJCXNoZHJfaW5mb1tjbnRdLm5ld3N5bWlkeFtpbm5lcl0gPSBkZXN0aWR4Kys7CisKKwkJCWlmIChsYXN0X3dhc19sb2NhbAorCQkJICAgICYmIEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCisJCQkgIHsKKwkJCSAgICBsYXN0X3dhc19sb2NhbCA9IGZhbHNlOworCQkJICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfaW5mbyA9IGRlc3RpZHggLSAxOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgLyogVGhpcyBpcyBhIHNlY3Rpb24gc3ltYm9sIGZvciBhIHNlY3Rpb24gd2hpY2ggaGFzCisJCQkgYmVlbiByZW1vdmVkLiAgKi8KKwkJICAgICAgYXNzZXJ0IChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pOworCQkgIH0KKworCQlpZiAoZGVzdGlkeCAhPSBpbm5lcikKKwkJICB7CisJCSAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGNoYW5nZWQuICAqLworCQkgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9zaXplID0gbmV3ZGF0YS0+ZF9zaXplCisJCSAgICAgID0gZGVzdGlkeCAqIGVsc2l6ZTsKKwkJICAgIGFueV9zeW10YWJfY2hhbmdlcyA9IHRydWU7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgLyogVGhlIHN5bWJvbCB0YWJsZSBkaWRuJ3QgcmVhbGx5IGNoYW5nZS4gICovCisJCSAgICBmcmVlIChzaGRyX2luZm9bY250XS5uZXdzeW1pZHgpOworCQkgICAgc2hkcl9pbmZvW2NudF0ubmV3c3ltaWR4ID0gTlVMTDsKKwkJICB9CisJICAgICAgfQorCSAgfQorCisJLyogSWYgd2UgaGF2ZSB0bywgY29tcHV0ZSB0aGUgb2Zmc2V0IG9mIHRoZSBzZWN0aW9uLiAgKi8KKwlpZiAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF9vZmZzZXQgPT0gMCkKKwkgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfb2Zmc2V0CisJICAgID0gKChsYXN0b2Zmc2V0ICsgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9hZGRyYWxpZ24gLSAxKQorCSAgICAgICAmIH4oKEdFbGZfT2ZmKSAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF9hZGRyYWxpZ24gLSAxKSkpOworCisJLyogU2V0IHRoZSBzZWN0aW9uIGhlYWRlciBpbiB0aGUgbmV3IGZpbGUuICAqLworCWlmICh1bmxpa2VseSAoZ2VsZl91cGRhdGVfc2hkciAoc2NuLCAmc2hkcl9pbmZvW2NudF0uc2hkcikgPT0gMCkpCisJICAvKiBUaGVyZSBjYW5ub3QgYmUgYW55IG92ZXJmbG93cy4gICovCisJICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworCisJLyogUmVtZW1iZXIgdGhlIGxhc3Qgc2VjdGlvbiB3cml0dGVuIHNvIGZhci4gICovCisJR0VsZl9PZmYgZmlsZXN6ID0gKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSAhPSBTSFRfTk9CSVRTCisJCQkgICA/IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfc2l6ZSA6IDApOworCWlmIChsYXN0b2Zmc2V0IDwgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9vZmZzZXQgKyBmaWxlc3opCisJICBsYXN0b2Zmc2V0ID0gc2hkcl9pbmZvW2NudF0uc2hkci5zaF9vZmZzZXQgKyBmaWxlc3o7CisgICAgICB9CisKKyAgLyogQWRqdXN0IHN5bWJvbCByZWZlcmVuY2VzIGlmIHN5bWJvbCB0YWJsZXMgY2hhbmdlZC4gICovCisgIGlmIChhbnlfc3ltdGFiX2NoYW5nZXMpCisgICAgeworICAgICAgLyogRmluZCBhbGwgcmVsb2NhdGlvbiBzZWN0aW9ucyB3aGljaCB1c2UgdGhpcworCSBzeW1ib2wgdGFibGUuICAqLworICAgICAgZm9yIChjbnQgPSAxOyBjbnQgPD0gc2hkcmlkeDsgKytjbnQpCisJeworCSAgaWYgKHNoZHJfaW5mb1tjbnRdLmlkeCA9PSAwICYmIGRlYnVnX2ZuYW1lID09IE5VTEwpCisJICAgIC8qIElnbm9yZSBzZWN0aW9ucyB3aGljaCBhcmUgZGlzY2FyZGVkLiAgV2hlbiB3ZSBhcmUgc2F2aW5nIGEKKwkgICAgICAgcmVsb2NhdGlvbiBzZWN0aW9uIGluIGEgc2VwYXJhdGUgZGVidWcgZmlsZSwgd2UgbXVzdCBmaXggdXAKKwkgICAgICAgdGhlIHN5bWJvbCB0YWJsZSByZWZlcmVuY2VzLiAgKi8KKwkgICAgY29udGludWU7CisKKwkgIGlmIChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAorCSAgICAgIHx8IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkKKwkgICAgeworCSAgICAgIC8qIElmIHRoZSBzeW1ib2wgdGFibGUgaGFzbid0IGNoYW5nZWQsIGRvIG5vdCBkbyBhbnl0aGluZy4gICovCisJICAgICAgaWYgKHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5vbGRfc2hfbGlua10ubmV3c3ltaWR4ID09IE5VTEwpCisJCWNvbnRpbnVlOworCisJICAgICAgRWxmMzJfV29yZCAqbmV3c3ltaWR4CisJCT0gc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLm9sZF9zaF9saW5rXS5uZXdzeW1pZHg7CisJICAgICAgRWxmX0RhdGEgKmQgPSBlbGZfZ2V0ZGF0YSAoc2hkcl9pbmZvW2NudF0uaWR4ID09IDAKKwkJCQkJID8gZWxmX2dldHNjbiAoZGVidWdlbGYsIGNudCkKKwkJCQkJIDogZWxmX2dldHNjbiAobmV3ZWxmLAorCQkJCQkJICAgICAgIHNoZHJfaW5mb1tjbnRdLmlkeCksCisJCQkJCSBOVUxMKTsKKwkgICAgICBhc3NlcnQgKGQgIT0gTlVMTCk7CisJICAgICAgc2l6ZV90IG5yZWxzID0gKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfc2l6ZQorCQkJICAgICAgLyBzaGRyX2luZm9bY250XS5zaGRyLnNoX2VudHNpemUpOworCisJICAgICAgaWYgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfUkVMKQorCQlmb3IgKHNpemVfdCByZWxpZHggPSAwOyByZWxpZHggPCBucmVsczsgKytyZWxpZHgpCisJCSAgeworCQkgICAgR0VsZl9SZWwgcmVsX21lbTsKKwkJICAgIGlmIChnZWxmX2dldHJlbCAoZCwgcmVsaWR4LCAmcmVsX21lbSkgPT0gTlVMTCkKKwkJICAgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKworCQkgICAgc2l6ZV90IHN5bWlkeCA9IEdFTEZfUl9TWU0gKHJlbF9tZW0ucl9pbmZvKTsKKwkJICAgIGlmIChuZXdzeW1pZHhbc3ltaWR4XSAhPSBzeW1pZHgpCisJCSAgICAgIHsKKwkJCXJlbF9tZW0ucl9pbmZvCisJCQkgID0gR0VMRl9SX0lORk8gKG5ld3N5bWlkeFtzeW1pZHhdLAorCQkJCQkgR0VMRl9SX1RZUEUgKHJlbF9tZW0ucl9pbmZvKSk7CisKKwkJCWlmIChnZWxmX3VwZGF0ZV9yZWwgKGQsIHJlbGlkeCwgJnJlbF9tZW0pID09IDApCisJCQkgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgZWxzZQorCQlmb3IgKHNpemVfdCByZWxpZHggPSAwOyByZWxpZHggPCBucmVsczsgKytyZWxpZHgpCisJCSAgeworCQkgICAgR0VsZl9SZWxhIHJlbF9tZW07CisJCSAgICBpZiAoZ2VsZl9nZXRyZWxhIChkLCByZWxpZHgsICZyZWxfbWVtKSA9PSBOVUxMKQorCQkgICAgICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworCisJCSAgICBzaXplX3Qgc3ltaWR4ID0gR0VMRl9SX1NZTSAocmVsX21lbS5yX2luZm8pOworCQkgICAgaWYgKG5ld3N5bWlkeFtzeW1pZHhdICE9IHN5bWlkeCkKKwkJICAgICAgeworCQkJcmVsX21lbS5yX2luZm8KKwkJCSAgPSBHRUxGX1JfSU5GTyAobmV3c3ltaWR4W3N5bWlkeF0sCisJCQkJCSBHRUxGX1JfVFlQRSAocmVsX21lbS5yX2luZm8pKTsKKworCQkJaWYgKGdlbGZfdXBkYXRlX3JlbGEgKGQsIHJlbGlkeCwgJnJlbF9tZW0pID09IDApCisJCQkgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7CisJCSAgICAgIH0KKwkJICB9CisJICAgIH0KKwkgIGVsc2UgaWYgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfSEFTSCkKKwkgICAgeworCSAgICAgIC8qIFdlIGhhdmUgdG8gcmVjb21wdXRlIHRoZSBoYXNoIHRhYmxlLiAgKi8KKwkgICAgICBFbGYzMl9Xb3JkIHN5bXRhYmlkeCA9IHNoZHJfaW5mb1tjbnRdLm9sZF9zaF9saW5rOworCisJICAgICAgLyogV2UgZG8gbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgaWYgdGhlIHN5bWJvbCB0YWJsZSB3YXMKKwkJIG5vdCBjaGFuZ2VkLiAgKi8KKwkgICAgICBpZiAoc2hkcl9pbmZvW3N5bXRhYmlkeF0ubmV3c3ltaWR4ID09IE5VTEwpCisJCWNvbnRpbnVlOworCisJICAgICAgYXNzZXJ0IChzaGRyX2luZm9bY250XS5pZHggPiAwKTsKKworCSAgICAgIC8qIFRoZSBoYXNoIHNlY3Rpb24gaW4gdGhlIG5ldyBmaWxlLiAgKi8KKwkgICAgICBzY24gPSBlbGZfZ2V0c2NuIChuZXdlbGYsIHNoZHJfaW5mb1tjbnRdLmlkeCk7CisKKwkgICAgICAvKiBUaGUgc3ltYm9sIHRhYmxlIGRhdGEuICAqLworCSAgICAgIEVsZl9EYXRhICpzeW1kID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKG5ld2VsZiwKKwkJCQkJCQlzaGRyX2luZm9bc3ltdGFiaWR4XS5pZHgpLAorCQkJCQkgICAgTlVMTCk7CisJICAgICAgYXNzZXJ0IChzeW1kICE9IE5VTEwpOworCisJICAgICAgLyogVGhlIGhhc2ggdGFibGUgZGF0YS4gICovCisJICAgICAgRWxmX0RhdGEgKmhhc2hkID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisJICAgICAgYXNzZXJ0IChoYXNoZCAhPSBOVUxMKTsKKworCSAgICAgIGlmIChzaGRyX2luZm9bY250XS5zaGRyLnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGYzMl9Xb3JkKSkKKwkJeworCQkgIC8qIFNhbmUgYXJjaGVzIGZpcnN0LiAgKi8KKwkJICBFbGYzMl9Xb3JkICpidWNrZXQgPSAoRWxmMzJfV29yZCAqKSBoYXNoZC0+ZF9idWY7CisKKwkJICBzaXplX3Qgc3Ryc2huZHggPSBzaGRyX2luZm9bc3ltdGFiaWR4XS5vbGRfc2hfbGluazsKKwkJICBzaXplX3QgZWxzaXplID0gZ2VsZl9mc2l6ZSAoZWxmLCBFTEZfVF9TWU0sIDEsCisJCQkJCSAgICAgIGVoZHItPmVfdmVyc2lvbik7CisKKwkJICAvKiBBZGp1c3QgdGhlIG5jaGFpbiB2YWx1ZS4gIFRoZSBzeW1ib2wgdGFibGUgc2l6ZQorCQkgICAgIGNoYW5nZWQuICBXZSBrZWVwIHRoZSBzYW1lIHNpemUgZm9yIHRoZSBidWNrZXQgYXJyYXkuICAqLworCQkgIGJ1Y2tldFsxXSA9IHN5bWQtPmRfc2l6ZSAvIGVsc2l6ZTsKKwkJICBFbGYzMl9Xb3JkIG5idWNrZXQgPSBidWNrZXRbMF07CisJCSAgYnVja2V0ICs9IDI7CisJCSAgRWxmMzJfV29yZCAqY2hhaW4gPSBidWNrZXQgKyBuYnVja2V0OworCisJCSAgLyogTmV3IHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLworCQkgIEdFbGZfU2hkciBzaGRyX21lbTsKKwkJICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKwkJICBzaGRyLT5zaF9zaXplID0gaGFzaGQtPmRfc2l6ZQorCQkgICAgPSAoMiArIHN5bWQtPmRfc2l6ZSAvIGVsc2l6ZSArIG5idWNrZXQpCisJCSAgICAgICogc2l6ZW9mIChFbGYzMl9Xb3JkKTsKKwkJICAodm9pZCkgZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKKworCQkgIC8qIENsZWFyIHRoZSBhcnJheXMuICAqLworCQkgIG1lbXNldCAoYnVja2V0LCAnXDAnLAorCQkJICAoc3ltZC0+ZF9zaXplIC8gZWxzaXplICsgbmJ1Y2tldCkKKwkJCSAgKiBzaXplb2YgKEVsZjMyX1dvcmQpKTsKKworCQkgIGZvciAoc2l6ZV90IGlubmVyID0gc2hkcl9pbmZvW3N5bXRhYmlkeF0uc2hkci5zaF9pbmZvOworCQkgICAgICAgaW5uZXIgPCBzeW1kLT5kX3NpemUgLyBlbHNpemU7ICsraW5uZXIpCisJCSAgICB7CisJCSAgICAgIEdFbGZfU3ltIHN5bV9tZW07CisJCSAgICAgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bSAoc3ltZCwgaW5uZXIsICZzeW1fbWVtKTsKKwkJICAgICAgYXNzZXJ0IChzeW0gIT0gTlVMTCk7CisKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgc3Ryc2huZHgsCisJCQkJCQkgICAgIHN5bS0+c3RfbmFtZSk7CisJCSAgICAgIGFzc2VydCAobmFtZSAhPSBOVUxMKTsKKwkJICAgICAgc2l6ZV90IGhpZHggPSBlbGZfaGFzaCAobmFtZSkgJSBuYnVja2V0OworCisJCSAgICAgIGlmIChidWNrZXRbaGlkeF0gPT0gMCkKKwkJCWJ1Y2tldFtoaWR4XSA9IGlubmVyOworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGhpZHggPSBidWNrZXRbaGlkeF07CisKKwkJCSAgd2hpbGUgKGNoYWluW2hpZHhdICE9IDApCisJCQkgICAgaGlkeCA9IGNoYWluW2hpZHhdOworCisJCQkgIGNoYWluW2hpZHhdID0gaW5uZXI7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBBbHBoYSBhbmQgUzM5MCA2NC1iaXQgdXNlIDY0LWJpdCBTSFRfSEFTSCBlbnRyaWVzLiAgKi8KKwkJICBhc3NlcnQgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfZW50c2l6ZQorCQkJICA9PSBzaXplb2YgKEVsZjY0X1h3b3JkKSk7CisKKwkJICBFbGY2NF9Yd29yZCAqYnVja2V0ID0gKEVsZjY0X1h3b3JkICopIGhhc2hkLT5kX2J1ZjsKKworCQkgIHNpemVfdCBzdHJzaG5keCA9IHNoZHJfaW5mb1tzeW10YWJpZHhdLm9sZF9zaF9saW5rOworCQkgIHNpemVfdCBlbHNpemUgPSBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NZTSwgMSwKKwkJCQkJICAgICAgZWhkci0+ZV92ZXJzaW9uKTsKKworCQkgIC8qIEFkanVzdCB0aGUgbmNoYWluIHZhbHVlLiAgVGhlIHN5bWJvbCB0YWJsZSBzaXplCisJCSAgICAgY2hhbmdlZC4gIFdlIGtlZXAgdGhlIHNhbWUgc2l6ZSBmb3IgdGhlIGJ1Y2tldCBhcnJheS4gICovCisJCSAgYnVja2V0WzFdID0gc3ltZC0+ZF9zaXplIC8gZWxzaXplOworCQkgIEVsZjY0X1h3b3JkIG5idWNrZXQgPSBidWNrZXRbMF07CisJCSAgYnVja2V0ICs9IDI7CisJCSAgRWxmNjRfWHdvcmQgKmNoYWluID0gYnVja2V0ICsgbmJ1Y2tldDsKKworCQkgIC8qIE5ldyBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KKwkJICBHRWxmX1NoZHIgc2hkcl9tZW07CisJCSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisJCSAgc2hkci0+c2hfc2l6ZSA9IGhhc2hkLT5kX3NpemUKKwkJICAgID0gKDIgKyBzeW1kLT5kX3NpemUgLyBlbHNpemUgKyBuYnVja2V0KQorCQkgICAgICAqIHNpemVvZiAoRWxmNjRfWHdvcmQpOworCQkgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpOworCisJCSAgLyogQ2xlYXIgdGhlIGFycmF5cy4gICovCisJCSAgbWVtc2V0IChidWNrZXQsICdcMCcsCisJCQkgIChzeW1kLT5kX3NpemUgLyBlbHNpemUgKyBuYnVja2V0KQorCQkJICAqIHNpemVvZiAoRWxmNjRfWHdvcmQpKTsKKworCQkgIGZvciAoc2l6ZV90IGlubmVyID0gc2hkcl9pbmZvW3N5bXRhYmlkeF0uc2hkci5zaF9pbmZvOworCQkgICAgICAgaW5uZXIgPCBzeW1kLT5kX3NpemUgLyBlbHNpemU7ICsraW5uZXIpCisJCSAgICB7CisJCSAgICAgIEdFbGZfU3ltIHN5bV9tZW07CisJCSAgICAgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bSAoc3ltZCwgaW5uZXIsICZzeW1fbWVtKTsKKwkJICAgICAgYXNzZXJ0IChzeW0gIT0gTlVMTCk7CisKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgc3Ryc2huZHgsCisJCQkJCQkgICAgIHN5bS0+c3RfbmFtZSk7CisJCSAgICAgIGFzc2VydCAobmFtZSAhPSBOVUxMKTsKKwkJICAgICAgc2l6ZV90IGhpZHggPSBlbGZfaGFzaCAobmFtZSkgJSBuYnVja2V0OworCisJCSAgICAgIGlmIChidWNrZXRbaGlkeF0gPT0gMCkKKwkJCWJ1Y2tldFtoaWR4XSA9IGlubmVyOworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGhpZHggPSBidWNrZXRbaGlkeF07CisKKwkJCSAgd2hpbGUgKGNoYWluW2hpZHhdICE9IDApCisJCQkgICAgaGlkeCA9IGNoYWluW2hpZHhdOworCisJCQkgIGNoYWluW2hpZHhdID0gaW5uZXI7CisJCQl9CisJCSAgICB9CisJICAgICAgICB9CisJICAgIH0KKwkgIGVsc2UgaWYgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfR05VX3ZlcnN5bSkKKwkgICAgeworCSAgICAgIC8qIElmIHRoZSBzeW1ib2wgdGFibGUgY2hhbmdlZCB3ZSBoYXZlIHRvIGFkanVzdCB0aGUKKwkJIGVudHJpZXMuICAqLworCSAgICAgIEVsZjMyX1dvcmQgc3ltdGFiaWR4ID0gc2hkcl9pbmZvW2NudF0ub2xkX3NoX2xpbms7CisKKwkgICAgICAvKiBXZSBkbyBub3QgaGF2ZSB0byBkbyBhbnl0aGluZyBpZiB0aGUgc3ltYm9sIHRhYmxlIHdhcworCQkgbm90IGNoYW5nZWQuICAqLworCSAgICAgIGlmIChzaGRyX2luZm9bc3ltdGFiaWR4XS5uZXdzeW1pZHggPT0gTlVMTCkKKwkJY29udGludWU7CisKKwkgICAgICBhc3NlcnQgKHNoZHJfaW5mb1tjbnRdLmlkeCA+IDApOworCisJICAgICAgLyogVGhlIHN5bWJvbCB2ZXJzaW9uIHNlY3Rpb24gaW4gdGhlIG5ldyBmaWxlLiAgKi8KKwkgICAgICBzY24gPSBlbGZfZ2V0c2NuIChuZXdlbGYsIHNoZHJfaW5mb1tjbnRdLmlkeCk7CisKKwkgICAgICAvKiBUaGUgc3ltYm9sIHRhYmxlIGRhdGEuICAqLworCSAgICAgIEVsZl9EYXRhICpzeW1kID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKG5ld2VsZiwKKwkJCQkJCQlzaGRyX2luZm9bc3ltdGFiaWR4XS5pZHgpLAorCQkJCQkgICAgTlVMTCk7CisJICAgICAgYXNzZXJ0IChzeW1kICE9IE5VTEwpOworCisJICAgICAgLyogVGhlIHZlcnNpb24gc3ltYm9sIGRhdGEuICAqLworCSAgICAgIEVsZl9EYXRhICp2ZXJkID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisJICAgICAgYXNzZXJ0ICh2ZXJkICE9IE5VTEwpOworCisJICAgICAgLyogVGhlIHN5bWJvbCB2ZXJzaW9uIGFycmF5LiAgKi8KKwkgICAgICBHRWxmX0hhbGYgKnZlcnN0YWIgPSAoR0VsZl9IYWxmICopIHZlcmQtPmRfYnVmOworCisJICAgICAgLyogTmV3IGluZGljZXMgb2YgdGhlIHN5bWJvbHMuICAqLworCSAgICAgIEVsZjMyX1dvcmQgKm5ld3N5bWlkeCA9IHNoZHJfaW5mb1tzeW10YWJpZHhdLm5ld3N5bWlkeDsKKworCSAgICAgIC8qIFdhbGsgdGhyb3VnaCB0aGUgbGlzdCBhbmQgKi8KKwkgICAgICBzaXplX3QgZWxzaXplID0gZ2VsZl9mc2l6ZSAoZWxmLCB2ZXJkLT5kX3R5cGUsIDEsCisJCQkJCSAgZWhkci0+ZV92ZXJzaW9uKTsKKwkgICAgICBmb3IgKHNpemVfdCBpbm5lciA9IDE7IGlubmVyIDwgdmVyZC0+ZF9zaXplIC8gZWxzaXplOyArK2lubmVyKQorCQlpZiAobmV3c3ltaWR4W2lubmVyXSAhPSAwKQorCQkgIC8qIE92ZXJ3cml0aW5nIHRoZSBzYW1lIGFycmF5IHdvcmtzIHNpbmNlIHRoZQorCQkgICAgIHJlb3JkZXJpbmcgY2FuIG9ubHkgbW92ZSBlbnRyaWVzIHRvIGxvd2VyIGluZGljZXMKKwkJICAgICBpbiB0aGUgYXJyYXkuICAqLworCQkgIHZlcnN0YWJbbmV3c3ltaWR4W2lubmVyXV0gPSB2ZXJzdGFiW2lubmVyXTsKKworCSAgICAgIC8qIE5ldyBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KKwkgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07CisJICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisJICAgICAgc2hkci0+c2hfc2l6ZSA9IHZlcmQtPmRfc2l6ZQorCQk9IGdlbGZfZnNpemUgKG5ld2VsZiwgdmVyZC0+ZF90eXBlLAorCQkJICAgICAgc3ltZC0+ZF9zaXplIC8gZ2VsZl9mc2l6ZSAoZWxmLCBzeW1kLT5kX3R5cGUsIDEsCisJCQkJCQkJIGVoZHItPmVfdmVyc2lvbiksCisJCQkgICAgICBlaGRyLT5lX3ZlcnNpb24pOworCSAgICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpOworCSAgICB9CisJICBlbHNlIGlmIChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX0dST1VQKQorCSAgICB7CisJICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGUgYXNzb2NpYXRlZCBzeW1ib2wgdGFibGUgY2hhbmdlZC4gICovCisJICAgICAgaWYgKHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5vbGRfc2hfbGlua10ubmV3c3ltaWR4ICE9IE5VTEwpCisJCXsKKwkJICAvKiBZZXMgdGhlIHN5bWJvbCB0YWJsZSBjaGFuZ2VkLiAgVXBkYXRlIHRoZSBzZWN0aW9uCisJCSAgICAgaGVhZGVyIG9mIHRoZSBzZWN0aW9uIGdyb3VwLiAgKi8KKwkJICBzY24gPSBlbGZfZ2V0c2NuIChuZXdlbGYsIHNoZHJfaW5mb1tjbnRdLmlkeCk7CisJCSAgR0VsZl9TaGRyIHNoZHJfbWVtOworCQkgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworCQkgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKKworCQkgIHNpemVfdCBzdGFiaWR4ID0gc2hkcl9pbmZvW2NudF0ub2xkX3NoX2xpbms7CisJCSAgc2hkci0+c2hfaW5mbyA9IHNoZHJfaW5mb1tzdGFiaWR4XS5uZXdzeW1pZHhbc2hkci0+c2hfaW5mb107CisKKwkJICAodm9pZCkgZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGRvbmUgYWxsIGFkanVzdG1lbnRzIHRvIHRoZSBkYXRhLAorICAgICB3ZSBjYW4gYWN0dWFsbHkgd3JpdGUgb3V0IHRoZSBkZWJ1ZyBmaWxlLiAgKi8KKyAgaWYgKGRlYnVnX2ZuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgdWludDMyX3QgZGVidWdfY3JjOworICAgICAgRWxmX0RhdGEgZGVidWdfY3JjX2RhdGEgPQorCXsKKwkgIC5kX3R5cGUgPSBFTEZfVF9XT1JELAorCSAgLmRfYnVmID0gJmRlYnVnX2NyYywKKwkgIC5kX3NpemUgPSBzaXplb2YgKGRlYnVnX2NyYyksCisJICAuZF92ZXJzaW9uID0gRVZfQ1VSUkVOVAorCX07CisKKyAgICAgIC8qIEZpbmFsbHkgd3JpdGUgdGhlIGZpbGUuICAqLworICAgICAgaWYgKHVubGlrZWx5IChlbGZfdXBkYXRlIChkZWJ1Z2VsZiwgRUxGX0NfV1JJVEUpKSA9PSAtMSkKKwl7CisJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIndoaWxlIHdyaXRpbmcgJyVzJzogJXMiKSwKKwkJIGRlYnVnX2ZuYW1lLCBlbGZfZXJybXNnICgtMSkpOworCSAgcmVzdWx0ID0gMTsKKwkgIGdvdG8gZmFpbF9jbG9zZTsKKwl9CisKKyAgICAgIC8qIENyZWF0ZSB0aGUgcmVhbCBvdXRwdXQgZmlsZS4gIEZpcnN0IHJlbmFtZSwgdGhlbiBjaGFuZ2UgdGhlCisJIG1vZGUuICAqLworICAgICAgaWYgKHJlbmFtZSAodG1wX2RlYnVnX2ZuYW1lLCBkZWJ1Z19mbmFtZSkgIT0gMAorCSAgfHwgZmNobW9kIChkZWJ1Z19mZCwgbW9kZSkgIT0gMCkKKwl7CisJICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSBjcmVhdGluZyAnJXMnIiksIGRlYnVnX2ZuYW1lKTsKKwkgIHJlc3VsdCA9IDE7CisJICBnb3RvIGZhaWxfY2xvc2U7CisJfQorCisgICAgICAvKiBUaGUgdGVtcG9yYXJ5IGZpbGUgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gICovCisgICAgICB0bXBfZGVidWdfZm5hbWUgPSBOVUxMOworCisgICAgICAvKiBDb21wdXRlIHRoZSBjaGVja3N1bSB3aGljaCB3ZSB3aWxsIGFkZCB0byB0aGUgZXhlY3V0YWJsZS4gICovCisgICAgICBpZiAoY3JjMzJfZmlsZSAoZGVidWdfZmQsICZkZWJ1Z19jcmMpICE9IDApCisJeworCSAgZXJyb3IgKDAsIGVycm5vLAorCQkgZ2V0dGV4dCAoIndoaWxlIGNvbXB1dGluZyBjaGVja3N1bSBmb3IgZGVidWcgaW5mb3JtYXRpb24iKSk7CisJICB1bmxpbmsgKGRlYnVnX2ZuYW1lKTsKKwkgIHJlc3VsdCA9IDE7CisJICBnb3RvIGZhaWxfY2xvc2U7CisJfQorCisgICAgICAvKiBTdG9yZSBpdCBpbiB0aGUgZGVidWdsaW5rIHNlY3Rpb24gZGF0YS4gICovCisgICAgICBpZiAodW5saWtlbHkgKGdlbGZfeGxhdGV0b2YgKG5ld2VsZiwgJmRlYnVnbGlua19jcmNfZGF0YSwKKwkJCQkgICAmZGVidWdfY3JjX2RhdGEsIGVoZHItPmVfaWRlbnRbRUlfREFUQV0pCisJCSAgICAhPSAmZGVidWdsaW5rX2NyY19kYXRhKSkKKwlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworICAgIH0KKworICAvKiBGaW5hbGx5IGZpbmlzaCB0aGUgRUxGIGhlYWRlci4gIEZpbGwgaW4gdGhlIGZpZWxkcyBub3QgaGFuZGxlZCBieQorICAgICBsaWJlbGYgZnJvbSB0aGUgb2xkIGZpbGUuICAqLworICBuZXdlaGRyID0gZ2VsZl9nZXRlaGRyIChuZXdlbGYsICZuZXdlaGRyX21lbSk7CisgIGlmIChuZXdlaGRyID09IE5VTEwpCisgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKKworICBtZW1jcHkgKG5ld2VoZHItPmVfaWRlbnQsIGVoZHItPmVfaWRlbnQsIEVJX05JREVOVCk7CisgIG5ld2VoZHItPmVfdHlwZSA9IGVoZHItPmVfdHlwZTsKKyAgbmV3ZWhkci0+ZV9tYWNoaW5lID0gZWhkci0+ZV9tYWNoaW5lOworICBuZXdlaGRyLT5lX3ZlcnNpb24gPSBlaGRyLT5lX3ZlcnNpb247CisgIG5ld2VoZHItPmVfZW50cnkgPSBlaGRyLT5lX2VudHJ5OworICBuZXdlaGRyLT5lX2ZsYWdzID0gZWhkci0+ZV9mbGFnczsKKyAgbmV3ZWhkci0+ZV9waG9mZiA9IGVoZHItPmVfcGhvZmY7CisgIC8qIFdlIG5lZWQgdG8gcG9zaXRpb24gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlLiAgKi8KKyAgY29uc3Qgc2l6ZV90IG9mZnNpemUgPSBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX09GRiwgMSwgRVZfQ1VSUkVOVCk7CisgIG5ld2VoZHItPmVfc2hvZmYgPSAoKHNoZHJfaW5mb1tzaGRyaWR4XS5zaGRyLnNoX29mZnNldAorCQkgICAgICAgKyBzaGRyX2luZm9bc2hkcmlkeF0uc2hkci5zaF9zaXplICsgb2Zmc2l6ZSAtIDEpCisJCSAgICAgICYgfigoR0VsZl9PZmYpIChvZmZzaXplIC0gMSkpKTsKKyAgbmV3ZWhkci0+ZV9zaGVudHNpemUgPSBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NIRFIsIDEsIEVWX0NVUlJFTlQpOworCisgIC8qIFRoZSBuZXcgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KKyAgaWYgKGxpa2VseSAoaWR4IDwgU0hOX0hJUkVTRVJWRSkgJiYgbGlrZWx5IChpZHggIT0gU0hOX1hJTkRFWCkpCisgICAgbmV3ZWhkci0+ZV9zaHN0cm5keCA9IGlkeDsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoZSBpbmRleCBkb2VzIG5vdCBmaXQgaW4gdGhlIEVMRiBoZWFkZXIgZmllbGQuICAqLworICAgICAgc2hkcl9pbmZvWzBdLnNjbiA9IGVsZl9nZXRzY24gKGVsZiwgMCk7CisKKyAgICAgIGlmIChnZWxmX2dldHNoZHIgKHNoZHJfaW5mb1swXS5zY24sICZzaGRyX2luZm9bMF0uc2hkcikgPT0gTlVMTCkKKwlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworCisgICAgICBzaGRyX2luZm9bMF0uc2hkci5zaF9saW5rID0gaWR4OworICAgICAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHNoZHJfaW5mb1swXS5zY24sICZzaGRyX2luZm9bMF0uc2hkcik7CisKKyAgICAgIG5ld2VoZHItPmVfc2hzdHJuZHggPSBTSE5fWElOREVYOworICAgIH0KKworICBpZiAoZ2VsZl91cGRhdGVfZWhkciAobmV3ZWxmLCBuZXdlaGRyKSA9PSAwKQorICAgIHsKKyAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXM6IGVycm9yIHdoaWxlIGNyZWF0aW5nIEVMRiBoZWFkZXI6ICVzIiksCisJICAgICBmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBXZSBoYXZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgb2xkIGZpbGUuICAqLworICBpZiAoZWxmX2NudGwgKGVsZiwgRUxGX0NfRkRET05FKSAhPSAwKQorICAgIHsKKyAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXM6IGVycm9yIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGU6ICVzIiksCisJICAgICBmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBUaGUgRUxGIGxpYnJhcnkgYmV0dGVyIGZvbGxvd3Mgb3VyIGxheW91dCB3aGVuIHRoaXMgaXMgbm90IGEKKyAgICAgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAqLworICBlbGZfZmxhZ2VsZiAobmV3ZWxmLCBFTEZfQ19TRVQsCisJICAgICAgIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMID8gRUxGX0ZfTEFZT1VUIDogMCkKKwkgICAgICAgfCAocGVybWlzc2l2ZSA/IEVMRl9GX1BFUk1JU1NJVkUgOiAwKSk7CisKKyAgLyogRmluYWxseSB3cml0ZSB0aGUgZmlsZS4gICovCisgIGlmIChlbGZfdXBkYXRlIChuZXdlbGYsIEVMRl9DX1dSSVRFKSA9PSAtMSkKKyAgICB7CisgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIndoaWxlIHdyaXRpbmcgJyVzJzogJXMiKSwKKwkgICAgIGZuYW1lLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisKKyBmYWlsX2Nsb3NlOgorICBpZiAoc2hkcl9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgLyogRm9yIHNvbWUgc2VjdGlvbnMgd2UgbWlnaHQgaGF2ZSBjcmVhdGVkIGFuIHRhYmxlIHRvIG1hcCBzeW1ib2wKKwkgdGFibGUgaW5kaWNlcy4gICovCisgICAgICBpZiAoYW55X3N5bXRhYl9jaGFuZ2VzKQorCWZvciAoY250ID0gMTsgY250IDw9IHNoZHJpZHg7ICsrY250KQorCSAgZnJlZSAoc2hkcl9pbmZvW2NudF0ubmV3c3ltaWR4KTsKKworICAgICAgLyogRnJlZSB0aGUgbWVtb3J5LiAgKi8KKyAgICAgIGlmICgoc2hudW0gKyAyKSAqIHNpemVvZiAoc3RydWN0IHNoZHJfaW5mbykgPiBNQVhfU1RBQ0tfQUxMT0MpCisJZnJlZSAoc2hkcl9pbmZvKTsKKyAgICB9CisKKyAgLyogRnJlZSBvdGhlciByZXNvdXJjZXMuICAqLworICBpZiAoc2hzdHJ0YWJfZGF0YSAhPSBOVUxMKQorICAgIGZyZWUgKHNoc3RydGFiX2RhdGEtPmRfYnVmKTsKKyAgaWYgKHNoc3QgIT0gTlVMTCkKKyAgICBlYmxfc3RydGFiZnJlZSAoc2hzdCk7CisKKyAgLyogVGhhdCB3YXMgaXQuICBDbG9zZSB0aGUgZGVzY3JpcHRvcnMuICAqLworICBpZiAoZWxmX2VuZCAobmV3ZWxmKSAhPSAwKQorICAgIHsKKyAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiZXJyb3Igd2hpbGUgZmluaXNoaW5nICclcyc6ICVzIiksIGZuYW1lLAorCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgfQorCisgIGlmIChkZWJ1Z2VsZiAhPSBOVUxMICYmIGVsZl9lbmQgKGRlYnVnZWxmKSAhPSAwKQorICAgIHsKKyAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiZXJyb3Igd2hpbGUgZmluaXNoaW5nICclcyc6ICVzIiksIGRlYnVnX2ZuYW1lLAorCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgfQorCisgZmFpbDoKKyAgLyogQ2xvc2UgdGhlIEVCTCBiYWNrZW5kLiAgKi8KKyAgaWYgKGVibCAhPSBOVUxMKQorICAgIGVibF9jbG9zZWJhY2tlbmQgKGVibCk7CisKKyAgLyogQ2xvc2UgZGVidWcgZmlsZSBkZXNjcmlwdG9yLCBpZiBvcGVuZWQgKi8KKyAgaWYgKGRlYnVnX2ZkID49IDApCisgICAgeworICAgICAgaWYgKHRtcF9kZWJ1Z19mbmFtZSAhPSBOVUxMKQorCXVubGluayAodG1wX2RlYnVnX2ZuYW1lKTsKKyAgICAgIGNsb3NlIChkZWJ1Z19mZCk7CisgICAgfQorCisgIC8qIElmIHJlcXVlc3RlZCwgcHJlc2VydmUgdGhlIHRpbWVzdGFtcC4gICovCisgIGlmICh0dnAgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZnV0aW1lcyAoZmQsIHR2cCkgIT0gMCkKKwl7CisJICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJcCitjYW5ub3Qgc2V0IGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGUgb2YgJyVzJyIpLAorCQkgb3V0cHV0X2ZuYW1lID86IGZuYW1lKTsKKwkgIHJlc3VsdCA9IDE7CisJfQorICAgIH0KKworICAvKiBDbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGlmIHdlIGNyZWF0ZWQgYSBuZXcgZmlsZS4gICovCisgIGlmIChvdXRwdXRfZm5hbWUgIT0gTlVMTCkKKyAgICBjbG9zZSAoZmQpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludAoraGFuZGxlX2FyIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAorCSAgIHN0cnVjdCB0aW1ldmFsIHR2cFsyXSkKK3sKKyAgc2l6ZV90IHByZWZpeF9sZW4gPSBwcmVmaXggPT0gTlVMTCA/IDAgOiBzdHJsZW4gKHByZWZpeCk7CisgIHNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKSArIDE7CisgIGNoYXIgbmV3X3ByZWZpeFtwcmVmaXhfbGVuICsgMSArIGZuYW1lX2xlbl07CisgIGNoYXIgKmNwID0gbmV3X3ByZWZpeDsKKworICAvKiBDcmVhdGUgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgZmlsZS4gICovCisgIGlmIChwcmVmaXggIT0gTlVMTCkKKyAgICB7CisgICAgICBjcCA9IG1lbXBjcHkgKGNwLCBwcmVmaXgsIHByZWZpeF9sZW4pOworICAgICAgKmNwKysgPSAnOic7CisgICAgfQorICBtZW1jcHkgKGNwLCBmbmFtZSwgZm5hbWVfbGVuKTsKKworCisgIC8qIFByb2Nlc3MgYWxsIHRoZSBmaWxlcyBjb250YWluZWQgaW4gdGhlIGFyY2hpdmUuICAqLworICBFbGYgKnN1YmVsZjsKKyAgRWxmX0NtZCBjbWQgPSBFTEZfQ19SRFdSOworICBpbnQgcmVzdWx0ID0gMDsKKyAgd2hpbGUgKChzdWJlbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIGVsZikpICE9IE5VTEwpCisgICAgeworICAgICAgLyogVGhlIHRoZSBoZWFkZXIgZm9yIHRoaXMgZWxlbWVudC4gICovCisgICAgICBFbGZfQXJoZHIgKmFyaGRyID0gZWxmX2dldGFyaGRyIChzdWJlbGYpOworCisgICAgICBpZiAoZWxmX2tpbmQgKHN1YmVsZikgPT0gRUxGX0tfRUxGKQorCXJlc3VsdCB8PSBoYW5kbGVfZWxmIChmZCwgc3ViZWxmLCBuZXdfcHJlZml4LCBhcmhkci0+YXJfbmFtZSwgMCwgTlVMTCk7CisgICAgICBlbHNlIGlmIChlbGZfa2luZCAoc3ViZWxmKSA9PSBFTEZfS19BUikKKwlyZXN1bHQgfD0gaGFuZGxlX2FyIChmZCwgc3ViZWxmLCBuZXdfcHJlZml4LCBhcmhkci0+YXJfbmFtZSwgTlVMTCk7CisKKyAgICAgIC8qIEdldCBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCisgICAgICBjbWQgPSBlbGZfbmV4dCAoc3ViZWxmKTsKKyAgICAgIGlmICh1bmxpa2VseSAoZWxmX2VuZCAoc3ViZWxmKSAhPSAwKSkKKwlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOworICAgIH0KKworICBpZiAodHZwICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHVubGlrZWx5IChmdXRpbWVzIChmZCwgdHZwKSAhPSAwKSkKKwl7CisJICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJcCitjYW5ub3Qgc2V0IGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGUgb2YgJyVzJyIpLCBmbmFtZSk7CisJICByZXN1bHQgPSAxOworCX0KKyAgICB9CisKKyAgaWYgKHVubGlrZWx5IChjbG9zZSAoZmQpICE9IDApKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBnZXR0ZXh0ICgid2hpbGUgY2xvc2luZyAnJXMnIiksIGZuYW1lKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvc3JjL3N5bWJvbGhhc2guYyBiL3NyYy9zeW1ib2xoYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyYWU2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zeW1ib2xoYXNoLmMKQEAgLTAsMCArMSwyOSBAQAorLyogU3ltYm9sIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxkLmg+CisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgc3ltYm9sIGhhc2ggdGFibGUuICAqLworI2RlZmluZSBUWVBFIHN0cnVjdCBzeW1ib2wgKgorI2RlZmluZSBOQU1FIGxkX3N5bWJvbF90YWIKKyNkZWZpbmUgSVRFUkFURSAxCisjZGVmaW5lIENPTVBBUkUoYSwgYikgc3RyY21wICgoYSktPm5hbWUsIChiKS0+bmFtZSkKKworI2luY2x1ZGUgIi4uL2xpYi9keW5hbWljc2l6ZWhhc2guYyIKZGlmZiAtLWdpdCBhL3NyYy9zeW1ib2xoYXNoLmggYi9zcmMvc3ltYm9saGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Nzk4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3ltYm9saGFzaC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmbmRlZiBTWU1CT0xIQVNIX0gKKyNkZWZpbmUgU1lNQk9MSEFTSF9ICTEKKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBzeW1ib2wgaGFzaCB0YWJsZS4gICovCisjZGVmaW5lIFRZUEUgc3RydWN0IHN5bWJvbCAqCisjZGVmaW5lIE5BTUUgbGRfc3ltYm9sX3RhYgorI2RlZmluZSBJVEVSQVRFIDEKKyNkZWZpbmUgQ09NUEFSRShhLCBiKSBzdHJjbXAgKChhKS0+bmFtZSwgKGIpLT5uYW1lKQorI2luY2x1ZGUgPGR5bmFtaWNzaXplaGFzaC5oPgorCisjZW5kaWYJLyogc3ltYm9saGFzaC5oICovCmRpZmYgLS1naXQgYS9zcmMvdW5hbGlnbmVkLmggYi9zcmMvdW5hbGlnbmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0YjM1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy91bmFsaWduZWQuaApAQCAtMCwwICsxLDk4IEBACisvKiBVbmFsaWduZWQgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbmFsaXR5LgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIF9VTkFMSUdORURfSAorI2RlZmluZSBfVU5BTElHTkVEX0gJMQorCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworCisjaWZuZGVmIFVOQUxJR05FRF9BQ0NFU1NfQ0xBU1MKKyMgZXJyb3IgIlVOQUxJR05FRF9BQ0NFU1NfQ0xBU1MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKworLyogTWFjcm9zIHRvIGNvbnZlcnQgZnJvbSB0aGUgaG9zdCBieXRlIG9yZGVyIHRvIHRoYXQgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KKyNpZiBVTkFMSUdORURfQUNDRVNTX0NMQVNTID09IEJZVEVfT1JERVIKKyMgZGVmaW5lIHRhcmdldF9ic3dhcF8xNihuKSAobikKKyMgZGVmaW5lIHRhcmdldF9ic3dhcF8zMihuKSAobikKKyMgZGVmaW5lIHRhcmdldF9ic3dhcF82NChuKSAobikKKyNlbHNlCisjIGRlZmluZSB0YXJnZXRfYnN3YXBfMTYobikgYnN3YXBfMTYgKG4pCisjIGRlZmluZSB0YXJnZXRfYnN3YXBfMzIobikgYnN3YXBfMzIgKG4pCisjIGRlZmluZSB0YXJnZXRfYnN3YXBfNjQobikgYnN3YXBfNjQgKG4pCisjZW5kaWYKKworCit1bmlvbiB1XzJ1Ynl0ZV91bmFsaWduZWQKK3sKKyAgdWludDE2X3QgdTsKKyAgY2hhciBjWzJdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwordW5pb24gdV80dWJ5dGVfdW5hbGlnbmVkCit7CisgIHVpbnQzMl90IHU7CisgIGNoYXIgY1s0XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3VuaW9uIHVfOHVieXRlX3VuYWxpZ25lZAoreworICB1aW50NjRfdCB1OworICBjaGFyIGNbOF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIE1hY3JvcyB0byBzdG9yZSB2YWx1ZSBhdCB1bmFsaWduZWQgYWRkcmVzcy4gICovCisjZGVmaW5lIHN0b3JlXzJ1Ynl0ZV91bmFsaWduZWQocHRyLCB2YWx1ZSkgXAorICAodm9pZCkgKCgodW5pb24gdV8ydWJ5dGVfdW5hbGlnbmVkICopIChwdHIpKS0+dSA9IHRhcmdldF9ic3dhcF8xNiAodmFsdWUpKQorI2RlZmluZSBzdG9yZV80dWJ5dGVfdW5hbGlnbmVkKHB0ciwgdmFsdWUpIFwKKyAgKHZvaWQpICgoKHVuaW9uIHVfNHVieXRlX3VuYWxpZ25lZCAqKSAocHRyKSktPnUgPSB0YXJnZXRfYnN3YXBfMzIgKHZhbHVlKSkKKyNkZWZpbmUgc3RvcmVfOHVieXRlX3VuYWxpZ25lZChwdHIsIHZhbHVlKSBcCisgICh2b2lkKSAoKCh1bmlvbiB1Xzh1Ynl0ZV91bmFsaWduZWQgKikgKHB0cikpLT51ID0gdGFyZ2V0X2Jzd2FwXzY0ICh2YWx1ZSkpCisKKworLyogTWFjcm9zIHRvIGFkZCB2YWx1ZSB0byB1bmFsaWduZWQgYWRkcmVzcy4gIFRoaXMgaXMgYSBiaXQgbW9yZQorICAgY29tcGxpY2F0ZWQgc2luY2UgdGhlIHZhbHVlIG11c3QgYmUgcmVhZCBmcm9tIG1lbW9yeSBhbmQgZXZlbnR1YWxseQorICAgY29udmVydGVkIHR3aWNlLiAgKi8KKyNpZiBVTkFMSUdORURfQUNDRVNTX0NMQVNTID09IEJZVEVfT1JERVIKKyMgZGVmaW5lIGFkZF8ydWJ5dGVfdW5hbGlnbmVkKHB0ciwgdmFsdWUpIFwKKyAgKHZvaWQpICgoKHVuaW9uIHVfMnVieXRlX3VuYWxpZ25lZCAqKSAocHRyKSktPnUgKz0gdmFsdWUpCisjIGRlZmluZSBhZGRfNHVieXRlX3VuYWxpZ25lZChwdHIsIHZhbHVlKSBcCisgICh2b2lkKSAoKCh1bmlvbiB1XzR1Ynl0ZV91bmFsaWduZWQgKikgKHB0cikpLT51ICs9IHZhbHVlKQorIyBkZWZpbmUgYWRkXzh1Ynl0ZV91bmFsaWduZWQocHRyLCB2YWx1ZSkgXAorICAodm9pZCkgKCgodW5pb24gdV84dWJ5dGVfdW5hbGlnbmVkICopIChwdHIpKS0+dSArPSB2YWx1ZSkKKyNlbHNlCisjIGRlZmluZSBhZGRfMnVieXRlX3VuYWxpZ25lZChwdHIsIHZhbHVlKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5pb24gdV8ydWJ5dGVfdW5hbGlnbmVkICpfcHRyID0gKHB0cik7CQkJCSAgICAgIFwKKyAgICB1aW50MTZfdCBfdmFsID0gYnN3YXBfMTYgKF9wdHItPnUpICsgKHZhbHVlKTsJCQkgICAgICBcCisgICAgX3B0ci0+dSA9IGJzd2FwXzE2IChfdmFsKTsJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjIGRlZmluZSBhZGRfNHVieXRlX3VuYWxpZ25lZChwdHIsIHZhbHVlKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5pb24gdV80dWJ5dGVfdW5hbGlnbmVkICpfcHRyID0gKHB0cik7CQkJCSAgICAgIFwKKyAgICB1aW50MzJfdCBfdmFsID0gYnN3YXBfMzIgKF9wdHItPnUpICsgKHZhbHVlKTsJCQkgICAgICBcCisgICAgX3B0ci0+dSA9IGJzd2FwXzMyIChfdmFsKTsJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjIGRlZmluZSBhZGRfOHVieXRlX3VuYWxpZ25lZChwdHIsIHZhbHVlKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5pb24gdV84dWJ5dGVfdW5hbGlnbmVkICpfcHRyID0gKHB0cik7CQkJCSAgICAgIFwKKyAgICB1aW50NjRfdCBfdmFsID0gYnN3YXBfNjQgKF9wdHItPnUpICsgKHZhbHVlKTsJCQkgICAgICBcCisgICAgX3B0ci0+dSA9IGJzd2FwXzY0IChfdmFsKTsJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2VuZGlmIC8qIHVuYWxpZ25lZC5oICovCmRpZmYgLS1naXQgYS9zcmMvdmVyc2lvbmhhc2guYyBiL3NyYy92ZXJzaW9uaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YjJlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdmVyc2lvbmhhc2guYwpAQCAtMCwwICsxLDI4IEBACisvKiBWZXJzaW9uIHN5bWJvbCBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsZC5oPgorCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIHN5bWJvbCBoYXNoIHRhYmxlLiAgKi8KKyNkZWZpbmUgVFlQRSBzdHJ1Y3QgaWRfbGlzdCAqCisjZGVmaW5lIE5BTUUgbGRfdmVyc2lvbl9zdHJfdGFiCisjZGVmaW5lIENPTVBBUkUoYSwgYikgc3RyY21wICgoYSktPmlkLCAoYiktPmlkKQorCisjaW5jbHVkZSAiLi4vbGliL2R5bmFtaWNzaXplaGFzaC5jIgpkaWZmIC0tZ2l0IGEvc3JjL3ZlcnNpb25oYXNoLmggYi9zcmMvdmVyc2lvbmhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNhZWViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3ZlcnNpb25oYXNoLmgKQEAgLTAsMCArMSwyMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZuZGVmIFZFUlNJT05IQVNIX0gKKyNkZWZpbmUgVkVSU0lPTkhBU0hfSAkxCisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgc3ltYm9sIGhhc2ggdGFibGUuICAqLworI2RlZmluZSBUWVBFIHN0cnVjdCBpZF9saXN0ICoKKyNkZWZpbmUgTkFNRSBsZF92ZXJzaW9uX3N0cl90YWIKKyNpbmNsdWRlIDxkeW5hbWljc2l6ZWhhc2guaD4KKworI2VuZGlmCS8qIHZlcnNpb25oYXNoLmggKi8KZGlmZiAtLWdpdCBhL3NyYy94ZWxmLmggYi9zcmMveGVsZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzZlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMveGVsZi5oCkBAIC0wLDAgKzEsMzg3IEBACisvKiBNYWNyb3MgdG8gZW5hYmxlIHdyaXRpbmcgbmF0aXZlIGFuZCBnZW5lcmljIEVMRiBhY2Nlc3MgY29kZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpYmVibC5oPgorCisKKy8qIEJ5IGRlZmF1bHQgdGhlIGxpbmtlciBpcyBoYW5kbGluZyBhbGwgYXJjaGl0ZWN0dXJlcy4gIEJ1dCBpdCBjYW4KKyAgIGJlIGNvbmZpZ3VyZWQgdG8gYmUgYSBuYXRpdmUtb25seSBsaW5rZXIuICAqLworI2lmIE5BVElWRV9FTEYgPT0gMzIKKy8qIDMyLWJpdCBvbmx5LiAgKi8KKyMgZGVmaW5lIFhFbGZfRWhkciBFbGYzMl9FaGRyCisjIGRlZmluZSBYRWxmX1NoZHIgRWxmMzJfU2hkcgorIyBkZWZpbmUgWEVsZl9PZmYgRWxmMzJfT2ZmCisjIGRlZmluZSBYRWxmX0FkZHIgRWxmMzJfQWRkcgorIyBkZWZpbmUgWEVsZl9IYWxmIEVsZjMyX0hhbGYKKyMgZGVmaW5lIFhFbGZfV29yZCBFbGYzMl9Xb3JkCisjIGRlZmluZSBYRWxmX1h3b3JkIEVsZjMyX1dvcmQKKyMgZGVmaW5lIFhFbGZfU3h3b3JkIEVsZjMyX1N3b3JkCisjIGRlZmluZSBYRWxmX1ZlcnN5bSBFbGYzMl9WZXJzeW0KKyMgZGVmaW5lIFhFbGZfU3ltIEVsZjMyX1N5bQorIyBkZWZpbmUgWEVsZl9SZWwgRWxmMzJfUmVsCisjIGRlZmluZSBYRWxmX1JlbGEgRWxmMzJfUmVsYQorCisjIGRlZmluZSBYRWxmX0VoZHJfdmFyZGVmKG5hbWUpIEVsZjMyX0VoZHIgKm5hbWUKKyMgZGVmaW5lIHhlbGZfZ2V0ZWhkcihlbGYsIG5hbWUpIG5hbWUgPSBlbGYzMl9nZXRlaGRyIChlbGYpCisjIGRlZmluZSB4ZWxmX2dldGVoZHJfY29weShlbGYsIG5hbWUsIGNvcHkpIFwKKyAgKGNvcHkpID0gKihuYW1lID0gZWxmMzJfZ2V0ZWhkciAoZWxmKSkKKyMgZGVmaW5lIHhlbGZfbmV3ZWhkcihlbGYsIGtsYXNzKSBlbGYzMl9uZXdlaGRyIChlbGYpCisjIGRlZmluZSB4ZWxmX3VwZGF0ZV9laGRyKGVsZiwgZWhkcikgXAorICAvKiBub3RoaW5nICovICgodm9pZCkgKGVsZiksICh2b2lkKSAoZWhkciksIDEpCisKKyMgZGVmaW5lIHhlbGZfZ2V0Y2xhc3MoZWxmKSBFTEZDTEFTUzMyCisKKyMgZGVmaW5lIFhFbGZfUGhkcl92YXJkZWYobmFtZSkgRWxmMzJfUGhkciAqbmFtZQorIyBkZWZpbmUgeGVsZl9uZXdwaGRyKGVsZiwgbikgZWxmMzJfbmV3cGhkciAoZWxmLCBuKQorIyBkZWZpbmUgeGVsZl9nZXRwaGRyKGVsZiwgaWR4LCBuYW1lKSBuYW1lID0gZWxmMzJfZ2V0cGhkciAoZWxmKSArIGlkeAorIyBkZWZpbmUgeGVsZl9nZXRwaGRyX3B0cihlbGYsIGlkeCwgbmFtZSkgbmFtZSA9IGVsZjMyX2dldHBoZHIgKGVsZikgKyBpZHgKKyMgZGVmaW5lIHhlbGZfdXBkYXRlX3BoZHIoZWxmLCBpZHgsIHBoZHIpIFwKKyAgLyogbm90aGluZyAqLyAoKHZvaWQpIChlbGYpLCAodm9pZCkgKGlkeCksICh2b2lkKSAocGhkciksIDEpCisKKyMgZGVmaW5lIFhFbGZfU2hkcl92YXJkZWYobmFtZSkgRWxmMzJfU2hkciAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXRzaGRyKHNjbiwgbmFtZSkgbmFtZSA9IGVsZjMyX2dldHNoZHIgKHNjbikKKyMgZGVmaW5lIHhlbGZfZ2V0c2hkcl9jb3B5KHNjbiwgbmFtZSwgY29weSkgXAorICAoY29weSkgPSAqKG5hbWUgPSBlbGYzMl9nZXRzaGRyIChzY24pKQorIyBkZWZpbmUgeGVsZl91cGRhdGVfc2hkcihzY24sIHNoZHIpIFwKKyAgLyogbm90aGluZyAqLyAoKHZvaWQpIChzY24pLCAodm9pZCkgKHNoZHIpLCAxKQorCisjIGRlZmluZSBYRWxmX1N5bV92YXJkZWYobmFtZSkgRWxmMzJfU3ltICpuYW1lCisjIGRlZmluZSB4ZWxmX2dldHN5bShkYXRhLCBpZHgsIG5hbWUpIFwKKyAgbmFtZSA9ICYoKEVsZjMyX1N5bSAqKSAoZGF0YSktPmRfYnVmKVtpZHhdCisjIGRlZmluZSB4ZWxmX2dldHN5bV9wdHIoZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmKChFbGYzMl9TeW0gKikgKGRhdGEpLT5kX2J1ZilbaWR4XQorIyBkZWZpbmUgeGVsZl9nZXRzeW1zaG5keChkYXRhLCBuZHhkYXRhLCBpZHgsIG5hbWUxLCBuYW1lMikgXAorICAobmFtZTEgPSAmKChFbGYzMl9TeW0gKikgKChkYXRhKS0+ZF9idWYpKVtpZHhdKTsJCQkgICAgICBcCisgIG5hbWUyID0gKHVubGlrZWx5ICgobmR4ZGF0YSkgIT0gTlVMTCkJCQkJCSAgICAgIFwKKwkgICA/ICgoRWxmMzJfV29yZCAqKSAoKG5keGRhdGEpLT5kX2J1ZikpW2lkeF0gOiAwKQorIyBkZWZpbmUgeGVsZl91cGRhdGVfc3ltKGRhdGEsIGlkeCwgc3ltKSBcCisgIC8qIG5vdGhpbmcgKi8gKCh2b2lkKSAoZGF0YSksICh2b2lkKSAoaWR4KSwgKHZvaWQpIChzeW0pLCAxKQorIyBkZWZpbmUgeGVsZl91cGRhdGVfc3ltc2huZHgoZGF0YSwgbmR4ZGF0YSwgaWR4LCBuYW1lMSwgbmFtZTIsIGRhdGFjaGFuZ2VkKSBcCisgIGlmIChkYXRhY2hhbmdlZCkJCQkJCQkJICAgICAgXAorICAgICgoRWxmMzJfU3ltICopICgoZGF0YSktPmRfYnVmKSlbaWR4XSA9ICpuYW1lMTsJCQkgICAgICBcCisgIGlmICh1bmxpa2VseSAobmR4ZGF0YSAhPSBOVUxMKSkJCQkJCSAgICAgIFwKKyAgICAoKEVsZjMyX1dvcmQgKikgKChuZHhkYXRhKS0+ZF9idWYpKVtpZHhdID0gbmFtZTIKKworIyBkZWZpbmUgWEVsZl9WZXJzeW1fdmFyZGVmKG5hbWUpIEVsZjMyX1ZlcnN5bSBuYW1lCisjIGRlZmluZSB4ZWxmX2dldHZlcnN5bV9jb3B5KGRhdGEsIGlkeCwgbmFtZSkgXAorICAobmFtZSA9ICgoRWxmMzJfVmVyc3ltICopICgoZGF0YSktPmRfYnVmKSlbaWR4XSwgJm5hbWUpCisKKyMgZGVmaW5lIFhFbGZfRHluX3ZhcmRlZihuYW1lKSBFbGYzMl9EeW4gKm5hbWUKKyMgZGVmaW5lIHhlbGZfZ2V0ZHluKGRhdGEsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gJigoRWxmMzJfRHluICopICgoZGF0YSktPmRfYnVmKSlbaWR4XQorIyBkZWZpbmUgeGVsZl9nZXRkeW5fcHRyKGRhdGEsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gJigoRWxmMzJfRHluICopICgoZGF0YSktPmRfYnVmKSlbaWR4XQorIyBkZWZpbmUgeGVsZl91cGRhdGVfZHluKGRhdGEsIGlkeCwgbmFtZSkgXAorICAvKiBub3RoaW5nICovICgodm9pZCkgKGRhdGEpLCAodm9pZCkgKGlkeCksICh2b2lkKSAobmFtZSksIDEpCisKKyMgZGVmaW5lIFhFbGZfUmVsX3ZhcmRlZihuYW1lKSBFbGYzMl9SZWwgKm5hbWUKKyMgZGVmaW5lIHhlbGZfZ2V0cmVsKGRhdGEsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gJigoRWxmMzJfUmVsICopICgoZGF0YSktPmRfYnVmKSlbaWR4XQorIyBkZWZpbmUgeGVsZl9nZXRyZWxfcHRyKGRhdGEsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gJigoRWxmMzJfUmVsICopICgoZGF0YSktPmRfYnVmKSlbaWR4XQorIyBkZWZpbmUgeGVsZl91cGRhdGVfcmVsKGRhdGEsIGlkeCwgbmFtZSkgXAorICAvKiBub3RoaW5nICovICgodm9pZCkgKGRhdGEpLCAodm9pZCkgKGlkeCksICh2b2lkKSAobmFtZSksIDEpCisKKyMgZGVmaW5lIFhFbGZfUmVsYV92YXJkZWYobmFtZSkgRWxmMzJfUmVsYSAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXRyZWxhKGRhdGEsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gJigoRWxmMzJfUmVsYSAqKSAoKGRhdGEpLT5kX2J1ZikpW2lkeF0KKyMgZGVmaW5lIHhlbGZfZ2V0cmVsYV9wdHIoZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmKChFbGYzMl9SZWxhICopICgoZGF0YSktPmRfYnVmKSlbaWR4XQorIyBkZWZpbmUgeGVsZl91cGRhdGVfcmVsYShkYXRhLCBpZHgsIG5hbWUpIFwKKyAgLyogbm90aGluZyAqLyAoKHZvaWQpIChkYXRhKSwgKHZvaWQpIChpZHgpLCAodm9pZCkgKG5hbWUpLCAxKQorCisjIGRlZmluZSBYRWxmX1ZlcmRlZl92YXJkZWYobmFtZSkgRWxmMzJfVmVyZGVmICpuYW1lCisjIGRlZmluZSB4ZWxmX2dldHZlcmRlZihkYXRhLCBvZmZzZXQsIG5hbWUpIFwKKyAgbmFtZSA9ICgoRWxmMzJfVmVyZGVmICopICgoY2hhciAqKSAoKGRhdGEpLT5kX2J1ZikgKyAob2Zmc2V0KSkpCisKKyMgZGVmaW5lIFhFbGZfVmVyZGF1eF92YXJkZWYobmFtZSkgRWxmMzJfVmVyZGF1eCAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXR2ZXJkYXV4KGRhdGEsIG9mZnNldCwgbmFtZSkgXAorICBuYW1lID0gKChFbGYzMl9WZXJkYXV4ICopICgoY2hhciAqKSAoKGRhdGEpLT5kX2J1ZikgKyAob2Zmc2V0KSkpCisKKyMgZGVmaW5lIFhFTEZfU1RfVFlQRShpbmZvKSBFTEYzMl9TVF9UWVBFIChpbmZvKQorIyBkZWZpbmUgWEVMRl9TVF9CSU5EKGluZm8pIEVMRjMyX1NUX0JJTkQgKGluZm8pCisjIGRlZmluZSBYRUxGX1NUX0lORk8oYmluZCwgdHlwZSkgRUxGMzJfU1RfSU5GTyAoYmluZCwgdHlwZSkKKyMgZGVmaW5lIFhFTEZfU1RfVklTSUJJTElUWShpbmZvKSBFTEYzMl9TVF9WSVNJQklMSVRZIChpbmZvKQorCisjIGRlZmluZSBYRUxGX1JfU1lNKGluZm8pIEVMRjMyX1JfU1lNIChpbmZvKQorIyBkZWZpbmUgWEVMRl9SX1RZUEUoaW5mbykgRUxGMzJfUl9UWVBFIChpbmZvKQorIyBkZWZpbmUgWEVMRl9SX0lORk8oc3ltLCB0eXBlKSBFTEYzMl9SX0lORk8gKHN5bSwgdHlwZSkKKworIyBkZWZpbmUgeGVsZl9mc2l6ZShlbGYsIHR5cGUsIGNudCkgXAorICAoX19idWlsdGluX2NvbnN0YW50X3AgKHR5cGUpCQkJCQkJICAgICAgXAorICAgPyAoeyBzaXplX3QgZnNpemU7CQkJCQkJCSAgICAgIFwKKyAgICAgICAgc3dpdGNoICh0eXBlKQkJCQkJCQkgICAgICBcCisJICB7CQkJCQkJCQkgICAgICBcCisJICBjYXNlIEVMRl9UX0JZVEU6IGZzaXplID0gMTsgYnJlYWs7CQkJCSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfQUREUjogZnNpemUgPSBzaXplb2YgKEVsZjMyX0FkZHIpOyBicmVhazsJCSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfRFlOOiBmc2l6ZSA9IHNpemVvZiAoRWxmMzJfRHluKTsgYnJlYWs7CQkgICAgICBcCisJICBjYXNlIEVMRl9UX0VIRFI6IGZzaXplID0gc2l6ZW9mIChFbGYzMl9FaGRyKTsgYnJlYWs7CQkgICAgICBcCisJICBjYXNlIEVMRl9UX0hBTEY6IGZzaXplID0gc2l6ZW9mIChFbGYzMl9IYWxmKTsgYnJlYWs7CQkgICAgICBcCisJICBjYXNlIEVMRl9UX09GRjogZnNpemUgPSBzaXplb2YgKEVsZjMyX09mZik7IGJyZWFrOwkJICAgICAgXAorCSAgY2FzZSBFTEZfVF9QSERSOiBmc2l6ZSA9IHNpemVvZiAoRWxmMzJfUGhkcik7IGJyZWFrOwkJICAgICAgXAorCSAgY2FzZSBFTEZfVF9SRUxBOiBmc2l6ZSA9IHNpemVvZiAoRWxmMzJfUmVsYSk7IGJyZWFrOwkJICAgICAgXAorCSAgY2FzZSBFTEZfVF9SRUw6IGZzaXplID0gc2l6ZW9mIChFbGYzMl9SZWwpOyBicmVhazsJCSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfU0hEUjogZnNpemUgPSBzaXplb2YgKEVsZjMyX1NoZHIpOyBicmVhazsJCSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfU1dPUkQ6IGZzaXplID0gc2l6ZW9mIChFbGYzMl9Td29yZCk7IGJyZWFrOwkgICAgICBcCisJICBjYXNlIEVMRl9UX1NZTTogZnNpemUgPSBzaXplb2YgKEVsZjMyX1N5bSk7IGJyZWFrOwkJICAgICAgXAorCSAgY2FzZSBFTEZfVF9XT1JEOiBmc2l6ZSA9IHNpemVvZiAoRWxmMzJfV29yZCk7IGJyZWFrOwkJICAgICAgXAorCSAgY2FzZSBFTEZfVF9YV09SRDogZnNpemUgPSBzaXplb2YgKEVsZjMyX1h3b3JkKTsgYnJlYWs7CSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfU1hXT1JEOiBmc2l6ZSA9IHNpemVvZiAoRWxmMzJfU3h3b3JkKTsgYnJlYWs7CSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfVkRFRjogZnNpemUgPSBzaXplb2YgKEVsZjMyX1ZlcmRlZik7IGJyZWFrOwkgICAgICBcCisJICBjYXNlIEVMRl9UX1ZEQVVYOiBmc2l6ZSA9IHNpemVvZiAoRWxmMzJfVmVyZGF1eCk7IGJyZWFrOwkgICAgICBcCisJICBjYXNlIEVMRl9UX1ZORUVEOiBmc2l6ZSA9IHNpemVvZiAoRWxmMzJfVmVybmVlZCk7IGJyZWFrOwkgICAgICBcCisJICBjYXNlIEVMRl9UX1ZOQVVYOiBmc2l6ZSA9IHNpemVvZiAoRWxmMzJfVmVybmF1eCk7IGJyZWFrOwkgICAgICBcCisJICBjYXNlIEVMRl9UX05IRFI6IGZzaXplID0gc2l6ZW9mIChFbGYzMl9OaGRyKTsgYnJlYWs7CQkgICAgICBcCisJICBjYXNlIEVMRl9UX1NZTUlORk86IGZzaXplID0gc2l6ZW9mIChFbGYzMl9TeW1pbmZvKTsgYnJlYWs7CSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfTU9WRTogZnNpemUgPSBzaXplb2YgKEVsZjMyX01vdmUpOyBicmVhazsJCSAgICAgIFwKKyAgICAgICAgICBkZWZhdWx0OiBmc2l6ZSA9IDA7IGJyZWFrOwkJCQkJICAgICAgXAorCSAgfQkJCQkJCQkJICAgICAgXAorICAgICAgICBmc2l6ZSAqIChjbnQpOyB9KQkJCQkJCSAgICAgIFwKKyAgIDogZ2VsZl9mc2l6ZSAoZWxmLCB0eXBlLCBjbnQsIEVWX0NVUlJFTlQpKQorI2VsaWYgTkFUSVZFX0VMRiA9PSA2NAorLyogNjQtYml0IG9ubHkuICAqLworIyBkZWZpbmUgWEVsZl9FaGRyIEVsZjY0X0VoZHIKKyMgZGVmaW5lIFhFbGZfU2hkciBFbGY2NF9TaGRyCisjIGRlZmluZSBYRWxmX0FkZHIgRWxmNjRfQWRkcgorIyBkZWZpbmUgWEVsZl9IYWxmIEVsZjY0X0hhbGYKKyMgZGVmaW5lIFhFbGZfT2ZmIEVsZjY0X09mZgorIyBkZWZpbmUgWEVsZl9Xb3JkIEVsZjY0X1dvcmQKKyMgZGVmaW5lIFhFbGZfWHdvcmQgRWxmNjRfWHdvcmQKKyMgZGVmaW5lIFhFbGZfU3h3b3JkIEVsZjY0X1N4d29yZAorIyBkZWZpbmUgWEVsZl9WZXJzeW0gRWxmNjRfVmVyc3ltCisjIGRlZmluZSBYRWxmX1N5bSBFbGY2NF9TeW0KKyMgZGVmaW5lIFhFbGZfUmVsIEVsZjY0X1JlbAorIyBkZWZpbmUgWEVsZl9SZWxhIEVsZjY0X1JlbGEKKworIyBkZWZpbmUgWEVsZl9FaGRyX3ZhcmRlZihuYW1lKSBFbGY2NF9FaGRyICpuYW1lCisjIGRlZmluZSB4ZWxmX2dldGVoZHIoZWxmLCBuYW1lKSBuYW1lID0gZWxmNjRfZ2V0ZWhkciAoZWxmKQorIyBkZWZpbmUgeGVsZl9nZXRlaGRyX2NvcHkoZWxmLCBuYW1lLCBjb3B5KSBcCisgIChjb3B5KSA9ICoobmFtZSA9IGVsZjY0X2dldGVoZHIgKGVsZikpCisjIGRlZmluZSB4ZWxmX25ld2VoZHIoZWxmLCBrbGFzcykgZWxmNjRfbmV3ZWhkciAoZWxmKQorIyBkZWZpbmUgeGVsZl91cGRhdGVfZWhkcihlbGYsIGVoZHIpIFwKKyAgLyogbm90aGluZyAqLyAoKHZvaWQpIChlbGYpLCAodm9pZCkgKGVoZHIpLCAxKQorCisjIGRlZmluZSB4ZWxmX2dldGNsYXNzKGVsZikgRUxGQ0xBU1MzMgorCisjIGRlZmluZSBYRWxmX1BoZHJfdmFyZGVmKG5hbWUpIEVsZjY0X1BoZHIgKm5hbWUKKyMgZGVmaW5lIHhlbGZfbmV3cGhkcihlbGYsIG4pIGVsZjY0X25ld3BoZHIgKGVsZiwgbikKKyMgZGVmaW5lIHhlbGZfZ2V0cGhkcihlbGYsIGlkeCwgbmFtZSkgbmFtZSA9IGVsZjY0X2dldHBoZHIgKGVsZikgKyBpZHgKKyMgZGVmaW5lIHhlbGZfZ2V0cGhkcl9wdHIoZWxmLCBpZHgsIG5hbWUpIG5hbWUgPSBlbGY2NF9nZXRwaGRyIChlbGYpICsgaWR4CisjIGRlZmluZSB4ZWxmX3VwZGF0ZV9waGRyKGVsZiwgaWR4LCBwaGRyKSBcCisgIC8qIG5vdGhpbmcgKi8gKCh2b2lkKSAoZWxmKSwgKHZvaWQpIChpZHgpLCAodm9pZCkgKHBoZHIpLCAxKQorCisjIGRlZmluZSBYRWxmX1NoZHJfdmFyZGVmKG5hbWUpIEVsZjY0X1NoZHIgKm5hbWUKKyMgZGVmaW5lIHhlbGZfZ2V0c2hkcihzY24sIG5hbWUpIG5hbWUgPSBlbGY2NF9nZXRzaGRyIChzY24pCisjIGRlZmluZSB4ZWxmX2dldHNoZHJfY29weShzY24sIG5hbWUsIGNvcHkpIFwKKyAgKGNvcHkpID0gKihuYW1lID0gZWxmNjRfZ2V0c2hkciAoc2NuKSkKKyMgZGVmaW5lIHhlbGZfdXBkYXRlX3NoZHIoc2NuLCBzaGRyKSBcCisgIC8qIG5vdGhpbmcgKi8gKCh2b2lkKSAoc2NuKSwgKHZvaWQpIChzaGRyKSwgMSkKKworIyBkZWZpbmUgWEVsZl9TeW1fdmFyZGVmKG5hbWUpIEVsZjY0X1N5bSAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXRzeW0oZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmKChFbGY2NF9TeW0gKikgKGRhdGEpLT5kX2J1ZilbaWR4XQorIyBkZWZpbmUgeGVsZl9nZXRzeW1fcHRyKGRhdGEsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gJigoRWxmNjRfU3ltICopIChkYXRhKS0+ZF9idWYpW2lkeF0KKyMgZGVmaW5lIHhlbGZfZ2V0c3ltc2huZHgoZGF0YSwgbmR4ZGF0YSwgaWR4LCBuYW1lMSwgbmFtZTIpIFwKKyAgKG5hbWUxID0gJigoRWxmNjRfU3ltICopICgoZGF0YSktPmRfYnVmKSlbaWR4XSk7CQkJICAgICAgXAorICBuYW1lMiA9ICh1bmxpa2VseSAoKG5keGRhdGEpICE9IE5VTEwpCQkJCQkgICAgICBcCisJICAgPyAoKEVsZjMyX1dvcmQgKikgKChuZHhkYXRhKS0+ZF9idWYpKVtpZHhdIDogMCkKKyMgZGVmaW5lIHhlbGZfdXBkYXRlX3N5bShkYXRhLCBpZHgsIHN5bSkgXAorICAvKiBub3RoaW5nICovICgodm9pZCkgKGRhdGEpLCAodm9pZCkgKGlkeCksICh2b2lkKSAoc3ltKSwgMSkKKyMgZGVmaW5lIHhlbGZfdXBkYXRlX3N5bXNobmR4KGRhdGEsIG5keGRhdGEsIGlkeCwgbmFtZTEsIG5hbWUyLCBkYXRhY2hhbmdlZCkgXAorICBpZiAoZGF0YWNoYW5nZWQpCQkJCQkJCSAgICAgIFwKKyAgICAoKEVsZjY0X1N5bSAqKSAoKGRhdGEpLT5kX2J1ZikpW2lkeF0gPSAqbmFtZTE7CQkJICAgICAgXAorICBpZiAobmR4ZGF0YSAhPSBOVUxMKQkJCQkJCQkgICAgICBcCisgICAgKCgoRWxmMzJfV29yZCAqKSAoKG5keGRhdGEpLT5kX2J1ZikpW2lkeF0gPSBuYW1lMikKKworIyBkZWZpbmUgWEVsZl9WZXJzeW1fdmFyZGVmKG5hbWUpIEVsZjY0X1ZlcnN5bSBuYW1lCisjIGRlZmluZSB4ZWxmX2dldHZlcnN5bV9jb3B5KGRhdGEsIGlkeCwgbmFtZSkgXAorICAobmFtZSA9ICgoRWxmNjRfVmVyc3ltICopICgoZGF0YSktPmRfYnVmKSlbaWR4XSwgKCZuYW1lKSkKKworIyBkZWZpbmUgWEVsZl9EeW5fdmFyZGVmKG5hbWUpIEVsZjY0X0R5biAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXRkeW4oZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmKChFbGY2NF9EeW4gKikgKChkYXRhKS0+ZF9idWYpKVtpZHhdCisjIGRlZmluZSB4ZWxmX2dldGR5bl9wdHIoZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmKChFbGY2NF9EeW4gKikgKChkYXRhKS0+ZF9idWYpKVtpZHhdCisjIGRlZmluZSB4ZWxmX3VwZGF0ZV9keW4oZGF0YSwgaWR4LCBuYW1lKSBcCisgIC8qIG5vdGhpbmcgKi8gKCh2b2lkKSAoZGF0YSksICh2b2lkKSAoaWR4KSwgKHZvaWQpIChuYW1lKSwgMSkKKworIyBkZWZpbmUgWEVsZl9SZWxfdmFyZGVmKG5hbWUpIEVsZjY0X1JlbCAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXRyZWwoZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmKChFbGY2NF9SZWwgKikgKChkYXRhKS0+ZF9idWYpKVtpZHhdCisjIGRlZmluZSB4ZWxmX2dldHJlbF9wdHIoZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmKChFbGY2NF9SZWwgKikgKChkYXRhKS0+ZF9idWYpKVtpZHhdCisjIGRlZmluZSB4ZWxmX3VwZGF0ZV9yZWwoZGF0YSwgaWR4LCBuYW1lKSBcCisgIC8qIG5vdGhpbmcgKi8gKCh2b2lkKSAoZGF0YSksICh2b2lkKSAoaWR4KSwgKHZvaWQpIChuYW1lKSwgMSkKKworIyBkZWZpbmUgWEVsZl9SZWxhX3ZhcmRlZihuYW1lKSBFbGY2NF9SZWxhICpuYW1lCisjIGRlZmluZSB4ZWxmX2dldHJlbGEoZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmKChFbGY2NF9SZWxhICopICgoZGF0YSktPmRfYnVmKSlbaWR4XQorIyBkZWZpbmUgeGVsZl9nZXRyZWxhX3B0cihkYXRhLCBpZHgsIG5hbWUpIFwKKyAgbmFtZSA9ICYoKEVsZjY0X1JlbGEgKikgKChkYXRhKS0+ZF9idWYpKVtpZHhdCisjIGRlZmluZSB4ZWxmX3VwZGF0ZV9yZWxhKGRhdGEsIGlkeCwgbmFtZSkgXAorICAvKiBub3RoaW5nICovICgodm9pZCkgKGRhdGEpLCAodm9pZCkgKGlkeCksICh2b2lkKSAobmFtZSksIDEpCisKKyMgZGVmaW5lIFhFbGZfVmVyZGVmX3ZhcmRlZihuYW1lKSBFbGY2NF9WZXJkZWYgKm5hbWUKKyMgZGVmaW5lIHhlbGZfZ2V0dmVyZGVmKGRhdGEsIG9mZnNldCwgbmFtZSkgXAorICBuYW1lID0gKChFbGY2NF9WZXJkZWYgKikgKChjaGFyICopICgoZGF0YSktPmRfYnVmKSArIChvZmZzZXQpKSkKKworIyBkZWZpbmUgWEVsZl9WZXJkYXV4X3ZhcmRlZihuYW1lKSBFbGY2NF9WZXJkYXV4ICpuYW1lCisjIGRlZmluZSB4ZWxmX2dldHZlcmRhdXgoZGF0YSwgb2Zmc2V0LCBuYW1lKSBcCisgIG5hbWUgPSAoKEVsZjY0X1ZlcmRhdXggKikgKChjaGFyICopICgoZGF0YSktPmRfYnVmKSArIChvZmZzZXQpKSkKKworIyBkZWZpbmUgWEVMRl9TVF9UWVBFKGluZm8pIEVMRjY0X1NUX1RZUEUgKGluZm8pCisjIGRlZmluZSBYRUxGX1NUX0JJTkQoaW5mbykgRUxGNjRfU1RfQklORCAoaW5mbykKKyMgZGVmaW5lIFhFTEZfU1RfSU5GTyhiaW5kLCB0eXBlKSBFTEY2NF9TVF9JTkZPIChiaW5kLCB0eXBlKQorIyBkZWZpbmUgWEVMRl9TVF9WSVNJQklMSVRZKGluZm8pIEVMRjY0X1NUX1ZJU0lCSUxJVFkgKGluZm8pCisKKyMgZGVmaW5lIFhFTEZfUl9TWU0oaW5mbykgRUxGNjRfUl9TWU0gKGluZm8pCisjIGRlZmluZSBYRUxGX1JfVFlQRShpbmZvKSBFTEY2NF9SX1RZUEUgKGluZm8pCisjIGRlZmluZSBYRUxGX1JfSU5GTyhzeW0sIHR5cGUpIEVMRjY0X1JfSU5GTyAoc3ltLCB0eXBlKQorCisjIGRlZmluZSB4ZWxmX2ZzaXplKGVsZiwgdHlwZSwgY250KSBcCisgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAodHlwZSkJCQkJCQkgICAgICBcCisgICA/ICh7IHNpemVfdCBmc2l6ZTsJCQkJCQkJICAgICAgXAorICAgICAgICBzd2l0Y2ggKHR5cGUpCQkJCQkJCSAgICAgIFwKKwkgIHsJCQkJCQkJCSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfQllURTogZnNpemUgPSAxOyBicmVhazsJCQkJICAgICAgXAorCSAgY2FzZSBFTEZfVF9BRERSOiBmc2l6ZSA9IHNpemVvZiAoRWxmNjRfQWRkcik7IGJyZWFrOwkJICAgICAgXAorCSAgY2FzZSBFTEZfVF9EWU46IGZzaXplID0gc2l6ZW9mIChFbGY2NF9EeW4pOyBicmVhazsJCSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfRUhEUjogZnNpemUgPSBzaXplb2YgKEVsZjY0X0VoZHIpOyBicmVhazsJCSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfSEFMRjogZnNpemUgPSBzaXplb2YgKEVsZjY0X0hhbGYpOyBicmVhazsJCSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfT0ZGOiBmc2l6ZSA9IHNpemVvZiAoRWxmNjRfT2ZmKTsgYnJlYWs7CQkgICAgICBcCisJICBjYXNlIEVMRl9UX1BIRFI6IGZzaXplID0gc2l6ZW9mIChFbGY2NF9QaGRyKTsgYnJlYWs7CQkgICAgICBcCisJICBjYXNlIEVMRl9UX1JFTEE6IGZzaXplID0gc2l6ZW9mIChFbGY2NF9SZWxhKTsgYnJlYWs7CQkgICAgICBcCisJICBjYXNlIEVMRl9UX1JFTDogZnNpemUgPSBzaXplb2YgKEVsZjY0X1JlbCk7IGJyZWFrOwkJICAgICAgXAorCSAgY2FzZSBFTEZfVF9TSERSOiBmc2l6ZSA9IHNpemVvZiAoRWxmNjRfU2hkcik7IGJyZWFrOwkJICAgICAgXAorCSAgY2FzZSBFTEZfVF9TV09SRDogZnNpemUgPSBzaXplb2YgKEVsZjY0X1N3b3JkKTsgYnJlYWs7CSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfU1lNOiBmc2l6ZSA9IHNpemVvZiAoRWxmNjRfU3ltKTsgYnJlYWs7CQkgICAgICBcCisJICBjYXNlIEVMRl9UX1dPUkQ6IGZzaXplID0gc2l6ZW9mIChFbGY2NF9Xb3JkKTsgYnJlYWs7CQkgICAgICBcCisJICBjYXNlIEVMRl9UX1hXT1JEOiBmc2l6ZSA9IHNpemVvZiAoRWxmNjRfWHdvcmQpOyBicmVhazsJICAgICAgXAorCSAgY2FzZSBFTEZfVF9TWFdPUkQ6IGZzaXplID0gc2l6ZW9mIChFbGY2NF9TeHdvcmQpOyBicmVhazsJICAgICAgXAorCSAgY2FzZSBFTEZfVF9WREVGOiBmc2l6ZSA9IHNpemVvZiAoRWxmNjRfVmVyZGVmKTsgYnJlYWs7CSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfVkRBVVg6IGZzaXplID0gc2l6ZW9mIChFbGY2NF9WZXJkYXV4KTsgYnJlYWs7CSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfVk5FRUQ6IGZzaXplID0gc2l6ZW9mIChFbGY2NF9WZXJuZWVkKTsgYnJlYWs7CSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfVk5BVVg6IGZzaXplID0gc2l6ZW9mIChFbGY2NF9WZXJuYXV4KTsgYnJlYWs7CSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfTkhEUjogZnNpemUgPSBzaXplb2YgKEVsZjY0X05oZHIpOyBicmVhazsJCSAgICAgIFwKKwkgIGNhc2UgRUxGX1RfU1lNSU5GTzogZnNpemUgPSBzaXplb2YgKEVsZjY0X1N5bWluZm8pOyBicmVhazsJICAgICAgXAorCSAgY2FzZSBFTEZfVF9NT1ZFOiBmc2l6ZSA9IHNpemVvZiAoRWxmNjRfTW92ZSk7IGJyZWFrOwkJICAgICAgXAorICAgICAgICAgIGRlZmF1bHQ6IGZzaXplID0gMDsgYnJlYWs7CQkJCQkgICAgICBcCisJICB9CQkJCQkJCQkgICAgICBcCisgICAgICAgIGZzaXplICogKGNudCk7IH0pCQkJCQkJICAgICAgXAorICAgOiBnZWxmX2ZzaXplIChlbGYsIHR5cGUsIGNudCwgRVZfQ1VSUkVOVCkpCisjZWxzZQorIyBpbmNsdWRlIDxnZWxmLmg+CisKKy8qIEdlbmVyaWMgbGlua2VyLiAgKi8KKyMgZGVmaW5lIFhFbGZfRWhkciBHRWxmX0VoZHIKKyMgZGVmaW5lIFhFbGZfU2hkciBHRWxmX1NoZHIKKyMgZGVmaW5lIFhFbGZfQWRkciBHRWxmX0FkZHIKKyMgZGVmaW5lIFhFbGZfSGFsZiBHRWxmX0hhbGYKKyMgZGVmaW5lIFhFbGZfT2ZmIEdFbGZfT2ZmCisjIGRlZmluZSBYRWxmX1dvcmQgR0VsZl9Xb3JkCisjIGRlZmluZSBYRWxmX1h3b3JkIEdFbGZfWHdvcmQKKyMgZGVmaW5lIFhFbGZfU3h3b3JkIEdFbGZfU3h3b3JkCisjIGRlZmluZSBYRWxmX1ZlcnN5bSBHRWxmX1ZlcnN5bQorIyBkZWZpbmUgWEVsZl9TeW0gR0VsZl9TeW0KKyMgZGVmaW5lIFhFbGZfUmVsIEdFbGZfUmVsCisjIGRlZmluZSBYRWxmX1JlbGEgR0VsZl9SZWxhCisKKyMgZGVmaW5lIFhFbGZfRWhkcl92YXJkZWYobmFtZSkgR0VsZl9FaGRyIG5hbWUjI19tZW07IEdFbGZfRWhkciAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXRlaGRyKGVsZiwgbmFtZSkgbmFtZSA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmbmFtZSMjX21lbSkKKyMgZGVmaW5lIHhlbGZfZ2V0ZWhkcl9jb3B5KGVsZiwgbmFtZSwgY29weSkgXAorICBuYW1lID0gZ2VsZl9nZXRlaGRyIChlbGYsICYoY29weSkpCisjIGRlZmluZSB4ZWxmX25ld2VoZHIoZWxmLCBrbGFzcykgZ2VsZl9uZXdlaGRyIChlbGYsIGtsYXNzKQorIyBkZWZpbmUgeGVsZl91cGRhdGVfZWhkcihlbGYsIGVoZHIpIGdlbGZfdXBkYXRlX2VoZHIgKGVsZiwgZWhkcikKKworIyBkZWZpbmUgeGVsZl9nZXRjbGFzcyhlbGYpIGdlbGZfZ2V0Y2xhc3MgKGVsZikKKworIyBkZWZpbmUgWEVsZl9QaGRyX3ZhcmRlZihuYW1lKSBHRWxmX1BoZHIgbmFtZSMjX21lbTsgR0VsZl9QaGRyICpuYW1lCisjIGRlZmluZSB4ZWxmX25ld3BoZHIoZWxmLCBuKSBnZWxmX25ld3BoZHIgKGVsZiwgbikKKyMgZGVmaW5lIHhlbGZfZ2V0cGhkcihlbGYsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gZ2VsZl9nZXRwaGRyIChlbGYsIGlkeCwgJm5hbWUjI19tZW0pCisjIGRlZmluZSB4ZWxmX2dldHBoZHJfcHRyKGVsZiwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmbmFtZSMjX21lbQorIyBkZWZpbmUgeGVsZl91cGRhdGVfcGhkcihlbGYsIGlkeCwgcGhkcikgXAorICBnZWxmX3VwZGF0ZV9waGRyIChlbGYsIGlkeCwgcGhkcikKKworIyBkZWZpbmUgWEVsZl9TaGRyX3ZhcmRlZihuYW1lKSBHRWxmX1NoZHIgbmFtZSMjX21lbTsgR0VsZl9TaGRyICpuYW1lCisjIGRlZmluZSB4ZWxmX2dldHNoZHIoc2NuLCBuYW1lKSBuYW1lID0gZ2VsZl9nZXRzaGRyIChzY24sICZuYW1lIyNfbWVtKQorIyBkZWZpbmUgeGVsZl9nZXRzaGRyX2NvcHkoc2NuLCBuYW1lLCBjb3B5KSBcCisgIG5hbWUgPSBnZWxmX2dldHNoZHIgKHNjbiwgJihjb3B5KSkKKyMgZGVmaW5lIHhlbGZfdXBkYXRlX3NoZHIoc2NuLCBzaGRyKSBnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpCisKKyMgZGVmaW5lIFhFbGZfU3ltX3ZhcmRlZihuYW1lKSBHRWxmX1N5bSBuYW1lIyNfbWVtOyBHRWxmX1N5bSAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXRzeW0oZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSBnZWxmX2dldHN5bSAoZGF0YSwgaWR4LCAmbmFtZSMjX21lbSkKKyMgZGVmaW5lIHhlbGZfZ2V0c3ltX3B0cihkYXRhLCBpZHgsIG5hbWUpIFwKKyAgbmFtZSA9ICZuYW1lIyNfbWVtCisjIGRlZmluZSB4ZWxmX2dldHN5bXNobmR4KGRhdGEsIG5keGRhdGEsIGlkeCwgbmFtZTEsIG5hbWUyKSBcCisgIG5hbWUxID0gZ2VsZl9nZXRzeW1zaG5keCAoZGF0YSwgbmR4ZGF0YSwgaWR4LCAmbmFtZTEjI19tZW0sICYobmFtZTIpKQorIyBkZWZpbmUgeGVsZl91cGRhdGVfc3ltKGRhdGEsIGlkeCwgc3ltKSBnZWxmX3VwZGF0ZV9zeW0gKGRhdGEsIGlkeCwgc3ltKQorIyBkZWZpbmUgeGVsZl91cGRhdGVfc3ltc2huZHgoZGF0YSwgbmR4ZGF0YSwgaWR4LCBuYW1lMSwgbmFtZTIsIGRhdGFjaGFuZ2VkKSBcCisgIGdlbGZfdXBkYXRlX3N5bXNobmR4IChkYXRhLCBuZHhkYXRhLCBpZHgsIG5hbWUxLCBuYW1lMikKKworIyBkZWZpbmUgWEVsZl9WZXJzeW1fdmFyZGVmKG5hbWUpIEdFbGZfVmVyc3ltIG5hbWUKKyMgZGVmaW5lIHhlbGZfZ2V0dmVyc3ltX2NvcHkoZGF0YSwgaWR4LCBuYW1lKSBcCisgIGdlbGZfZ2V0dmVyc3ltIChkYXRhLCBpZHgsICZuYW1lKQorCisjIGRlZmluZSBYRWxmX0R5bl92YXJkZWYobmFtZSkgR0VsZl9EeW4gbmFtZSMjX21lbTsgR0VsZl9EeW4gKm5hbWUKKyMgZGVmaW5lIHhlbGZfZ2V0ZHluKGRhdGEsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gZ2VsZl9nZXRkeW4gKGRhdGEsIGlkeCwgJm5hbWUjI19tZW0pCisjIGRlZmluZSB4ZWxmX2dldGR5bl9wdHIoZGF0YSwgaWR4LCBuYW1lKSBcCisgIG5hbWUgPSAmbmFtZSMjX21lbQorIyBkZWZpbmUgeGVsZl91cGRhdGVfZHluKGRhdGEsIGlkeCwgbmFtZSkgXAorICBnZWxmX3VwZGF0ZV9keW4gKGRhdGEsIGlkeCwgbmFtZSkKKworIyBkZWZpbmUgWEVsZl9SZWxfdmFyZGVmKG5hbWUpIEdFbGZfUmVsIG5hbWUjI19tZW07IEdFbGZfUmVsICpuYW1lCisjIGRlZmluZSB4ZWxmX2dldHJlbChkYXRhLCBpZHgsIG5hbWUpIFwKKyAgbmFtZSA9IGdlbGZfZ2V0cmVsIChkYXRhLCBpZHgsICZuYW1lIyNfbWVtKQorIyBkZWZpbmUgeGVsZl9nZXRyZWxfcHRyKGRhdGEsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gJm5hbWUjI19tZW0KKyMgZGVmaW5lIHhlbGZfdXBkYXRlX3JlbChkYXRhLCBpZHgsIG5hbWUpIFwKKyAgZ2VsZl91cGRhdGVfcmVsIChkYXRhLCBpZHgsIG5hbWUpCisKKyMgZGVmaW5lIFhFbGZfUmVsYV92YXJkZWYobmFtZSkgR0VsZl9SZWxhIG5hbWUjI19tZW07IEdFbGZfUmVsYSAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXRyZWxhKGRhdGEsIGlkeCwgbmFtZSkgXAorICBuYW1lID0gZ2VsZl9nZXRyZWxhIChkYXRhLCBpZHgsICZuYW1lIyNfbWVtKQorIyBkZWZpbmUgeGVsZl9nZXRyZWxhX3B0cihkYXRhLCBpZHgsIG5hbWUpIFwKKyAgbmFtZSA9ICZuYW1lIyNfbWVtCisjIGRlZmluZSB4ZWxmX3VwZGF0ZV9yZWxhKGRhdGEsIGlkeCwgbmFtZSkgXAorICBnZWxmX3VwZGF0ZV9yZWxhIChkYXRhLCBpZHgsIG5hbWUpCisKKyMgZGVmaW5lIFhFbGZfVmVyZGVmX3ZhcmRlZihuYW1lKSBHRWxmX1ZlcmRlZiBuYW1lIyNfbWVtOyBHRWxmX1ZlcmRlZiAqbmFtZQorIyBkZWZpbmUgeGVsZl9nZXR2ZXJkZWYoZGF0YSwgb2Zmc2V0LCBuYW1lKSBcCisgIG5hbWUgPSBnZWxmX2dldHZlcmRlZiAoZGF0YSwgb2Zmc2V0LCAmbmFtZSMjX21lbSkKKworIyBkZWZpbmUgWEVsZl9WZXJkYXV4X3ZhcmRlZihuYW1lKSBHRWxmX1ZlcmRhdXggbmFtZSMjX21lbTsgR0VsZl9WZXJkYXV4ICpuYW1lCisjIGRlZmluZSB4ZWxmX2dldHZlcmRhdXgoZGF0YSwgb2Zmc2V0LCBuYW1lKSBcCisgIG5hbWUgPSBnZWxmX2dldHZlcmRhdXggKGRhdGEsIG9mZnNldCwgJm5hbWUjI19tZW0pCisKKyMgZGVmaW5lIFhFTEZfU1RfVFlQRShpbmZvKSBHRUxGX1NUX1RZUEUgKGluZm8pCisjIGRlZmluZSBYRUxGX1NUX0JJTkQoaW5mbykgR0VMRl9TVF9CSU5EIChpbmZvKQorIyBkZWZpbmUgWEVMRl9TVF9JTkZPKGJpbmQsIHR5cGUpIEdFTEZfU1RfSU5GTyAoYmluZCwgdHlwZSkKKyMgZGVmaW5lIFhFTEZfU1RfVklTSUJJTElUWShpbmZvKSBHRUxGX1NUX1ZJU0lCSUxJVFkgKGluZm8pCisKKyMgZGVmaW5lIFhFTEZfUl9TWU0oaW5mbykgR0VMRl9SX1NZTSAoaW5mbykKKyMgZGVmaW5lIFhFTEZfUl9UWVBFKGluZm8pIEdFTEZfUl9UWVBFIChpbmZvKQorIyBkZWZpbmUgWEVMRl9SX0lORk8oc3ltLCB0eXBlKSBHRUxGX1JfSU5GTyAoc3ltLCB0eXBlKQorCisjIGRlZmluZSB4ZWxmX2ZzaXplKGVsZiwgdHlwZSwgY250KSBcCisgIGdlbGZfZnNpemUgKGVsZiwgdHlwZSwgY250LCBFVl9DVVJSRU5UKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMveWx3cmFwIGIvc3JjL3lsd3JhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFiZjgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3lsd3JhcApAQCAtMCwwICsxLDE1NCBAQAorIyEgL2Jpbi9zaAorIyB5bHdyYXAgLSB3cmFwcGVyIGZvciBsZXgveWFjYyBpbnZvY2F0aW9ucy4KKyMgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgVXNhZ2U6CisjICAgICB5bHdyYXAgSU5QVVQgW09VVFBVVCBERVNJUkVEXS4uLiAtLSBQUk9HUkFNIFtBUkdTXS4uLgorIyAqIElOUFVUIGlzIHRoZSBpbnB1dCBmaWxlCisjICogT1VUUFVUIGlzIGZpbGUgUFJPRyBnZW5lcmF0ZXMKKyMgKiBERVNJUkVEIGlzIGZpbGUgd2UgYWN0dWFsbHkgd2FudAorIyAqIFBST0dSQU0gaXMgcHJvZ3JhbSB0byBydW4KKyMgKiBBUkdTIGFyZSBwYXNzZWQgdG8gUFJPRworIyBBbnkgbnVtYmVyIG9mIE9VVFBVVCxERVNJUkVEIHBhaXJzIG1heSBiZSB1c2VkLgorCisjIFRoZSBpbnB1dC4KK2lucHV0PSIkMSIKK3NoaWZ0CitjYXNlICIkaW5wdXQiIGluCisgW1xcL10qIHwgPzpbXFwvXSopCisgICAgIyBBYnNvbHV0ZSBwYXRoOyBkbyBub3RoaW5nLgorICAgIDs7CisgKikKKyAgICAjIFJlbGF0aXZlIHBhdGguICBNYWtlIGl0IGFic29sdXRlLgorICAgIGlucHV0PSJgcHdkYC8kaW5wdXQiCisgICAgOzsKK2VzYWMKKworcGFpcmxpc3Q9Cit3aGlsZSB0ZXN0ICIkIyIgLW5lIDA7IGRvCisgICBpZiB0ZXN0ICIkMSIgPSAiLS0iOyB0aGVuCisgICAgICBzaGlmdAorICAgICAgYnJlYWsKKyAgIGZpCisgICBwYWlybGlzdD0iJHBhaXJsaXN0ICQxIgorICAgc2hpZnQKK2RvbmUKKworIyBUaGUgcHJvZ3JhbSB0byBydW4uCitwcm9nPSIkMSIKK3NoaWZ0CisjIE1ha2UgYW55IHJlbGF0aXZlIHBhdGggaW4gJHByb2cgYWJzb2x1dGUuCitjYXNlICIkcHJvZyIgaW4KKyBbXFwvXSogfCA/OltcXC9dKikgOzsKKyAqW1xcL10qKSBwcm9nPSJgcHdkYC8kcHJvZyIgOzsKK2VzYWMKKworIyBGSVhNRTogYWRkIGhvc3RuYW1lIGhlcmUgZm9yIHBhcmFsbGVsIG1ha2VzIHRoYXQgcnVuIGNvbW1hbmRzIG9uCisjIG90aGVyIG1hY2hpbmVzLiAgQnV0IHRoYXQgbWlnaHQgdGFrZSB1cyBvdmVyIHRoZSAxNC1jaGFyIGxpbWl0LgorZGlybmFtZT15bHdyYXAkJAordHJhcCAiY2QgYHB3ZGA7IHJtIC1yZiAkZGlybmFtZSA+IC9kZXYvbnVsbCAyPiYxIiAxIDIgMyAxNQorbWtkaXIgJGRpcm5hbWUgfHwgZXhpdCAxCisKK2NkICRkaXJuYW1lCisKKyRwcm9nICR7MSsiJEAifSAiJGlucHV0Igorc3RhdHVzPSQ/CisKK2lmIHRlc3QgJHN0YXR1cyAtZXEgMDsgdGhlbgorICAgc2V0IFggJHBhaXJsaXN0CisgICBzaGlmdAorICAgZmlyc3Q9eWVzCisgICAjIFNpbmNlIERPUyBmaWxlbmFtZSBjb252ZW50aW9ucyBkb24ndCBhbGxvdyB0d28gZG90cywKKyAgICMgdGhlIERPUyB2ZXJzaW9uIG9mIEJpc29uIHdyaXRlcyBvdXQgeV90YWIuYyBpbnN0ZWFkIG9mIHkudGFiLmMKKyAgICMgYW5kIHlfdGFiLmggaW5zdGVhZCBvZiB5LnRhYi5oLiBUZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBjYXNlLgorICAgeV90YWJfbm9kb3Q9Im5vIgorICAgaWYgdGVzdCAtZiB5X3RhYi5jIHx8IHRlc3QgLWYgeV90YWIuaDsgdGhlbgorICAgICAgeV90YWJfbm9kb3Q9InllcyIKKyAgIGZpCisKKyAgICMgVGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoZSBpbnB1dC4KKyAgIGlucHV0X2Rpcj1gZWNobyAiJGlucHV0IiB8IHNlZCAtZSAncyxcKFtcXC9dXClbXlxcL10qJCxcMSwnYAorICAgIyBRdW90ZSAkSU5QVVRfRElSIHNvIHdlIGNhbiB1c2UgaXQgaW4gYSByZWdleHAuCisgICAjIEZJWE1FOiByZWFsbHkgd2Ugc2hvdWxkIGNhcmUgYWJvdXQgbW9yZSB0aGFuIGAuJyBhbmQgYFwnLgorICAgaW5wdXRfcng9YGVjaG8gIiRpbnB1dF9kaXIiIHwgc2VkICdzLFxcXFwsXFxcXFxcXFwsZztzLFxcLixcXFxcLixnJ2AKKworICAgd2hpbGUgdGVzdCAiJCMiIC1uZSAwOyBkbworICAgICAgZnJvbT0iJDEiCisgICAgICAjIEhhbmRsZSB5X3RhYi5jIGFuZCB5X3RhYi5oIG91dHB1dCBieSBET1MKKyAgICAgIGlmIHRlc3QgJHlfdGFiX25vZG90ID0gInllcyI7IHRoZW4KKwkgaWYgdGVzdCAkZnJvbSA9ICJ5LnRhYi5jIjsgdGhlbgorCSAgICBmcm9tPSJ5X3RhYi5jIgorCSBlbHNlCisJICAgIGlmIHRlc3QgJGZyb20gPSAieS50YWIuaCI7IHRoZW4KKwkgICAgICAgZnJvbT0ieV90YWIuaCIKKwkgICAgZmkKKwkgZmkKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1mICIkZnJvbSI7IHRoZW4KKyAgICAgICAgICMgSWYgJDIgaXMgYW4gYWJzb2x1dGUgcGF0aCBuYW1lLCB0aGVuIGp1c3QgdXNlIHRoYXQsCisgICAgICAgICAjIG90aGVyd2lzZSBwcmVwZW5kIGAuLi8nLgorICAgICAgICAgY2FzZSAiJDIiIGluCisJICAgW1xcL10qIHwgPzpbXFwvXSopIHRhcmdldD0iJDIiOzsKKwkgICAqKSB0YXJnZXQ9Ii4uLyQyIjs7CisJIGVzYWMKKworCSAjIEVkaXQgb3V0IGAjbGluZScgb3IgYCMnIGRpcmVjdGl2ZXMuCisJICMKKwkgIyBXZSBkb24ndCB3YW50IHRoZSByZXN1bHRpbmcgZGVidWcgaW5mb3JtYXRpb24gdG8gcG9pbnQgYXQKKwkgIyBhbiBhYnNvbHV0ZSBzcmNkaXI7IGl0IGlzIGJldHRlciBmb3IgaXQgdG8ganVzdCBtZW50aW9uIHRoZQorCSAjIC55IGZpbGUgd2l0aCBubyBwYXRoLgorCSAjCisJICMgV2Ugd2FudCB0byB1c2UgdGhlIHJlYWwgb3V0cHV0IGZpbGUgbmFtZSwgbm90IHl5LmxleC5jIGZvcgorCSAjIGluc3RhbmNlLgorCSAjCisJICMgV2Ugd2FudCB0aGUgaW5jbHVkZSBndWFyZHMgdG8gYmUgYWRqdXN0ZWQgdG9vLgorCSBGUk9NPWBlY2hvICIkZnJvbSIgfCBzZWQgXAorICAgICAgICAgICAgICAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nXAorICAgICAgICAgICAgICAgICAtZSAncy9bXkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXS9fL2cnYAorCSBUQVJHRVQ9YGVjaG8gIiQyIiB8IHNlZCBcCisgICAgICAgICAgICAgICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydcCisgICAgICAgICAgICAgICAgIC1lICdzL1teQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpdL18vZydgCisgICAgICAgICBzZWQgIi9eIy97cywkaW5wdXRfcngsLDtzLCRmcm9tLCQyLDtzLCRGT1JNLCRUTyw7fSIgIiRmcm9tIiA+IiR0YXJnZXQiIHx8CisgICAgICAgICAgICBzdGF0dXM9JD8KKyAgICAgIGVsc2UKKwkgIyBBIG1pc3NpbmcgZmlsZSBpcyBvbmx5IGFuIGVycm9yIGZvciB0aGUgZmlyc3QgZmlsZS4gIFRoaXMKKwkgIyBpcyBhIGJsYXRhbnQgaGFjayB0byBsZXQgdXMgc3VwcG9ydCB1c2luZyAieWFjYyAtZCIuICBJZiAtZAorCSAjIGlzIG5vdCBzcGVjaWZpZWQsIHdlIGRvbid0IHdhbnQgYW4gZXJyb3Igd2hlbiB0aGUgaGVhZGVyCisJICMgZmlsZSBpcyAibWlzc2luZyIuCisJIGlmIHRlc3QgJGZpcnN0ID0geWVzOyB0aGVuCisJICAgIHN0YXR1cz0xCisJIGZpCisgICAgICBmaQorICAgICAgc2hpZnQKKyAgICAgIHNoaWZ0CisgICAgICBmaXJzdD1ubworICAgZG9uZQorZWxzZQorICAgc3RhdHVzPSQ/CitmaQorCisjIFJlbW92ZSB0aGUgZGlyZWN0b3J5LgorY2QgLi4KK3JtIC1yZiAkZGlybmFtZQorCitleGl0ICRzdGF0dXMKZGlmZiAtLWdpdCBhL3Rlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODQ1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK01ha2VmaWxlLmluCmRpZmYgLS1naXQgYS90ZXN0cy9DaGFuZ2VMb2cgYi90ZXN0cy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0YzdjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0NoYW5nZUxvZwpAQCAtMCwwICsxLDEyNiBAQAorMjAwNS0wNy0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIHRlc3RmaWxlMTguYnoyOiBOZXcgZmlsZS4KKwkqIHJ1bi1lbGZsaW50LXRlc3Quc2g6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1lbGZsaW50LXRlc3Quc2guCisJKEVYVFJBX0RJU1QpOiBBZGQgcnVuLWVsZmxpbnQtdGVzdC5zaCBhbmQgdGVzdGZpbGUxOC5iejIuCisKKzIwMDUtMDUtMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBnZXQtZmlsZXMuYyAobWFpbik6IFVzZSBjb3JyZWN0IGZvcm1hdCBzcGVjaWZpZXIuCisKKzIwMDUtMDUtMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQWRkIC1XZXh0cmEgdG8gQ0ZMQUdTLgorCSogZ2V0LWZpbGVzLmM6IFJlbW92ZSB3YXJuaW5nIHRoaXMgcHJvZHVjZWQuCisJKiBnZXQtcHVibmFtZXMuYzogTGlrZXdpc2UuCisJKiBuZXdmaWxlLmM6IExpa2V3aXNlLgorCSogbmV3c2NuLmM6IExpa2V3aXNlLgorCSogc2NubmFtZXMuYzogTGlrZXdpc2UuCisJKiBzaG93cHRhYmxlLmM6IExpa2V3aXNlLgorCSogdGVzdC1ubGlzdC5jOiBMaWtld2lzZS4KKwkqIHVwZGF0ZTEuYzogTGlrZXdpc2UuCisJKiB1cGRhdGUyLmM6IExpa2V3aXNlLgorCSogdXBkYXRlMy5jOiBMaWtld2lzZS4KKwkqIHVwZGF0ZTQuYzogTGlrZXdpc2UuCisKKzIwMDUtMDUtMDggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBydW4tbGluZTJhZGRyLnNoOiBSZW1vdmUgdGVzdGZpbGUxNCBhdCB0aGUgZW5kLgorCisJKiBydW4tc3RyaXAtdGVzdC5zaDogUmVtb3ZlIGRldWJpbmZvIHRlc3QgaW5wdXQgZmlsZSBhcyB3ZWxsLgorCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IE5ld2x5IGFkZGVkIGZpbGVzIGluY29ycmVjdGx5IHVzZWQKKwkuYnosIG5vdCAuYnoyLgorCisyMDA1LTA1LTAzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgorCisJKiBydW4tc3RyaXAtdGVzdC5zaDogVXNlIHZhcmlhYmxlcyBmb3IgdGVzdCBmaWxlIG5hbWVzLgorCU9wdGlvbmFsbHkgcHJvZHVjZSBzZXBhcmF0ZSBkZWJ1ZyBmaWxlIGFuZCBjaGVjayBpdC4KKwkqIHJ1bi1zdHJpcC10ZXN0Mi5zaDogVXNlIHJ1bi1zdHJpcC10ZXN0LnNoIHZpYSAuLCBubyBkdXBsaWNhdGlvbi4KKwkqIHJ1bi1zdHJpcC10ZXN0My5zaDogTGlrZXdpc2UuCisJKiBydW4tc3RyaXAtdGVzdDQuc2g6IE5ldyBmaWxlLgorCSogcnVuLXN0cmlwLXRlc3Q1LnNoOiBOZXcgZmlsZS4KKwkqIHJ1bi1zdHJpcC10ZXN0Ni5zaDogTmV3IGZpbGUuCisJKiB0ZXN0ZmlsZTE1LmJ6OiBOZXcgZmlsZS4KKwkqIHRlc3RmaWxlMTUuZGVidWcuYno6IE5ldyBmaWxlLgorCSogdGVzdGZpbGUxNi5iejogTmV3IGZpbGUuCisJKiB0ZXN0ZmlsZTE2LmRlYnVnLmJ6OiBOZXcgZmlsZS4KKwkqIHRlc3RmaWxlMTcuYno6IE5ldyBmaWxlLgorCSogdGVzdGZpbGUxNy5kZWJ1Zy5iejogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5hbSAoVEVTVFMsIEVYVFJBX0RJU1QpOiBBZGQgdGhlbS4KKworMjAwNS0wNC0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIHJ1bi1saW5lMmFkZHIuc2g6IEFsc28gdXNlIHRlc3RmaWxlMTQuICBBZGp1c3QgZm9yIGNvcnJlY3QKKwlyZXR1cm4gb2YgbXVsdGlwbGUgbWF0Y2hlcy4KKwkqIHRlc3RmaWxlMTQuYnoyOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlMTQuYnoyLgorCisJKiBzaG93LWFiYnJldi5jIChtYWluKTogQWRqdXN0IGZvciBkd2FyZl9nZXRhYmJyZXYgaW50ZXJmYWNlIGNoYW5nZS4KKworMjAwNS0wNC0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAZnJvYi5jb20+CisKKwkqIGxpbmUyYWRkci5jIChtYWluKTogSW5pdGlhbGl6ZSBMSU5FUyBhbmQgTkxJTkVTIGJlZm9yZSBjYWxsaW5nCisJZHdhcmZfZ2V0c3JjX2ZpbGUsIGFuZCBmcmVlIExJTkVTIGFmdGVyd2FyZHMuCisKKwkqIGFsbGZjdHMuYyAobWFpbik6IFVzZSBzaXplX3QgZm9yIENVSEwuCisKKzIwMDUtMDQtMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBsaW5lMmFkZHIuYzogTmV3IGZpbGUuCisJKiBydW4tbGluZTJhZGRyLnNoOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZXMgdG8gYnVpbGQsIHJ1biwgYW5kIGRpc3RyaWJ1dGUgbmV3IGNvZGUuCisKKzIwMDUtMDQtMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBhbGxmY3RzLmM6IE5ldyBmaWxlLgorCSogcnVuLWFsbGZjdHMuc2g6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW06IEFkZCBydWxlcyB0byBidWlsZCwgcnVuLCBhbmQgZGlzdHJpYnV0ZSBuZXcgY29kZS4KKworMjAwNS0wMi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIFtNVURGTEFQXSAoQU1fQ0ZMQUdTKTogQWRkIC1mbXVkZmxhcC4gIExpbmsgYWxsIHRlc3QKKwlwcm9ncmFtcyB3aXRoIC1sbXVkZmxhcC4KKworMjAwNC0wOS0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGFzbS10c3Q0LmMgKG1haW4pOiBBZGQgTERfTElCUkFSWV9QQVRIIHRvIGVsZmxpbnQgaW52b2NhdGlvbi4KKwkqIGFzbS10c3Q1LmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIGFzbS10c3Q2LmMgKG1haW4pOiBMaWtld2lzZS4KKworMjAwNC0wMS0xNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggbXVkZmxhcC4KKworMjAwNC0wMS0xMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIGdldC1hcmFuZ2VzLmM6IFJld3JpdGUgdG8gdXNlIGxpYmR3LgorCSogTWFrZWZpbGUuYW06IFJlZW5hYmxlIGdldC1hcmFuZ2VzIHRlc3QuCisKKzIwMDQtMDEtMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgorCisJKiBnZXQtbGluZXMuYzogTmV3IGZpbGUuCisJKiBnZXQtZmlsZXMuYzogQWRqdXN0IGZvciBsaWJkdy4KKwkqIHJ1bi1nZXQtZmlsZXMuc2g6IEFkanVzdCBleHBlY3RlZCByZXN1bHQuCisJKiBydW4tZ2V0LWxpbmVzLnNoOiBMaWtld2lzZS4KKwkqIE1ha2VmaWxlLmFtOiBSdW4gZ2V0LWxpbmVzIHRlc3QuICBEb24ndCBydW4gZ2V0LWFyYW5nZXMgYW5kCisJZ2V0LWNpZWZkZSB0ZXN0IGZvciBub3cuCisKKwkqIHNob3ctYWJicmV2LmM6IEFkanVzdCBjYWxsIHRvIGR3YXJmX2dldGFiYnJldmF0dHIgYWZ0ZXIgaW50ZXJmYWNlCisJY2hhbmdlLiAgUHJpbnQgYXR0cmlidXRlIG9mZnNldCBpbmZvcm1hdGlvbi4KKwkqIHJ1bi1zaG93LWFiYnJldi5zaDogQWRqdXN0IGV4cGVjdGVkIG91dHB1dC4KKworMjAwNC0wMS0wOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIHNob3ctYWJicmV2LmM6IEFkanVzdCBjYWxsIHRvIGR3YXJmX25leHRjdSBhZnRlciBpbnRlcmZhY2UgY2hhbmdlLgorCSogc2hvdy1kaWUtaW5mby5jOiBMaWtld2lzZS4KKwkqIHJ1bi1zaG93LWRpZS1pbmZvLnNoOiBBZGp1c3QgZXhwZWN0ZWQgb3V0cHV0LgorCisyMDAzLTA4LTEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuaW46IERlcGVuZCBvbiBsaWJlYmwuYSwgbm90IGxpYmVibC5zby4KKworMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+CisKKwkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi90ZXN0cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzRlZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMTMgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCisjIworIyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorIyMKKyMjIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMjCisjIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyMgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorIyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorIyMKK0RFRlMgPSAtREhBVkVfQ09ORklHX0ggLURfR05VX1NPVVJDRQoraWYgTVVERkxBUAorQU1fQ0ZMQUdTID0gLVdhbGwgLVdlcnJvciAtV2V4dHJhIC1zdGQ9Z251OTkgLWZtdWRmbGFwXAorCSAgICAkKGlmICQoJCgqRilfbm9fV2Zvcm1hdCksLVduby1mb3JtYXQsLVdmb3JtYXQ9MikKK2Vsc2UKK0FNX0NGTEFHUyA9IC1XYWxsIC1XZXJyb3IgLVdleHRyYSAtc3RkPWdudTk5IFwKKwkgICAgJChpZiAkKCQoKkYpX25vX1dmb3JtYXQpLC1Xbm8tZm9ybWF0LC1XZm9ybWF0PTIpCitBTV9MREZMQUdTID0gLVdsLC1ycGF0aCxcJCRPUklHSU4vLi4vbGliYXNtOlwkJE9SSUdJTi8uLi9saWJkdzpcJCRPUklHSU4vLi4vbGliZWJsOlwkJE9SSUdJTi8uLi9saWJlbGYKK2VuZGlmCitJTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKS9saWJhc20gLUkkKHRvcF9zcmNkaXIpL2xpYmR3IFwKKwkgICAtSSQodG9wX3NyY2RpcikvbGliZWJsIC1JJCh0b3Bfc3JjZGlyKS9saWJlbGYgXAorCSAgIC1JJCh0b3Bfc3JjZGlyKS9saWIgLUkuLgorCitub2luc3RfUFJPR1JBTVMgPSBhcmV4dHJhY3QgYXJzeW10ZXN0IG5ld2ZpbGUgc2FyaWR4IHNjbm5hbWVzIHNlY3Rpb25kdW1wIFwKKwkJICBzaG93cHRhYmxlIHVwZGF0ZTEgdXBkYXRlMiB1cGRhdGUzIHVwZGF0ZTQgdGVzdC1ubGlzdCBcCisJCSAgc2hvdy1kaWUtaW5mbyBnZXQtZmlsZXMgZ2V0LWxpbmVzIGdldC1wdWJuYW1lcyBcCisJCSAgZ2V0LWFyYW5nZXMgYWxsZmN0cyBsaW5lMmFkZHIgXAorCQkgIHNob3ctYWJicmV2IGhhc2ggYXNtLXRzdDEgYXNtLXRzdDIgYXNtLXRzdDMgXAorCQkgIGFzbS10c3Q0IGFzbS10c3Q1IGFzbS10c3Q2IGFzbS10c3Q3IGFzbS10c3Q4IGFzbS10c3Q5IFwKKwkJICBtc2dfdHN0IG5ld3NjbiBlY3AKKyMgZ2V0LWNpZWZkZQorCitURVNUUyA9IHJ1bi1hcmV4dHJhY3Quc2ggcnVuLWFyc3ltdGVzdC5zaCBuZXdmaWxlIHRlc3Qtbmxpc3QgXAorCXVwZGF0ZTEgdXBkYXRlMiB1cGRhdGUzIHVwZGF0ZTQgXAorCXJ1bi1zaG93LWRpZS1pbmZvLnNoIHJ1bi1nZXQtZmlsZXMuc2ggcnVuLWdldC1saW5lcy5zaCBcCisJcnVuLWdldC1wdWJuYW1lcy5zaCBydW4tZ2V0LWFyYW5nZXMuc2ggcnVuLWFsbGZjdHMuc2ggXAorCXJ1bi1zaG93LWFiYnJldi5zaCBydW4tbGluZTJhZGRyLnNoIGhhc2ggYXNtLXRzdDEgYXNtLXRzdDIgXAorCWFzbS10c3QzIGFzbS10c3Q0IGFzbS10c3Q1IGFzbS10c3Q2IGFzbS10c3Q3IGFzbS10c3Q4IGFzbS10c3Q5IFwKKwltc2dfdHN0IG5ld3NjbiBydW4tc3RyaXAtdGVzdC5zaCBydW4tc3RyaXAtdGVzdDIuc2ggXAorCXJ1bi1zdHJpcC10ZXN0My5zaCBydW4tc3RyaXAtdGVzdDQuc2ggcnVuLXN0cmlwLXRlc3Q1LnNoIFwKKwlydW4tc3RyaXAtdGVzdDYuc2ggcnVuLWVjcC10ZXN0LnNoIHJ1bi1lY3AtdGVzdDIuc2ggXAorCXJ1bi1lbGZsaW50LXRlc3Quc2gKKyMgcnVuLXNob3ctY2llZmRlLnNoCisKK0VYVFJBX0RJU1QgPSBydW4tYXJleHRyYWN0LnNoIHJ1bi1hcnN5bXRlc3Quc2ggXAorCSAgICAgcnVuLXNob3ctZGllLWluZm8uc2ggcnVuLWdldC1maWxlcy5zaCBydW4tZ2V0LWxpbmVzLnNoIFwKKwkgICAgIHJ1bi1nZXQtcHVibmFtZXMuc2ggcnVuLWdldC1hcmFuZ2VzLnNoIFwKKwkgICAgIHJ1bi1zaG93LWNpZWZkZS5zaCBydW4tc2hvdy1hYmJyZXYuc2ggcnVuLXN0cmlwLXRlc3Quc2ggXAorCSAgICAgcnVuLXN0cmlwLXRlc3QyLnNoIHJ1bi1lY3AtdGVzdC5zaCBydW4tZWNwLXRlc3QyLnNoIFwKKwkgICAgIHRlc3RmaWxlLmJ6MiB0ZXN0ZmlsZTIuYnoyIHRlc3RmaWxlMy5iejIgdGVzdGZpbGU0LmJ6MiBcCisJICAgICB0ZXN0ZmlsZTUuYnoyIHRlc3RmaWxlNi5iejIgdGVzdGZpbGU3LmJ6MiB0ZXN0ZmlsZTguYnoyIFwKKwkgICAgIHRlc3RmaWxlOS5iejIgdGVzdGZpbGUxMC5iejIgdGVzdGZpbGUxMS5iejIgdGVzdGZpbGUxMi5iejIgXAorCSAgICAgdGVzdGZpbGUxMy5iejIgcnVuLXN0cmlwLXRlc3QzLnNoIHJ1bi1hbGxmY3RzLnNoIFwKKwkgICAgIHJ1bi1saW5lMmFkZHIuc2ggcnVuLWVsZmxpbnQtdGVzdC5zaCB0ZXN0ZmlsZTE0LmJ6MiBcCisJICAgICBydW4tc3RyaXAtdGVzdDQuc2ggcnVuLXN0cmlwLXRlc3Q1LnNoIHJ1bi1zdHJpcC10ZXN0Ni5zaCBcCisJICAgICB0ZXN0ZmlsZTE1LmJ6MiB0ZXN0ZmlsZTE1LmRlYnVnLmJ6MiBcCisJICAgICB0ZXN0ZmlsZTE2LmJ6MiB0ZXN0ZmlsZTE2LmRlYnVnLmJ6MiBcCisJICAgICB0ZXN0ZmlsZTE3LmJ6MiB0ZXN0ZmlsZTE3LmRlYnVnLmJ6MiBcCisJICAgICB0ZXN0ZmlsZTE4LmJ6MgorCitpZiBNVURGTEFQCitsaWJkdyA9IC4uL2xpYmR3L2xpYmR3LmEKK2xpYmVsZiA9IC4uL2xpYmVsZi9saWJlbGYuYQorbGliYXNtID0gLi4vbGliYXNtL2xpYmFzbS5hCitsaWJtdWRmbGFwID0gLWxtdWRmbGFwCitlbHNlCitsaWJkdyA9IC4uL2xpYmR3L2xpYmR3LnNvCitsaWJlbGYgPSAuLi9saWJlbGYvbGliZWxmLnNvCitsaWJhc20gPSAuLi9saWJhc20vbGliYXNtLnNvCitlbmRpZgorbGliZWJsID0gLi4vbGliZWJsL2xpYmVibC5hCisKK2FyZXh0cmFjdF9MREFERCA9ICQobGliZWxmKSAkKGxpYm11ZGZsYXApCithcnN5bXRlc3RfTERBREQgPSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorbmV3ZmlsZV9MREFERCA9ICQobGliZWxmKSAkKGxpYm11ZGZsYXApCitzYXJpZHhfTERBREQgPSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorc2NubmFtZXNfTERBREQgPSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorc2VjdGlvbmR1bXBfTERBREQgPSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorc2hvd3B0YWJsZV9MREFERCA9ICQobGliZWxmKSAkKGxpYm11ZGZsYXApCitoYXNoX0xEQUREID0gJChsaWJlbGYpICQobGlibXVkZmxhcCkKK3Rlc3Rfbmxpc3RfTERBREQgPSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorbXNnX3RzdF9MREFERCA9ICQobGliZWxmKSAkKGxpYm11ZGZsYXApCituZXdzY25fTERBREQgPSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorZWNwX0xEQUREID0gJChsaWJlbGYpICQobGlibXVkZmxhcCkKK3VwZGF0ZTFfTERBREQgPSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQordXBkYXRlMl9MREFERCA9ICQobGliZWxmKSAkKGxpYm11ZGZsYXApCit1cGRhdGUzX0xEQUREID0gJChsaWJlYmwpICQobGliZWxmKSAkKGxpYm11ZGZsYXApCit1cGRhdGU0X0xEQUREID0gJChsaWJlYmwpICQobGliZWxmKSAkKGxpYm11ZGZsYXApCitzaG93X2RpZV9pbmZvX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpICQobGlibXVkZmxhcCkKK2dldF9wdWJuYW1lc19MREFERCA9ICQobGliZHcpICQobGliZWxmKSAkKGxpYm11ZGZsYXApCitzaG93X2FiYnJldl9MREFERCA9ICQobGliZHcpICQobGliZWxmKSAkKGxpYm11ZGZsYXApCitnZXRfbGluZXNfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorZ2V0X2ZpbGVzX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpICQobGlibXVkZmxhcCkKK2dldF9hcmFuZ2VzX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpICQobGlibXVkZmxhcCkKK2FsbGZjdHNfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorbGluZTJhZGRyX25vX1dmb3JtYXQgPSB5ZXMKK2xpbmUyYWRkcl9MREFERCA9ICQobGliZHcpICQobGliZWxmKSAkKGxpYm11ZGZsYXApCisjc2hvd19jaWVmZGVfTERBREQgPSAuLi9saWJkd2FyZi9saWJkd2FyZi5zbyAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorYXNtX3RzdDFfTERBREQgPSAkKGxpYmFzbSkgJChsaWJlYmwpICQobGliZWxmKSAkKGxpYm11ZGZsYXApCithc21fdHN0Ml9MREFERCA9ICQobGliYXNtKSAkKGxpYmVibCkgJChsaWJlbGYpICQobGlibXVkZmxhcCkKK2FzbV90c3QzX0xEQUREID0gJChsaWJhc20pICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorYXNtX3RzdDRfTERBREQgPSAkKGxpYmFzbSkgJChsaWJlYmwpICQobGliZWxmKSAkKGxpYm11ZGZsYXApCithc21fdHN0NV9MREFERCA9ICQobGliYXNtKSAkKGxpYmVibCkgJChsaWJlbGYpICQobGlibXVkZmxhcCkKK2FzbV90c3Q2X0xEQUREID0gJChsaWJhc20pICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorYXNtX3RzdDdfTERBREQgPSAkKGxpYmFzbSkgJChsaWJlYmwpICQobGliZWxmKSAkKGxpYm11ZGZsYXApCithc21fdHN0OF9MREFERCA9ICQobGliYXNtKSAkKGxpYmVibCkgJChsaWJlbGYpICQobGlibXVkZmxhcCkKK2FzbV90c3Q5X0xEQUREID0gJChsaWJhc20pICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJtdWRmbGFwKQorCitDTEVBTkZJTEVTID0geHh4CmRpZmYgLS1naXQgYS90ZXN0cy9hbGxmY3RzLmMgYi90ZXN0cy9hbGxmY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3ZWJjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FsbGZjdHMuYwpAQCAtMCwwICsxLDUwIEBACisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJkdy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworc3RhdGljIGludAorY2IgKER3YXJmX0Z1bmMgKmZ1bmMsIHZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2FyZl9mdW5jX2ZpbGUgKGZ1bmMpOworICBpbnQgbGluZSA9IC0xOworICBkd2FyZl9mdW5jX2xpbmUgKGZ1bmMsICZsaW5lKTsKKyAgY29uc3QgY2hhciAqZmN0ID0gZHdhcmZfZnVuY19uYW1lIChmdW5jKTsKKworICBwcmludGYgKCIlczolZDolc1xuIiwgZmlsZSwgbGluZSwgZmN0KTsKKworICByZXR1cm4gRFdBUkZfQ0JfT0s7Cit9CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkKKyAgICB7CisgICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W2ldLCBPX1JET05MWSk7CisKKyAgICAgIER3YXJmICpkYmcgPSBkd2FyZl9iZWdpbiAoZmQsIERXQVJGX0NfUkVBRCk7CisgICAgICBpZiAoZGJnICE9IE5VTEwpCisJeworCSAgRHdhcmZfT2ZmIG9mZiA9IDA7CisJICBzaXplX3QgY3VobDsKKwkgIER3YXJmX09mZiBub2ZmOworCisJICB3aGlsZSAoZHdhcmZfbmV4dGN1IChkYmcsIG9mZiwgJm5vZmYsICZjdWhsLCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKQorCSAgICB7CisJICAgICAgRHdhcmZfRGllIGRpZV9tZW07CisJICAgICAgRHdhcmZfRGllICpkaWUgPSBkd2FyZl9vZmZkaWUgKGRiZywgb2ZmICsgY3VobCwgJmRpZV9tZW0pOworCisJICAgICAgKHZvaWQpIGR3YXJmX2dldGZ1bmNzIChkaWUsIGNiLCBOVUxMLCAwKTsKKworCSAgICAgIG9mZiA9IG5vZmY7CisJICAgIH0KKworCSAgZHdhcmZfZW5kIChkYmcpOworCX0KKworICAgICAgY2xvc2UgKGZkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hcmV4dHJhY3QuYyBiL3Rlc3RzL2FyZXh0cmFjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODZmYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hcmV4dHJhY3QuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCBmZDsKKyAgRWxmICplbGY7CisgIEVsZiAqc3ViZWxmOworICBFbGZfQ21kIGNtZDsKKyAgb2ZmX3Qgb2Zmc2V0OworICBzaXplX3QgdG9kbzsKKworICBpZiAoYXJnYyA8IDQpCisgICAgZXhpdCAoMSk7CisKKyAgLyogT3BlbiB0aGUgYXJjaGl2ZS4gICovCisgIGZkID0gb3BlbiAoYXJndlsxXSwgT19SRE9OTFkpOworICBpZiAoZmQgPT0gLTEpCisgICAgeworICAgICAgcHJpbnRmICgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZTogJW0iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBTZXQgdGhlIEVMRiB2ZXJzaW9uLiAgKi8KKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIC8qIENyZWF0ZSBhbiBFTEYgZGVzY3JpcHRvci4gICovCisgIGNtZCA9IEVMRl9DX1JFQUQ7CisgIGVsZiA9IGVsZl9iZWdpbiAoZmQsIGNtZCwgTlVMTCk7CisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJDYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBJZiBpdCBpcyBubyBhcmNoaXZlIHB1bnQuICAqLworICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfQVIpCisgICAgeworICAgICAgcHJpbnRmICgiYCVzJyBpcyBubyBhcmNoaXZlXG4iLCBhcmd2WzFdKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBHZXQgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcmNoaXZlIG9uZSBhZnRlciB0aGUgb3RoZXIuICAqLworICB3aGlsZSAoKHN1YmVsZiA9IGVsZl9iZWdpbiAoZmQsIGNtZCwgZWxmKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUaGUgdGhlIGhlYWRlciBmb3IgdGhpcyBlbGVtZW50LiAgKi8KKyAgICAgIEVsZl9BcmhkciAqYXJoZHIgPSBlbGZfZ2V0YXJoZHIgKHN1YmVsZik7CisKKyAgICAgIGlmIChhcmhkciA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBnZXQgYXJoZHI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworCSAgZXhpdCAoMSk7CisJfQorCisgICAgICBpZiAoc3RyY21wIChhcmhkci0+YXJfbmFtZSwgYXJndlsyXSkgPT0gMCkKKwl7CisJICBpbnQgb3V0ZmQ7CisKKwkgIC8qIEdldCB0aGUgb2Zmc2V0IG9mIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlLiAgKi8KKwkgIG9mZnNldCA9IGVsZl9nZXRiYXNlIChzdWJlbGYpOworCSAgaWYgKG9mZnNldCA9PSAtMSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIlwKK0ZhaWxlZCB0byBnZXQgYmFzZSBhZGRyZXNzIGZvciB0aGUgYXJjaGl2ZSBlbGVtZW50OiAlc1xuIiwKKwkJICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCisJICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gICovCisJICBvdXRmZCA9IG9wZW4gKGFyZ3ZbM10sIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19SRFdSLCAwNjY2KTsKKwkgIGlmIChvdXRmZCA9PSAtMSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIG91dHB1dCBmaWxlOiAlbSIpOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisKKwkgIC8qIE5vdyB3cml0ZSBvdXQgdGhlIGRhdGEuICAqLworCSAgdG9kbyA9IGFyaGRyLT5hcl9zaXplOworCSAgd2hpbGUgKHRvZG8gPiAwKQorCSAgICB7CisJICAgICAgY2hhciBidWZbMTAyNF07CisJICAgICAgc3NpemVfdCBuID0gcHJlYWQgKGZkLCBidWYsIE1JTiAoc2l6ZW9mIGJ1ZiwgdG9kbyksIG9mZnNldCk7CisJICAgICAgaWYgKG4gPT0gMCkKKwkJYnJlYWs7CisKKwkgICAgICBpZiAod3JpdGUgKG91dGZkLCBidWYsIG4pICE9IG4pCisJCXsKKwkJICBwdXRzICgiV3JpdGluZyBvdXRwdXQgZmFpbGVkIik7CisJCSAgZXhpdCAoMSk7CisJCX0KKworCSAgICAgIG9mZnNldCArPSBuOworCSAgICAgIHRvZG8gLT0gbjsKKwkgICAgfQorCisJICAvKiBDaGVjayB3aGV0aGVyIGFsbCB0aGUgZGF0ZSB3YXMgcmVhZCBhbmQgd3JpdHRlbiBvdXQuICAqLworCSAgaWYgKHRvZG8gIT0gMCkKKwkgICAgeworCSAgICAgIHB1dHMgKCJSZWFkaW5nIGFyY2hpdmUgbWVtYmVyIGZhaWxlZC4iKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCisJICAvKiBDbG9zZSB0aGUgZGVzY3JpcHRvcnMuICAqLworCSAgaWYgKGVsZl9lbmQgKHN1YmVsZikgIT0gMCB8fCBlbGZfZW5kIChlbGYpICE9IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKCJGcmVlaW5nIEVMRiBkZXNjcmlwdG9ycyBmYWlsZWQ6ICVzIiwgZWxmX2Vycm1zZyAoLTEpKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCisJICBjbG9zZSAob3V0ZmQpOworCSAgY2xvc2UgKGZkKTsKKworCSAgLyogQWxsIHdlbnQgd2VsbC4gICovCisJICBleGl0ICgwKTsKKwl9CisKKyAgICAgIC8qIEdldCBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCisgICAgICBjbWQgPSBlbGZfbmV4dCAoc3ViZWxmKTsKKyAgICAgIGlmIChlbGZfZW5kIChzdWJlbGYpICE9IDApCisJeworCSAgcHJpbnRmICgiZXJyb3Igd2hpbGUgZnJlZWluZyBzdWItRUxGIGRlc2NyaXB0b3I6ICVzXG4iLAorCQkgIGVsZl9lcnJtc2cgKC0xKSk7CisJICBleGl0ICgxKTsKKwl9CisgICAgfQorCisgIC8qIFdoZW4gd2UgcmVhY2ggdGhpcyBwb2ludCB3ZSBoYXZlbid0IGZvdW5kIHRoZSBnaXZlbiBmaWxlIGluIHRoZQorICAgICBhcmNoaXZlLiAgKi8KKyAgcHJpbnRmICgiRmlsZSBgJXMnIG5vdCBmb3VuZCBpbiBhcmNoaXZlXG4iLCBhcmd2WzJdKTsKKyAgZXhpdCAoMSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hcnN5bXRlc3QuYyBiL3Rlc3RzL2Fyc3ltdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzJjZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hcnN5bXRlc3QuYwpAQCAtMCwwICsxLDEzMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgZmQ7CisgIEZJTEUgKmZwOworICBFbGYgKmVsZjsKKyAgRWxmX0Fyc3ltICphcnN5bTsKKyAgc2l6ZV90IG5hcnN5bTsKKworICBpZiAoYXJnYyA8IDMpCisgICAgZXhpdCAoMSk7CisKKyAgLyogT3BlbiB0aGUgYXJjaGl2ZS4gICovCisgIGZkID0gb3BlbiAoYXJndlsxXSwgT19SRE9OTFkpOworICBpZiAoZmQgPT0gLTEpCisgICAgeworICAgICAgcHJpbnRmICgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZTogJW0iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGZwID0gZm9wZW4gKGFyZ3ZbMl0sICJ3Iik7CisgIGlmIChmcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlOiAlbSIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFNldCB0aGUgRUxGIHZlcnNpb24uICAqLworICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7CisKKyAgLyogQ3JlYXRlIGFuIEVMRiBkZXNjcmlwdG9yLiAgKi8KKyAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7CisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJDYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBJZiBpdCBpcyBubyBhcmNoaXZlIHB1bnQuICAqLworICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfQVIpCisgICAgeworICAgICAgcHJpbnRmICgiYCVzJyBpcyBubyBhcmNoaXZlXG4iLCBhcmd2WzFdKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBOb3cgZ2V0IHRoZSBpbmRleCBvZiB0aGUgYXJjaGl2ZS4gICovCisgIGFyc3ltID0gZWxmX2dldGFyc3ltIChlbGYsICZuYXJzeW0pOworICBpZiAoYXJzeW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJDYW5ub3QgZ2V0IGFyY2hpdmUgaW5kZXg6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIElmIHRoZXJlIGlzIG5vIGVsZW1lbnQgaW4gdGhlIGluZGV4IGRvIG5vdGhpbmcuICBUaGVyZSBhbHdheXMgaXMKKyAgICAgYW4gZW1wdHkgZW50cnkgYXQgdGhlIGVuZCB3aGljaCBpcyBpbmNsdWRlZCBpbiB0aGUgY291bnQgYW5kCisgICAgIHdoaWNoIHdlIHdhbnQgdG8gc2tpcC4gICovCisgIGlmIChuYXJzeW0tLSA+IDEpCisgICAgd2hpbGUgKG5hcnN5bS0tID4gMCkKKyAgICAgIHsKKwlFbGYgKnN1YmVsZjsKKwlFbGZfQXJoZHIgKmFyaGRyOworCisJaWYgKGVsZl9yYW5kIChlbGYsIGFyc3ltW25hcnN5bV0uYXNfb2ZmKSAhPSBhcnN5bVtuYXJzeW1dLmFzX29mZikKKwkgIHsKKwkgICAgcHJpbnRmICgicmFuZG9tIGFjY2VzcyBmb3Igc3ltYm9sIGAlcycgZmFpbHM6ICVzXG4iLAorCQkgICAgYXJzeW1bbmFyc3ltXS5hc19uYW1lLCBlbGZfZXJybXNnICgtMSkpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKworCXN1YmVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQUQsIGVsZik7CisJaWYgKHN1YmVsZiA9PSBOVUxMKQorCSAgeworCSAgICBwcmludGYgKCJDYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIGZvciBhcmNoaXZlIG1lbWJlcjogJXNcbiIsCisJCSAgICBlbGZfZXJybXNnICgtMSkpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKworCWFyaGRyID0gZWxmX2dldGFyaGRyIChzdWJlbGYpOworCWlmIChhcmhkciA9PSBOVUxMKQorCSAgeworCSAgICBwcmludGYgKCJDYW5ub3QgZ2V0IGFyY2hpdmUgaGVhZGVyIGZvciBlbGVtZW50IGAlcyc6ICVzXG4iLAorCQkgICAgYXJzeW1bbmFyc3ltXS5hc19uYW1lLCBlbGZfZXJybXNnICgtMSkpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKworCS8qIE5vdyBwcmludCB3aGF0IHdlIGFjdHVhbGx5IHdhbnQuICAqLworCWZwcmludGYgKGZwLCAiJXMgaW4gJXNcbiIsIGFyc3ltW25hcnN5bV0uYXNfbmFtZSwgYXJoZHItPmFyX25hbWUpOworCisJLyogRnJlZSB0aGUgRUxGIGRlc2NyaXB0b3IuICAqLworCWlmIChlbGZfZW5kIChzdWJlbGYpICE9IDApCisJICB7CisJICAgIHByaW50ZiAoIkVycm9yIHdoaWxlIGZyZWVpbmcgc3ViRUxGIGRlc2NyaXB0b3I6ICVzXG4iLAorCQkgICAgZWxmX2Vycm1zZyAoLTEpKTsKKwkgICAgZXhpdCAoMSk7CisJICB9CisgICAgICB9CisKKyAgLyogRnJlZSB0aGUgRUxGIGRlc2NyaXB0b3IuICAqLworICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkVycm9yIHdoaWxlIGZyZWVpbmcgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGNsb3NlIChmZCk7CisgIGZjbG9zZSAoZnApOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXNtLXRzdDEuYyBiL3Rlc3RzL2FzbS10c3QxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2OTMwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FzbS10c3QxLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGliYXNtLmg+CisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworCitzdGF0aWMgY29uc3QgY2hhciBmbmFtZVtdID0gImFzbS10c3QxLW91dC5vIjsKKworCitzdGF0aWMgY29uc3QgR0VsZl9FaGRyIGV4cGVjdGVkX2VoZHIgPQorICB7CisgICAgLmVfaWRlbnQgPSB7IFtFSV9NQUcwXSA9IEVMRk1BRzAsCisJCSBbRUlfTUFHMV0gPSBFTEZNQUcxLAorCQkgW0VJX01BRzJdID0gRUxGTUFHMiwKKwkJIFtFSV9NQUczXSA9IEVMRk1BRzMsCisJCSBbRUlfQ0xBU1NdID0gRUxGQ0xBU1MzMiwKKwkJIFtFSV9EQVRBXSA9IEVMRkRBVEEyTFNCLAorCQkgW0VJX1ZFUlNJT05dID0gRVZfQ1VSUkVOVCB9LAorICAgIC5lX3R5cGUgPSBFVF9SRUwsCisgICAgLmVfbWFjaGluZSA9IEVNXzM4NiwKKyAgICAuZV92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKKyAgICAuZV9zaG9mZiA9IDg4LAorICAgIC5lX2Voc2l6ZSA9IHNpemVvZiAoRWxmMzJfRWhkciksCisgICAgLmVfc2hlbnRzaXplID0gc2l6ZW9mIChFbGYzMl9TaGRyKSwKKyAgICAuZV9zaG51bSA9IDQsCisgICAgLmVfc2hzdHJuZHggPSAzCisgIH07CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnNjbm5hbWVzWzRdID0KKyAgeworICAgIFswXSA9ICIiLAorICAgIFsxXSA9ICIudGV4dCIsCisgICAgWzJdID0gIi5kYXRhIiwKKyAgICBbM10gPSAiLnNoc3RydGFiIgorICB9OworCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgQXNtQ3R4X3QgKmN0eDsKKyAgQXNtU2NuX3QgKnNjbjE7CisgIEFzbVNjbl90ICpzY24yOworICBpbnQgZmQ7CisgIEVsZiAqZWxmOworICBHRWxmX0VoZHIgZWhkcl9tZW07CisgIEdFbGZfRWhkciAqZWhkcjsKKyAgaW50IHJlc3VsdCA9IDA7CisgIHNpemVfdCBjbnQ7CisKKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIGN0eCA9IGFzbV9iZWdpbiAoZm5hbWUsIGZhbHNlLCBFTV8zODYsIEVMRkNMQVNTMzIsIEVMRkRBVEEyTFNCKTsKKyAgaWYgKGN0eCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgYXNzZW1ibGVyIGNvbnRleHQ6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIENyZWF0ZSB0d28gc2VjdGlvbnMuICAqLworICBzY24xID0gYXNtX25ld3NjbiAoY3R4LCAiLnRleHQiLCBTSFRfUFJPR0JJVFMsIFNIRl9BTExPQyB8IFNIRl9FWEVDSU5TVFIpOworICBzY24yID0gYXNtX25ld3NjbiAoY3R4LCAiLmRhdGEiLCBTSFRfUFJPR0JJVFMsIFNIRl9BTExPQyB8IFNIRl9XUklURSk7CisgIGlmIChzY24xID09IE5VTEwgfHwgc2NuMiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBpbiBvdXRwdXQgZmlsZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICBhc21fYWJvcnQgKGN0eCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogU3BlY2lhbCBhbGlnbm1lbnQgZm9yIHRoZSAudGV4dCBzZWN0aW9uLiAgKi8KKyAgaWYgKGFzbV9hbGlnbiAoc2NuMSwgMzIpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGFsaWduIC50ZXh0IHNlY3Rpb246ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGlmIChhc21fZW5kIChjdHgpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICBhc21fYWJvcnQgKGN0eCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhlIGZpbGUuICAqLworICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBnZW5lcmF0ZWQgZmlsZTogJW1cbiIpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlOworICAgIH0KKyAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKKyAgICB7CisgICAgICBwdXRzICgibm90IGEgdmFsaWQgRUxGIGZpbGUiKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgICBnb3RvIG91dF9jbG9zZTI7CisgICAgfQorCisgIGVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKKyAgICB9CisKKyAgaWYgKG1lbWNtcCAoZWhkciwgJmV4cGVjdGVkX2VoZHIsIHNpemVvZiAoR0VsZl9FaGRyKSkgIT0gMCkKKyAgICB7CisgICAgICBwdXRzICgiRUxGIGhlYWRlciBkb2VzIG5vdCBtYXRjaCIpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKKyAgICB9CisKKyAgZm9yIChjbnQgPSAxOyBjbnQgPCA0OyArK2NudCkKKyAgICB7CisgICAgICBFbGZfU2NuICpzY247CisgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnNoZHI7CisKKyAgICAgIHNjbiA9IGVsZl9nZXRzY24gKGVsZiwgY250KTsKKyAgICAgIGlmIChzY24gPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gJVpkOiAlc1xuIiwgY250LCBlbGZfZXJybXNnICgtMSkpOworCSAgcmVzdWx0ID0gMTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBzZWN0aW9uICVaZDogJXNcbiIsCisJCSAgY250LCBlbGZfZXJybXNnICgtMSkpOworCSAgcmVzdWx0ID0gMTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHN0cmNtcCAoZWxmX3N0cnB0ciAoZWxmLCBlaGRyLT5lX3Noc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKKwkJICBzY25uYW1lc1tjbnRdKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3MgbmFtZSBkaWZmZXJzOiAlcyB2cyAlc1xuIiwgY250LAorCQkgIGVsZl9zdHJwdHIgKGVsZiwgZWhkci0+ZV9zaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCisJCSAgc2NubmFtZXNbY250XSk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX3R5cGUgIT0gKGNudCA9PSAzID8gU0hUX1NUUlRBQiA6IFNIVF9QUk9HQklUUykpCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyB0eXBlIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9mbGFncyAhPSAoU0hGX0FMTE9DIHwgU0hGX0VYRUNJTlNUUikpCisJICB8fCAoY250ID09IDIgJiYgc2hkci0+c2hfZmxhZ3MgIT0gKFNIRl9BTExPQyB8IFNIRl9XUklURSkpCisJICB8fCAoY250ID09IDMgJiYgc2hkci0+c2hfZmxhZ3MgIT0gMCkpCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBmbGFncyBkaWZmZXJzXG4iLCBjbnQpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmIChzaGRyLT5zaF9hZGRyICE9IDApCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBhZGRyZXNzIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX29mZnNldCAhPSAoKHNpemVvZiAoRWxmMzJfRWhkcikgKyAzMSkgJiB+MzEpKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3Mgb2Zmc2V0IGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKChjbnQgIT0gMyAmJiBzaGRyLT5zaF9zaXplICE9IDApCisJICB8fCAoY250ID09IDMgJiYgc2hkci0+c2hfc2l6ZSAhPSAyMykpCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBzaXplIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX2xpbmsgIT0gMCkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIGxpbmsgZGlmZmVyc1xuIiwgY250KTsKKwkgIHJlc3VsdCA9IDE7CisJfQorCisgICAgICBpZiAoc2hkci0+c2hfaW5mbyAhPSAwKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3MgaW5mbyBkaWZmZXJzXG4iLCBjbnQpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmICgoY250ID09IDEgJiYgc2hkci0+c2hfYWRkcmFsaWduICE9IDMyKQorCSAgfHwgKGNudCAhPSAxICYmIHNoZHItPnNoX2FkZHJhbGlnbiAhPSAxKSkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIGFkZHJhbGlnbiBkaWZmZXJzXG4iLCBjbnQpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IDApCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBlbnRzaXplIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKyAgICB9CisKKyBvdXRfY2xvc2UyOgorICBlbGZfZW5kIChlbGYpOworIG91dF9jbG9zZToKKyAgY2xvc2UgKGZkKTsKKyBvdXQ6CisgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZpbGUgYW55bW9yZS4gICovCisgIHVubGluayAoZm5hbWUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hc20tdHN0Mi5jIGIvdGVzdHMvYXNtLXRzdDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzA5OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXNtLXRzdDIuYwpAQCAtMCwwICsxLDI2MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJhc20uaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKK3N0YXRpYyBjb25zdCBjaGFyIGZuYW1lW10gPSAiYXNtLXRzdDItb3V0Lm8iOworCisKK3N0YXRpYyBjb25zdCBHRWxmX0VoZHIgZXhwZWN0ZWRfZWhkciA9CisgIHsKKyAgICAuZV9pZGVudCA9IHsgW0VJX01BRzBdID0gRUxGTUFHMCwKKwkJIFtFSV9NQUcxXSA9IEVMRk1BRzEsCisJCSBbRUlfTUFHMl0gPSBFTEZNQUcyLAorCQkgW0VJX01BRzNdID0gRUxGTUFHMywKKwkJIFtFSV9DTEFTU10gPSBFTEZDTEFTUzMyLAorCQkgW0VJX0RBVEFdID0gRUxGREFUQTJMU0IsCisJCSBbRUlfVkVSU0lPTl0gPSBFVl9DVVJSRU5UIH0sCisgICAgLmVfdHlwZSA9IEVUX1JFTCwKKyAgICAuZV9tYWNoaW5lID0gRU1fMzg2LAorICAgIC5lX3ZlcnNpb24gPSBFVl9DVVJSRU5ULAorICAgIC5lX3Nob2ZmID0gOTYsCisgICAgLmVfZWhzaXplID0gc2l6ZW9mIChFbGYzMl9FaGRyKSwKKyAgICAuZV9zaGVudHNpemUgPSBzaXplb2YgKEVsZjMyX1NoZHIpLAorICAgIC5lX3NobnVtID0gMywKKyAgICAuZV9zaHN0cm5keCA9IDIKKyAgfTsKKworCitzdGF0aWMgY29uc3QgY2hhciAqc2NubmFtZXNbM10gPQorICB7CisgICAgWzBdID0gIiIsCisgICAgWzFdID0gIi5kYXRhIiwKKyAgICBbMl0gPSAiLnNoc3RydGFiIgorICB9OworCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgQXNtQ3R4X3QgKmN0eDsKKyAgQXNtU2NuX3QgKnNjbjE7CisgIEFzbVNjbl90ICpzY24yOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGZkOworICBFbGYgKmVsZjsKKyAgR0VsZl9FaGRyIGVoZHJfbWVtOworICBHRWxmX0VoZHIgKmVoZHI7CisgIHNpemVfdCBjbnQ7CisKKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIGN0eCA9IGFzbV9iZWdpbiAoZm5hbWUsIGZhbHNlLCBFTV8zODYsIEVMRkNMQVNTMzIsIEVMRkRBVEEyTFNCKTsKKyAgaWYgKGN0eCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgYXNzZW1ibGVyIGNvbnRleHQ6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIENyZWF0ZSB0d28gc2VjdGlvbnMuICAqLworICBzY24xID0gYXNtX25ld3NjbiAoY3R4LCAiLmRhdGEiLCBTSFRfUFJPR0JJVFMsIFNIRl9BTExPQyB8IFNIRl9XUklURSk7CisgIHNjbjIgPSBhc21fbmV3c3Vic2NuIChzY24xLCAxKTsKKyAgaWYgKHNjbjEgPT0gTlVMTCB8fCBzY24yID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGluIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKKyAgICAgIGFzbV9hYm9ydCAoY3R4KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBTcGVjaWFsIGFsaWdubWVudCBmb3IgdGhlIC50ZXh0IHNlY3Rpb24uICAqLworICBpZiAoYXNtX2FsaWduIChzY24xLCAxNikgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgYWxpZ24gLnRleHQgc2VjdGlvbjogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICByZXN1bHQgPSAxOworICAgIH0KKworICAvKiBBZGQgYSBmZXcgc3RyaW5ncy4gICovCisgIGlmIChhc21fYWRkc3RyeiAoc2NuMSwgIm9uZSIsIDQpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGluc2VydCBmaXJzdCBzdHJpbmc6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisgIGlmIChhc21fYWRkc3RyeiAoc2NuMiwgInRocmVlIiwgMCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgaW5zZXJ0IHNlY29uZCBzdHJpbmc6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisgIGlmIChhc21fYWRkc3RyeiAoc2NuMSwgInR3byIsIDQpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGluc2VydCB0aGlyZCBzdHJpbmc6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGlmIChhc21fZW5kIChjdHgpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICBhc21fYWJvcnQgKGN0eCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhlIGZpbGUuICAqLworICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBnZW5lcmF0ZWQgZmlsZTogJW1cbiIpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlOworICAgIH0KKyAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKKyAgICB7CisgICAgICBwdXRzICgibm90IGEgdmFsaWQgRUxGIGZpbGUiKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgICBnb3RvIG91dF9jbG9zZTI7CisgICAgfQorCisgIGVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKKyAgICB9CisKKyAgaWYgKG1lbWNtcCAoZWhkciwgJmV4cGVjdGVkX2VoZHIsIHNpemVvZiAoR0VsZl9FaGRyKSkgIT0gMCkKKyAgICB7CisgICAgICBwdXRzICgiRUxGIGhlYWRlciBkb2VzIG5vdCBtYXRjaCIpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKKyAgICB9CisKKyAgZm9yIChjbnQgPSAxOyBjbnQgPCAzOyArK2NudCkKKyAgICB7CisgICAgICBFbGZfU2NuICpzY247CisgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnNoZHI7CisKKyAgICAgIHNjbiA9IGVsZl9nZXRzY24gKGVsZiwgY250KTsKKyAgICAgIGlmIChzY24gPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gJVpkOiAlc1xuIiwgY250LCBlbGZfZXJybXNnICgtMSkpOworCSAgcmVzdWx0ID0gMTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBzZWN0aW9uICVaZDogJXNcbiIsCisJCSAgY250LCBlbGZfZXJybXNnICgtMSkpOworCSAgcmVzdWx0ID0gMTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHN0cmNtcCAoZWxmX3N0cnB0ciAoZWxmLCBlaGRyLT5lX3Noc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKKwkJICBzY25uYW1lc1tjbnRdKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3MgbmFtZSBkaWZmZXJzOiAlcyB2cyAlc1xuIiwgY250LAorCQkgIGVsZl9zdHJwdHIgKGVsZiwgZWhkci0+ZV9zaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCisJCSAgc2NubmFtZXNbY250XSk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX3R5cGUgIT0gKGNudCA9PSAyID8gU0hUX1NUUlRBQiA6IFNIVF9QUk9HQklUUykpCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyB0eXBlIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9mbGFncyAhPSAoU0hGX0FMTE9DIHwgU0hGX1dSSVRFKSkKKwkgIHx8IChjbnQgPT0gMiAmJiBzaGRyLT5zaF9mbGFncyAhPSAwKSkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIGZsYWdzIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX2FkZHIgIT0gMCkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIGFkZHJlc3MgZGlmZmVyc1xuIiwgY250KTsKKwkgIHJlc3VsdCA9IDE7CisJfQorCisgICAgICBpZiAoKGNudCA9PSAxICYmIHNoZHItPnNoX29mZnNldCAhPSAoKHNpemVvZiAoRWxmMzJfRWhkcikgKyAxNSkgJiB+MTUpKQorCSAgfHwgKGNudCA9PSAyCisJICAgICAgJiYgc2hkci0+c2hfb2Zmc2V0ICE9ICgoKHNpemVvZiAoRWxmMzJfRWhkcikgKyAxNSkgJiB+MTUpCisJCQkJICAgICArIHN0cmxlbiAoIm9uZSIpICsgMQorCQkJCSAgICAgKyBzdHJsZW4gKCJ0d28iKSArIDEKKwkJCQkgICAgICsgc3RybGVuICgidGhyZWUiKSArIDEpKSkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIG9mZnNldCBkaWZmZXJzXG4iLCBjbnQpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmICgoY250ID09IDEgJiYgc2hkci0+c2hfc2l6ZSAhPSAoc3RybGVuICgib25lIikgKyAxCisJCQkJCSArIHN0cmxlbiAoInR3byIpICsgMQorCQkJCQkgKyBzdHJsZW4gKCJ0aHJlZSIpICsgMSkpCisJICB8fCAoY250ID09IDIgJiYgc2hkci0+c2hfc2l6ZSAhPSAxNykpCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBzaXplIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX2xpbmsgIT0gMCkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIGxpbmsgZGlmZmVyc1xuIiwgY250KTsKKwkgIHJlc3VsdCA9IDE7CisJfQorCisgICAgICBpZiAoc2hkci0+c2hfaW5mbyAhPSAwKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3MgaW5mbyBkaWZmZXJzXG4iLCBjbnQpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmICgoY250ID09IDEgJiYgc2hkci0+c2hfYWRkcmFsaWduICE9IDE2KQorCSAgfHwgKGNudCAhPSAxICYmIHNoZHItPnNoX2FkZHJhbGlnbiAhPSAxKSkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIGFkZHJhbGlnbiBkaWZmZXJzXG4iLCBjbnQpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IDApCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBlbnRzaXplIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKyAgICB9CisKKyBvdXRfY2xvc2UyOgorICBlbGZfZW5kIChlbGYpOworIG91dF9jbG9zZToKKyAgY2xvc2UgKGZkKTsKKyBvdXQ6CisgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZpbGUgYW55bW9yZS4gICovCisgIHVubGluayAoZm5hbWUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hc20tdHN0My5jIGIvdGVzdHMvYXNtLXRzdDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjc5ZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXNtLXRzdDMuYwpAQCAtMCwwICsxLDMyMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJhc20uaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKK3N0YXRpYyBjb25zdCBjaGFyIGZuYW1lW10gPSAiYXNtLXRzdDMtb3V0Lm8iOworCisKK3N0YXRpYyBjb25zdCBjaGFyICpzY25uYW1lc1s1XSA9CisgIHsKKyAgICBbMF0gPSAiIiwKKyAgICBbMV0gPSAiLmRhdGEiLAorICAgIFsyXSA9ICIuc3RydGFiIiwKKyAgICBbM10gPSAiLnN5bXRhYiIsCisgICAgWzRdID0gIi5zaHN0cnRhYiIKKyAgfTsKKworCitzdGF0aWMgdW5zaWduZWQgaW50IHNjbnR5cGVzWzVdID0KKyAgeworICAgIFswXSA9IFNIVF9OVUxMLAorICAgIFsxXSA9IFNIVF9QUk9HQklUUywKKyAgICBbMl0gPSBTSFRfU1RSVEFCLAorICAgIFszXSA9IFNIVF9TWU1UQUIsCisgICAgWzRdID0gU0hUX1NUUlRBQgorICB9OworCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgQXNtQ3R4X3QgKmN0eDsKKyAgQXNtU2NuX3QgKnNjbjE7CisgIEFzbVNjbl90ICpzY24yOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGZkOworICBFbGYgKmVsZjsKKyAgR0VsZl9FaGRyIGVoZHJfbWVtOworICBHRWxmX0VoZHIgKmVoZHI7CisgIHNpemVfdCBjbnQ7CisKKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIGN0eCA9IGFzbV9iZWdpbiAoZm5hbWUsIGZhbHNlLCBFTV8zODYsIEVMRkNMQVNTMzIsIEVMRkRBVEEyTFNCKTsKKyAgaWYgKGN0eCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgYXNzZW1ibGVyIGNvbnRleHQ6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIENyZWF0ZSB0d28gc2VjdGlvbnMuICAqLworICBzY24xID0gYXNtX25ld3NjbiAoY3R4LCAiLmRhdGEiLCBTSFRfUFJPR0JJVFMsIFNIRl9BTExPQyB8IFNIRl9XUklURSk7CisgIHNjbjIgPSBhc21fbmV3c3Vic2NuIChzY24xLCAxKTsKKyAgaWYgKHNjbjEgPT0gTlVMTCB8fCBzY24yID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGluIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKKyAgICAgIGFzbV9hYm9ydCAoY3R4KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBTcGVjaWFsIGFsaWdubWVudCBmb3IgdGhlIC50ZXh0IHNlY3Rpb24uICAqLworICBpZiAoYXNtX2FsaWduIChzY24xLCAxNikgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgYWxpZ24gLnRleHQgc2VjdGlvbjogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICByZXN1bHQgPSAxOworICAgIH0KKworICAvKiBBZGQgYSBmZXcgc3RyaW5ncyB3aXRoIG5hbWVzLiAgKi8KKyAgaWYgKGFzbV9uZXdzeW0gKHNjbjEsICJvbmUiLCA0LCBTVFRfT0JKRUNULCBTVEJfR0xPQkFMKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgZmlyc3QgbmFtZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICByZXN1bHQgPSAxOworICAgIH0KKyAgaWYgKGFzbV9hZGRzdHJ6IChzY24xLCAib25lIiwgNCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgaW5zZXJ0IGZpcnN0IHN0cmluZzogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICByZXN1bHQgPSAxOworICAgIH0KKyAgaWYgKGFzbV9uZXdzeW0gKHNjbjIsICJ0aHJlZSIsIDYsIFNUVF9PQkpFQ1QsIFNUQl9XRUFLKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgc2Vjb25kIG5hbWU6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisgIGlmIChhc21fYWRkc3RyeiAoc2NuMiwgInRocmVlIiwgMCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgaW5zZXJ0IHNlY29uZCBzdHJpbmc6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisgIGlmIChhc21fbmV3c3ltIChzY24xLCAidHdvIiwgNCwgU1RUX09CSkVDVCwgU1RCX0xPQ0FMKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgdGhpcmQgbmFtZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICByZXN1bHQgPSAxOworICAgIH0KKyAgaWYgKGFzbV9hZGRzdHJ6IChzY24xLCAidHdvIiwgNCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgaW5zZXJ0IHRoaXJkIHN0cmluZzogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICByZXN1bHQgPSAxOworICAgIH0KKworICAvKiBDcmVhdGUgdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgaWYgKGFzbV9lbmQgKGN0eCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKKyAgICAgIGFzbV9hYm9ydCAoY3R4KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBDaGVjayB0aGUgZmlsZS4gICovCisgIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGdlbmVyYXRlZCBmaWxlOiAlbVxuIik7CisgICAgICByZXN1bHQgPSAxOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQUQsIE5VTEwpOworICBpZiAoZWxmID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICByZXN1bHQgPSAxOworICAgICAgZ290byBvdXRfY2xvc2U7CisgICAgfQorICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfRUxGKQorICAgIHsKKyAgICAgIHB1dHMgKCJub3QgYSB2YWxpZCBFTEYgZmlsZSIpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKKyAgICB9CisKKyAgZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOworICBpZiAoZWhkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICByZXN1bHQgPSAxOworICAgICAgZ290byBvdXRfY2xvc2UyOworICAgIH0KKworICBmb3IgKGNudCA9IDE7IGNudCA8IDU7ICsrY250KQorICAgIHsKKyAgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgICAgIEdFbGZfU2hkciAqc2hkcjsKKworICAgICAgc2NuID0gZWxmX2dldHNjbiAoZWxmLCBjbnQpOworICAgICAgaWYgKHNjbiA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBnZXQgc2VjdGlvbiAlWmQ6ICVzXG4iLCBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7CisJICByZXN1bHQgPSAxOworCSAgY29udGludWU7CisJfQorCisgICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisgICAgICBpZiAoc2hkciA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gJVpkOiAlc1xuIiwKKwkJICBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7CisJICByZXN1bHQgPSAxOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoc3RyY21wIChlbGZfc3RycHRyIChlbGYsIGVoZHItPmVfc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAorCQkgIHNjbm5hbWVzW2NudF0pICE9IDApCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBuYW1lIGRpZmZlcnM6ICVzIHZzICVzXG4iLCBjbnQsCisJCSAgZWxmX3N0cnB0ciAoZWxmLCBlaGRyLT5lX3Noc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKKwkJICBzY25uYW1lc1tjbnRdKTsKKwkgIHJlc3VsdCA9IDE7CisJfQorCisgICAgICBpZiAoc2hkci0+c2hfdHlwZSAhPSBzY250eXBlc1tjbnRdKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3MgdHlwZSBkaWZmZXJzXG4iLCBjbnQpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmICgoY250ID09IDEgJiYgc2hkci0+c2hfZmxhZ3MgIT0gKFNIRl9BTExPQyB8IFNIRl9XUklURSkpCisJICB8fCAoY250ICE9IDEgJiYgc2hkci0+c2hfZmxhZ3MgIT0gMCkpCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBmbGFncyBkaWZmZXJzXG4iLCBjbnQpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmIChzaGRyLT5zaF9hZGRyICE9IDApCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBhZGRyZXNzIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKGNudCA9PSAzKQorCXsKKwkgIEVsZl9EYXRhICpkYXRhOworCisJICBpZiAoc2hkci0+c2hfbGluayAhPSAyKQorCSAgICB7CisJICAgICAgcHV0cyAoInN5bWJvbCB0YWJsZSBoYXMgaW5jb3JyZWN0IGxpbmsiKTsKKwkgICAgICByZXN1bHQgPSAxOworCSAgICB9CisKKwkgIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKwkgIGlmIChkYXRhID09IE5VTEwpCisJICAgIHsKKwkgICAgICBwdXRzICgiY2Fubm90IGdldCBkYXRhIG9mIHN5bWJvbCB0YWJsZSIpOworCSAgICAgIHJlc3VsdCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNpemVfdCBpbm5lcjsKKworCSAgICAgIGZvciAoaW5uZXIgPSAxOworCQkgICBpbm5lciA8IChzaGRyLT5zaF9zaXplCisJCQkgICAgLyBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCkpOworCQkgICArK2lubmVyKQorCQl7CisJCSAgR0VsZl9TeW0gc3ltX21lbTsKKwkJICBHRWxmX1N5bSAqc3ltOworCisJCSAgc3ltID0gZ2VsZl9nZXRzeW0gKGRhdGEsIGlubmVyLCAmc3ltX21lbSk7CisJCSAgaWYgKHN5bSA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IHN5bWJvbCAlenU6ICVzXG4iLAorCQkJICAgICAgaW5uZXIsIGVsZl9lcnJtc2cgKC0xKSk7CisJCSAgICAgIHJlc3VsdCA9IDE7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlIHRoaXJkIGFuZCBmb3VydGggZW50cnkgZGVwZW5kcworCQkJIG9uIGhvdyB0aGUgaGFzaCB0YWJsZSBpcyBvcmdhbml6ZWQuICAqLworCQkgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbNF0gPQorCQkJeworCQkJICBbMF0gPSAiIiwKKwkJCSAgWzFdID0gInR3byIsCisJCQkgIFsyXSA9ICJvbmUiLAorCQkJICBbM10gPSAidGhyZWUiCisJCQl9OworCQkgICAgICBzdGF0aWMgY29uc3QgaW50IGluZm9bNF0gPQorCQkJeworCQkJICBbMF0gPSBHRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX05PVFlQRSksCisJCQkgIFsxXSA9IEdFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfT0JKRUNUKSwKKwkJCSAgWzJdID0gR0VMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfT0JKRUNUKSwKKwkJCSAgWzNdID0gR0VMRl9TVF9JTkZPIChTVEJfV0VBSywgU1RUX09CSkVDVCkKKwkJCX07CisJCSAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB2YWx1ZVs0XSA9CisJCQl7CisJCQkgIFswXSA9IDAsCisJCQkgIFsxXSA9IDQsCisJCQkgIFsyXSA9IDAsCisJCQkgIFszXSA9IDgKKwkJCX07CisKKwkJICAgICAgaWYgKHN0cmNtcCAobmFtZXNbaW5uZXJdLAorCQkJCSAgZWxmX3N0cnB0ciAoZWxmLCBzaGRyLT5zaF9saW5rLAorCQkJCQkgICAgICBzeW0tPnN0X25hbWUpKSAhPSAwKQorCQkJeworCQkJICBwcmludGYgKCJzeW1ib2wgJXp1IGhhcyBkaWZmZXJlbnQgbmFtZVxuIiwgaW5uZXIpOworCQkJICByZXN1bHQgPSAxOworCQkJfQorCisJCSAgICAgIGlmIChzeW0tPnN0X3ZhbHVlICE9IHZhbHVlW2lubmVyXSkKKwkJCXsKKwkJCSAgcHJpbnRmICgic3ltYm9sICV6dSBoYXMgd3JvbmcgdmFsdWVcbiIsIGlubmVyKTsKKwkJCSAgcmVzdWx0ID0gMTsKKwkJCX0KKworCQkgICAgICBpZiAoc3ltLT5zdF9vdGhlciAhPSAwKQorCQkJeworCQkJICBwcmludGYgKCJzeW1ib2wgJXp1IGhhcyB3cm9uZyBvdGhlciBpbmZvXG4iLCBpbm5lcik7CisJCQkgIHJlc3VsdCA9IDE7CisJCQl9CisKKwkJICAgICAgaWYgKHN5bS0+c3Rfc2huZHggIT0gMSkKKwkJCXsKKwkJCSAgcHJpbnRmICgic3ltYm9sICV6dSBoYXMgd3Jvbmcgc2VjdGlvbiByZWZlcmVuY2VcbiIsCisJCQkJICBpbm5lcik7CisJCQkgIHJlc3VsdCA9IDE7CisJCQl9CisKKwkJICAgICAgaWYgKHN5bS0+c3RfaW5mbyAhPSBpbmZvW2lubmVyXSkKKwkJCXsKKwkJCSAgcHJpbnRmICgic3ltYm9sICV6dSBoYXMgd3JvbmcgdHlwZSBvciBiaW5kaW5nXG4iLAorCQkJCSAgaW5uZXIpOworCQkJICByZXN1bHQgPSAxOworCQkJfQorCisJCSAgICAgIGlmICgoaW5uZXIgIT0gMyAmJiBzeW0tPnN0X3NpemUgIT0gNCkKKwkJCSAgfHwgKGlubmVyID09IDMgJiYgc3ltLT5zdF9zaXplICE9IDYpKQorCQkJeworCQkJICBwcmludGYgKCJzeW1ib2wgJXp1IGhhcyB3cm9uZyBzaXplXG4iLCBpbm5lcik7CisJCQkgIHJlc3VsdCA9IDE7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyBvdXRfY2xvc2UyOgorICBlbGZfZW5kIChlbGYpOworIG91dF9jbG9zZToKKyAgY2xvc2UgKGZkKTsKKyBvdXQ6CisgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZpbGUgYW55bW9yZS4gICovCisgIHVubGluayAoZm5hbWUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hc20tdHN0NC5jIGIvdGVzdHMvYXNtLXRzdDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQ2NDg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXNtLXRzdDQuYwpAQCAtMCwwICsxLDg4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpYmFzbS5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworCitzdGF0aWMgY29uc3QgY2hhciBmbmFtZVtdID0gImFzbS10c3Q0LW91dC5vIjsKKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIEFzbUN0eF90ICpjdHg7CisgIGludCByZXN1bHQgPSAwOworICBzaXplX3QgY250OworCisgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKKworICBjdHggPSBhc21fYmVnaW4gKGZuYW1lLCBmYWxzZSwgRU1fMzg2LCBFTEZDTEFTUzMyLCBFTEZEQVRBMkxTQik7CisgIGlmIChjdHggPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGFzc2VtYmxlciBjb250ZXh0OiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBDcmVhdGUgNjYwMDAgc2VjdGlvbnMuICAqLworICBmb3IgKGNudCA9IDA7IGNudCA8IDY2MDAwOyArK2NudCkKKyAgICB7CisgICAgICBjaGFyIGJ1ZlsyMF07CisgICAgICBBc21TY25fdCAqc2NuOworCisgICAgICAvKiBDcmVhdGUgYSB1bmlxdWUgbmFtZS4gICovCisgICAgICBzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1ZiksICIuZGF0YS4lWnUiLCBjbnQpOworCisgICAgICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24uICAqLworICAgICAgc2NuID0gYXNtX25ld3NjbiAoY3R4LCBidWYsIFNIVF9QUk9HQklUUywgU0hGX0FMTE9DIHwgU0hGX1dSSVRFKTsKKyAgICAgIGlmIChzY24gPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gXCIlc1wiIGluIG91dHB1dCBmaWxlOiAlc1xuIiwKKwkJICBidWYsIGFzbV9lcnJtc2cgKC0xKSk7CisJICBhc21fYWJvcnQgKGN0eCk7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIEFkZCBzb21lIGNvbnRlbnQuICAqLworICAgICAgaWYgKGFzbV9hZGR1aW50MzIgKHNjbiwgY250KSAhPSAwKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgY29udGVudCBvZiBzZWN0aW9uIFwiJXNcIjogJXNcbiIsCisJCSAgYnVmLCBhc21fZXJybXNnICgtMSkpOworCSAgYXNtX2Fib3J0IChjdHgpOworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICAvKiBDcmVhdGUgdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgaWYgKGFzbV9lbmQgKGN0eCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKKyAgICAgIGFzbV9hYm9ydCAoY3R4KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiAocmVzdWx0ID09IDApCisgICAgcmVzdWx0ID0gV0VYSVRTVEFUVVMgKHN5c3RlbSAoIlwKK2VudiBMRF9MSUJSQVJZX1BBVEg9Li4vbGliZWxmIC4uL3NyYy9lbGZsaW50IC1xIGFzbS10c3Q0LW91dC5vIikpOworCisgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZpbGUgYW55bW9yZS4gICovCisgIHVubGluayAoZm5hbWUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hc20tdHN0NS5jIGIvdGVzdHMvYXNtLXRzdDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjc2MWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXNtLXRzdDUuYwpAQCAtMCwwICsxLDEwMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJhc20uaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworCitzdGF0aWMgY29uc3QgY2hhciBmbmFtZVtdID0gImFzbS10c3Q1LW91dC5vIjsKKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIEFzbUN0eF90ICpjdHg7CisgIGludCByZXN1bHQgPSAwOworICBzaXplX3QgY250OworCisgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKKworICBjdHggPSBhc21fYmVnaW4gKGZuYW1lLCBmYWxzZSwgRU1fMzg2LCBFTEZDTEFTUzMyLCBFTEZEQVRBMkxTQik7CisgIGlmIChjdHggPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGFzc2VtYmxlciBjb250ZXh0OiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBDcmVhdGUgNjYwMDAgc2VjdGlvbnMuICAqLworICBmb3IgKGNudCA9IDA7IGNudCA8IDY2MDAwOyArK2NudCkKKyAgICB7CisgICAgICBjaGFyIGJ1ZlsyMF07CisgICAgICBBc21TY25fdCAqc2NuOworCisgICAgICAvKiBDcmVhdGUgYSB1bmlxdWUgbmFtZS4gICovCisgICAgICBzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1ZiksICIuZGF0YS4lWnUiLCBjbnQpOworCisgICAgICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24uICAqLworICAgICAgc2NuID0gYXNtX25ld3NjbiAoY3R4LCBidWYsIFNIVF9QUk9HQklUUywgU0hGX0FMTE9DIHwgU0hGX1dSSVRFKTsKKyAgICAgIGlmIChzY24gPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gXCIlc1wiIGluIG91dHB1dCBmaWxlOiAlc1xuIiwKKwkJICBidWYsIGFzbV9lcnJtc2cgKC0xKSk7CisJICBhc21fYWJvcnQgKGN0eCk7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIEFkZCBhIG5hbWUuICAqLworICAgICAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAiJVp1IiwgY250KTsKKyAgICAgIGlmIChhc21fbmV3c3ltIChzY24sIGJ1Ziwgc2l6ZW9mICh1aW50MzJfdCksIFNUVF9PQkpFQ1QsCisJCSAgICAgIFNUQl9HTE9CQUwpID09IE5VTEwpCisJeworCSAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzeW1ib2wgXCIlc1wiOiAlc1xuIiwgYnVmLCBhc21fZXJybXNnICgtMSkpOworCSAgYXNtX2Fib3J0IChjdHgpOworCSAgcmV0dXJuIDE7CisJfQorCisgICAgICAvKiBBZGQgc29tZSBjb250ZW50LiAgKi8KKyAgICAgIGlmIChhc21fYWRkdWludDMyIChzY24sIGNudCkgIT0gMCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGNvbnRlbnQgb2Ygc2VjdGlvbiBcIiVzXCI6ICVzXG4iLAorCQkgIGJ1ZiwgYXNtX2Vycm1zZyAoLTEpKTsKKwkgIGFzbV9hYm9ydCAoY3R4KTsKKwkgIHJldHVybiAxOworCX0KKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGlmIChhc21fZW5kIChjdHgpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICBhc21fYWJvcnQgKGN0eCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgaWYgKHJlc3VsdCA9PSAwKQorICAgIHJlc3VsdCA9IFdFWElUU1RBVFVTIChzeXN0ZW0gKCJcCitlbnYgTERfTElCUkFSWV9QQVRIPS4uL2xpYmVsZiAuLi9zcmMvZWxmbGludCAtcSBhc20tdHN0NS1vdXQubyIpKTsKKworICAvKiBXZSBkb24ndCBuZWVkIHRoZSBmaWxlIGFueW1vcmUuICAqLworICB1bmxpbmsgKGZuYW1lKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXNtLXRzdDYuYyBiL3Rlc3RzL2FzbS10c3Q2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlNjliYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FzbS10c3Q2LmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGxpYmFzbS5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPHN5c3RlbS5oPgorCisKK3N0YXRpYyBjb25zdCBjaGFyIGZuYW1lW10gPSAiYXNtLXRzdDYtb3V0Lm8iOworCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgQXNtQ3R4X3QgKmN0eDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIHNpemVfdCBjbnQ7CisKKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIGN0eCA9IGFzbV9iZWdpbiAoZm5hbWUsIGZhbHNlLCBFTV8zODYsIEVMRkNMQVNTMzIsIEVMRkRBVEEyTFNCKTsKKyAgaWYgKGN0eCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgYXNzZW1ibGVyIGNvbnRleHQ6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGZvciAoY250ID0gMDsgY250IDwgMjIwMDA7ICsrY250KQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzUxMl07CisgICAgICBBc21TY25HcnBfdCAqZ3JwOworICAgICAgQXNtU2NuX3QgKnNjbjsKKyAgICAgIEFzbVN5bV90ICpzeW07CisKKyAgICAgIHNucHJpbnRmIChidWYsIHNpemVvZiAoYnVmKSwgIi5ncnAlWnUiLCBjbnQpOworICAgICAgZ3JwID0gYXNtX25ld3NjbmdycCAoY3R4LCBidWYsIE5VTEwsIDApOworICAgICAgaWYgKGdycCA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBzZWN0aW9uIGdyb3VwICVadTogJXNcbiIsIGNudCwgYXNtX2Vycm1zZyAoLTEpKTsKKwkgIGFzbV9hYm9ydCAoY3R4KTsKKwkgIHJldHVybiAxOworCX0KKworICAgICAgc2NuID0gYXNtX25ld3Njbl9pbmdycCAoY3R4LCAiLmRhdGEiLCBTSFRfUFJPR0JJVFMsCisJCQkgICAgICBTSEZfQUxMT0MgfCBTSEZfV1JJVEUsIGdycCk7CisgICAgICBpZiAoc2NuID09IE5VTEwpCisJeworCSAgcHJpbnRmICgiY2Fubm90IGRhdGEgc2VjdGlvbiBmb3IgZ3JvdXAgJVp1OiAlc1xuIiwKKwkJICBjbnQsIGFzbV9lcnJtc2cgKC0xKSk7CisJICBhc21fYWJvcnQgKGN0eCk7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIEFkZCBhIG5hbWUuICAqLworICAgICAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAiJVp1IiwgY250KTsKKyAgICAgIHN5bSA9IGFzbV9uZXdzeW0gKHNjbiwgYnVmLCBzaXplb2YgKHVpbnQzMl90KSwgU1RUX09CSkVDVCwKKwkJCVNUQl9HTE9CQUwpOworICAgICAgaWYgKHN5bSA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgc3ltYm9sIFwiJXNcIjogJXNcbiIsIGJ1ZiwgYXNtX2Vycm1zZyAoLTEpKTsKKwkgIGFzbV9hYm9ydCAoY3R4KTsKKwkgIHJldHVybiAxOworCX0KKworICAgICAgLyogQWRkIHNvbWUgY29udGVudC4gICovCisgICAgICBpZiAoYXNtX2FkZHVpbnQzMiAoc2NuLCBjbnQpICE9IDApCisJeworCSAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBjb250ZW50IG9mIHNlY3Rpb24gXCIlc1wiOiAlc1xuIiwKKwkJICBidWYsIGFzbV9lcnJtc2cgKC0xKSk7CisJICBhc21fYWJvcnQgKGN0eCk7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIE5vdyB3ZSBoYXZlIGEgc3ltYm9sLCB1c2UgaXQgYXMgdGhlIHNpZ25hdHVyZS4gICovCisgICAgICBpZiAoYXNtX3NjbmdycF9uZXdzaWduYXR1cmUgKGdycCwgc3ltKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBzZXQgc2lnbmF0dXJlIGZvciBzZWN0aW9uIGdyb3VwICVadTogJXNcbiIsCisJCSAgY250LCBhc21fZXJybXNnICgtMSkpOworCSAgYXNtX2Fib3J0IChjdHgpOworCSAgcmV0dXJuIDE7CisJfQorCisgICAgICAvKiBDcmVhdGUgYSBwaG9ueSBkZWJ1ZyBpbmZvIHNlY3Rpb24uICAqLworICAgICAgc2NuID0gYXNtX25ld3Njbl9pbmdycCAoY3R4LCAiLnN0YWIiLCBTSFRfUFJPR0JJVFMsIDAsIGdycCk7CisgICAgICBpZiAoc2NuID09IE5VTEwpCisJeworCSAgcHJpbnRmICgiY2Fubm90IHN0YWIgc2VjdGlvbiBmb3IgZ3JvdXAgJVp1OiAlc1xuIiwKKwkJICBjbnQsIGFzbV9lcnJtc2cgKC0xKSk7CisJICBhc21fYWJvcnQgKGN0eCk7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIEFkZCBzb21lIGNvbnRlbnQuICAqLworICAgICAgaWYgKGFzbV9hZGR1aW50MzIgKHNjbiwgY250KSAhPSAwKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgY29udGVudCBvZiBzZWN0aW9uIFwiJXNcIjogJXNcbiIsCisJCSAgYnVmLCBhc21fZXJybXNnICgtMSkpOworCSAgYXNtX2Fib3J0IChjdHgpOworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICAvKiBDcmVhdGUgdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgaWYgKGFzbV9lbmQgKGN0eCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKKyAgICAgIGFzbV9hYm9ydCAoY3R4KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiAocmVzdWx0ID09IDApCisgICAgcmVzdWx0ID0gV0VYSVRTVEFUVVMgKHN5c3RlbSAoIlwKK2VudiBMRF9MSUJSQVJZX1BBVEg9Li4vbGliZWxmIC4uL3NyYy9lbGZsaW50IC1xIGFzbS10c3Q2LW91dC5vIikpOworCisgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZpbGUgYW55bW9yZS4gICovCisgIHVubGluayAoZm5hbWUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hc20tdHN0Ny5jIGIvdGVzdHMvYXNtLXRzdDcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQ0NTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXNtLXRzdDcuYwpAQCAtMCwwICsxLDE2NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmFzbS5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworc3RhdGljIGNvbnN0IGNoYXIgZm5hbWVbXSA9ICJhc20tdHN0Ny1vdXQubyI7CisKKworaW50CittYWluICh2b2lkKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgc2l6ZV90IGNudDsKKyAgQXNtQ3R4X3QgKmN0eDsKKyAgRWxmICplbGY7CisgIGludCBmZDsKKworICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7CisKKyAgY3R4ID0gYXNtX2JlZ2luIChmbmFtZSwgZmFsc2UsIEVNXzM4NiwgRUxGQ0xBU1MzMiwgRUxGREFUQTJMU0IpOworICBpZiAoY3R4ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBhc3NlbWJsZXIgY29udGV4dDogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgaWYgKGFzbV9uZXdjb21zeW0gKGN0eCwgImNvbW1zeW0iLCA0LCAxNikgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGNvbW1vbiBzeW1ib2w6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgYXNtX2Fib3J0IChjdHgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuICAqLworICBpZiAoYXNtX2VuZCAoY3R4KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGU6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOworICAgICAgYXNtX2Fib3J0IChjdHgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIENoZWNrIHRoZSBmaWxlLiAgKi8KKyAgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFkpOworICBpZiAoZmQgPT0gLTEpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IG9wZW4gZ2VuZXJhdGVkIGZpbGU6ICVtXG4iKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7CisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgICBnb3RvIG91dF9jbG9zZTsKKyAgICB9CisgIGlmIChlbGZfa2luZCAoZWxmKSAhPSBFTEZfS19FTEYpCisgICAgeworICAgICAgcHV0cyAoIm5vdCBhIHZhbGlkIEVMRiBmaWxlIik7CisgICAgICByZXN1bHQgPSAxOworICAgICAgZ290byBvdXRfY2xvc2UyOworICAgIH0KKworICBmb3IgKGNudCA9IDE7IDE7ICsrY250KQorICAgIHsKKyAgICAgIEVsZl9TY24gKnNjbjsKKyAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgICAgIEdFbGZfU2hkciAqc2hkcjsKKworICAgICAgc2NuID0gZWxmX2dldHNjbiAoZWxmLCBjbnQpOworICAgICAgaWYgKHNjbiA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBnZXQgc2VjdGlvbiAlWmQ6ICVzXG4iLCBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7CisJICByZXN1bHQgPSAxOworCSAgY29udGludWU7CisJfQorCisgICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7CisgICAgICBpZiAoc2hkciA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gJVpkOiAlc1xuIiwKKwkJICBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7CisJICByZXN1bHQgPSAxOworCSAgY29udGludWU7CisJfQorICAgICAgLyogV2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBzeW1ib2wgdGFibGUuICAqLworICAgICAgaWYgKHNoZHItPnNoX3R5cGUgIT0gU0hUX1NZTVRBQikKKwljb250aW51ZTsKKworICAgICAgZm9yIChjbnQgPSAxOyBjbnQ8IChzaGRyLT5zaF9zaXplCisJCQkgIC8gZ2VsZl9mc2l6ZSAoZWxmLCBFTEZfVF9TWU0sIDEsIEVWX0NVUlJFTlQpKTsKKwkgICArK2NudCkKKwl7CisJICBHRWxmX1N5bSBzeW1fbWVtOworCSAgR0VsZl9TeW0gKnN5bTsKKworCSAgaWYgKGNudCA+IDEpCisJICAgIHsKKwkgICAgICBwdXRzICgidG9vIG1hbnkgc3ltYm9sIik7CisJICAgICAgcmVzdWx0ID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBzeW0gPSBnZWxmX2dldHN5bSAoZWxmX2dldGRhdGEgKHNjbiwgTlVMTCksIGNudCwgJnN5bV9tZW0pOworCSAgaWYgKHN5bSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBzeW1ib2wgJXp1OiAlc1xuIiwgY250LCBlbGZfZXJybXNnICgtMSkpOworCSAgICAgIHJlc3VsdCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pCisJCXsKKwkJICBwcmludGYgKCJleHBlY3RlZCBjb21tb24gc3ltYm9sLCBnb3Qgc2VjdGlvbiAldVxuIiwKKwkJCSAgKHVuc2lnbmVkIGludCkgc3ltLT5zdF9zaG5keCk7CisJCSAgcmVzdWx0ID0gMTsKKwkJfQorCisJICAgICAgaWYgKHN5bS0+c3RfdmFsdWUgIT0gMTYpCisJCXsKKwkJICBwcmludGYgKCJyZXF1ZXN0ZWQgYWxpZ25tZW50IDE2LCBpcyAlIiBQUkl1TUFYICJcbiIsCisJCQkgICh1aW50bWF4X3QpIHN5bS0+c3RfdmFsdWUpOworCQkgIHJlc3VsdCA9IDE7CisJCX0KKworCSAgICAgIGlmIChzeW0tPnN0X3NpemUgIT0gNCkKKwkJeworCQkgIHByaW50ZiAoInJlcXVlc3RlZCBzaXplIDQsIGlzICUiIFBSSXVNQVggIlxuIiwKKwkJCSAgKHVpbnRtYXhfdCkgc3ltLT5zdF92YWx1ZSk7CisJCSAgcmVzdWx0ID0gMTsKKwkJfQorCSAgICB9CisJfQorCisgICAgICBicmVhazsKKyAgICB9CisKKyBvdXRfY2xvc2UyOgorICBlbGZfZW5kIChlbGYpOworIG91dF9jbG9zZToKKyAgY2xvc2UgKGZkKTsKKyBvdXQ6CisgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZpbGUgYW55bW9yZS4gICovCisgIHVubGluayAoZm5hbWUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hc20tdHN0OC5jIGIvdGVzdHMvYXNtLXRzdDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2U3YzljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXNtLXRzdDguYwpAQCAtMCwwICsxLDE3MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmFzbS5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworc3RhdGljIGNvbnN0IGNoYXIgZm5hbWVbXSA9ICJhc20tdHN0OC1vdXQubyI7CisKKworaW50CittYWluICh2b2lkKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgc2l6ZV90IGNudDsKKyAgQXNtQ3R4X3QgKmN0eDsKKyAgRWxmICplbGY7CisgIGludCBmZDsKKworICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7CisKKyAgY3R4ID0gYXNtX2JlZ2luIChmbmFtZSwgZmFsc2UsIEVNXzM4NiwgRUxGQ0xBU1MzMiwgRUxGREFUQTJMU0IpOworICBpZiAoY3R4ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBhc3NlbWJsZXIgY29udGV4dDogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgaWYgKGFzbV9uZXdhYnNzeW0gKGN0eCwgInRzdDgtb3V0LnMiLCA0LCAweGZlZWRiZWVmLCBTVFRfRklMRSwgU1RCX0xPQ0FMKQorICAgICAgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGFic29sdXRlIHN5bWJvbDogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICBhc21fYWJvcnQgKGN0eCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGlmIChhc21fZW5kIChjdHgpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICBhc21fYWJvcnQgKGN0eCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhlIGZpbGUuICAqLworICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBnZW5lcmF0ZWQgZmlsZTogJW1cbiIpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlOworICAgIH0KKyAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKKyAgICB7CisgICAgICBwdXRzICgibm90IGEgdmFsaWQgRUxGIGZpbGUiKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgICBnb3RvIG91dF9jbG9zZTI7CisgICAgfQorCisgIGZvciAoY250ID0gMTsgMTsgKytjbnQpCisgICAgeworICAgICAgRWxmX1NjbiAqc2NuOworICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOworICAgICAgR0VsZl9TaGRyICpzaGRyOworCisgICAgICBzY24gPSBlbGZfZ2V0c2NuIChlbGYsIGNudCk7CisgICAgICBpZiAoc2NuID09IE5VTEwpCisJeworCSAgcHJpbnRmICgiY2Fubm90IGdldCBzZWN0aW9uICVaZDogJXNcbiIsIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKKwkgIHJlc3VsdCA9IDE7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKyAgICAgIGlmIChzaGRyID09IE5VTEwpCisJeworCSAgcHJpbnRmICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3Igc2VjdGlvbiAlWmQ6ICVzXG4iLAorCQkgIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKKwkgIHJlc3VsdCA9IDE7CisJICBjb250aW51ZTsKKwl9CisgICAgICAvKiBXZSBhcmUgbG9va2luZyBmb3IgdGhlIHN5bWJvbCB0YWJsZS4gICovCisgICAgICBpZiAoc2hkci0+c2hfdHlwZSAhPSBTSFRfU1lNVEFCKQorCWNvbnRpbnVlOworCisgICAgICBmb3IgKGNudCA9IDE7IGNudDwgKHNoZHItPnNoX3NpemUKKwkJCSAgLyBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCkpOworCSAgICsrY250KQorCXsKKwkgIEdFbGZfU3ltIHN5bV9tZW07CisJICBHRWxmX1N5bSAqc3ltOworCisJICBpZiAoY250ID4gMSkKKwkgICAgeworCSAgICAgIHB1dHMgKCJ0b28gbWFueSBzeW1ib2wiKTsKKwkgICAgICByZXN1bHQgPSAxOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIHN5bSA9IGdlbGZfZ2V0c3ltIChlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKSwgY250LCAmc3ltX21lbSk7CisJICBpZiAoc3ltID09IE5VTEwpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IHN5bWJvbCAlenU6ICVzXG4iLCBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7CisJICAgICAgcmVzdWx0ID0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX0FCUykKKwkJeworCQkgIHByaW50ZiAoImV4cGVjdGVkIGNvbW1vbiBzeW1ib2wsIGdvdCBzZWN0aW9uICV1XG4iLAorCQkJICAodW5zaWduZWQgaW50KSBzeW0tPnN0X3NobmR4KTsKKwkJICByZXN1bHQgPSAxOworCQl9CisKKwkgICAgICBpZiAoc3ltLT5zdF92YWx1ZSAhPSAweGZlZWRiZWVmKQorCQl7CisJCSAgcHJpbnRmICgicmVxdWVzdGVkIHZhbHVlIDB4ZmVlZGJlZWYsIGlzICUjIiBQUkl4TUFYICJcbiIsCisJCQkgICh1aW50bWF4X3QpIHN5bS0+c3RfdmFsdWUpOworCQkgIHJlc3VsdCA9IDE7CisJCX0KKworCSAgICAgIGlmIChzeW0tPnN0X3NpemUgIT0gNCkKKwkJeworCQkgIHByaW50ZiAoInJlcXVlc3RlZCBzaXplIDQsIGlzICUiIFBSSXVNQVggIlxuIiwKKwkJCSAgKHVpbnRtYXhfdCkgc3ltLT5zdF92YWx1ZSk7CisJCSAgcmVzdWx0ID0gMTsKKwkJfQorCisJICAgICAgaWYgKEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfRklMRSkKKwkJeworCQkgIHByaW50ZiAoInJlcXVlc3RlZCB0eXBlIEZJTEUsIGlzICV1XG4iLAorCQkJICAodW5zaWduZWQgaW50KSBHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykpOworCQkgIHJlc3VsdCA9IDE7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgYnJlYWs7CisgICAgfQorCisgb3V0X2Nsb3NlMjoKKyAgZWxmX2VuZCAoZWxmKTsKKyBvdXRfY2xvc2U6CisgIGNsb3NlIChmZCk7Cisgb3V0OgorICAvKiBXZSBkb24ndCBuZWVkIHRoZSBmaWxlIGFueW1vcmUuICAqLworICB1bmxpbmsgKGZuYW1lKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvYXNtLXRzdDkuYyBiL3Rlc3RzL2FzbS10c3Q5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiYjQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FzbS10c3Q5LmMKQEAgLTAsMCArMSwzMTggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJhc20uaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKK3N0YXRpYyBjb25zdCBjaGFyIGZuYW1lW10gPSAiYXNtLXRzdDktb3V0Lm8iOworCisKK3N0YXRpYyBpbnQzMl90IGlucHV0W10gPQorICB7CisgICAgMCwgMSwgMTI5LCA1MTAsIDIwMDAsIDMzMDAwLCAweDdmZmZmZmYsIDB4N2ZmZmZmZmYKKyAgfTsKKyNkZWZpbmUgbmlucHV0IChzaXplb2YgKGlucHV0KSAvIHNpemVvZiAoaW5wdXRbMF0pKQorCisKK3N0YXRpYyBjb25zdCBHRWxmX0VoZHIgZXhwZWN0ZWRfZWhkciA9CisgIHsKKyAgICAuZV9pZGVudCA9IHsgW0VJX01BRzBdID0gRUxGTUFHMCwKKwkJIFtFSV9NQUcxXSA9IEVMRk1BRzEsCisJCSBbRUlfTUFHMl0gPSBFTEZNQUcyLAorCQkgW0VJX01BRzNdID0gRUxGTUFHMywKKwkJIFtFSV9DTEFTU10gPSBFTEZDTEFTUzMyLAorCQkgW0VJX0RBVEFdID0gRUxGREFUQTJMU0IsCisJCSBbRUlfVkVSU0lPTl0gPSBFVl9DVVJSRU5UIH0sCisgICAgLmVfdHlwZSA9IEVUX1JFTCwKKyAgICAuZV9tYWNoaW5lID0gRU1fMzg2LAorICAgIC5lX3ZlcnNpb24gPSBFVl9DVVJSRU5ULAorICAgIC5lX3Nob2ZmID0gMTgwLAorICAgIC5lX2Voc2l6ZSA9IHNpemVvZiAoRWxmMzJfRWhkciksCisgICAgLmVfc2hlbnRzaXplID0gc2l6ZW9mIChFbGYzMl9TaGRyKSwKKyAgICAuZV9zaG51bSA9IDMsCisgICAgLmVfc2hzdHJuZHggPSAyCisgIH07CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnNjbm5hbWVzWzNdID0KKyAgeworICAgIFswXSA9ICIiLAorICAgIFsxXSA9ICIuZGF0YSIsCisgICAgWzJdID0gIi5zaHN0cnRhYiIKKyAgfTsKKworCitzdGF0aWMgY29uc3QgY2hhciBleHBlY3RlZGRhdGFbXSA9CisgIHsKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDBmLCAweDdmLAorICAgIDB4ODEsIDB4MDEsIDB4ODEsIDB4MDEsIDB4ZmYsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4MGYsIDB4ZmYsIDB4N2UsIDB4ZmUsCisgICAgMHgwMywgMHhmZSwgMHgwMywgMHg4MiwgMHhmYywgMHhmZiwgMHhmZiwgMHgwZiwgMHg4MiwgMHg3YywgMHhkMCwgMHgwZiwKKyAgICAweGQwLCAweDBmLCAweGIwLCAweGYwLCAweGZmLCAweGZmLCAweDBmLCAweGIwLCAweDcwLCAweGU4LCAweDgxLCAweDAyLAorICAgIDB4ZTgsIDB4ODEsIDB4MDIsIDB4OTgsIDB4ZmUsIDB4ZmQsIDB4ZmYsIDB4MGYsIDB4OTgsIDB4ZmUsIDB4N2QsIDB4ZmYsCisgICAgMHhmZiwgMHhmZiwgMHgzZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgzZiwgMHg4MSwgMHg4MCwgMHg4MCwgMHhjMCwgMHgwZiwKKyAgICAweDgxLCAweDgwLCAweDgwLCAweDQwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDA3LCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4MDcsIDB4ODEsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MDgsIDB4ODEsIDB4ODAsIDB4ODAsIDB4ODAsIDB4NzgKKyAgfTsKKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIEFzbUN0eF90ICpjdHg7CisgIEFzbVNjbl90ICpzY247CisgIGludCByZXN1bHQgPSAwOworICBpbnQgZmQ7CisgIEVsZiAqZWxmOworICBHRWxmX0VoZHIgZWhkcl9tZW07CisgIEdFbGZfRWhkciAqZWhkcjsKKyAgc2l6ZV90IGNudDsKKworICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7CisKKyAgY3R4ID0gYXNtX2JlZ2luIChmbmFtZSwgZmFsc2UsIEVNXzM4NiwgRUxGQ0xBU1MzMiwgRUxGREFUQTJMU0IpOworICBpZiAoY3R4ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBhc3NlbWJsZXIgY29udGV4dDogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIHR3byBzZWN0aW9ucy4gICovCisgIHNjbiA9IGFzbV9uZXdzY24gKGN0eCwgIi5kYXRhIiwgU0hUX1BST0dCSVRTLCBTSEZfQUxMT0MgfCBTSEZfV1JJVEUpOworICBpZiAoc2NuID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGluIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKKyAgICAgIGFzbV9hYm9ydCAoY3R4KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBTcGVjaWFsIGFsaWdubWVudCBmb3IgdGhlIC50ZXh0IHNlY3Rpb24uICAqLworICBpZiAoYXNtX2FsaWduIChzY24sIDE2KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBhbGlnbiAudGV4dCBzZWN0aW9uOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgfQorCisgIC8qIEFkZCBhIGZldyBVTEVCMTI4IGFuZCBTTEVCMTI4IG51bWJlcnMuICAqLworICBmb3IgKGNudCA9IDA7IGNudCA8IG5pbnB1dDsgKytjbnQpCisgICAgeworICAgICAgaWYgKGFzbV9hZGR1bGViMTI4IChzY24sIGlucHV0W2NudF0pICE9IDApCisJeworCSAgcHJpbnRmICgiY2Fubm90IGluc2VydCB1bGViICUiIFBSSXUzMiAiOiAlc1xuIiwKKwkJICAodWludDMyX3QpIGlucHV0W2NudF0sIGFzbV9lcnJtc2cgKC0xKSk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKGFzbV9hZGRzbGViMTI4IChzY24sIGlucHV0W2NudF0pICE9IDApCisJeworCSAgcHJpbnRmICgiY2Fubm90IGluc2VydCBzbGViICUiIFBSSWQzMiAiOiAlc1xuIiwKKwkJICBpbnB1dFtjbnRdLCBhc21fZXJybXNnICgtMSkpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmIChhc21fYWRkdWxlYjEyOCAoc2NuLCAtaW5wdXRbY250XSkgIT0gMCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgaW5zZXJ0IHVsZWIgJSIgUFJJdTMyICI6ICVzXG4iLAorCQkgICh1aW50MzJfdCkgLWlucHV0W2NudF0sIGFzbV9lcnJtc2cgKC0xKSk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKGFzbV9hZGRzbGViMTI4IChzY24sIC1pbnB1dFtjbnRdKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoImNhbm5vdCBpbnNlcnQgc2xlYiAlIiBQUklkMzIgIjogJXNcbiIsCisJCSAgLWlucHV0W2NudF0sIGFzbV9lcnJtc2cgKC0xKSk7CisJICByZXN1bHQgPSAxOworCX0KKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGlmIChhc21fZW5kIChjdHgpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7CisgICAgICBhc21fYWJvcnQgKGN0eCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhlIGZpbGUuICAqLworICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBnZW5lcmF0ZWQgZmlsZTogJW1cbiIpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlOworICAgIH0KKyAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKKyAgICB7CisgICAgICBwdXRzICgibm90IGEgdmFsaWQgRUxGIGZpbGUiKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgICBnb3RvIG91dF9jbG9zZTI7CisgICAgfQorCisgIGVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKKyAgICB9CisKKyAgaWYgKG1lbWNtcCAoZWhkciwgJmV4cGVjdGVkX2VoZHIsIHNpemVvZiAoR0VsZl9FaGRyKSkgIT0gMCkKKyAgICB7CisgICAgICBwdXRzICgiRUxGIGhlYWRlciBkb2VzIG5vdCBtYXRjaCIpOworICAgICAgcmVzdWx0ID0gMTsKKyAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKKyAgICB9CisKKyAgZm9yIChjbnQgPSAxOyBjbnQgPCAzOyArK2NudCkKKyAgICB7CisgICAgICBFbGZfU2NuICpzY247CisgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07CisgICAgICBHRWxmX1NoZHIgKnNoZHI7CisKKyAgICAgIHNjbiA9IGVsZl9nZXRzY24gKGVsZiwgY250KTsKKyAgICAgIGlmIChzY24gPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gJVpkOiAlc1xuIiwgY250LCBlbGZfZXJybXNnICgtMSkpOworCSAgcmVzdWx0ID0gMTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOworICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBzZWN0aW9uICVaZDogJXNcbiIsCisJCSAgY250LCBlbGZfZXJybXNnICgtMSkpOworCSAgcmVzdWx0ID0gMTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHN0cmNtcCAoZWxmX3N0cnB0ciAoZWxmLCBlaGRyLT5lX3Noc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKKwkJICBzY25uYW1lc1tjbnRdKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3MgbmFtZSBkaWZmZXJzOiAlcyB2cyAlc1xuIiwgY250LAorCQkgIGVsZl9zdHJwdHIgKGVsZiwgZWhkci0+ZV9zaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCisJCSAgc2NubmFtZXNbY250XSk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX3R5cGUgIT0gKGNudCA9PSAyID8gU0hUX1NUUlRBQiA6IFNIVF9QUk9HQklUUykpCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyB0eXBlIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9mbGFncyAhPSAoU0hGX0FMTE9DIHwgU0hGX1dSSVRFKSkKKwkgIHx8IChjbnQgPT0gMiAmJiBzaGRyLT5zaF9mbGFncyAhPSAwKSkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIGZsYWdzIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX2FkZHIgIT0gMCkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIGFkZHJlc3MgZGlmZmVyc1xuIiwgY250KTsKKwkgIHJlc3VsdCA9IDE7CisJfQorCisgICAgICBpZiAoKGNudCA9PSAxICYmIHNoZHItPnNoX29mZnNldCAhPSAoKHNpemVvZiAoRWxmMzJfRWhkcikgKyAxNSkgJiB+MTUpKQorCSAgfHwgKGNudCA9PSAyCisJICAgICAgJiYgc2hkci0+c2hfb2Zmc2V0ICE9ICgoKHNpemVvZiAoRWxmMzJfRWhkcikgKyAxNSkgJiB+MTUpCisJCQkJICAgICArIHNpemVvZiAoZXhwZWN0ZWRkYXRhKSkpKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3Mgb2Zmc2V0IGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9zaXplICE9IHNpemVvZiAoZXhwZWN0ZWRkYXRhKSkKKwkgIHx8IChjbnQgPT0gMiAmJiBzaGRyLT5zaF9zaXplICE9IDE3KSkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIHNpemUgZGlmZmVyc1xuIiwgY250KTsKKwkgIHJlc3VsdCA9IDE7CisJfQorCisgICAgICBpZiAoc2hkci0+c2hfbGluayAhPSAwKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3MgbGluayBkaWZmZXJzXG4iLCBjbnQpOworCSAgcmVzdWx0ID0gMTsKKwl9CisKKyAgICAgIGlmIChzaGRyLT5zaF9pbmZvICE9IDApCisJeworCSAgcHJpbnRmICgic2VjdGlvbiAlWmQncyBpbmZvIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9hZGRyYWxpZ24gIT0gMTYpCisJICB8fCAoY250ICE9IDEgJiYgc2hkci0+c2hfYWRkcmFsaWduICE9IDEpKQorCXsKKwkgIHByaW50ZiAoInNlY3Rpb24gJVpkJ3MgYWRkcmFsaWduIGRpZmZlcnNcbiIsIGNudCk7CisJICByZXN1bHQgPSAxOworCX0KKworICAgICAgaWYgKHNoZHItPnNoX2VudHNpemUgIT0gMCkKKwl7CisJICBwcmludGYgKCJzZWN0aW9uICVaZCdzIGVudHNpemUgZGlmZmVyc1xuIiwgY250KTsKKwkgIHJlc3VsdCA9IDE7CisJfQorCisgICAgICBpZiAoY250ID09IDEpCisJeworCSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKKworCSAgaWYgKGRhdGEgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgZGF0YSBvZiBzZWN0aW9uICVaZFxuIiwgY250KTsKKwkgICAgICByZXN1bHQgPSAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoZGF0YS0+ZF9zaXplICE9IHNpemVvZiAoZXhwZWN0ZWRkYXRhKSkKKwkJeworCQkgIHByaW50ZiAoImRhdGEgYmxvY2sgc2l6ZSBvZiBzZWN0aW9uICVaZCB3cm9uZzogZ290ICVaZCwgIgorCQkJICAiZXhwZWN0ZWQgOTZcbiIsIGNudCwgZGF0YS0+ZF9zaXplKTsKKwkJICByZXN1bHQgPSAxOworCQl9CisKKwkgICAgICBpZiAobWVtY21wIChkYXRhLT5kX2J1ZiwgZXhwZWN0ZWRkYXRhLCBzaXplb2YgKGV4cGVjdGVkZGF0YSkpCisJCSAgIT0gMCkKKwkJeworCQkgIHByaW50ZiAoImRhdGEgYmxvY2sgY29udGVudCBvZiBzZWN0aW9uICVaZCB3cm9uZ1xuIiwgY250KTsKKwkJICByZXN1bHQgPSAxOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgb3V0X2Nsb3NlMjoKKyAgZWxmX2VuZCAoZWxmKTsKKyBvdXRfY2xvc2U6CisgIGNsb3NlIChmZCk7Cisgb3V0OgorICAvKiBXZSBkb24ndCBuZWVkIHRoZSBmaWxlIGFueW1vcmUuICAqLworICB1bmxpbmsgKGZuYW1lKTsKKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZWNwLmMgYi90ZXN0cy9lY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJjNzFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZWNwLmMKQEAgLTAsMCArMSw4OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxlcnJvci5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGlmIChhcmdjIDwgMykKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAidXNhZ2U6ICVzIEZST01OQU1FIFRPTkFNRSIsIGFyZ3ZbMF0pOworCisgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKKworICBpbnQgaW5mZCA9IG9wZW4gKGFyZ3ZbMV0sIE9fUkRPTkxZKTsKKyAgaWYgKGluZmQgPT0gLTEpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICclcyciLCBhcmd2WzFdKTsKKworICBFbGYgKmluZWxmID0gZWxmX2JlZ2luIChpbmZkLCBFTEZfQ19SRUFELCBOVUxMKTsKKyAgaWYgKGluZWxmID09IE5VTEwpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgInByb2JsZW1zIG9wZW5pbmcgJyVzJyBhcyBFTEYgZmlsZTogJXMiLAorCSAgIGFyZ3ZbMV0sIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgaW50IG91dGZkID0gY3JlYXQgKGFyZ3ZbMl0sIDA2NjYpOworICBpZiAob3V0ZmQgPT0gLTEpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAnJXMnIiwgYXJndlsyXSk7CisKKyAgRWxmICpvdXRlbGYgPSBlbGZfYmVnaW4gKG91dGZkLCBFTEZfQ19XUklURSwgTlVMTCk7CisgIGlmIChvdXRlbGYgPT0gTlVMTCkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAicHJvYmxlbXMgb3BlbmluZyAnJXMnIGFzIEVMRiBmaWxlOiAlcyIsCisJICAgYXJndlsyXSwgZWxmX2Vycm1zZyAoLTEpKTsKKworICBnZWxmX25ld2VoZHIgKG91dGVsZiwgZ2VsZl9nZXRjbGFzcyAoaW5lbGYpKTsKKworICBHRWxmX0VoZHIgZWhkcl9tZW07CisgIEdFbGZfRWhkciAqZWhkcjsKKyAgZ2VsZl91cGRhdGVfZWhkciAob3V0ZWxmLCAoZWhkciA9IGdlbGZfZ2V0ZWhkciAoaW5lbGYsICZlaGRyX21lbSkpKTsKKworICBpZiAoZWhkci0+ZV9waG51bSA+IDApCisgICAgeworICAgICAgaW50IGNudDsKKworICAgICAgaWYgKGdlbGZfbmV3cGhkciAob3V0ZWxmLCBlaGRyLT5lX3BobnVtKSA9PSAwKQorCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIsCisJICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgICAgIGZvciAoY250ID0gMDsgY250IDwgZWhkci0+ZV9waG51bTsgKytjbnQpCisJeworCSAgR0VsZl9QaGRyIHBoZHJfbWVtOworCisJICBnZWxmX3VwZGF0ZV9waGRyIChvdXRlbGYsIGNudCwgZ2VsZl9nZXRwaGRyIChpbmVsZiwgY250LCAmcGhkcl9tZW0pKTsKKwl9CisgICAgfQorCisgIEVsZl9TY24gKnNjbiA9IE5VTEw7CisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGluZWxmLCBzY24pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIEVsZl9TY24gKm5ld3NjbiA9IGVsZl9uZXdzY24gKG91dGVsZik7CisKKyAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKKyAgICAgIGdlbGZfdXBkYXRlX3NoZHIgKG5ld3NjbiwgZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSkpOworCisgICAgICAqZWxmX25ld2RhdGEgKG5ld3NjbikgPSAqZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7CisgICAgfQorCisgIGVsZl9mbGFnZWxmIChvdXRlbGYsIEVMRl9DX1NFVCwgRUxGX0ZfTEFZT1VUKTsKKworICBpZiAoZWxmX3VwZGF0ZSAob3V0ZWxmLCBFTEZfQ19XUklURSkgPT0gLTEpCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImVsZl91cGRhdGUgZmFpbGVkOiAlcyIsIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgY2xvc2UgKG91dGZkKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dldC1hcmFuZ2VzLmMgYi90ZXN0cy9nZXQtYXJhbmdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTc2YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nZXQtYXJhbmdlcy5jCkBAIC0wLDAgKzEsMTM0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPGxpYmR3Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworCitzdGF0aWMgY29uc3QgRHdhcmZfQWRkciB0ZXN0YWRkcltdID0KK3sKKyAgMHg4MDQ4NDJiLCAweDgwNDg0MmMsIDB4ODA0ODQzYywgMHg4MDQ4NDU5LCAweDgwNDg0NWEsCisgIDB4ODA0ODQ1YiwgMHg4MDQ4NDVjLCAweDgwNDg0NjAsIDB4ODA0ODQ2NSwgMHg4MDQ4NDY2LAorICAweDgwNDg0NjcsIDB4ODA0ODQ2OCwgMHg4MDQ4NDcwLCAweDgwNDg0NzEsIDB4ODA0ODQ3MgorfTsKKyNkZWZpbmUgbnRlc3RhZGRyIChzaXplb2YgKHRlc3RhZGRyKSAvIHNpemVvZiAodGVzdGFkZHJbMF0pKQorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBjbnQ7CisKKyAgZm9yIChjbnQgPSAxOyBjbnQgPCBhcmdjOyArK2NudCkKKyAgICB7CisgICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W2NudF0sIE9fUkRPTkxZKTsKKworICAgICAgRHdhcmYgKmRiZyA9IGR3YXJmX2JlZ2luIChmZCwgRFdBUkZfQ19SRUFEKTsKKyAgICAgIGlmIChkYmcgPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCIlcyBub3QgdXNhYmxlXG4iLCBhcmd2W2NudF0pOworCSAgcmVzdWx0ID0gMTsKKwkgIGNsb3NlIChmZCk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIER3YXJmX0FyYW5nZXMgKmFyYW5nZXM7CisgICAgICBzaXplX3QgbmFyYW5nZXM7CisgICAgICBpZiAoZHdhcmZfZ2V0YXJhbmdlcyAoZGJnLCAmYXJhbmdlcywgJm5hcmFuZ2VzKSAhPSAwKQorCXByaW50ZiAoIiVzOiBjYW5ub3QgZ2V0IGFyYW5nZXNcbiIsIGFyZ3ZbY250XSk7CisgICAgICBlbHNlCisJeworCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudGVzdGFkZHI7ICsraSkKKwkgICAgeworCSAgICAgIER3YXJmX0FyYW5nZSAqZm91bmQ7CisKKwkgICAgICBmb3VuZCA9IGR3YXJmX2dldGFyYW5nZV9hZGRyIChhcmFuZ2VzLCB0ZXN0YWRkcltpXSk7CisJICAgICAgaWYgKGZvdW5kICE9IE5VTEwpCisJCXsKKwkJICBEd2FyZl9PZmYgY3Vfb2Zmc2V0OworCisJCSAgaWYgKGR3YXJmX2dldGFyYW5nZWluZm8gKGZvdW5kLCBOVUxMLCBOVUxMLCAmY3Vfb2Zmc2V0KSAhPSAwKQorCQkgICAgeworCQkgICAgICBwdXRzICgiZmFpbGVkIHRvIGdldCBDVSBkaWUgb2Zmc2V0Iik7CisJCSAgICAgIHJlc3VsdCA9IDE7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBjb25zdCBjaGFyICpjdW5hbWU7CisJCSAgICAgIER3YXJmX0RpZSBjdV9kaWU7CisKKwkJICAgICAgaWYgKGR3YXJmX29mZmRpZSAoZGJnLCBjdV9vZmZzZXQsICZjdV9kaWUpID09IE5VTEwKKwkJCSAgfHwgKGN1bmFtZSA9IGR3YXJmX2RpZW5hbWUgKCZjdV9kaWUpKSA9PSBOVUxMKQorCQkJeworCQkJICBwdXRzICgiZmFpbGVkIHRvIGdldCBDVSBkaWUiKTsKKwkJCSAgcmVzdWx0ID0gMTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJcHJpbnRmICgiQ1UgbmFtZTogXCIlc1wiXG4iLCBjdW5hbWUpOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQlwcmludGYgKCIlI2xseDogbm90IGluIHJhbmdlXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIHRlc3RhZGRyW2ldKTsKKwkgICAgfQorCisJICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hcmFuZ2VzOyArK2kpCisJICAgIHsKKwkgICAgICBEd2FyZl9BcmFuZ2UgKmFyYW5nZSA9IGR3YXJmX29uZWFyYW5nZSAoYXJhbmdlcywgaSk7CisJICAgICAgaWYgKGFyYW5nZSA9PSBOVUxMKQorCQl7CisJCSAgcHJpbnRmICgiY2Fubm90IGdldCBhcmFuZ2UgJXp1OiAlc1xuIiwgaSwgZHdhcmZfZXJybXNnICgtMSkpOworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICBEd2FyZl9BZGRyIHN0YXJ0OworCSAgICAgIER3YXJmX1dvcmQgbGVuZ3RoOworCSAgICAgIER3YXJmX09mZiBjdV9vZmZzZXQ7CisKKwkgICAgICBpZiAoZHdhcmZfZ2V0YXJhbmdlaW5mbyAoYXJhbmdlLCAmc3RhcnQsICZsZW5ndGgsICZjdV9vZmZzZXQpCisJCSAgIT0gMCkKKwkJeworCQkgIHByaW50ZiAoImNhbm5vdCBnZXQgaW5mbyBmcm9tIGFyYW5nZXNbJXp1XVxuIiwgaSk7CisJCSAgcmVzdWx0ID0gMTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHByaW50ZiAoIiBbJTJ6dV0gc3RhcnQ6ICUjbGx4LCBsZW5ndGg6ICVsbHUsIGN1OiAlbGx1XG4iLAorCQkJICBpLCAodW5zaWduZWQgbG9uZyBsb25nIGludCkgc3RhcnQsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBsZW5ndGgsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBjdV9vZmZzZXQpOworCisJCSAgY29uc3QgY2hhciAqY3VuYW1lOworCQkgIER3YXJmX0RpZSBjdV9kaWU7CisJCSAgaWYgKGR3YXJmX29mZmRpZSAoZGJnLCBjdV9vZmZzZXQsICZjdV9kaWUpID09IE5VTEwKKwkJICAgICAgfHwgKGN1bmFtZSA9IGR3YXJmX2RpZW5hbWUgKCZjdV9kaWUpKSA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBwdXRzICgiZmFpbGVkIHRvIGdldCBDVSBkaWUiKTsKKwkJICAgICAgcmVzdWx0ID0gMTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBwcmludGYgKCJDVSBuYW1lOiBcIiVzXCJcbiIsIGN1bmFtZSk7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgZHdhcmZfZW5kIChkYmcpOworICAgICAgY2xvc2UgKGZkKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2dldC1maWxlcy5jIGIvdGVzdHMvZ2V0LWZpbGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5NDM0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2dldC1maWxlcy5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8bGliZHcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBjbnQ7CisKKyAgZm9yIChjbnQgPSAxOyBjbnQgPCBhcmdjOyArK2NudCkKKyAgICB7CisgICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W2NudF0sIE9fUkRPTkxZKTsKKworICAgICAgRHdhcmYgKmRiZyA9IGR3YXJmX2JlZ2luIChmZCwgRFdBUkZfQ19SRUFEKTsKKyAgICAgIGlmIChkYmcgPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCIlcyBub3QgdXNhYmxlXG4iLCBhcmd2W2NudF0pOworCSAgcmVzdWx0ID0gMTsKKwkgIGlmIChmZCAhPSAtMSkKKwkgICAgY2xvc2UgKGZkKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgRHdhcmZfT2ZmIG8gPSAwOworICAgICAgRHdhcmZfT2ZmIG5jdTsKKyAgICAgIER3YXJmX09mZiBhbzsKKyAgICAgIHNpemVfdCBjdWhsOworICAgICAgdWludDhfdCBhc3o7CisgICAgICB1aW50OF90IG9zejsKKyAgICAgIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgbywgJm5jdSwgJmN1aGwsICZhbywgJmFzeiwgJm9zeikgPT0gMCkKKwl7CisJICBwcmludGYgKCJjdWhsID0gJXp1LCBvID0gJWxsdSwgYXN6ID0gJWhodSwgb3N6ID0gJWhodSwgbmN1ID0gJWxsdVxuIiwKKwkJICBjdWhsLCAodW5zaWduZWQgbG9uZyBsb25nIGludCkgYW8sCisJCSAgYXN6LCBvc3osICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBuY3UpOworCisJICBEd2FyZl9EaWUgZGllX21lbTsKKwkgIER3YXJmX0RpZSAqZGllID0gZHdhcmZfb2ZmZGllIChkYmcsIG8gKyBjdWhsLCAmZGllX21lbSk7CisJICBpZiAoZGllID09IE5VTEwpCisJICAgIHsKKwkgICAgICBwcmludGYgKCIlczogY2Fubm90IGdldCBDVSBkaWVcbiIsIGFyZ3ZbY250XSk7CisJICAgICAgcmVzdWx0ID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBEd2FyZl9GaWxlcyAqZmlsZXM7CisJICBzaXplX3QgbmZpbGVzOworCSAgaWYgKGR3YXJmX2dldHNyY2ZpbGVzIChkaWUsICZmaWxlcywgJm5maWxlcykgIT0gMCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiVzOiBjYW5ub3QgZ2V0IGZpbGVzXG4iLCBhcmd2W2NudF0pOworCSAgICAgIHJlc3VsdCA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZmlsZXM7ICsraSkKKwkgICAgcHJpbnRmICgiIGZpbGVbJXp1XSA9IFwiJXNcIlxuIiwgaSwKKwkJICAgIGR3YXJmX2ZpbGVzcmMgKGZpbGVzLCBpLCBOVUxMLCBOVUxMKSk7CisKKwkgIG8gPSBuY3U7CisJfQorCisgICAgICBkd2FyZl9lbmQgKGRiZyk7CisgICAgICBjbG9zZSAoZmQpOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZ2V0LWxpbmVzLmMgYi90ZXN0cy9nZXQtbGluZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThjMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ2V0LWxpbmVzLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxsaWJkdy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGNudDsKKworICBmb3IgKGNudCA9IDE7IGNudCA8IGFyZ2M7ICsrY250KQorICAgIHsKKyAgICAgIGludCBmZCA9IG9wZW4gKGFyZ3ZbY250XSwgT19SRE9OTFkpOworCisgICAgICBEd2FyZiAqZGJnID0gZHdhcmZfYmVnaW4gKGZkLCBEV0FSRl9DX1JFQUQpOworICAgICAgaWYgIChkYmcgPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCIlcyBub3QgdXNhYmxlOiAlc1xuIiwgYXJndltjbnRdLCBkd2FyZl9lcnJtc2cgKC0xKSk7CisJICBjbG9zZSAgKGZkKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgRHdhcmZfT2ZmIGN1b2ZmID0gMDsKKyAgICAgIER3YXJmX09mZiBvbGRfY3VvZmYgPSAwOworICAgICAgc2l6ZV90IGhzaXplOworICAgICAgRHdhcmZfT2ZmIGFvOworICAgICAgdWludDhfdCBhc3o7CisgICAgICB1aW50OF90IG9zejsKKyAgICAgIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgY3VvZmYsICZjdW9mZiwgJmhzaXplLCAmYW8sICZhc3osICZvc3opID09IDApCisJeworCSAgcHJpbnRmICgiY3VobCA9ICV6dSwgbyA9ICVsbHUsIGFzeiA9ICVoaHUsIG9zeiA9ICVoaHUsIG5jdSA9ICVsbHVcbiIsCisJCSAgaHNpemUsICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBhbywKKwkJICBhc3osIG9zeiwgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGN1b2ZmKTsKKworCSAgLyogR2V0IHRoZSBESUUgZm9yIHRoZSBDVS4gICovCisJICBEd2FyZl9EaWUgZGllOworIAkgIGlmIChkd2FyZl9vZmZkaWUgKGRiZywgb2xkX2N1b2ZmICsgaHNpemUsICZkaWUpID09IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCisJICAgICAgcHJpbnRmICgiJXM6IGNhbm5vdCBnZXQgQ1UgZGllXG4iLCBhcmd2W2NudF0pOworCSAgICAgIHJlc3VsdCA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIG9sZF9jdW9mZiA9IGN1b2ZmOworCisJICBEd2FyZl9MaW5lcyAqbGI7CisJICBzaXplX3QgbmxiOworCSAgaWYgKGR3YXJmX2dldHNyY2xpbmVzICgmZGllLCAmbGIsICZubGIpICE9IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKCIlczogY2Fubm90IGdldCBsaW5lc1xuIiwgYXJndltjbnRdKTsKKwkgICAgICByZXN1bHQgPSAxOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIHByaW50ZiAoIiAlenUgbGluZXNcbiIsIG5sYik7CisKKwkgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmxiOyArK2kpCisJICAgIHsKKwkgICAgICBEd2FyZl9MaW5lICpsID0gZHdhcmZfb25lc3JjbGluZSAobGIsIGkpOworCSAgICAgIGlmIChsID09IE5VTEwpCisJCXsKKwkJICBwcmludGYgKCIlczogY2Fubm90IGdldCBpbmRpdmlkdWFsIGxpbmVcbiIsIGFyZ3ZbY250XSk7CisJCSAgcmVzdWx0ID0gMTsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgRHdhcmZfQWRkciBhZGRyOworCSAgICAgIGlmIChkd2FyZl9saW5lYWRkciAobCwgJmFkZHIpICE9IDApCisJCWFkZHIgPSAwOworCSAgICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2FyZl9saW5lc3JjIChsLCBOVUxMLCBOVUxMKTsKKwkgICAgICBpbnQgbGluZTsKKwkgICAgICBpZiAoZHdhcmZfbGluZW5vIChsLCAmbGluZSkgIT0gMCkKKwkJbGluZSA9IDA7CisKKwkgICAgICBwcmludGYgKCIlIiBQUkl4NjQgIjogJXM6JWQ6IiwgKHVpbnQ2NF90KSBhZGRyLAorCQkgICAgICBmaWxlID86ICI/Pz8iLCBsaW5lKTsKKworCSAgICAgIGludCBjb2x1bW47CisJICAgICAgaWYgKGR3YXJmX2xpbmVjb2wgKGwsICZjb2x1bW4pICE9IDApCisJCWNvbHVtbiA9IDA7CisJICAgICAgaWYgKGNvbHVtbiA+PSAwKQorCQlwcmludGYgKCIlZDoiLCBjb2x1bW4pOworCisJICAgICAgYm9vbCBpc19zdG10OworCSAgICAgIGlmIChkd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQgKGwsICZpc19zdG10KSAhPSAwKQorCQlpc19zdG10ID0gZmFsc2U7CisJICAgICAgYm9vbCBlbmRfc2VxdWVuY2U7CisJICAgICAgaWYgKGR3YXJmX2xpbmVlbmRzZXF1ZW5jZSAobCwgJmVuZF9zZXF1ZW5jZSkgIT0gMCkKKwkJZW5kX3NlcXVlbmNlID0gZmFsc2U7CisJICAgICAgYm9vbCBiYXNpY19ibG9jazsKKwkgICAgICBpZiAoZHdhcmZfbGluZWJsb2NrIChsLCAmYmFzaWNfYmxvY2spICE9IDApCisJCWJhc2ljX2Jsb2NrID0gZmFsc2U7CisJICAgICAgYm9vbCBwcm9sb2d1ZV9lbmQ7CisJICAgICAgaWYgKGR3YXJmX2xpbmVwcm9sb2d1ZWVuZCAobCwgJnByb2xvZ3VlX2VuZCkgIT0gMCkKKwkJcHJvbG9ndWVfZW5kID0gZmFsc2U7CisJICAgICAgYm9vbCBlcGlsb2d1ZV9iZWdpbjsKKwkgICAgICBpZiAoZHdhcmZfbGluZWVwaWxvZ3VlYmVnaW4gKGwsICZlcGlsb2d1ZV9iZWdpbikgIT0gMCkKKwkJZXBpbG9ndWVfYmVnaW4gPSBmYWxzZTsKKworCSAgICAgIHByaW50ZiAoIiBpc19zdG10OiVzLCBlbmRfc2VxOiVzLCBiYjolcywgcHJvbG9ndWU6JXMsIGVwaWxvZ3VlOiVzXG4iLAorCQkgICAgICBpc19zdG10ID8gInllcyIgOiAibm8iLCBlbmRfc2VxdWVuY2UgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIGJhc2ljX2Jsb2NrID8gInllcyIgOiAibm8iLCBwcm9sb2d1ZV9lbmQgID8gInllcyIgOiAibm8iLAorCQkgICAgICBlcGlsb2d1ZV9iZWdpbiA/ICJ5ZXMiIDogIm5vIik7CisJICAgIH0KKwl9CisKKyAgICAgIGR3YXJmX2VuZCAoZGJnKTsKKyAgICAgIGNsb3NlIChmZCk7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9nZXQtcHVibmFtZXMuYyBiL3Rlc3RzL2dldC1wdWJuYW1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzkxYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9nZXQtcHVibmFtZXMuYwpAQCAtMCwwICsxLDkwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPGxpYmR3Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworCitzdGF0aWMgaW50IGdsb2JjbnQ7CisKK3N0YXRpYyBpbnQKK2NhbGxiYWNrIChEd2FyZiAqZGJnLCBEd2FyZl9HbG9iYWwgKmdsLCB2b2lkICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBpbnQgcmVzdWx0ID0gRFdBUkZfQ0JfT0s7CisKKyAgcHJpbnRmICgiIFslMmRdIFwiJXNcIiwgZGllOiAlbGx1LCBjdTogJWxsdVxuIiwKKwkgIGdsb2JjbnQrKywgZ2wtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBnbC0+ZGllX29mZnNldCwKKwkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBnbC0+Y3Vfb2Zmc2V0KTsKKworICBEd2FyZl9EaWUgY3VfZGllOworICBjb25zdCBjaGFyICpjdW5hbWU7CisgIGlmIChkd2FyZl9vZmZkaWUgKGRiZywgZ2wtPmN1X29mZnNldCwgJmN1X2RpZSkgPT0gTlVMTAorICAgICAgfHwgKGN1bmFtZSA9IGR3YXJmX2RpZW5hbWUgKCZjdV9kaWUpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHB1dHMgKCJmYWlsZWQgdG8gZ2V0IENVIGRpZSIpOworICAgICAgcmVzdWx0ID0gRFdBUkZfQ0JfQUJPUlQ7CisgICAgfQorICBlbHNlCisgICAgcHJpbnRmICgiQ1UgbmFtZTogXCIlc1wiXG4iLCBjdW5hbWUpOworCisgIGNvbnN0IGNoYXIgKmRpZW5hbWU7CisgIER3YXJmX0RpZSBkaWU7CisgIGlmIChkd2FyZl9vZmZkaWUgKGRiZywgZ2wtPmRpZV9vZmZzZXQsICZkaWUpID09IE5VTEwKKyAgICAgIHx8IChkaWVuYW1lID0gZHdhcmZfZGllbmFtZSAoJmRpZSkpID09IE5VTEwpCisgICAgeworICAgICAgcHV0cyAoImZhaWxlZCB0byBnZXQgb2JqZWN0IGRpZSIpOworICAgICAgcmVzdWx0ID0gRFdBUkZfQ0JfQUJPUlQ7CisgICAgfQorICBlbHNlCisgICAgcHJpbnRmICgib2JqZWN0IG5hbWU6IFwiJXNcIlxuIiwgZGllbmFtZSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgY250OworCisgIGZvciAoY250ID0gMTsgY250IDwgYXJnYzsgKytjbnQpCisgICAgeworICAgICAgaW50IGZkID0gb3BlbiAoYXJndltjbnRdLCBPX1JET05MWSk7CisgICAgICBEd2FyZiAqZGJnID0gZHdhcmZfYmVnaW4gKGZkLCBEV0FSRl9DX1JFQUQpOworICAgICAgaWYgKGRiZyA9PSBOVUxMKQorCXsKKwkgIHByaW50ZiAoIiVzIG5vdCB1c2FibGU6ICVzXG4iLCBhcmd2W2NudF0sIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkgIHJlc3VsdCA9IDE7CisJICBjbG9zZSAoZmQpOworCSAgY29udGludWU7CisJfQorCisgICAgICBnbG9iY250ID0gMDsKKworICAgICAgaWYgKGR3YXJmX2dldHB1Ym5hbWVzIChkYmcsIGNhbGxiYWNrLCBOVUxMLCAwKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoImR3YXJmX2dldF9wdWJuYW1lcyBkaWRuJ3QgcmV0dXJuIHplcm86ICVzXG4iLAorCQkgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkgIHJlc3VsdCA9IDE7CisJfQorCisgICAgICBkd2FyZl9lbmQgKGRiZyk7CisgICAgICBjbG9zZSAoZmQpOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaGFzaC5jIGIvdGVzdHMvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTg1M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9oYXNoLmMKQEAgLTAsMCArMSw0MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworCitzdGF0aWMgaW50CitjaGVjayAoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBpbnQgZXhwZWN0ZWQpCit7CisgIHVuc2lnbmVkIGxvbmcgaW50IGFjdHVhbCA9IGVsZl9oYXNoIChuYW1lKTsKKworICByZXR1cm4gYWN0dWFsICE9IGV4cGVjdGVkOworfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKworICAvKiBDaGVjayBzb21lIG5hbWVzLiAgV2Uga25vdyB3aGF0IHRoZSBleHBlY3RlZCByZXN1bHQgaXMuICAqLworICBzdGF0dXMgPSBjaGVjayAoIl9EWU5BTUlDIiwgMTY1ODMyNjc1KTsKKyAgc3RhdHVzIHw9IGNoZWNrICgiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgMTAyMjY0MzM1KTsKKworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGluZTJhZGRyLmMgYi90ZXN0cy9saW5lMmFkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjAxN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGluZTJhZGRyLmMKQEAgLTAsMCArMSw2NSBAQAorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJkdy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBmb3IgKGludCBjbnQgPSAxOyBjbnQgPCBhcmdjOyArK2NudCkKKyAgICB7CisgICAgICBjaGFyICpmbmFtZTsKKyAgICAgIGNoYXIgKmZpbGU7CisgICAgICBpbnQgbGluZTsKKworICAgICAgc3dpdGNoIChzc2NhbmYgKGFyZ3ZbY250XSwgIiVhW146XTolYVteOl06JWQiLAorCQkJICZmbmFtZSwgJmZpbGUsICZsaW5lKSkKKwl7CisJZGVmYXVsdDoKKwljYXNlIDA6CisJY2FzZSAxOgorCSAgcHJpbnRmICgiaWdub3JlZCAlc1xuIiwgYXJndltjbnRdKTsKKwkgIGNvbnRpbnVlOworCWNhc2UgMjoKKwkgIGxpbmUgPSAwOworCSAgYnJlYWs7CisJY2FzZSAzOgorCSAgYnJlYWs7CisJfQorCisgICAgICBpbnQgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFkpOworICAgICAgaWYgKGZkID09IC0xKQorCWNvbnRpbnVlOworCisgICAgICBEd2FyZiAqZGJnID0gZHdhcmZfYmVnaW4gKGZkLCBEV0FSRl9DX1JFQUQpOworICAgICAgaWYgKGRiZyAhPSBOVUxMKQorCXsKKwkgIER3YXJmX0xpbmUgKipsaW5lcyA9IE5VTEw7CisJICBzaXplX3QgbmxpbmVzID0gMDsKKworCSAgaWYgKGR3YXJmX2dldHNyY19maWxlIChkYmcsIGZpbGUsIGxpbmUsIDAsICZsaW5lcywgJm5saW5lcykgPT0gMCkKKwkgICAgeworCSAgICAgIGZvciAoc2l6ZV90IGlubmVyID0gMDsgaW5uZXIgPCBubGluZXM7ICsraW5uZXIpCisJCXsKKwkJICBEd2FyZl9BZGRyIGFkZHI7CisJCSAgaWYgKGR3YXJmX2xpbmVhZGRyIChsaW5lc1tpbm5lcl0sICZhZGRyKSA9PSAwKQorCQkgICAgcHJpbnRmICgiJXMgLT4gJSMiIFBSSXhNQVggIlxuIiwKKwkJCSAgICBhcmd2W2NudF0sICh1aW50bWF4X3QpIGFkZHIpOworCQl9CisKKwkgICAgICBmcmVlIChsaW5lcyk7CisJICAgIH0KKworCSAgZHdhcmZfZW5kIChkYmcpOworCX0KKworICAgICAgY2xvc2UgKGZkKTsKKyAgICAgIGZyZWUgKGZuYW1lKTsKKyAgICAgIGZyZWUgKGZpbGUpOworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21zZ190c3QuYyBiL3Rlc3RzL21zZ190c3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2U2M2MwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXNnX3RzdC5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmVsZlAuaD4KKworc3RhdGljIHN0cnVjdAoreworICBpbnQgaWQ7CisgIGNvbnN0IGNoYXIgKmV4cGVjdGVkOworfSBsaWJlbGZfbXNnc1tFTEZfRV9OVU1dID0KKyAgeworICAgIHsgRUxGX0VfTk9FUlJPUiwgIm5vIGVycm9yIiB9LAorICAgIHsgRUxGX0VfVU5LTk9XTl9FUlJPUiwgInVua25vd24gZXJyb3IiIH0sCisgICAgeyBFTEZfRV9VTktOT1dOX1ZFUlNJT04sICJ1bmtub3duIHZlcnNpb24iIH0sCisgICAgeyBFTEZfRV9VTktOT1dOX1RZUEUsICJ1bmtub3duIHR5cGUiIH0sCisgICAgeyBFTEZfRV9JTlZBTElEX0hBTkRMRSwgImludmFsaWQgYEVsZicgaGFuZGxlIiB9LAorICAgIHsgRUxGX0VfU09VUkNFX1NJWkUsICJpbnZhbGlkIHNpemUgb2Ygc291cmNlIG9wZXJhbmQiIH0sCisgICAgeyBFTEZfRV9ERVNUX1NJWkUsICJpbnZhbGlkIHNpemUgb2YgZGVzdGluYXRpb24gb3BlcmFuZCIgfSwKKyAgICB7IEVMRl9FX0lOVkFMSURfRU5DT0RJTkcsICJpbnZhbGlkIGVuY29kaW5nIiB9LAorICAgIHsgRUxGX0VfTk9NRU0sICJvdXQgb2YgbWVtb3J5IiB9LAorICAgIHsgRUxGX0VfSU5WQUxJRF9GSUxFLCAiaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IiIH0sCisgICAgeyBFTEZfRV9JTlZBTElEX09QLCAiaW52YWxpZCBvcGVyYXRpb24iIH0sCisgICAgeyBFTEZfRV9OT19WRVJTSU9OLCAiRUxGIHZlcnNpb24gbm90IHNldCIgfSwKKyAgICB7IEVMRl9FX0lOVkFMSURfQ01ELCAiaW52YWxpZCBjb21tYW5kIiB9LAorICAgIHsgRUxGX0VfUkFOR0UsICJvZmZzZXQgb3V0IG9mIHJhbmdlIiB9LAorICAgIHsgRUxGX0VfQVJDSElWRV9GTUFHLCAiaW52YWxpZCBmbWFnIGZpZWxkIGluIGFyY2hpdmUgaGVhZGVyIiB9LAorICAgIHsgRUxGX0VfSU5WQUxJRF9BUkNISVZFLCAiaW52YWxpZCBhcmNoaXZlIGZpbGUiIH0sCisgICAgeyBFTEZfRV9OT19BUkNISVZFLCAiZGVzY3JpcHRvciBpcyBub3QgZm9yIGFuIGFyY2hpdmUiIH0sCisgICAgeyBFTEZfRV9OT19JTkRFWCwgIm5vIGluZGV4IGF2YWlsYWJsZSIgfSwKKyAgICB7IEVMRl9FX1JFQURfRVJST1IsICJjYW5ub3QgcmVhZCBkYXRhIGZyb20gZmlsZSIgfSwKKyAgICB7IEVMRl9FX1dSSVRFX0VSUk9SLCAiY2Fubm90IHdyaXRlIGRhdGEgdG8gZmlsZSIgfSwKKyAgICB7IEVMRl9FX0lOVkFMSURfQ0xBU1MsICJpbnZhbGlkIGJpbmFyeSBjbGFzcyIgfSwKKyAgICB7IEVMRl9FX0lOVkFMSURfSU5ERVgsICJpbnZhbGlkIHNlY3Rpb24gaW5kZXgiIH0sCisgICAgeyBFTEZfRV9JTlZBTElEX09QRVJBTkQsICJpbnZhbGlkIG9wZXJhbmQiIH0sCisgICAgeyBFTEZfRV9JTlZBTElEX1NFQ1RJT04sICJpbnZhbGlkIHNlY3Rpb24iIH0sCisgICAgeyBFTEZfRV9JTlZBTElEX0NPTU1BTkQsICJpbnZhbGlkIGNvbW1hbmQiIH0sCisgICAgeyBFTEZfRV9XUk9OR19PUkRFUl9FSERSLCAiZXhlY3V0YWJsZSBoZWFkZXIgbm90IGNyZWF0ZWQgZmlyc3QiIH0sCisgICAgeyBFTEZfRV9GRF9ESVNBQkxFRCwgImZpbGUgZGVzY3JpcHRvciBkaXNhYmxlZCIgfSwKKyAgICB7IEVMRl9FX0ZEX01JU01BVENILCAiYXJjaGl2ZS9tZW1iZXIgZmlsZGVzIG1pc21hdGNoIiB9LAorICAgIHsgRUxGX0VfT0ZGU0VUX1JBTkdFLCAib2Zmc2V0IG91dCBvZiByYW5nZSIgfSwKKyAgICB7IEVMRl9FX05PVF9OVUxfU0VDVElPTiwgImNhbm5vdCBtYW5pcHVsYXRlIG51bGwgc2VjdGlvbiIgfSwKKyAgICB7IEVMRl9FX0RBVEFfTUlTTUFUQ0gsICJkYXRhL3NjbiBtaXNtYXRjaCIgfSwKKyAgICB7IEVMRl9FX0lOVkFMSURfU0VDVElPTl9IRUFERVIsICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIiB9LAorICAgIHsgRUxGX0VfSU5WQUxJRF9EQVRBLCAiaW52YWxpZCBkYXRhIiB9LAorICAgIHsgRUxGX0VfREFUQV9FTkNPRElORywgInVua25vd24gZGF0YSBlbmNvZGluZyIgfSwKKyAgICB7IEVMRl9FX1NFQ1RJT05fVE9PX1NNQUxMLCAic2VjdGlvbiBgc2hfc2l6ZScgdG9vIHNtYWxsIGZvciBkYXRhIiB9LAorICAgIHsgRUxGX0VfSU5WQUxJRF9BTElHTiwgImludmFsaWQgc2VjdGlvbiBhbGlnbm1lbnQiIH0sCisgICAgeyBFTEZfRV9JTlZBTElEX1NIRU5UU0laRSwgImludmFsaWQgc2VjdGlvbiBlbnRyeSBzaXplIiB9LAorICAgIHsgRUxGX0VfVVBEQVRFX1JPLCAidXBkYXRlKCkgZm9yIHdyaXRlIG9uIHJlYWQtb25seSBmaWxlIiB9LAorICAgIHsgRUxGX0VfTk9GSUxFLCAibm8gc3VjaCBmaWxlIiB9LAorICAgIHsgRUxGX0VfR1JPVVBfTk9UX1JFTCwKKyAgICAgICJvbmx5IHJlbG9jYXRhYmxlIGZpbGVzIGNhbiBjb250YWluIHNlY3Rpb24gZ3JvdXBzIiB9LAorICAgIHsgRUxGX0VfSU5WQUxJRF9QSERSLAorICAgICAgInByb2dyYW0gaGVhZGVyIG9ubHkgYWxsb3dlZCBpbiBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIG9iamVjdHMiIH0sCisgICAgeyBFTEZfRV9OT19QSERSLAorICAgICAgImZpbGUgaGFzIG5vIHByb2dyYW0gaGVhZGVyIiB9CisgIH07CisKKworaW50CittYWluICh2b2lkKQoreworICBzaXplX3QgY250OworICBpbnQgcmVzdWx0ID0gRVhJVF9TVUNDRVNTOworCisgIC8qIENsZWFyIHRoZSBlcnJvciBzdGF0ZS4gICovCisgICh2b2lkKSBlbGZfZXJybm8gKCk7CisKKyAgLyogQ2hlY2sgYWxsIHRoZSBtZXNzYWdlcyBvZiBsaWJlbGYuICAqLworICBmb3IgKGNudCA9IDE7IGNudCA8IEVMRl9FX05VTTsgKytjbnQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc3RyID0gZWxmX2Vycm1zZyAobGliZWxmX21zZ3NbY250XS5pZCk7CisKKyAgICAgIGlmIChzdHJjbXAgKHN0ciwgbGliZWxmX21zZ3NbY250XS5leHBlY3RlZCkgIT0gMCkKKwl7CisJICBwcmludGYgKCJsaWJlbGYgbXNnICV6dTogZXhwZWN0ZWQgXCIlc1wiLCBnb3QgXCIlc1wiXG4iLAorCQkgIGNudCwgbGliZWxmX21zZ3NbY250XS5leHBlY3RlZCwgc3RyKTsKKwkgIHJlc3VsdCA9IEVYSVRfRkFJTFVSRTsKKwl9CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9uZXdmaWxlLmMgYi90ZXN0cy9uZXdmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjNDA5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ld2ZpbGUuYwpAQCAtMCwwICsxLDE2NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitzdGF0aWMgdm9pZAorcHJpbnRfZWhkciAoRWxmMzJfRWhkciAqZWhkcikKK3sKKyAgaW50IG47CisKKyAgZm9yIChuID0gMDsgbiA8IEVJX05JREVOVDsgKytuKQorICAgIHByaW50ZiAoIiAlMDJ4IiwgZWhkci0+ZV9pZGVudFtuXSk7CisKKyAgcHJpbnRmICgiXG50eXBlID0gJWRcbm1hY2hpbmUgPSAlZFxudmVyc2lvbiA9ICVkXG5lbnRyeSA9ICVkXG4iCisgICAgICAgICAgInBob2ZmID0gJWRcbnNob2ZmID0gJWRcbmZsYWdzID0gJWRcbmVoc2l6ZSA9ICVkXG4iCisgICAgICAgICAgInBoZW50c2l6ZSA9ICVkXG5waG51bSA9ICVkXG5zaGVudHNpemUgPSAlZFxuc2hudW0gPSAlZFxuIgorICAgICAgICAgICJzaHN0cm5keCA9ICVkXG4iLAorICAgICAgICAgIGVoZHItPmVfdHlwZSwKKyAgICAgICAgICBlaGRyLT5lX21hY2hpbmUsCisgICAgICAgICAgZWhkci0+ZV92ZXJzaW9uLAorICAgICAgICAgIGVoZHItPmVfZW50cnksCisgICAgICAgICAgZWhkci0+ZV9waG9mZiwKKyAgICAgICAgICBlaGRyLT5lX3Nob2ZmLAorICAgICAgICAgIGVoZHItPmVfZmxhZ3MsCisgICAgICAgICAgZWhkci0+ZV9laHNpemUsCisgICAgICAgICAgZWhkci0+ZV9waGVudHNpemUsCisgICAgICAgICAgZWhkci0+ZV9waG51bSwKKyAgICAgICAgICBlaGRyLT5lX3NoZW50c2l6ZSwKKyAgICAgICAgICBlaGRyLT5lX3NobnVtLAorICAgICAgICAgIGVoZHItPmVfc2hzdHJuZHgpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQoreworICBFbGYgKmVsZjsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBmZDsKKyAgY2hhciBmbmFtZVtdID0gIm5ld2ZpbGUtWFhYWFhYIjsKKworICBmZCA9IG1rc3RlbXAgKGZuYW1lKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGU6ICVtXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgLyogUmVtb3ZlIHRoZSBmaWxlIHdoZW4gd2UgZXhpdC4gICovCisgIHVubGluayAoZm5hbWUpOworCisgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKKyAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfV1JJVEUsIE5VTEwpOworICBpZiAoZWxmID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiZWxmX2JlZ2luOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIHJlc3VsdCA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGVsZjMyX25ld2VoZHIgKGVsZikgPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJlbGYzMl9uZXdlaGRyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKwkgIHJlc3VsdCA9IDE7CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisJICBFbGYzMl9FaGRyICplaGRyID0gZWxmMzJfZ2V0ZWhkciAoZWxmKTsKKworCSAgaWYgKGVoZHIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImVsZjMyX2dldGVoZHI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworCSAgICAgIHJlc3VsdCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludCBpOworCisJICAgICAgaWYgKGFyZ2MgPiAxKQorCQkvKiBVc2UgYXJnYyBhcyBhIGRlYnVnZ2luZyBmbGFnLiAgKi8KKwkJcHJpbnRfZWhkciAoZWhkcik7CisKKwkgICAgICAvKiBTb21lIHRlc3RzLiAgKi8KKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyArK2kpCisJCWlmIChlaGRyLT5lX2lkZW50W2ldICE9IDApCisJCSAgeworCQkgICAgcHJpbnRmICgiZWhkci0+ZV9pZGVudFslZF0gIT0gMFxuIiwgaSk7CisJCSAgICByZXN1bHQgPSAxOworCQkgICAgYnJlYWs7CisJCSAgfQorCisjZGVmaW5lIFZBTFVFX1RFU1QobmFtZSwgdmFsKSBcCisJICAgICAgaWYgKGVoZHItPm5hbWUgIT0gdmFsKQkJCQkJICAgICAgXAorCSAgICAgICAgewkJCQkJCQkgICAgICBcCisJCSAgcHJpbnRmICgiZWhkci0+JXMgIT0gJWRcbiIsICNuYW1lLCB2YWwpOwkJICAgICAgXAorCQkgIHJlc3VsdCA9IDE7CQkJCQkJICAgICAgXAorCQl9CisjZGVmaW5lIFpFUk9fVEVTVChuYW1lKSBWQUxVRV9URVNUIChuYW1lLCAwKQorCSAgICAgIFpFUk9fVEVTVCAoZV90eXBlKTsKKwkgICAgICBaRVJPX1RFU1QgKGVfbWFjaGluZSk7CisJICAgICAgWkVST19URVNUIChlX3ZlcnNpb24pOworCSAgICAgIFpFUk9fVEVTVCAoZV9lbnRyeSk7CisJICAgICAgWkVST19URVNUIChlX3Bob2ZmKTsKKwkgICAgICBaRVJPX1RFU1QgKGVfc2hvZmYpOworCSAgICAgIFpFUk9fVEVTVCAoZV9mbGFncyk7CisJICAgICAgWkVST19URVNUIChlX2Voc2l6ZSk7CisJICAgICAgWkVST19URVNUIChlX3BoZW50c2l6ZSk7CisJICAgICAgWkVST19URVNUIChlX3BobnVtKTsKKwkgICAgICBaRVJPX1RFU1QgKGVfc2hlbnRzaXplKTsKKwkgICAgICBaRVJPX1RFU1QgKGVfc2hudW0pOworCSAgICAgIFpFUk9fVEVTVCAoZV9zaHN0cm5keCk7CisKKwkgICAgICBpZiAoZWxmMzJfbmV3cGhkciAoZWxmLCAxMCkgPT0gTlVMTCkKKwkJeworCQkgIHByaW50ZiAoImVsZjMyX25ld3BoZHI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworCQkgIHJlc3VsdCA9IDE7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoYXJnYyA+IDEpCisJCSAgICBwcmludF9laGRyIChlaGRyKTsKKworCQkgIGVoZHIgPSBlbGYzMl9nZXRlaGRyIChlbGYpOworCQkgIGlmIChlaGRyID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIHByaW50ZiAoImVsZjMyX2dldGVoZHIgKCMyKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisJCSAgICAgIHJlc3VsdCA9IDE7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBaRVJPX1RFU1QgKGVfdHlwZSk7CisJCSAgICAgIFpFUk9fVEVTVCAoZV9tYWNoaW5lKTsKKwkJICAgICAgWkVST19URVNUIChlX3ZlcnNpb24pOworCQkgICAgICBaRVJPX1RFU1QgKGVfZW50cnkpOworCQkgICAgICBaRVJPX1RFU1QgKGVfcGhvZmYpOworCQkgICAgICBaRVJPX1RFU1QgKGVfc2hvZmYpOworCQkgICAgICBaRVJPX1RFU1QgKGVfZmxhZ3MpOworCQkgICAgICBaRVJPX1RFU1QgKGVfZWhzaXplKTsKKwkJICAgICAgVkFMVUVfVEVTVCAoZV9waGVudHNpemUsIChpbnQpIHNpemVvZiAoRWxmMzJfUGhkcikpOworCQkgICAgICBWQUxVRV9URVNUIChlX3BobnVtLCAxMCk7CisJCSAgICAgIFpFUk9fVEVTVCAoZV9zaGVudHNpemUpOworCQkgICAgICBaRVJPX1RFU1QgKGVfc2hudW0pOworCQkgICAgICBaRVJPX1RFU1QgKGVfc2hzdHJuZHgpOworCQkgICAgfQorCQl9CisJICAgIH0KKyAgICAgICAgfQorCisgICAgICAodm9pZCkgZWxmX2VuZCAoZWxmKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL25ld3Njbi5jIGIvdGVzdHMvbmV3c2NuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4YjMzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL25ld3Njbi5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgRWxmICplbGY7CisgIGludCBmZDsKKyAgRWxmX1NjbiAqc2VjdGlvbjsKKworICBpZiAoZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpID09IEVWX05PTkUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAibGlicmFyeSBmZCBvZiBkYXRlXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBjaGFyIG5hbWVbXSA9ICJ0ZXN0LlhYWFhYWCI7CisgIGZkID0gbWtzdGVtcCAobmFtZSk7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gZmRwdXQgZmlsZTogJXNcbiIsIG5hbWUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICB1bmxpbmsgKG5hbWUpOworCisgIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1dSSVRFLCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBlbGZfYmVnaW4gZmRwdXQgZmlsZTogJXNcbiIsIG5hbWUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHNlY3Rpb24gPSBlbGZfbmV3c2NuIChlbGYpOworICBzZWN0aW9uID0gZWxmX25leHRzY24gKGVsZiwgc2VjdGlvbik7CisgIGFzc2VydCAoc2VjdGlvbiA9PSBOVUxMKTsKKworICBlbGZfZW5kIChlbGYpOworICBjbG9zZSAoZmQpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuLWFsbGZjdHMuc2ggYi90ZXN0cy9ydW4tYWxsZmN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZlNzVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnVuLWFsbGZjdHMuc2gKQEAgLTAsMCArMSw0NiBAQAorIyEgL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgorIworIyBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisjIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuCitzZXQgLWUKKworIyBEb24ndCBmYWlsIGlmIHdlIGNhbm5vdCBkZWNvbXByZXNzIHRoZSBmaWxlLgorYnVuemlwMiAtYyAkc3JjZGlyL3Rlc3RmaWxlLmJ6MiA+IHRlc3RmaWxlIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGUyLmJ6MiA+IHRlc3RmaWxlMiAyPi9kZXYvbnVsbCB8fCBleGl0IDAKKworIyBEb24ndCBmYWlsIGlmIHdlIGNhbm5vdCBkZWNvbXByZXNzIHRoZSBmaWxlLgorYnVuemlwMiAtYyAkc3JjZGlyL3Rlc3RmaWxlOC5iejIgPiB0ZXN0ZmlsZTggMj4vZGV2L251bGwgfHwgZXhpdCAwCisKKy4vYWxsZmN0cyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgdGVzdGZpbGU4ID4gYWxsZmN0cy5vdXQKKworZGlmZiAtdSBhbGxmY3RzLm91dCAtIDw8IkVPRiIKKy9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvbS5jOjU6bWFpbgorL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9iLmM6NDpiYXIKKy9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jOjM6Zm9vCisvc2hvZ2dvdGgvZHJlcHBlci9iLmM6NDpiYXIKKy9zaG9nZ290aC9kcmVwcGVyL2YuYzozOmZvbworL3Nob2dnb3RoL2RyZXBwZXIvbS5jOjU6bWFpbgorL2hvbWUvZHJlcHBlci9nbnUvZWxmdXRpbHMvYnVpbGQvc3JjLy4uLy4uL3NyYy9zdHJpcC5jOjEwNzptYWluCisvaG9tZS9kcmVwcGVyL2dudS9lbGZ1dGlscy9idWlsZC9zcmMvLi4vLi4vc3JjL3N0cmlwLmM6MTU5OnByaW50X3ZlcnNpb24KKy9ob21lL2RyZXBwZXIvZ251L2VsZnV0aWxzL2J1aWxkL3NyYy8uLi8uLi9zcmMvc3RyaXAuYzoxNzM6cGFyc2Vfb3B0CisvaG9tZS9kcmVwcGVyL2dudS9lbGZ1dGlscy9idWlsZC9zcmMvLi4vLi4vc3JjL3N0cmlwLmM6MjAxOm1vcmVfaGVscAorL2hvbWUvZHJlcHBlci9nbnUvZWxmdXRpbHMvYnVpbGQvc3JjLy4uLy4uL3NyYy9zdHJpcC5jOjIxNzpwcm9jZXNzX2ZpbGUKKy91c3IvaW5jbHVkZS9zeXMvc3RhdC5oOjM3NTpzdGF0NjQKKy9ob21lL2RyZXBwZXIvZ251L2VsZnV0aWxzL2J1aWxkL3NyYy8uLi8uLi9zcmMvc3RyaXAuYzoyOTE6Y3JjMzJfZmlsZQorL2hvbWUvZHJlcHBlci9nbnUvZWxmdXRpbHMvYnVpbGQvc3JjLy4uLy4uL3NyYy9zdHJpcC5jOjMxMzpoYW5kbGVfZWxmCitFT0YKKworcm0gLWYgdGVzdGZpbGUgdGVzdGZpbGUyIHRlc3RmaWxlOCBhbGxmY3RzLm91dAorCitleGl0IDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3J1bi1hcmV4dHJhY3Quc2ggYi90ZXN0cy9ydW4tYXJleHRyYWN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWMwYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ydW4tYXJleHRyYWN0LnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhIC9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisjIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorCithcmNoaXZlPS4uL2xpYmVsZi9saWJlbGYuYQoraWYgdGVzdCAtZiAkYXJjaGl2ZTsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgcmVhbGx5IGF2YWlsYWJsZSAoaS5lLiwgbm8gc2hhcmVkLW9ubHkgYnVpbHQpLgorICAgIGVjaG8gLW4gIkV4dHJhY3Rpbmcgc3ltYm9scy4uLiAkYWNfYyIKKworICAgICMgVGhlIGZpbGVzIHdlIGFyZSBsb29raW5nIGF0LgorICAgIGZvciBmIGluIC4uL2xpYmVsZi8qLm87IGRvCisJLi9hcmV4dHJhY3QgJGFyY2hpdmUgYGJhc2VuYW1lICRmYCBhcmV4dHJhY3QudGVzdCB8fCBleGl0IDEKKwljbXAgJGYgYXJleHRyYWN0LnRlc3QgfHwgeworCSAgICBlY2hvICJFeHRyYWN0aW9uIG9mICQxIGZhaWxlZCIKKwkgICAgZXhpdCAxCisJfQorCXJtIC1mICR7b2JqcGZ4fWFyZXh0cmFjdC50ZXN0CisgICAgZG9uZQorCisgICAgZWNobyAiZG9uZSIKK2ZpCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuLWFyc3ltdGVzdC5zaCBiL3Rlc3RzL3J1bi1hcnN5bXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzY2RiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3J1bi1hcnN5bXRlc3Quc2gKQEAgLTAsMCArMSw0MSBAQAorIyEgL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorIworIyBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisjIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuCisKK2xpYj0uLi9saWJlbGYvbGliZWxmLmEKK29rZmlsZT1hcnN5bXRlc3Qub2sKK3RtcGZpbGU9YXJzeW10ZXN0LnRtcAordGVzdGZpbGU9YXJzeW10ZXN0LnRlc3QKKworcmVzdWx0PTAKK2lmIHRlc3QgLWYgJGxpYjsgdGhlbgorICAgICMgR2VuZXJhdGUgbGlzdCB1c2luZyBgbm0nIHdlIGNoZWNrIGFnYWluc3QuCisgICAgbm0gLXMgJGxpYiB8CisgICAgc2VkIC1lICcxLC9eQXJjaC9kJyAtZSAnL14kLywkZCcgfAorICAgIHNvcnQgPiAkb2tmaWxlCisKKyAgICAjIE5vdyBydW4gb3VyIHByb2dyYW0gdXNpbmcgbGliZWxmLgorICAgIC4vYXJzeW10ZXN0ICRsaWIgJHRtcGZpbGUgfHwgZXhpdCAxCisgICAgc29ydCAkdG1wZmlsZSA+ICR0ZXN0ZmlsZQorICAgIHJtICR0bXBmaWxlCisKKyAgICAjIENvbXBhcmUgdGhlIG91dHB1dHMuCisgICAgaWYgY21wICRva2ZpbGUgJHRlc3RmaWxlOyB0aGVuCisJcmVzdWx0PTAKKwlybSAkdGVzdGZpbGUgJG9rZmlsZQorICAgIGVsc2UKKwlyZXN1bHQ9MQorICAgIGZpCitmaQorCitleGl0ICRyZXN1bHQKZGlmZiAtLWdpdCBhL3Rlc3RzL3J1bi1lY3AtdGVzdC5zaCBiL3Rlc3RzL3J1bi1lY3AtdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDMwNDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnVuLWVjcC10ZXN0LnNoCkBAIC0wLDAgKzEsMjUgQEAKKyMhIC9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyMgV3JpdHRlbiBieSBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiwgMjAwMi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisjIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorc2V0IC1lCisKKyMgRG9uJ3QgZmFpbCBpZiB3ZSBjYW5ub3QgZGVjb21wcmVzcyB0aGUgZmlsZS4KK2J1bnppcDIgLWMgJHNyY2Rpci90ZXN0ZmlsZTEwLmJ6MiA+IHRlc3RmaWxlMTAgMj4vZGV2L251bGwgfHwgZXhpdCAwCisKKy4vZWNwIHRlc3RmaWxlMTAgdGVzdGZpbGUxMC50bXAKKworY21wIHRlc3RmaWxlMTAgdGVzdGZpbGUxMC50bXAKKworcm0gLWYgdGVzdGZpbGUxMCB0ZXN0ZmlsZTEwLnRtcAorCitleGl0IDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3J1bi1lY3AtdGVzdDIuc2ggYi90ZXN0cy9ydW4tZWNwLXRlc3QyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0M2M3MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ydW4tZWNwLXRlc3QyLnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhIC9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KKyMgV3JpdHRlbiBieSBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiwgMjAwMi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisjIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorc2V0IC1lCisKKyMgRG9uJ3QgZmFpbCBpZiB3ZSBjYW5ub3QgZGVjb21wcmVzcyB0aGUgZmlsZS4KK2J1bnppcDIgLWMgJHNyY2Rpci90ZXN0ZmlsZTIuYnoyID4gdGVzdGZpbGUyIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisuL2VjcCB0ZXN0ZmlsZTIgdGVzdGZpbGUyLnRtcAorCitybSAtZiB0ZXN0ZmlsZTIgdGVzdGZpbGUyLnRtcAorCitleGl0IDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3J1bi1lbGZsaW50LXRlc3Quc2ggYi90ZXN0cy9ydW4tZWxmbGludC10ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDhjY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ydW4tZWxmbGludC10ZXN0LnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhIC9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisjIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorc2V0IC1lCisKKyMgRG9uJ3QgZmFpbCBpZiB3ZSBjYW5ub3QgZGVjb21wcmVzcyB0aGUgZmlsZS4KK2J1bnppcDIgLWMgJHNyY2Rpci90ZXN0ZmlsZTE4LmJ6MiA+IHRlc3RmaWxlMTggMj4vZGV2L251bGwgfHwgZXhpdCAwCisKK0xEX0xJQlJBUllfUEFUSD0uLi9saWJlYmw6Li4vbGliZWxmJHtMRF9MSUJSQVJZX1BBVEg6Kzp9JExEX0xJQlJBUllfUEFUSCBcCisgIC4uL3NyYy9lbGZsaW50IC0tZ251IHRlc3RmaWxlMTggPiYgZWxmbGludC10ZXN0Lm91dCB8fCA6CisKK2RpZmYgLXUgZWxmbGludC10ZXN0Lm91dCAtIDw8IkVPRiIKK3NlY3Rpb24gWyA4XSAnLnJlbGEuZHluJzogcmVsb2NhdGlvbiAxOiBjb3B5IHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgb2YgdHlwZSBGVU5DCitFT0YKKworcm0gLWYgdGVzdGZpbGUxOCBlbGZsaW50LXRlc3Qub3V0CisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuLWdldC1hcmFuZ2VzLnNoIGIvdGVzdHMvcnVuLWdldC1hcmFuZ2VzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YjI5ODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ydW4tZ2V0LWFyYW5nZXMuc2gKQEAgLTAsMCArMSw3MSBAQAorIyEgL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorIworIyBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisjIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuCitzZXQgLWUKKworIyBEb24ndCBmYWlsIGlmIHdlIGNhbm5vdCBkZWNvbXByZXNzIHRoZSBmaWxlLgorYnVuemlwMiAtYyAkc3JjZGlyL3Rlc3RmaWxlLmJ6MiA+IHRlc3RmaWxlIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGUyLmJ6MiA+IHRlc3RmaWxlMiAyPi9kZXYvbnVsbCB8fCBleGl0IDAKKworLi9nZXQtYXJhbmdlcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgPiBnZXQtYXJhbmdlcy5vdXQKKworY21wIGdldC1hcmFuZ2VzLm91dCAtIDw8IkVPRiIKKzB4ODA0ODQyYjogbm90IGluIHJhbmdlCitDVSBuYW1lOiAibS5jIgorQ1UgbmFtZTogIm0uYyIKK0NVIG5hbWU6ICJtLmMiCisweDgwNDg0NWE6IG5vdCBpbiByYW5nZQorMHg4MDQ4NDViOiBub3QgaW4gcmFuZ2UKK0NVIG5hbWU6ICJiLmMiCitDVSBuYW1lOiAiYi5jIgorQ1UgbmFtZTogImIuYyIKKzB4ODA0ODQ2Njogbm90IGluIHJhbmdlCisweDgwNDg0Njc6IG5vdCBpbiByYW5nZQorQ1UgbmFtZTogImYuYyIKK0NVIG5hbWU6ICJmLmMiCitDVSBuYW1lOiAiZi5jIgorMHg4MDQ4NDcyOiBub3QgaW4gcmFuZ2UKKyBbIDBdIHN0YXJ0OiAweDgwNDg0MmMsIGxlbmd0aDogNDYsIGN1OiAxMQorQ1UgbmFtZTogIm0uYyIKKyBbIDFdIHN0YXJ0OiAweDgwNDg0NWMsIGxlbmd0aDogMTAsIGN1OiAyMDIKK0NVIG5hbWU6ICJiLmMiCisgWyAyXSBzdGFydDogMHg4MDQ4NDY4LCBsZW5ndGg6IDEwLCBjdTogNTYyOAorQ1UgbmFtZTogImYuYyIKKzB4ODA0ODQyYjogbm90IGluIHJhbmdlCisweDgwNDg0MmM6IG5vdCBpbiByYW5nZQorMHg4MDQ4NDNjOiBub3QgaW4gcmFuZ2UKKzB4ODA0ODQ1OTogbm90IGluIHJhbmdlCisweDgwNDg0NWE6IG5vdCBpbiByYW5nZQorMHg4MDQ4NDViOiBub3QgaW4gcmFuZ2UKKzB4ODA0ODQ1Yzogbm90IGluIHJhbmdlCisweDgwNDg0NjA6IG5vdCBpbiByYW5nZQorMHg4MDQ4NDY1OiBub3QgaW4gcmFuZ2UKKzB4ODA0ODQ2Njogbm90IGluIHJhbmdlCisweDgwNDg0Njc6IG5vdCBpbiByYW5nZQorMHg4MDQ4NDY4OiBub3QgaW4gcmFuZ2UKKzB4ODA0ODQ3MDogbm90IGluIHJhbmdlCisweDgwNDg0NzE6IG5vdCBpbiByYW5nZQorMHg4MDQ4NDcyOiBub3QgaW4gcmFuZ2UKKyBbIDBdIHN0YXJ0OiAweDEwMDAwNDcwLCBsZW5ndGg6IDMyLCBjdTogMTEKK0NVIG5hbWU6ICJiLmMiCisgWyAxXSBzdGFydDogMHgxMDAwMDQ5MCwgbGVuZ3RoOiAzMiwgY3U6IDI0MjkKK0NVIG5hbWU6ICJmLmMiCisgWyAyXSBzdGFydDogMHgxMDAwMDRiMCwgbGVuZ3RoOiAxMDAsIGN1OiAyNTMyCitDVSBuYW1lOiAibS5jIgorRU9GCisKK3JtIC1mIHRlc3RmaWxlIHRlc3RmaWxlMiBnZXQtYXJhbmdlcy5vdXQKKworZXhpdCAwCmRpZmYgLS1naXQgYS90ZXN0cy9ydW4tZ2V0LWZpbGVzLnNoIGIvdGVzdHMvcnVuLWdldC1maWxlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWY1YzEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnVuLWdldC1maWxlcy5zaApAQCAtMCwwICsxLDY0IEBACisjISAvYmluL3NoCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCisjIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyMgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorIyBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyMgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4KK3NldCAtZQorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGUuYnoyID4gdGVzdGZpbGUgMj4vZGV2L251bGwgfHwgZXhpdCAwCisKKyMgRG9uJ3QgZmFpbCBpZiB3ZSBjYW5ub3QgZGVjb21wcmVzcyB0aGUgZmlsZS4KK2J1bnppcDIgLWMgJHNyY2Rpci90ZXN0ZmlsZTIuYnoyID4gdGVzdGZpbGUyIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisuL2dldC1maWxlcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgPiBnZXQtZmlsZXMub3V0CisKK2RpZmYgLXUgZ2V0LWZpbGVzLm91dCAtIDw8IkVPRiIKK2N1aGwgPSAxMSwgbyA9IDAsIGFzeiA9IDQsIG9zeiA9IDQsIG5jdSA9IDE5MQorIGZpbGVbMF0gPSAiPz8/IgorIGZpbGVbMV0gPSAiL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9tLmMiCitjdWhsID0gMTEsIG8gPSAxMTQsIGFzeiA9IDQsIG9zeiA9IDQsIG5jdSA9IDU2MTcKKyBmaWxlWzBdID0gIj8/PyIKKyBmaWxlWzFdID0gIi9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jIgorIGZpbGVbMl0gPSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LXJlZGhhdC1saW51eC8yLjk2L2luY2x1ZGUvc3RkZGVmLmgiCisgZmlsZVszXSA9ICIvdXNyL2xpYi9nY2MtbGliL2kzODYtcmVkaGF0LWxpbnV4LzIuOTYvaW5jbHVkZS9zdGRhcmcuaCIKKyBmaWxlWzRdID0gIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiCisgZmlsZVs1XSA9ICIvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIgorIGZpbGVbNl0gPSAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVzLmgiCisgZmlsZVs3XSA9ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKKyBmaWxlWzhdID0gIi91c3IvaW5jbHVkZS9saWJpby5oIgorIGZpbGVbOV0gPSAiL3Vzci9pbmNsdWRlL3djaGFyLmgiCisgZmlsZVsxMF0gPSAiL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIgorIGZpbGVbMTFdID0gIi91c3IvaW5jbHVkZS9nY29udi5oIgorY3VobCA9IDExLCBvID0gNDEyLCBhc3ogPSA0LCBvc3ogPSA0LCBuY3UgPSA1NzUyCisgZmlsZVswXSA9ICI/Pz8iCisgZmlsZVsxXSA9ICIvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYyIKK2N1aGwgPSAxMSwgbyA9IDAsIGFzeiA9IDQsIG9zeiA9IDQsIG5jdSA9IDI0MTgKKyBmaWxlWzBdID0gIj8/PyIKKyBmaWxlWzFdID0gIi9zaG9nZ290aC9kcmVwcGVyL2IuYyIKKyBmaWxlWzJdID0gIi9ob21lL2dlb2Zmay9vYmpzL2xhdXJlbC0wMDA5MTItYnJhbmNoL2xpYi9nY2MtbGliL3Bvd2VycGMtdW5rbm93bi1saW51eC1nbnUvMi45Ni1sYXVyZWwtMDAwOTEyL2luY2x1ZGUvc3RkZGVmLmgiCisgZmlsZVszXSA9ICIvaG9tZS9nZW9mZmsvb2Jqcy9sYXVyZWwtMDAwOTEyLWJyYW5jaC9saWIvZ2NjLWxpYi9wb3dlcnBjLXVua25vd24tbGludXgtZ251LzIuOTYtbGF1cmVsLTAwMDkxMi9pbmNsdWRlL3N0ZGFyZy5oIgorIGZpbGVbNF0gPSAiL3Nob2dnb3RoL2RyZXBwZXIvPGJ1aWx0LWluPiIKKyBmaWxlWzVdID0gIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiCisgZmlsZVs2XSA9ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKKyBmaWxlWzddID0gIi91c3IvaW5jbHVkZS9saWJpby5oIgorIGZpbGVbOF0gPSAiL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIgorY3VobCA9IDExLCBvID0gMjEzLCBhc3ogPSA0LCBvc3ogPSA0LCBuY3UgPSAyNTIxCisgZmlsZVswXSA9ICI/Pz8iCisgZmlsZVsxXSA9ICIvc2hvZ2dvdGgvZHJlcHBlci9mLmMiCitjdWhsID0gMTEsIG8gPSAyNjcsIGFzeiA9IDQsIG9zeiA9IDQsIG5jdSA9IDI2ODAKKyBmaWxlWzBdID0gIj8/PyIKKyBmaWxlWzFdID0gIi9zaG9nZ290aC9kcmVwcGVyL20uYyIKK0VPRgorCitybSAtZiB0ZXN0ZmlsZSB0ZXN0ZmlsMiBnZXQtZmlsZXMub3V0CisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuLWdldC1saW5lcy5zaCBiL3Rlc3RzL3J1bi1nZXQtbGluZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjOWNkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3J1bi1nZXQtbGluZXMuc2gKQEAgLTAsMCArMSw2NyBAQAorIyEgL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIsIDIwMDQgUmVkIEhhdCwgSW5jLgorIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorIworIyBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisjIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuCitzZXQgLWUKKworIyBEb24ndCBmYWlsIGlmIHdlIGNhbm5vdCBkZWNvbXByZXNzIHRoZSBmaWxlLgorYnVuemlwMiAtYyAkc3JjZGlyL3Rlc3RmaWxlLmJ6MiA+IHRlc3RmaWxlIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGUyLmJ6MiA+IHRlc3RmaWxlMiAyPi9kZXYvbnVsbCB8fCBleGl0IDAKKworLi9nZXQtbGluZXMgdGVzdGZpbGUgdGVzdGZpbGUyID4gZ2V0LWxpbmVzLm91dAorCitkaWZmIC11IGdldC1saW5lcy5vdXQgLSA8PCJFT0YiCitjdWhsID0gMTEsIG8gPSAwLCBhc3ogPSA0LCBvc3ogPSA0LCBuY3UgPSAxOTEKKyA1IGxpbmVzCis4MDQ4NDJjOiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo1OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCis4MDQ4NDMyOiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo2OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCis4MDQ4NDRkOiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo3OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCis4MDQ4NDU4OiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo4OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCis4MDQ4NDVhOiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo4OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOnllcywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubworY3VobCA9IDExLCBvID0gMTE0LCBhc3ogPSA0LCBvc3ogPSA0LCBuY3UgPSA1NjE3CisgNCBsaW5lcworODA0ODQ1YzogL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9iLmM6NDowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubworODA0ODQ1ZjogL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9iLmM6NTowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubworODA0ODQ2NDogL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9iLmM6NjowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubworODA0ODQ2NjogL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9iLmM6NjowOiBpc19zdG10OnllcywgZW5kX3NlcTp5ZXMsIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KK2N1aGwgPSAxMSwgbyA9IDQxMiwgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gNTc1MgorIDQgbGluZXMKKzgwNDg0Njg6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jOjM6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KKzgwNDg0NmI6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jOjQ6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KKzgwNDg0NzA6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jOjU6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KKzgwNDg0NzI6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jOjU6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6eWVzLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCitjdWhsID0gMTEsIG8gPSAwLCBhc3ogPSA0LCBvc3ogPSA0LCBuY3UgPSAyNDE4CisgNCBsaW5lcworMTAwMDA0NzA6IC9zaG9nZ290aC9kcmVwcGVyL2IuYzo0OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCisxMDAwMDQ3YzogL3Nob2dnb3RoL2RyZXBwZXIvYi5jOjU6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KKzEwMDAwNDgwOiAvc2hvZ2dvdGgvZHJlcHBlci9iLmM6NjowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubworMTAwMDA0OTA6IC9zaG9nZ290aC9kcmVwcGVyL2IuYzo2OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOnllcywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubworY3VobCA9IDExLCBvID0gMjEzLCBhc3ogPSA0LCBvc3ogPSA0LCBuY3UgPSAyNTIxCisgNCBsaW5lcworMTAwMDA0OTA6IC9zaG9nZ290aC9kcmVwcGVyL2YuYzozOjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCisxMDAwMDQ5YzogL3Nob2dnb3RoL2RyZXBwZXIvZi5jOjQ6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KKzEwMDAwNGEwOiAvc2hvZ2dvdGgvZHJlcHBlci9mLmM6NTowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubworMTAwMDA0YjA6IC9zaG9nZ290aC9kcmVwcGVyL2YuYzo1OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOnllcywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubworY3VobCA9IDExLCBvID0gMjY3LCBhc3ogPSA0LCBvc3ogPSA0LCBuY3UgPSAyNjgwCisgNSBsaW5lcworMTAwMDA0YjA6IC9zaG9nZ290aC9kcmVwcGVyL20uYzo1OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCisxMDAwMDRjYzogL3Nob2dnb3RoL2RyZXBwZXIvbS5jOjY6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KKzEwMDAwNGU4OiAvc2hvZ2dvdGgvZHJlcHBlci9tLmM6NzowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubworMTAwMDA0ZjQ6IC9zaG9nZ290aC9kcmVwcGVyL20uYzo4OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCisxMDAwMDUxNDogL3Nob2dnb3RoL2RyZXBwZXIvbS5jOjg6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6eWVzLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCitFT0YKKworcm0gLWYgdGVzdGZpbGUgdGVzdGZpbGUyIGdldC1saW5lcy5vdXQKKworZXhpdCAwCmRpZmYgLS1naXQgYS90ZXN0cy9ydW4tZ2V0LXB1Ym5hbWVzLnNoIGIvdGVzdHMvcnVuLWdldC1wdWJuYW1lcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjMyYmZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnVuLWdldC1wdWJuYW1lcy5zaApAQCAtMCwwICsxLDUzIEBACisjISAvYmluL3NoCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMyBSZWQgSGF0LCBJbmMuCisjIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyMgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorIyBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyMgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4KK3NldCAtZQorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGUuYnoyID4gdGVzdGZpbGUgMj4vZGV2L251bGwgfHwgZXhpdCAwCisKKyMgRG9uJ3QgZmFpbCBpZiB3ZSBjYW5ub3QgZGVjb21wcmVzcyB0aGUgZmlsZS4KK2J1bnppcDIgLWMgJHNyY2Rpci90ZXN0ZmlsZTIuYnoyID4gdGVzdGZpbGUyIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisuL2dldC1wdWJuYW1lcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgPiBnZXQtcHVibmFtZXMub3V0CisKK2RpZmYgLXUgZ2V0LXB1Ym5hbWVzLm91dCAtIDw8IkVPRiIKKyBbIDBdICJtYWluIiwgZGllOiAxMDQsIGN1OiAxMQorQ1UgbmFtZTogIm0uYyIKK29iamVjdCBuYW1lOiAibWFpbiIKKyBbIDFdICJhIiwgZGllOiAxNzQsIGN1OiAxMQorQ1UgbmFtZTogIm0uYyIKK29iamVjdCBuYW1lOiAiYSIKKyBbIDJdICJiYXIiLCBkaWU6IDI5NSwgY3U6IDIwMgorQ1UgbmFtZTogImIuYyIKK29iamVjdCBuYW1lOiAiYmFyIgorIFsgM10gImZvbyIsIGRpZTogNTcyMSwgY3U6IDU2MjgKK0NVIG5hbWU6ICJmLmMiCitvYmplY3QgbmFtZTogImZvbyIKKyBbIDBdICJiYXIiLCBkaWU6IDcyLCBjdTogMTEKK0NVIG5hbWU6ICJiLmMiCitvYmplY3QgbmFtZTogImJhciIKKyBbIDFdICJmb28iLCBkaWU6IDI0OTAsIGN1OiAyNDI5CitDVSBuYW1lOiAiZi5jIgorb2JqZWN0IG5hbWU6ICJmb28iCisgWyAyXSAibWFpbiIsIGRpZTogMjU5MywgY3U6IDI1MzIKK0NVIG5hbWU6ICJtLmMiCitvYmplY3QgbmFtZTogIm1haW4iCisgWyAzXSAiYSIsIGRpZTogMjY2MywgY3U6IDI1MzIKK0NVIG5hbWU6ICJtLmMiCitvYmplY3QgbmFtZTogImEiCitFT0YKKworcm0gLWYgdGVzdGZpbGUgdGVzdGZpbGUyIGdldC1wdWJuYW1lcy5vdXQKKworZXhpdCAwCmRpZmYgLS1naXQgYS90ZXN0cy9ydW4tbGluZTJhZGRyLnNoIGIvdGVzdHMvcnVuLWxpbmUyYWRkci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDZjOGZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnVuLWxpbmUyYWRkci5zaApAQCAtMCwwICsxLDQ0IEBACisjISAvYmluL3NoCisjIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisjIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyMgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorIyBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyMgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4KK3NldCAtZQorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGUuYnoyID4gdGVzdGZpbGUgMj4vZGV2L251bGwgfHwgZXhpdCAwCisKKyMgRG9uJ3QgZmFpbCBpZiB3ZSBjYW5ub3QgZGVjb21wcmVzcyB0aGUgZmlsZS4KK2J1bnppcDIgLWMgJHNyY2Rpci90ZXN0ZmlsZTIuYnoyID4gdGVzdGZpbGUyIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGU4LmJ6MiA+IHRlc3RmaWxlOCAyPi9kZXYvbnVsbCB8fCBleGl0IDAKKworIyBEb24ndCBmYWlsIGlmIHdlIGNhbm5vdCBkZWNvbXByZXNzIHRoZSBmaWxlLgorYnVuemlwMiAtYyAkc3JjZGlyL3Rlc3RmaWxlMTQuYnoyID4gdGVzdGZpbGUxNCAyPi9kZXYvbnVsbCB8fCBleGl0IDAKKworLi9saW5lMmFkZHIgdGVzdGZpbGU6Zi5jOjQgdGVzdGZpbGU6Zi5jOjggdGVzdGZpbGUyOm0uYzo2IHRlc3RmaWxlMjpiLmM6MSB0ZXN0ZmlsZTg6c3RyaXAuYzo5NTMgdGVzdGZpbGU4OnN0cmlwLmM6MzY1IHRlc3RmaWxlMTQ6di5jOjYgPiBsaW5lMmFkZHIub3V0CisKK2RpZmYgLXUgbGluZTJhZGRyLm91dCAtIDw8IkVPRiIKK3Rlc3RmaWxlOmYuYzo0IC0+IDB4ODA0ODQ2YgordGVzdGZpbGUyOm0uYzo2IC0+IDB4MTAwMDA0Y2MKK3Rlc3RmaWxlMjpiLmM6MSAtPiAweDEwMDAwNDcwCit0ZXN0ZmlsZTg6c3RyaXAuYzo5NTMgLT4gMHgxNjlmCit0ZXN0ZmlsZTg6c3RyaXAuYzo5NTMgLT4gMHgxNmFhCit0ZXN0ZmlsZTg6c3RyaXAuYzozNjUgLT4gMHgyNzhiCit0ZXN0ZmlsZTg6c3RyaXAuYzozNjUgLT4gMHgyNzk3Cit0ZXN0ZmlsZTE0OnYuYzo2IC0+IDB4NDAwNDY4Cit0ZXN0ZmlsZTE0OnYuYzo2IC0+IDB4NDAwNDg3CitFT0YKKworcm0gLWYgdGVzdGZpbGUgdGVzdGZpbGUyIHRlc3RmaWxlOCB0ZXN0ZmlsZTE0IGxpbmUyYWRkci5vdXQKKworZXhpdCAwCmRpZmYgLS1naXQgYS90ZXN0cy9ydW4tc2hvdy1hYmJyZXYuc2ggYi90ZXN0cy9ydW4tc2hvdy1hYmJyZXYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4MTJhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3J1bi1zaG93LWFiYnJldi5zaApAQCAtMCwwICsxLDM1NSBAQAorIyEgL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQgUmVkIEhhdCwgSW5jLgorIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorIworIyBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisjIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuCitzZXQgLWUKKworIyBEb24ndCBmYWlsIGlmIHdlIGNhbm5vdCBkZWNvbXByZXNzIHRoZSBmaWxlLgorYnVuemlwMiAtYyAkc3JjZGlyL3Rlc3RmaWxlLmJ6MiA+IHRlc3RmaWxlIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGUyLmJ6MiA+IHRlc3RmaWxlMiAyPi9kZXYvbnVsbCB8fCBleGl0IDAKKworLi9zaG93LWFiYnJldiB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgPiBzaG93LWFiYnJldi5vdXQKKworZGlmZiAtdSBzaG93LWFiYnJldi5vdXQgLSA8PCJFT0YiCithYmJyZXZbMF06IGNvZGUgPSAxLCB0YWcgPSAxNywgY2hpbGRyZW4gPSAxCithYmJyZXZbMF06IGF0dHJbMF06IGNvZGUgPSAxNiwgZm9ybSA9IDYsIG9mZnNldCA9IDAKK2FiYnJldlswXTogYXR0clsxXTogY29kZSA9IDE4LCBmb3JtID0gMSwgb2Zmc2V0ID0gMgorYWJicmV2WzBdOiBhdHRyWzJdOiBjb2RlID0gMTcsIGZvcm0gPSAxLCBvZmZzZXQgPSA0CithYmJyZXZbMF06IGF0dHJbM106IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gNgorYWJicmV2WzBdOiBhdHRyWzRdOiBjb2RlID0gMjcsIGZvcm0gPSA4LCBvZmZzZXQgPSA4CithYmJyZXZbMF06IGF0dHJbNV06IGNvZGUgPSAzNywgZm9ybSA9IDgsIG9mZnNldCA9IDEwCithYmJyZXZbMF06IGF0dHJbNl06IGNvZGUgPSAxOSwgZm9ybSA9IDExLCBvZmZzZXQgPSAxMgorYWJicmV2WzE5XTogY29kZSA9IDIsIHRhZyA9IDQ2LCBjaGlsZHJlbiA9IDEKK2FiYnJldlsxOV06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDE5CithYmJyZXZbMTldOiBhdHRyWzFdOiBjb2RlID0gNjMsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjEKK2FiYnJldlsxOV06IGF0dHJbMl06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMjMKK2FiYnJldlsxOV06IGF0dHJbM106IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAyNQorYWJicmV2WzE5XTogYXR0cls0XTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDI3CithYmJyZXZbMTldOiBhdHRyWzVdOiBjb2RlID0gMzksIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjkKK2FiYnJldlsxOV06IGF0dHJbNl06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzMQorYWJicmV2WzE5XTogYXR0cls3XTogY29kZSA9IDE3LCBmb3JtID0gMSwgb2Zmc2V0ID0gMzMKK2FiYnJldlsxOV06IGF0dHJbOF06IGNvZGUgPSAxOCwgZm9ybSA9IDEsIG9mZnNldCA9IDM1CithYmJyZXZbMTldOiBhdHRyWzldOiBjb2RlID0gNjQsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gMzcKK2FiYnJldls0NF06IGNvZGUgPSAzLCB0YWcgPSA0NiwgY2hpbGRyZW4gPSAxCithYmJyZXZbNDRdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSA0NAorYWJicmV2WzQ0XTogYXR0clsxXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDQ2CithYmJyZXZbNDRdOiBhdHRyWzJdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDQ4CithYmJyZXZbNDRdOiBhdHRyWzNdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNTAKK2FiYnJldls0NF06IGF0dHJbNF06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA1MgorYWJicmV2WzQ0XTogYXR0cls1XTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDU0CithYmJyZXZbNDRdOiBhdHRyWzZdOiBjb2RlID0gNjAsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gNTYKK2FiYnJldls2M106IGNvZGUgPSA0LCB0YWcgPSAyNCwgY2hpbGRyZW4gPSAwCithYmJyZXZbNjhdOiBjb2RlID0gNSwgdGFnID0gNDYsIGNoaWxkcmVuID0gMQorYWJicmV2WzY4XTogYXR0clswXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDY4CithYmJyZXZbNjhdOiBhdHRyWzFdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDcwCithYmJyZXZbNjhdOiBhdHRyWzJdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNzIKK2FiYnJldls2OF06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA3NAorYWJicmV2WzY4XTogYXR0cls0XTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDc2CithYmJyZXZbNjhdOiBhdHRyWzVdOiBjb2RlID0gNjAsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gNzgKK2FiYnJldls4NV06IGNvZGUgPSA2LCB0YWcgPSAzNiwgY2hpbGRyZW4gPSAwCithYmJyZXZbODVdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDg1CithYmJyZXZbODVdOiBhdHRyWzFdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gODcKK2FiYnJldls4NV06IGF0dHJbMl06IGNvZGUgPSA2MiwgZm9ybSA9IDExLCBvZmZzZXQgPSA4OQorYWJicmV2Wzk2XTogY29kZSA9IDcsIHRhZyA9IDUyLCBjaGlsZHJlbiA9IDAKK2FiYnJldls5Nl06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gOTYKK2FiYnJldls5Nl06IGF0dHJbMV06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSA5OAorYWJicmV2Wzk2XTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDEwMAorYWJicmV2Wzk2XTogYXR0clszXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDEwMgorYWJicmV2Wzk2XTogYXR0cls0XTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDEwNAorYWJicmV2Wzk2XTogYXR0cls1XTogY29kZSA9IDIsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gMTA2CithYmJyZXZbMF06IGNvZGUgPSAxLCB0YWcgPSAxNywgY2hpbGRyZW4gPSAxCithYmJyZXZbMF06IGF0dHJbMF06IGNvZGUgPSAxNiwgZm9ybSA9IDYsIG9mZnNldCA9IDExNAorYWJicmV2WzBdOiBhdHRyWzFdOiBjb2RlID0gMTgsIGZvcm0gPSAxLCBvZmZzZXQgPSAxMTYKK2FiYnJldlswXTogYXR0clsyXTogY29kZSA9IDE3LCBmb3JtID0gMSwgb2Zmc2V0ID0gMTE4CithYmJyZXZbMF06IGF0dHJbM106IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMTIwCithYmJyZXZbMF06IGF0dHJbNF06IGNvZGUgPSAyNywgZm9ybSA9IDgsIG9mZnNldCA9IDEyMgorYWJicmV2WzBdOiBhdHRyWzVdOiBjb2RlID0gMzcsIGZvcm0gPSA4LCBvZmZzZXQgPSAxMjQKK2FiYnJldlswXTogYXR0cls2XTogY29kZSA9IDE5LCBmb3JtID0gMTEsIG9mZnNldCA9IDEyNgorYWJicmV2WzE5XTogY29kZSA9IDIsIHRhZyA9IDQ2LCBjaGlsZHJlbiA9IDAKK2FiYnJldlsxOV06IGF0dHJbMF06IGNvZGUgPSA2MywgZm9ybSA9IDEyLCBvZmZzZXQgPSAxMzMKK2FiYnJldlsxOV06IGF0dHJbMV06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMTM1CithYmJyZXZbMTldOiBhdHRyWzJdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTM3CithYmJyZXZbMTldOiBhdHRyWzNdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTM5CithYmJyZXZbMTldOiBhdHRyWzRdOiBjb2RlID0gMzksIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMTQxCithYmJyZXZbMTldOiBhdHRyWzVdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMTQzCithYmJyZXZbMTldOiBhdHRyWzZdOiBjb2RlID0gMTcsIGZvcm0gPSAxLCBvZmZzZXQgPSAxNDUKK2FiYnJldlsxOV06IGF0dHJbN106IGNvZGUgPSAxOCwgZm9ybSA9IDEsIG9mZnNldCA9IDE0NworYWJicmV2WzE5XTogYXR0cls4XTogY29kZSA9IDY0LCBmb3JtID0gMTAsIG9mZnNldCA9IDE0OQorYWJicmV2WzQyXTogY29kZSA9IDMsIHRhZyA9IDM2LCBjaGlsZHJlbiA9IDAKK2FiYnJldls0Ml06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMTU2CithYmJyZXZbNDJdOiBhdHRyWzFdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTU4CithYmJyZXZbNDJdOiBhdHRyWzJdOiBjb2RlID0gNjIsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTYwCithYmJyZXZbNTNdOiBjb2RlID0gNCwgdGFnID0gMjIsIGNoaWxkcmVuID0gMAorYWJicmV2WzUzXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAxNjcKK2FiYnJldls1M106IGF0dHJbMV06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAxNjkKK2FiYnJldls1M106IGF0dHJbMl06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAxNzEKK2FiYnJldls1M106IGF0dHJbM106IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAxNzMKK2FiYnJldls2Nl06IGNvZGUgPSA1LCB0YWcgPSAxNSwgY2hpbGRyZW4gPSAwCithYmJyZXZbNjZdOiBhdHRyWzBdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTgwCithYmJyZXZbNzNdOiBjb2RlID0gNiwgdGFnID0gMTUsIGNoaWxkcmVuID0gMAorYWJicmV2WzczXTogYXR0clswXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDE4NworYWJicmV2WzczXTogYXR0clsxXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDE4OQorYWJicmV2WzgyXTogY29kZSA9IDcsIHRhZyA9IDE5LCBjaGlsZHJlbiA9IDEKK2FiYnJldls4Ml06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDE5NgorYWJicmV2WzgyXTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDE5OAorYWJicmV2WzgyXTogYXR0clsyXTogY29kZSA9IDU4LCBmb3JtID0gMTEsIG9mZnNldCA9IDIwMAorYWJicmV2WzgyXTogYXR0clszXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDIwMgorYWJicmV2Wzk1XTogY29kZSA9IDgsIHRhZyA9IDEzLCBjaGlsZHJlbiA9IDAKK2FiYnJldls5NV06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMjA5CithYmJyZXZbOTVdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjExCithYmJyZXZbOTVdOiBhdHRyWzJdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjEzCithYmJyZXZbOTVdOiBhdHRyWzNdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjE1CithYmJyZXZbOTVdOiBhdHRyWzRdOiBjb2RlID0gNTYsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gMjE3CithYmJyZXZbMTEwXTogY29kZSA9IDksIHRhZyA9IDEsIGNoaWxkcmVuID0gMQorYWJicmV2WzExMF06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDIyNAorYWJicmV2WzExMF06IGF0dHJbMV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAyMjYKK2FiYnJldlsxMTldOiBjb2RlID0gMTAsIHRhZyA9IDMzLCBjaGlsZHJlbiA9IDAKK2FiYnJldlsxMTldOiBhdHRyWzBdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjMzCithYmJyZXZbMTE5XTogYXR0clsxXTogY29kZSA9IDQ3LCBmb3JtID0gMTEsIG9mZnNldCA9IDIzNQorYWJicmV2WzEyOF06IGNvZGUgPSAxMSwgdGFnID0gMTksIGNoaWxkcmVuID0gMQorYWJicmV2WzEyOF06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDI0MgorYWJicmV2WzEyOF06IGF0dHJbMV06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMjQ0CithYmJyZXZbMTI4XTogYXR0clsyXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDI0NgorYWJicmV2WzEyOF06IGF0dHJbM106IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAyNDgKK2FiYnJldlsxMjhdOiBhdHRyWzRdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjUwCithYmJyZXZbMTQzXTogY29kZSA9IDEyLCB0YWcgPSAxOSwgY2hpbGRyZW4gPSAwCithYmJyZXZbMTQzXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAyNTcKK2FiYnJldlsxNDNdOiBhdHRyWzFdOiBjb2RlID0gNjAsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjU5CithYmJyZXZbMTUyXTogY29kZSA9IDEzLCB0YWcgPSAxMywgY2hpbGRyZW4gPSAwCithYmJyZXZbMTUyXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAyNjYKK2FiYnJldlsxNTJdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjY4CithYmJyZXZbMTUyXTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gNSwgb2Zmc2V0ID0gMjcwCithYmJyZXZbMTUyXTogYXR0clszXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDI3MgorYWJicmV2WzE1Ml06IGF0dHJbNF06IGNvZGUgPSA1NiwgZm9ybSA9IDEwLCBvZmZzZXQgPSAyNzQKK2FiYnJldlsxNjddOiBjb2RlID0gMTQsIHRhZyA9IDIyLCBjaGlsZHJlbiA9IDAKK2FiYnJldlsxNjddOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDI4MQorYWJicmV2WzE2N106IGF0dHJbMV06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAyODMKK2FiYnJldlsxNjddOiBhdHRyWzJdOiBjb2RlID0gNTksIGZvcm0gPSA1LCBvZmZzZXQgPSAyODUKK2FiYnJldlsxNjddOiBhdHRyWzNdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjg3CithYmJyZXZbMTgwXTogY29kZSA9IDE1LCB0YWcgPSAyMywgY2hpbGRyZW4gPSAxCithYmJyZXZbMTgwXTogYXR0clswXTogY29kZSA9IDEsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjk0CithYmJyZXZbMTgwXTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDI5NgorYWJicmV2WzE4MF06IGF0dHJbMl06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAyOTgKK2FiYnJldlsxODBdOiBhdHRyWzNdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzAwCithYmJyZXZbMTkzXTogY29kZSA9IDE2LCB0YWcgPSAxMywgY2hpbGRyZW4gPSAwCithYmJyZXZbMTkzXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzMDcKK2FiYnJldlsxOTNdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzA5CithYmJyZXZbMTkzXTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDMxMQorYWJicmV2WzE5M106IGF0dHJbM106IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzMTMKK2FiYnJldlsyMDZdOiBjb2RlID0gMTcsIHRhZyA9IDQsIGNoaWxkcmVuID0gMQorYWJicmV2WzIwNl06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDMyMAorYWJicmV2WzIwNl06IGF0dHJbMV06IGNvZGUgPSAxMSwgZm9ybSA9IDExLCBvZmZzZXQgPSAzMjIKK2FiYnJldlsyMDZdOiBhdHRyWzJdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzI0CithYmJyZXZbMjA2XTogYXR0clszXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDMyNgorYWJicmV2WzIxOV06IGNvZGUgPSAxOCwgdGFnID0gNDAsIGNoaWxkcmVuID0gMAorYWJicmV2WzIxOV06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMzMzCithYmJyZXZbMjE5XTogYXR0clsxXTogY29kZSA9IDI4LCBmb3JtID0gMTEsIG9mZnNldCA9IDMzNQorYWJicmV2WzIyOF06IGNvZGUgPSAxOSwgdGFnID0gMzgsIGNoaWxkcmVuID0gMAorYWJicmV2WzIyOF06IGF0dHJbMF06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzNDIKK2FiYnJldlsyMzVdOiBjb2RlID0gMjAsIHRhZyA9IDIxLCBjaGlsZHJlbiA9IDEKK2FiYnJldlsyMzVdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSAzNDkKK2FiYnJldlsyMzVdOiBhdHRyWzFdOiBjb2RlID0gMzksIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMzUxCithYmJyZXZbMjM1XTogYXR0clsyXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDM1MworYWJicmV2WzI0Nl06IGNvZGUgPSAyMSwgdGFnID0gNSwgY2hpbGRyZW4gPSAwCithYmJyZXZbMjQ2XTogYXR0clswXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDM2MAorYWJicmV2WzI1M106IGNvZGUgPSAyMiwgdGFnID0gMjEsIGNoaWxkcmVuID0gMQorYWJicmV2WzI1M106IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDM2NworYWJicmV2WzI1M106IGF0dHJbMV06IGNvZGUgPSAzOSwgZm9ybSA9IDEyLCBvZmZzZXQgPSAzNjkKK2FiYnJldlsyNjJdOiBjb2RlID0gMjMsIHRhZyA9IDMzLCBjaGlsZHJlbiA9IDAKK2FiYnJldlsyNjJdOiBhdHRyWzBdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMzc2CithYmJyZXZbMjYyXTogYXR0clsxXTogY29kZSA9IDQ3LCBmb3JtID0gNiwgb2Zmc2V0ID0gMzc4CithYmJyZXZbMjcxXTogY29kZSA9IDI0LCB0YWcgPSAyMiwgY2hpbGRyZW4gPSAwCithYmJyZXZbMjcxXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzODUKK2FiYnJldlsyNzFdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzg3CithYmJyZXZbMjcxXTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDM4OQorYWJicmV2WzI4Ml06IGNvZGUgPSAyNSwgdGFnID0gNCwgY2hpbGRyZW4gPSAxCithYmJyZXZbMjgyXTogYXR0clswXTogY29kZSA9IDEsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMzk2CithYmJyZXZbMjgyXTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzOTgKK2FiYnJldlsyODJdOiBhdHRyWzJdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNDAwCithYmJyZXZbMjgyXTogYXR0clszXTogY29kZSA9IDU4LCBmb3JtID0gMTEsIG9mZnNldCA9IDQwMgorYWJicmV2WzI4Ml06IGF0dHJbNF06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA0MDQKK2FiYnJldlswXTogY29kZSA9IDEsIHRhZyA9IDE3LCBjaGlsZHJlbiA9IDEKK2FiYnJldlswXTogYXR0clswXTogY29kZSA9IDE2LCBmb3JtID0gNiwgb2Zmc2V0ID0gNDEyCithYmJyZXZbMF06IGF0dHJbMV06IGNvZGUgPSAxOCwgZm9ybSA9IDEsIG9mZnNldCA9IDQxNAorYWJicmV2WzBdOiBhdHRyWzJdOiBjb2RlID0gMTcsIGZvcm0gPSAxLCBvZmZzZXQgPSA0MTYKK2FiYnJldlswXTogYXR0clszXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA0MTgKK2FiYnJldlswXTogYXR0cls0XTogY29kZSA9IDI3LCBmb3JtID0gOCwgb2Zmc2V0ID0gNDIwCithYmJyZXZbMF06IGF0dHJbNV06IGNvZGUgPSAzNywgZm9ybSA9IDgsIG9mZnNldCA9IDQyMgorYWJicmV2WzBdOiBhdHRyWzZdOiBjb2RlID0gMTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNDI0CithYmJyZXZbMTldOiBjb2RlID0gMiwgdGFnID0gNDYsIGNoaWxkcmVuID0gMAorYWJicmV2WzE5XTogYXR0clswXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDQzMQorYWJicmV2WzE5XTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA0MzMKK2FiYnJldlsxOV06IGF0dHJbMl06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSA0MzUKK2FiYnJldlsxOV06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA0MzcKK2FiYnJldlsxOV06IGF0dHJbNF06IGNvZGUgPSAzOSwgZm9ybSA9IDEyLCBvZmZzZXQgPSA0MzkKK2FiYnJldlsxOV06IGF0dHJbNV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSA0NDEKK2FiYnJldlsxOV06IGF0dHJbNl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDQ0MworYWJicmV2WzE5XTogYXR0cls3XTogY29kZSA9IDE4LCBmb3JtID0gMSwgb2Zmc2V0ID0gNDQ1CithYmJyZXZbMTldOiBhdHRyWzhdOiBjb2RlID0gNjQsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gNDQ3CithYmJyZXZbNDJdOiBjb2RlID0gMywgdGFnID0gMzYsIGNoaWxkcmVuID0gMAorYWJicmV2WzQyXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA0NTQKK2FiYnJldls0Ml06IGF0dHJbMV06IGNvZGUgPSAxMSwgZm9ybSA9IDExLCBvZmZzZXQgPSA0NTYKK2FiYnJldls0Ml06IGF0dHJbMl06IGNvZGUgPSA2MiwgZm9ybSA9IDExLCBvZmZzZXQgPSA0NTgKK2FiYnJldlswXTogY29kZSA9IDEsIHRhZyA9IDE3LCBjaGlsZHJlbiA9IDEKK2FiYnJldlswXTogYXR0clswXTogY29kZSA9IDE2LCBmb3JtID0gNiwgb2Zmc2V0ID0gMAorYWJicmV2WzBdOiBhdHRyWzFdOiBjb2RlID0gMTgsIGZvcm0gPSAxLCBvZmZzZXQgPSAyCithYmJyZXZbMF06IGF0dHJbMl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDQKK2FiYnJldlswXTogYXR0clszXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA2CithYmJyZXZbMF06IGF0dHJbNF06IGNvZGUgPSAyNywgZm9ybSA9IDgsIG9mZnNldCA9IDgKK2FiYnJldlswXTogYXR0cls1XTogY29kZSA9IDM3LCBmb3JtID0gOCwgb2Zmc2V0ID0gMTAKK2FiYnJldlswXTogYXR0cls2XTogY29kZSA9IDE5LCBmb3JtID0gMTEsIG9mZnNldCA9IDEyCithYmJyZXZbMTldOiBjb2RlID0gMiwgdGFnID0gNDYsIGNoaWxkcmVuID0gMAorYWJicmV2WzE5XTogYXR0clswXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDE5CithYmJyZXZbMTldOiBhdHRyWzFdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDIxCithYmJyZXZbMTldOiBhdHRyWzJdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjMKK2FiYnJldlsxOV06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAyNQorYWJicmV2WzE5XTogYXR0cls0XTogY29kZSA9IDM5LCBmb3JtID0gMTIsIG9mZnNldCA9IDI3CithYmJyZXZbMTldOiBhdHRyWzVdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjkKK2FiYnJldlsxOV06IGF0dHJbNl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDMxCithYmJyZXZbMTldOiBhdHRyWzddOiBjb2RlID0gMTgsIGZvcm0gPSAxLCBvZmZzZXQgPSAzMworYWJicmV2WzE5XTogYXR0cls4XTogY29kZSA9IDY0LCBmb3JtID0gMTAsIG9mZnNldCA9IDM1CithYmJyZXZbNDJdOiBjb2RlID0gMywgdGFnID0gMzYsIGNoaWxkcmVuID0gMAorYWJicmV2WzQyXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA0MgorYWJicmV2WzQyXTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDQ0CithYmJyZXZbNDJdOiBhdHRyWzJdOiBjb2RlID0gNjIsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNDYKK2FiYnJldls1M106IGNvZGUgPSA0LCB0YWcgPSAyMiwgY2hpbGRyZW4gPSAwCithYmJyZXZbNTNdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDUzCithYmJyZXZbNTNdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNTUKK2FiYnJldls1M106IGF0dHJbMl06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA1NworYWJicmV2WzUzXTogYXR0clszXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDU5CithYmJyZXZbNjZdOiBjb2RlID0gNSwgdGFnID0gMSwgY2hpbGRyZW4gPSAxCithYmJyZXZbNjZdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSA2NgorYWJicmV2WzY2XTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA2OAorYWJicmV2WzY2XTogYXR0clsyXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDcwCithYmJyZXZbNzddOiBjb2RlID0gNiwgdGFnID0gMzMsIGNoaWxkcmVuID0gMAorYWJicmV2Wzc3XTogYXR0clswXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDc3CithYmJyZXZbNzddOiBhdHRyWzFdOiBjb2RlID0gNDcsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNzkKK2FiYnJldls4Nl06IGNvZGUgPSA3LCB0YWcgPSAxOSwgY2hpbGRyZW4gPSAxCithYmJyZXZbODZdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSA4NgorYWJicmV2Wzg2XTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA4OAorYWJicmV2Wzg2XTogYXR0clsyXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDkwCithYmJyZXZbODZdOiBhdHRyWzNdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gOTIKK2FiYnJldls4Nl06IGF0dHJbNF06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA5NAorYWJicmV2WzEwMV06IGNvZGUgPSA4LCB0YWcgPSAxMywgY2hpbGRyZW4gPSAwCithYmJyZXZbMTAxXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAxMDEKK2FiYnJldlsxMDFdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTAzCithYmJyZXZbMTAxXTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDEwNQorYWJicmV2WzEwMV06IGF0dHJbM106IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAxMDcKK2FiYnJldlsxMDFdOiBhdHRyWzRdOiBjb2RlID0gNTYsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gMTA5CithYmJyZXZbMTE2XTogY29kZSA9IDksIHRhZyA9IDE1LCBjaGlsZHJlbiA9IDAKK2FiYnJldlsxMTZdOiBhdHRyWzBdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTE2CithYmJyZXZbMTIzXTogY29kZSA9IDEwLCB0YWcgPSAxNSwgY2hpbGRyZW4gPSAwCithYmJyZXZbMTIzXTogYXR0clswXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDEyMworYWJicmV2WzEyM106IGF0dHJbMV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAxMjUKK2FiYnJldlsxMzJdOiBjb2RlID0gMTEsIHRhZyA9IDE5LCBjaGlsZHJlbiA9IDEKK2FiYnJldlsxMzJdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSAxMzIKK2FiYnJldlsxMzJdOiBhdHRyWzFdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTM0CithYmJyZXZbMTMyXTogYXR0clsyXTogY29kZSA9IDU4LCBmb3JtID0gMTEsIG9mZnNldCA9IDEzNgorYWJicmV2WzEzMl06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAxMzgKK2FiYnJldlsxNDVdOiBjb2RlID0gMTIsIHRhZyA9IDEsIGNoaWxkcmVuID0gMQorYWJicmV2WzE0NV06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDE0NQorYWJicmV2WzE0NV06IGF0dHJbMV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAxNDcKK2FiYnJldlsxNTRdOiBjb2RlID0gMTMsIHRhZyA9IDIyLCBjaGlsZHJlbiA9IDAKK2FiYnJldlsxNTRdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDE1NAorYWJicmV2WzE1NF06IGF0dHJbMV06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAxNTYKK2FiYnJldlsxNTRdOiBhdHRyWzJdOiBjb2RlID0gNTksIGZvcm0gPSA1LCBvZmZzZXQgPSAxNTgKK2FiYnJldlsxNTRdOiBhdHRyWzNdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMTYwCithYmJyZXZbMTY3XTogY29kZSA9IDE0LCB0YWcgPSAxOSwgY2hpbGRyZW4gPSAwCithYmJyZXZbMTY3XTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAxNjcKK2FiYnJldlsxNjddOiBhdHRyWzFdOiBjb2RlID0gNjAsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMTY5CithYmJyZXZbMTc2XTogY29kZSA9IDE1LCB0YWcgPSAyMiwgY2hpbGRyZW4gPSAwCithYmJyZXZbMTc2XTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAxNzYKK2FiYnJldlsxNzZdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTc4CithYmJyZXZbMTc2XTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDE4MAorYWJicmV2WzE4N106IGNvZGUgPSAxNiwgdGFnID0gMjEsIGNoaWxkcmVuID0gMQorYWJicmV2WzE4N106IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDE4NworYWJicmV2WzE4N106IGF0dHJbMV06IGNvZGUgPSAzOSwgZm9ybSA9IDEyLCBvZmZzZXQgPSAxODkKK2FiYnJldlsxODddOiBhdHRyWzJdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMTkxCithYmJyZXZbMTk4XTogY29kZSA9IDE3LCB0YWcgPSA1LCBjaGlsZHJlbiA9IDAKK2FiYnJldlsxOThdOiBhdHRyWzBdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMTk4CithYmJyZXZbMjA1XTogY29kZSA9IDE4LCB0YWcgPSAzOCwgY2hpbGRyZW4gPSAwCithYmJyZXZbMjA1XTogYXR0clswXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDIwNQorYWJicmV2WzBdOiBjb2RlID0gMSwgdGFnID0gMTcsIGNoaWxkcmVuID0gMQorYWJicmV2WzBdOiBhdHRyWzBdOiBjb2RlID0gMTYsIGZvcm0gPSA2LCBvZmZzZXQgPSAyMTMKK2FiYnJldlswXTogYXR0clsxXTogY29kZSA9IDE4LCBmb3JtID0gMSwgb2Zmc2V0ID0gMjE1CithYmJyZXZbMF06IGF0dHJbMl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDIxNworYWJicmV2WzBdOiBhdHRyWzNdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDIxOQorYWJicmV2WzBdOiBhdHRyWzRdOiBjb2RlID0gMjcsIGZvcm0gPSA4LCBvZmZzZXQgPSAyMjEKK2FiYnJldlswXTogYXR0cls1XTogY29kZSA9IDM3LCBmb3JtID0gOCwgb2Zmc2V0ID0gMjIzCithYmJyZXZbMF06IGF0dHJbNl06IGNvZGUgPSAxOSwgZm9ybSA9IDExLCBvZmZzZXQgPSAyMjUKK2FiYnJldlsxOV06IGNvZGUgPSAyLCB0YWcgPSA0NiwgY2hpbGRyZW4gPSAwCithYmJyZXZbMTldOiBhdHRyWzBdOiBjb2RlID0gNjMsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjMyCithYmJyZXZbMTldOiBhdHRyWzFdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDIzNAorYWJicmV2WzE5XTogYXR0clsyXTogY29kZSA9IDU4LCBmb3JtID0gMTEsIG9mZnNldCA9IDIzNgorYWJicmV2WzE5XTogYXR0clszXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDIzOAorYWJicmV2WzE5XTogYXR0cls0XTogY29kZSA9IDM5LCBmb3JtID0gMTIsIG9mZnNldCA9IDI0MAorYWJicmV2WzE5XTogYXR0cls1XTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDI0MgorYWJicmV2WzE5XTogYXR0cls2XTogY29kZSA9IDE3LCBmb3JtID0gMSwgb2Zmc2V0ID0gMjQ0CithYmJyZXZbMTldOiBhdHRyWzddOiBjb2RlID0gMTgsIGZvcm0gPSAxLCBvZmZzZXQgPSAyNDYKK2FiYnJldlsxOV06IGF0dHJbOF06IGNvZGUgPSA2NCwgZm9ybSA9IDEwLCBvZmZzZXQgPSAyNDgKK2FiYnJldls0Ml06IGNvZGUgPSAzLCB0YWcgPSAzNiwgY2hpbGRyZW4gPSAwCithYmJyZXZbNDJdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDI1NQorYWJicmV2WzQyXTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDI1NworYWJicmV2WzQyXTogYXR0clsyXTogY29kZSA9IDYyLCBmb3JtID0gMTEsIG9mZnNldCA9IDI1OQorYWJicmV2WzBdOiBjb2RlID0gMSwgdGFnID0gMTcsIGNoaWxkcmVuID0gMQorYWJicmV2WzBdOiBhdHRyWzBdOiBjb2RlID0gMTYsIGZvcm0gPSA2LCBvZmZzZXQgPSAyNjcKK2FiYnJldlswXTogYXR0clsxXTogY29kZSA9IDE4LCBmb3JtID0gMSwgb2Zmc2V0ID0gMjY5CithYmJyZXZbMF06IGF0dHJbMl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDI3MQorYWJicmV2WzBdOiBhdHRyWzNdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDI3MworYWJicmV2WzBdOiBhdHRyWzRdOiBjb2RlID0gMjcsIGZvcm0gPSA4LCBvZmZzZXQgPSAyNzUKK2FiYnJldlswXTogYXR0cls1XTogY29kZSA9IDM3LCBmb3JtID0gOCwgb2Zmc2V0ID0gMjc3CithYmJyZXZbMF06IGF0dHJbNl06IGNvZGUgPSAxOSwgZm9ybSA9IDExLCBvZmZzZXQgPSAyNzkKK2FiYnJldlsxOV06IGNvZGUgPSAyLCB0YWcgPSA0NiwgY2hpbGRyZW4gPSAxCithYmJyZXZbMTldOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSAyODYKK2FiYnJldlsxOV06IGF0dHJbMV06IGNvZGUgPSA2MywgZm9ybSA9IDEyLCBvZmZzZXQgPSAyODgKK2FiYnJldlsxOV06IGF0dHJbMl06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMjkwCithYmJyZXZbMTldOiBhdHRyWzNdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjkyCithYmJyZXZbMTldOiBhdHRyWzRdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjk0CithYmJyZXZbMTldOiBhdHRyWzVdOiBjb2RlID0gMzksIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjk2CithYmJyZXZbMTldOiBhdHRyWzZdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjk4CithYmJyZXZbMTldOiBhdHRyWzddOiBjb2RlID0gMTcsIGZvcm0gPSAxLCBvZmZzZXQgPSAzMDAKK2FiYnJldlsxOV06IGF0dHJbOF06IGNvZGUgPSAxOCwgZm9ybSA9IDEsIG9mZnNldCA9IDMwMgorYWJicmV2WzE5XTogYXR0cls5XTogY29kZSA9IDY0LCBmb3JtID0gMTAsIG9mZnNldCA9IDMwNAorYWJicmV2WzQ0XTogY29kZSA9IDMsIHRhZyA9IDQ2LCBjaGlsZHJlbiA9IDEKK2FiYnJldls0NF06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDMxMQorYWJicmV2WzQ0XTogYXR0clsxXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDMxMworYWJicmV2WzQ0XTogYXR0clsyXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzMTUKK2FiYnJldls0NF06IGF0dHJbM106IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAzMTcKK2FiYnJldls0NF06IGF0dHJbNF06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAzMTkKK2FiYnJldls0NF06IGF0dHJbNV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzMjEKK2FiYnJldls0NF06IGF0dHJbNl06IGNvZGUgPSA2MCwgZm9ybSA9IDEyLCBvZmZzZXQgPSAzMjMKK2FiYnJldls2M106IGNvZGUgPSA0LCB0YWcgPSAyNCwgY2hpbGRyZW4gPSAwCithYmJyZXZbNjhdOiBjb2RlID0gNSwgdGFnID0gNDYsIGNoaWxkcmVuID0gMQorYWJicmV2WzY4XTogYXR0clswXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDMzNQorYWJicmV2WzY4XTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzMzcKK2FiYnJldls2OF06IGF0dHJbMl06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAzMzkKK2FiYnJldls2OF06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAzNDEKK2FiYnJldls2OF06IGF0dHJbNF06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzNDMKK2FiYnJldls2OF06IGF0dHJbNV06IGNvZGUgPSA2MCwgZm9ybSA9IDEyLCBvZmZzZXQgPSAzNDUKK2FiYnJldls4NV06IGNvZGUgPSA2LCB0YWcgPSAzNiwgY2hpbGRyZW4gPSAwCithYmJyZXZbODVdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDM1MgorYWJicmV2Wzg1XTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDM1NAorYWJicmV2Wzg1XTogYXR0clsyXTogY29kZSA9IDYyLCBmb3JtID0gMTEsIG9mZnNldCA9IDM1NgorYWJicmV2Wzk2XTogY29kZSA9IDcsIHRhZyA9IDUyLCBjaGlsZHJlbiA9IDAKK2FiYnJldls5Nl06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMzYzCithYmJyZXZbOTZdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzY1CithYmJyZXZbOTZdOiBhdHRyWzJdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzY3CithYmJyZXZbOTZdOiBhdHRyWzNdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMzY5CithYmJyZXZbOTZdOiBhdHRyWzRdOiBjb2RlID0gNjMsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMzcxCithYmJyZXZbOTZdOiBhdHRyWzVdOiBjb2RlID0gMiwgZm9ybSA9IDEwLCBvZmZzZXQgPSAzNzMKK0VPRgorCitybSAtZiB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgc2hvdy1hYmJyZXYub3V0CisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuLXNob3ctY2llZmRlLnNoIGIvdGVzdHMvcnVuLXNob3ctY2llZmRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzU1MzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ydW4tc2hvdy1jaWVmZGUuc2gKQEAgLTAsMCArMSwzMTkgQEAKKyMhIC9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KKyMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisjIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorc2V0IC1lCisKKyMgRG9uJ3QgZmFpbCBpZiB3ZSBjYW5ub3QgZGVjb21wcmVzcyB0aGUgZmlsZS4KK2J1bnppcDIgLWMgJHNyY2Rpci90ZXN0ZmlsZTMuYnoyID4gdGVzdGZpbGUzIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGU0LmJ6MiA+IHRlc3RmaWxlNCAyPi9kZXYvbnVsbCB8fCBleGl0IDAKKworLi9zaG93LWNpZWZkZSB0ZXN0ZmlsZTMgdGVzdGZpbGU0ID4gc2hvdy1jaWVmZGUub3V0CisKK2RpZmYgLXUgc2hvdy1jaWVmZGUub3V0IC0gPDwiRU9GIgordGVzdGZpbGUzIGhhcyAxIENJRXMgYW5kIDEgRkRFcworQ0lFWzBdOiBieXRlc19pbl9jaWUgPSAxNiwgdmVyc2lvbiA9IDEsIGF1Z21lbnRlciA9ICIiCitDSUVbMF06IGNvZGVfYWxpZ25tZW50X2ZhY3RvciA9IDEKK0NJRVswXTogZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gZmZmZmZmZmZmZmZmZmZmYworQ0lFWzBdOiByZXR1cm5fYWRkcmVzc19yZWdpc3RlciA9IDgKK0NJRVswXTogYnl0ZXMgPSAwYyAwNCAwNCA4OCAwMSAwMCAwMAorRkRFWzBdOiBsb3dfcGMgPSAweDgwNDg0MmMsIGxlbmd0aCA9IDQxCitGREVbMF06IGJ5dGVzID0gMTggMDAgMDAgMDAgMTggMDAgMDAgMDAgMmMgODQgMDQgMDggMjkgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVswXTogY2llX29mZnNldCA9IDAsIGNpZV9pbmRleCA9IDAsIGZkZV9vZmZzZXQgPSAyNAorRkRFWzBdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorbm8gRkRFIGF0IDgwNDg0MDAKK0ZERVtAODA0ODQyY106IGNpZV9vZmZzZXQgPSAwLCBjaWVfaW5kZXggPSAwLCBmZGVfb2Zmc2V0ID0gMjQKK0ZERVtAODA0ODQ1NF06IGNpZV9vZmZzZXQgPSAwLCBjaWVfaW5kZXggPSAwLCBmZGVfb2Zmc2V0ID0gMjQKK25vIEZERSBhdCA4MDQ4NDU1CitubyBGREUgYXQgODA0OTNmYwordGVzdGZpbGU0IGhhcyA1IENJRXMgYW5kIDYxIEZERXMKK0NJRVswXTogYnl0ZXNfaW5fY2llID0gMjAsIHZlcnNpb24gPSAxLCBhdWdtZW50ZXIgPSAiZWgiCitDSUVbMF06IGNvZGVfYWxpZ25tZW50X2ZhY3RvciA9IDEKK0NJRVswXTogZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gZmZmZmZmZmZmZmZmZmZmYworQ0lFWzBdOiByZXR1cm5fYWRkcmVzc19yZWdpc3RlciA9IDgKK0NJRVswXTogYnl0ZXMgPSAwYyAwNCAwNCA4OCAwMQorQ0lFWzFdOiBieXRlc19pbl9jaWUgPSAxNiwgdmVyc2lvbiA9IDEsIGF1Z21lbnRlciA9ICIiCitDSUVbMV06IGNvZGVfYWxpZ25tZW50X2ZhY3RvciA9IDEKK0NJRVsxXTogZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gZmZmZmZmZmZmZmZmZmZmYworQ0lFWzFdOiByZXR1cm5fYWRkcmVzc19yZWdpc3RlciA9IDgKK0NJRVsxXTogYnl0ZXMgPSAwYyAwNCAwNCA4OCAwMSAwMCAwMAorQ0lFWzJdOiBieXRlc19pbl9jaWUgPSAxNiwgdmVyc2lvbiA9IDEsIGF1Z21lbnRlciA9ICIiCitDSUVbMl06IGNvZGVfYWxpZ25tZW50X2ZhY3RvciA9IDEKK0NJRVsyXTogZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gZmZmZmZmZmZmZmZmZmZmYworQ0lFWzJdOiByZXR1cm5fYWRkcmVzc19yZWdpc3RlciA9IDgKK0NJRVsyXTogYnl0ZXMgPSAwYyAwNCAwNCA4OCAwMSAwMCAwMAorQ0lFWzNdOiBieXRlc19pbl9jaWUgPSAyMCwgdmVyc2lvbiA9IDEsIGF1Z21lbnRlciA9ICJlaCIKK0NJRVszXTogY29kZV9hbGlnbm1lbnRfZmFjdG9yID0gMQorQ0lFWzNdOiBkYXRhX2FsaWdubWVudF9mYWN0b3IgPSBmZmZmZmZmZmZmZmZmZmZjCitDSUVbM106IHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyID0gOAorQ0lFWzNdOiBieXRlcyA9IDBjIDA0IDA0IDg4IDAxCitDSUVbNF06IGJ5dGVzX2luX2NpZSA9IDE2LCB2ZXJzaW9uID0gMSwgYXVnbWVudGVyID0gIiIKK0NJRVs0XTogY29kZV9hbGlnbm1lbnRfZmFjdG9yID0gMQorQ0lFWzRdOiBkYXRhX2FsaWdubWVudF9mYWN0b3IgPSBmZmZmZmZmZmZmZmZmZmZjCitDSUVbNF06IHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyID0gOAorQ0lFWzRdOiBieXRlcyA9IDBjIDA0IDA0IDg4IDAxIDAwIDAwCitGREVbMF06IGxvd19wYyA9IDB4ODA0OTNmYywgbGVuZ3RoID0gMTU0CitGREVbMF06IGJ5dGVzID0gMmMgMDAgMDAgMDAgMWMgMDAgMDAgMDAgZmMgOTMgMDQgMDggOWEgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNTMgMmUgMDggNTAgMmUgMTAgNDggMmUgMDAgNTggMmUgMTAgNjIgMmUgMDAgNjMgMmUgMTAgNDUgMmUgMDAgMDAgMDAgMDAKK0ZERVswXTogY2llX29mZnNldCA9IDAsIGNpZV9pbmRleCA9IDAsIGZkZV9vZmZzZXQgPSAyOAorRkRFWzBdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA1MyAyZSAwOCA1MCAyZSAxMCA0OCAyZSAwMCA1OCAyZSAxMCA2MiAyZSAwMCA2MyAyZSAxMCA0NSAyZSAwMCAwMCAwMCAwMAorRkRFWzFdOiBsb3dfcGMgPSAweDgwNDk0OTgsIGxlbmd0aCA9IDQ5CitGREVbMV06IGJ5dGVzID0gMTggMDAgMDAgMDAgNGMgMDAgMDAgMDAgOTggOTQgMDQgMDggMzEgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNGMgMmUgMTAgMDAKK0ZERVsxXTogY2llX29mZnNldCA9IDAsIGNpZV9pbmRleCA9IDAsIGZkZV9vZmZzZXQgPSA3NgorRkRFWzFdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0YyAyZSAxMCAwMAorRkRFWzJdOiBsb3dfcGMgPSAweDgwNDk0ZDQsIGxlbmd0aCA9IDIzCitGREVbMl06IGJ5dGVzID0gMTggMDAgMDAgMDAgMTggMDAgMDAgMDAgZDQgOTQgMDQgMDggMTcgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVsyXTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDI0CitGREVbMl06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDAwCitGREVbM106IGxvd19wYyA9IDB4ODA0OTRmMCwgbGVuZ3RoID0gMjYKK0ZERVszXTogYnl0ZXMgPSAxOCAwMCAwMCAwMCAzNCAwMCAwMCAwMCBmMCA5NCAwNCAwOCAxYSAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzNdOiBjaWVfb2Zmc2V0ID0gMTAwLCBjaWVfaW5kZXggPSAxLCBmZGVfb2Zmc2V0ID0gNTIKK0ZERVszXTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVs0XTogbG93X3BjID0gMHg4MDQ5NTYwLCBsZW5ndGggPSA4NQorRkRFWzRdOiBieXRlcyA9IDI0IDAwIDAwIDAwIDUwIDAwIDAwIDAwIDYwIDk1IDA0IDA4IDU1IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg2IDAzIDQxIDgzIDA0IDUzIDJlIDEwIDRlIDJlIDAwIDU1IDJlIDEwIDAwCitGREVbNF06IGNpZV9vZmZzZXQgPSAxMDAsIGNpZV9pbmRleCA9IDEsIGZkZV9vZmZzZXQgPSA4MAorRkRFWzRdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NiAwMyA0MSA4MyAwNCA1MyAyZSAxMCA0ZSAyZSAwMCA1NSAyZSAxMCAwMAorRkRFWzVdOiBsb3dfcGMgPSAweDgwNDk1YzAsIGxlbmd0aCA9IDY2CitGREVbNV06IGJ5dGVzID0gMjAgMDAgMDAgMDAgNzggMDAgMDAgMDAgYzAgOTUgMDQgMDggNDIgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODYgMDMgNDEgODMgMDQgNWUgMmUgMTAgMDAgMDAgMDAKK0ZERVs1XTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDEyMAorRkRFWzVdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NiAwMyA0MSA4MyAwNCA1ZSAyZSAxMCAwMCAwMCAwMAorRkRFWzZdOiBsb3dfcGMgPSAweDgwNDk2MTAsIGxlbmd0aCA9IDI4CitGREVbNl06IGJ5dGVzID0gMTggMDAgMDAgMDAgOWMgMDAgMDAgMDAgMTAgOTYgMDQgMDggMWMgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVs2XTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDE1NgorRkRFWzZdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzddOiBsb3dfcGMgPSAweDgwNDk2MzAsIGxlbmd0aCA9IDMxCitGREVbN106IGJ5dGVzID0gMTggMDAgMDAgMDAgYjggMDAgMDAgMDAgMzAgOTYgMDQgMDggMWYgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVs3XTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDE4NAorRkRFWzddOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzhdOiBsb3dfcGMgPSAweDgwNDk2ZTAsIGxlbmd0aCA9IDcxCitGREVbOF06IGJ5dGVzID0gMWMgMDAgMDAgMDAgZDQgMDAgMDAgMDAgZTAgOTYgMDQgMDggNDcgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgNWMgMmUgMTAgMDAgMDAKK0ZERVs4XTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDIxMgorRkRFWzhdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyA1YyAyZSAxMCAwMCAwMAorRkRFWzldOiBsb3dfcGMgPSAweDgwNDk3MzAsIGxlbmd0aCA9IDE2NQorRkRFWzldOiBieXRlcyA9IDIwIDAwIDAwIDAwIGY0IDAwIDAwIDAwIDMwIDk3IDA0IDA4IGE1IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDY5IDJlIDEwIDAyIDY2IDJlIDAwIDAwIDAwCitGREVbOV06IGNpZV9vZmZzZXQgPSAxMDAsIGNpZV9pbmRleCA9IDEsIGZkZV9vZmZzZXQgPSAyNDQKK0ZERVs5XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgNjkgMmUgMTAgMDIgNjYgMmUgMDAgMDAgMDAKK0ZERVsxMF06IGxvd19wYyA9IDB4ODA0OTdlMCwgbGVuZ3RoID0gODkKK0ZERVsxMF06IGJ5dGVzID0gMWMgMDAgMDAgMDAgMTggMDEgMDAgMDAgZTAgOTcgMDQgMDggNTkgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgNzQgMmUgMTAgMDAgMDAKK0ZERVsxMF06IGNpZV9vZmZzZXQgPSAxMDAsIGNpZV9pbmRleCA9IDEsIGZkZV9vZmZzZXQgPSAyODAKK0ZERVsxMF06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDc0IDJlIDEwIDAwIDAwCitGREVbMTFdOiBsb3dfcGMgPSAweDgwNDk4NDAsIGxlbmd0aCA9IDg5CitGREVbMTFdOiBieXRlcyA9IDI4IDAwIDAwIDAwIDM4IDAxIDAwIDAwIDQwIDk4IDA0IDA4IDU5IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg2IDAzIDQxIDgzIDA0IDU1IDJlIDEwIDRlIDJlIDAwIDUyIDJlIDEwIDRjIDJlIDAwIDAwIDAwCitGREVbMTFdOiBjaWVfb2Zmc2V0ID0gMTAwLCBjaWVfaW5kZXggPSAxLCBmZGVfb2Zmc2V0ID0gMzEyCitGREVbMTFdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NiAwMyA0MSA4MyAwNCA1NSAyZSAxMCA0ZSAyZSAwMCA1MiAyZSAxMCA0YyAyZSAwMCAwMCAwMAorRkRFWzEyXTogbG93X3BjID0gMHg4MDQ5OGEwLCBsZW5ndGggPSAxNzYKK0ZERVsxMl06IGJ5dGVzID0gMjQgMDAgMDAgMDAgNjQgMDEgMDAgMDAgYTAgOTggMDQgMDggYjAgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNWUgMmUgMTAgNGMgMmUgMDAgMDAKK0ZERVsxMl06IGNpZV9vZmZzZXQgPSAxMDAsIGNpZV9pbmRleCA9IDEsIGZkZV9vZmZzZXQgPSAzNTYKK0ZERVsxMl06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDVlIDJlIDEwIDRjIDJlIDAwIDAwCitGREVbMTNdOiBsb3dfcGMgPSAweDgwNDk5NTAsIGxlbmd0aCA9IDExNgorRkRFWzEzXTogYnl0ZXMgPSAyNCAwMCAwMCAwMCA4YyAwMSAwMCAwMCA1MCA5OSAwNCAwOCA3NCAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSAwMiA1ZSAyZSAxMCAwMCAwMCAwMAorRkRFWzEzXTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDM5NgorRkRFWzEzXTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgMDIgNWUgMmUgMTAgMDAgMDAgMDAKK0ZERVsxNF06IGxvd19wYyA9IDB4ODA0OTlkMCwgbGVuZ3RoID0gMzEKK0ZERVsxNF06IGJ5dGVzID0gMTggMDAgMDAgMDAgYjQgMDEgMDAgMDAgZDAgOTkgMDQgMDggMWYgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVsxNF06IGNpZV9vZmZzZXQgPSAxMDAsIGNpZV9pbmRleCA9IDEsIGZkZV9vZmZzZXQgPSA0MzYKK0ZERVsxNF06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDAwCitGREVbMTVdOiBsb3dfcGMgPSAweDgwNDk5ZjAsIGxlbmd0aCA9IDMxMworRkRFWzE1XTogYnl0ZXMgPSAyNCAwMCAwMCAwMCBkMCAwMSAwMCAwMCBmMCA5OSAwNCAwOCAzOSAwMSAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSAwMiBkOCAyZSAxMCA2MiAyZSAwMAorRkRFWzE1XTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDQ2NAorRkRFWzE1XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgMDIgZDggMmUgMTAgNjIgMmUgMDAKK0ZERVsxNl06IGxvd19wYyA9IDB4ODA0OWIzMCwgbGVuZ3RoID0gMjYyCitGREVbMTZdOiBieXRlcyA9IDI0IDAwIDAwIDAwIGY4IDAxIDAwIDAwIDMwIDliIDA0IDA4IDA2IDAxIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDAyIGM4IDJlIDEwIDYyIDJlIDAwCitGREVbMTZdOiBjaWVfb2Zmc2V0ID0gMTAwLCBjaWVfaW5kZXggPSAxLCBmZGVfb2Zmc2V0ID0gNTA0CitGREVbMTZdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSAwMiBjOCAyZSAxMCA2MiAyZSAwMAorRkRFWzE3XTogbG93X3BjID0gMHg4MDQ5YzQwLCBsZW5ndGggPSA5NQorRkRFWzE3XTogYnl0ZXMgPSAxYyAwMCAwMCAwMCAyMCAwMiAwMCAwMCA0MCA5YyAwNCAwOCA1ZiAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyA2ZSAyZSAxMCAwMCAwMAorRkRFWzE3XTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDU0NAorRkRFWzE3XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgNmUgMmUgMTAgMDAgMDAKK0ZERVsxOF06IGxvd19wYyA9IDB4ODA0OWQ2MCwgbGVuZ3RoID0gMjMwCitGREVbMThdOiBieXRlcyA9IDIwIDAwIDAwIDAwIDQwIDAyIDAwIDAwIDYwIDlkIDA0IDA4IGU2IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDAyIDlhIDJlIDEwIDAwIDAwCitGREVbMThdOiBjaWVfb2Zmc2V0ID0gMTAwLCBjaWVfaW5kZXggPSAxLCBmZGVfb2Zmc2V0ID0gNTc2CitGREVbMThdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCAwMiA5YSAyZSAxMCAwMCAwMAorRkRFWzE5XTogbG93X3BjID0gMHg4MDQ5ZTUwLCBsZW5ndGggPSA4NQorRkRFWzE5XTogYnl0ZXMgPSAxOCAwMCAwMCAwMCA2NCAwMiAwMCAwMCA1MCA5ZSAwNCAwOCA1NSAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzE5XTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDYxMgorRkRFWzE5XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVsyMF06IGxvd19wYyA9IDB4ODA0OWViMCwgbGVuZ3RoID0gMTQ0CitGREVbMjBdOiBieXRlcyA9IDIwIDAwIDAwIDAwIDgwIDAyIDAwIDAwIGIwIDllIDA0IDA4IDkwIDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDViIDJlIDEwCitGREVbMjBdOiBjaWVfb2Zmc2V0ID0gMTAwLCBjaWVfaW5kZXggPSAxLCBmZGVfb2Zmc2V0ID0gNjQwCitGREVbMjBdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA1YiAyZSAxMAorRkRFWzIxXTogbG93X3BjID0gMHg4MDQ5ZjQwLCBsZW5ndGggPSAxMTUKK0ZERVsyMV06IGJ5dGVzID0gMjAgMDAgMDAgMDAgYTQgMDIgMDAgMDAgNDAgOWYgMDQgMDggNzMgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNTkgMmUgMTAKK0ZERVsyMV06IGNpZV9vZmZzZXQgPSAxMDAsIGNpZV9pbmRleCA9IDEsIGZkZV9vZmZzZXQgPSA2NzYKK0ZERVsyMV06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDU5IDJlIDEwCitGREVbMjJdOiBsb3dfcGMgPSAweDgwNDlmZDAsIGxlbmd0aCA9IDk0OAorRkRFWzIyXTogYnl0ZXMgPSAzMCAwMCAwMCAwMCBjOCAwMiAwMCAwMCBkMCA5ZiAwNCAwOCBiNCAwMyAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSAwMiBmNyAyZSAyMCAwMiA2NCAyZSAxMCAwMyAxNSAwMSAyZSAwMCAwMiA5ZiAyZSAxMCAwMCAwMAorRkRFWzIyXTogY2llX29mZnNldCA9IDEwMCwgY2llX2luZGV4ID0gMSwgZmRlX29mZnNldCA9IDcxMgorRkRFWzIyXTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgMDIgZjcgMmUgMjAgMDIgNjQgMmUgMTAgMDMgMTUgMDEgMmUgMDAgMDIgOWYgMmUgMTAgMDAgMDAKK0ZERVsyM106IGxvd19wYyA9IDB4ODA0YTM5MCwgbGVuZ3RoID0gMjAxCitGREVbMjNdOiBieXRlcyA9IDI4IDAwIDAwIDAwIGZjIDAyIDAwIDAwIDkwIGEzIDA0IDA4IGM5IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDAyIDU4IDJlIDEwIDUyIDJlIDAwIDc1IDJlIDEwIDAwCitGREVbMjNdOiBjaWVfb2Zmc2V0ID0gMTAwLCBjaWVfaW5kZXggPSAxLCBmZGVfb2Zmc2V0ID0gNzY0CitGREVbMjNdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSAwMiA1OCAyZSAxMCA1MiAyZSAwMCA3NSAyZSAxMCAwMAorRkRFWzI0XTogbG93X3BjID0gMHg4MDRhNDYwLCBsZW5ndGggPSAyMDYKK0ZERVsyNF06IGJ5dGVzID0gMjggMDAgMDAgMDAgMjggMDMgMDAgMDAgNjAgYTQgMDQgMDggY2UgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgMDIgNjQgMmUgMTAgNTIgMmUgMDAgNmUgMmUgMTAgMDAKK0ZERVsyNF06IGNpZV9vZmZzZXQgPSAxMDAsIGNpZV9pbmRleCA9IDEsIGZkZV9vZmZzZXQgPSA4MDgKK0ZERVsyNF06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDAyIDY0IDJlIDEwIDUyIDJlIDAwIDZlIDJlIDEwIDAwCitGREVbMjVdOiBsb3dfcGMgPSAweDgwNGI5NzAsIGxlbmd0aCA9IDEyNzQKK0ZERVsyNV06IGJ5dGVzID0gNDQgMDAgMDAgMDAgMTggMDAgMDAgMDAgNzAgYjkgMDQgMDggZmEgMDQgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjYgMmUgMTAgN2IgMmUgMjAgMDMgN2YgMDEgMmUgMTAgNTMgMmUgMDggNGMgMmUgMTAgNzkgMmUgMjAgMDIgNTQgMmUgMTAgN2UgMmUgMjAgMDMgNmMgMDEgMmUgMTAgMDIgNDUgMmUgMjAgMDAgMDAgMDAKK0ZERVsyNV06IGNpZV9vZmZzZXQgPSA5NDgsIGNpZV9pbmRleCA9IDIsIGZkZV9vZmZzZXQgPSAyNAorRkRFWzI1XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjYgMmUgMTAgN2IgMmUgMjAgMDMgN2YgMDEgMmUgMTAgNTMgMmUgMDggNGMgMmUgMTAgNzkgMmUgMjAgMDIgNTQgMmUgMTAgN2UgMmUgMjAgMDMgNmMgMDEgMmUgMTAgMDIgNDUgMmUgMjAgMDAgMDAgMDAKK0ZERVsyNl06IGxvd19wYyA9IDB4ODA0YmU3MCwgbGVuZ3RoID0gNjAKK0ZERVsyNl06IGJ5dGVzID0gMWMgMDAgMDAgMDAgNjAgMDAgMDAgMDAgNzAgYmUgMDQgMDggM2MgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgNWUgMmUgMTAgMDAgMDAKK0ZERVsyNl06IGNpZV9vZmZzZXQgPSA5NDgsIGNpZV9pbmRleCA9IDIsIGZkZV9vZmZzZXQgPSA5NgorRkRFWzI2XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgNWUgMmUgMTAgMDAgMDAKK0ZERVsyN106IGxvd19wYyA9IDB4ODA0YzA5MCwgbGVuZ3RoID0gODUKK0ZERVsyN106IGJ5dGVzID0gMjQgMDAgMDAgMDAgODAgMDAgMDAgMDAgOTAgYzAgMDQgMDggNTUgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgNjYgMmUgMDQgNGQgMmUgMGMgNGMgMmUgMDQgNDYgMmUgMjAgMDAKK0ZERVsyN106IGNpZV9vZmZzZXQgPSA5NDgsIGNpZV9pbmRleCA9IDIsIGZkZV9vZmZzZXQgPSAxMjgKK0ZERVsyN106IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDY2IDJlIDA0IDRkIDJlIDBjIDRjIDJlIDA0IDQ2IDJlIDIwIDAwCitGREVbMjhdOiBsb3dfcGMgPSAweDgwNGMwZjAsIGxlbmd0aCA9IDc1CitGREVbMjhdOiBieXRlcyA9IDJjIDAwIDAwIDAwIGE4IDAwIDAwIDAwIGYwIGMwIDA0IDA4IDRiIDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDViIDJlIDA0IDRhIDJlIDBjIDRkIDJlIDA0IDQ2IDJlIDIwIDAwIDAwIDAwCitGREVbMjhdOiBjaWVfb2Zmc2V0ID0gOTQ4LCBjaWVfaW5kZXggPSAyLCBmZGVfb2Zmc2V0ID0gMTY4CitGREVbMjhdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA1YiAyZSAwNCA0YSAyZSAwYyA0ZCAyZSAwNCA0NiAyZSAyMCAwMCAwMCAwMAorRkRFWzI5XTogbG93X3BjID0gMHg4MDRkOGUwLCBsZW5ndGggPSA3MQorRkRFWzI5XTogYnl0ZXMgPSAyMCAwMCAwMCAwMCBkOCAwMCAwMCAwMCBlMCBkOCAwNCAwOCA0NyAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA2MCAyZSAxMAorRkRFWzI5XTogY2llX29mZnNldCA9IDk0OCwgY2llX2luZGV4ID0gMiwgZmRlX29mZnNldCA9IDIxNgorRkRFWzI5XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjAgMmUgMTAKK0ZERVszMF06IGxvd19wYyA9IDB4ODA0ZDk4MCwgbGVuZ3RoID0gNzEKK0ZERVszMF06IGJ5dGVzID0gMjAgMDAgMDAgMDAgZmMgMDAgMDAgMDAgODAgZDkgMDQgMDggNDcgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjAgMmUgMTAKK0ZERVszMF06IGNpZV9vZmZzZXQgPSA5NDgsIGNpZV9pbmRleCA9IDIsIGZkZV9vZmZzZXQgPSAyNTIKK0ZERVszMF06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDYwIDJlIDEwCitGREVbMzFdOiBsb3dfcGMgPSAweDgwNGRhMjAsIGxlbmd0aCA9IDcxCitGREVbMzFdOiBieXRlcyA9IDIwIDAwIDAwIDAwIDIwIDAxIDAwIDAwIDIwIGRhIDA0IDA4IDQ3IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDYwIDJlIDEwCitGREVbMzFdOiBjaWVfb2Zmc2V0ID0gOTQ4LCBjaWVfaW5kZXggPSAyLCBmZGVfb2Zmc2V0ID0gMjg4CitGREVbMzFdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA2MCAyZSAxMAorRkRFWzMyXTogbG93X3BjID0gMHg4MDRkYWMwLCBsZW5ndGggPSA3MQorRkRFWzMyXTogYnl0ZXMgPSAyMCAwMCAwMCAwMCA0NCAwMSAwMCAwMCBjMCBkYSAwNCAwOCA0NyAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA2MCAyZSAxMAorRkRFWzMyXTogY2llX29mZnNldCA9IDk0OCwgY2llX2luZGV4ID0gMiwgZmRlX29mZnNldCA9IDMyNAorRkRFWzMyXTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjAgMmUgMTAKK0ZERVszM106IGxvd19wYyA9IDB4ODA0ZGI2MCwgbGVuZ3RoID0gNzEKK0ZERVszM106IGJ5dGVzID0gMjAgMDAgMDAgMDAgNjggMDEgMDAgMDAgNjAgZGIgMDQgMDggNDcgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjAgMmUgMTAKK0ZERVszM106IGNpZV9vZmZzZXQgPSA5NDgsIGNpZV9pbmRleCA9IDIsIGZkZV9vZmZzZXQgPSAzNjAKK0ZERVszM106IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDYwIDJlIDEwCitGREVbMzRdOiBsb3dfcGMgPSAweDgwNGRjMDAsIGxlbmd0aCA9IDcxCitGREVbMzRdOiBieXRlcyA9IDIwIDAwIDAwIDAwIDhjIDAxIDAwIDAwIDAwIGRjIDA0IDA4IDQ3IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDYwIDJlIDEwCitGREVbMzRdOiBjaWVfb2Zmc2V0ID0gOTQ4LCBjaWVfaW5kZXggPSAyLCBmZGVfb2Zmc2V0ID0gMzk2CitGREVbMzRdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA2MCAyZSAxMAorRkRFWzM1XTogbG93X3BjID0gMHg4MDRkY2EwLCBsZW5ndGggPSA3MQorRkRFWzM1XTogYnl0ZXMgPSAyMCAwMCAwMCAwMCBiMCAwMSAwMCAwMCBhMCBkYyAwNCAwOCA0NyAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA2MCAyZSAxMAorRkRFWzM1XTogY2llX29mZnNldCA9IDk0OCwgY2llX2luZGV4ID0gMiwgZmRlX29mZnNldCA9IDQzMgorRkRFWzM1XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjAgMmUgMTAKK0ZERVszNl06IGxvd19wYyA9IDB4ODA0YzViNCwgbGVuZ3RoID0gMjYKK0ZERVszNl06IGJ5dGVzID0gMTggMDAgMDAgMDAgMWMgMDAgMDAgMDAgYjQgYzUgMDQgMDggMWEgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVszNl06IGNpZV9vZmZzZXQgPSAxNDEyLCBjaWVfaW5kZXggPSAzLCBmZGVfb2Zmc2V0ID0gMjgKK0ZERVszNl06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDAwCitGREVbMzddOiBsb3dfcGMgPSAweDgwNGM1ZDAsIGxlbmd0aCA9IDIzCitGREVbMzddOiBieXRlcyA9IDE4IDAwIDAwIDAwIDM4IDAwIDAwIDAwIGQwIGM1IDA0IDA4IDE3IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDAwCitGREVbMzddOiBjaWVfb2Zmc2V0ID0gMTQxMiwgY2llX2luZGV4ID0gMywgZmRlX29mZnNldCA9IDU2CitGREVbMzddOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzM4XTogbG93X3BjID0gMHg4MDRjNjQwLCBsZW5ndGggPSAyNAorRkRFWzM4XTogYnl0ZXMgPSAxOCAwMCAwMCAwMCA1NCAwMCAwMCAwMCA0MCBjNiAwNCAwOCAxOCAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzM4XTogY2llX29mZnNldCA9IDE0MTIsIGNpZV9pbmRleCA9IDMsIGZkZV9vZmZzZXQgPSA4NAorRkRFWzM4XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVszOV06IGxvd19wYyA9IDB4ODA0YzY2MCwgbGVuZ3RoID0gMzIKK0ZERVszOV06IGJ5dGVzID0gMTggMDAgMDAgMDAgNzAgMDAgMDAgMDAgNjAgYzYgMDQgMDggMjAgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVszOV06IGNpZV9vZmZzZXQgPSAxNDEyLCBjaWVfaW5kZXggPSAzLCBmZGVfb2Zmc2V0ID0gMTEyCitGREVbMzldOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzQwXTogbG93X3BjID0gMHg4MDRjNjgwLCBsZW5ndGggPSAyOQorRkRFWzQwXTogYnl0ZXMgPSAxOCAwMCAwMCAwMCA4YyAwMCAwMCAwMCA4MCBjNiAwNCAwOCAxZCAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzQwXTogY2llX29mZnNldCA9IDE0MTIsIGNpZV9pbmRleCA9IDMsIGZkZV9vZmZzZXQgPSAxNDAKK0ZERVs0MF06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDAwCitGREVbNDFdOiBsb3dfcGMgPSAweDgwNGM2YTAsIGxlbmd0aCA9IDM2CitGREVbNDFdOiBieXRlcyA9IDE4IDAwIDAwIDAwIGE4IDAwIDAwIDAwIGEwIGM2IDA0IDA4IDI0IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDAwCitGREVbNDFdOiBjaWVfb2Zmc2V0ID0gMTQxMiwgY2llX2luZGV4ID0gMywgZmRlX29mZnNldCA9IDE2OAorRkRFWzQxXTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVs0Ml06IGxvd19wYyA9IDB4ODA0YzZkMCwgbGVuZ3RoID0gOTgKK0ZERVs0Ml06IGJ5dGVzID0gMjQgMDAgMDAgMDAgYzQgMDAgMDAgMDAgZDAgYzYgMDQgMDggNjIgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgMDIgNDMgMmUgMTAgMDAgMDAgMDAKK0ZERVs0Ml06IGNpZV9vZmZzZXQgPSAxNDEyLCBjaWVfaW5kZXggPSAzLCBmZGVfb2Zmc2V0ID0gMTk2CitGREVbNDJdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSAwMiA0MyAyZSAxMCAwMCAwMCAwMAorRkRFWzQzXTogbG93X3BjID0gMHg4MDRjNzQwLCBsZW5ndGggPSAxMDcKK0ZERVs0M106IGJ5dGVzID0gMjQgMDAgMDAgMDAgZWMgMDAgMDAgMDAgNDAgYzcgMDQgMDggNmIgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNTMgMmUgMTAgN2IgMmUgMDAgMDAKK0ZERVs0M106IGNpZV9vZmZzZXQgPSAxNDEyLCBjaWVfaW5kZXggPSAzLCBmZGVfb2Zmc2V0ID0gMjM2CitGREVbNDNdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA1MyAyZSAxMCA3YiAyZSAwMCAwMAorRkRFWzQ0XTogbG93X3BjID0gMHg4MDRjN2IwLCBsZW5ndGggPSAyNTYKK0ZERVs0NF06IGJ5dGVzID0gMjQgMDAgMDAgMDAgMTQgMDEgMDAgMDAgYjAgYzcgMDQgMDggMDAgMDEgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgMDIgYmYgMmUgMTAgMDAgMDAgMDAKK0ZERVs0NF06IGNpZV9vZmZzZXQgPSAxNDEyLCBjaWVfaW5kZXggPSAzLCBmZGVfb2Zmc2V0ID0gMjc2CitGREVbNDRdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSAwMiBiZiAyZSAxMCAwMCAwMCAwMAorRkRFWzQ1XTogbG93X3BjID0gMHg4MDRjOGIwLCBsZW5ndGggPSA3OAorRkRFWzQ1XTogYnl0ZXMgPSAxYyAwMCAwMCAwMCAzYyAwMSAwMCAwMCBiMCBjOCAwNCAwOCA0ZSAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NiAwMyA0MSA4MyAwNCAwMCAwMAorRkRFWzQ1XTogY2llX29mZnNldCA9IDE0MTIsIGNpZV9pbmRleCA9IDMsIGZkZV9vZmZzZXQgPSAzMTYKK0ZERVs0NV06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg2IDAzIDQxIDgzIDA0IDAwIDAwCitGREVbNDZdOiBsb3dfcGMgPSAweDgwNGM5MDAsIGxlbmd0aCA9IDQ4MAorRkRFWzQ2XTogYnl0ZXMgPSA0MCAwMCAwMCAwMCA1YyAwMSAwMCAwMCAwMCBjOSAwNCAwOCBlMCAwMSAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA3ZCAyZSAxMCA0YyAyZSAwMCAwMiA0OCAyZSAxMCAwMiA1NCAyZSAwMCA3OCAyZSAxMCA0YyAyZSAwMCAwMiA0NCAyZSAxMCA3OSAyZSAwOCA0OSAyZSAxMCA0OCAyZSAwMCAwMCAwMAorRkRFWzQ2XTogY2llX29mZnNldCA9IDE0MTIsIGNpZV9pbmRleCA9IDMsIGZkZV9vZmZzZXQgPSAzNDgKK0ZERVs0Nl06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDdkIDJlIDEwIDRjIDJlIDAwIDAyIDQ4IDJlIDEwIDAyIDU0IDJlIDAwIDc4IDJlIDEwIDRjIDJlIDAwIDAyIDQ0IDJlIDEwIDc5IDJlIDA4IDQ5IDJlIDEwIDQ4IDJlIDAwIDAwIDAwCitGREVbNDddOiBsb3dfcGMgPSAweDgwNGNhZTAsIGxlbmd0aCA9IDM3CitGREVbNDddOiBieXRlcyA9IDFjIDAwIDAwIDAwIGEwIDAxIDAwIDAwIGUwIGNhIDA0IDA4IDI1IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDUyIDJlIDEwIDAwIDAwCitGREVbNDddOiBjaWVfb2Zmc2V0ID0gMTQxMiwgY2llX2luZGV4ID0gMywgZmRlX29mZnNldCA9IDQxNgorRkRFWzQ3XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgNTIgMmUgMTAgMDAgMDAKK0ZERVs0OF06IGxvd19wYyA9IDB4ODA0Y2IxMCwgbGVuZ3RoID0gMTI4CitGREVbNDhdOiBieXRlcyA9IDJjIDAwIDAwIDAwIGMwIDAxIDAwIDAwIDEwIGNiIDA0IDA4IDgwIDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDYyIDJlIDEwIDU2IDJlIDA4IDQ5IDJlIDEwIDQ4IDJlIDAwIDZjIDJlIDEwCitGREVbNDhdOiBjaWVfb2Zmc2V0ID0gMTQxMiwgY2llX2luZGV4ID0gMywgZmRlX29mZnNldCA9IDQ0OAorRkRFWzQ4XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjIgMmUgMTAgNTYgMmUgMDggNDkgMmUgMTAgNDggMmUgMDAgNmMgMmUgMTAKK0ZERVs0OV06IGxvd19wYyA9IDB4ODA0Y2I5MCwgbGVuZ3RoID0gMTI4CitGREVbNDldOiBieXRlcyA9IDJjIDAwIDAwIDAwIGYwIDAxIDAwIDAwIDkwIGNiIDA0IDA4IDgwIDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDYyIDJlIDEwIDU2IDJlIDA4IDQ5IDJlIDEwIDQ4IDJlIDAwIDZjIDJlIDEwCitGREVbNDldOiBjaWVfb2Zmc2V0ID0gMTQxMiwgY2llX2luZGV4ID0gMywgZmRlX29mZnNldCA9IDQ5NgorRkRFWzQ5XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjIgMmUgMTAgNTYgMmUgMDggNDkgMmUgMTAgNDggMmUgMDAgNmMgMmUgMTAKK0ZERVs1MF06IGxvd19wYyA9IDB4ODA0Y2MxMCwgbGVuZ3RoID0gNDUKK0ZERVs1MF06IGJ5dGVzID0gMTggMDAgMDAgMDAgMjAgMDIgMDAgMDAgMTAgY2MgMDQgMDggMmQgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODMgMDMgMDAKK0ZERVs1MF06IGNpZV9vZmZzZXQgPSAxNDEyLCBjaWVfaW5kZXggPSAzLCBmZGVfb2Zmc2V0ID0gNTQ0CitGREVbNTBdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzUxXTogbG93X3BjID0gMHg4MDRjYzQwLCBsZW5ndGggPSA0MworRkRFWzUxXTogYnl0ZXMgPSAxOCAwMCAwMCAwMCAzYyAwMiAwMCAwMCA0MCBjYyAwNCAwOCAyYiAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4MyAwMyAwMAorRkRFWzUxXTogY2llX29mZnNldCA9IDE0MTIsIGNpZV9pbmRleCA9IDMsIGZkZV9vZmZzZXQgPSA1NzIKK0ZERVs1MV06IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDgzIDAzIDAwCitGREVbNTJdOiBsb3dfcGMgPSAweDgwNGNkZTAsIGxlbmd0aCA9IDg5CitGREVbNTJdOiBieXRlcyA9IDIwIDAwIDAwIDAwIDE4IDAwIDAwIDAwIGUwIGNkIDA0IDA4IDU5IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDZkIDJlIDIwIDAwIDAwIDAwCitGREVbNTJdOiBjaWVfb2Zmc2V0ID0gMjAwOCwgY2llX2luZGV4ID0gNCwgZmRlX29mZnNldCA9IDI0CitGREVbNTJdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA2ZCAyZSAyMCAwMCAwMCAwMAorRkRFWzUzXTogbG93X3BjID0gMHg4MDRjZTQwLCBsZW5ndGggPSAyMTcKK0ZERVs1M106IGJ5dGVzID0gMjAgMDAgMDAgMDAgM2MgMDAgMDAgMDAgNDAgY2UgMDQgMDggZDkgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgMDIgNDAgMmUgMjAgMDAgMDAKK0ZERVs1M106IGNpZV9vZmZzZXQgPSAyMDA4LCBjaWVfaW5kZXggPSA0LCBmZGVfb2Zmc2V0ID0gNjAKK0ZERVs1M106IGluc3RydWN0aW9ucyA9IDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDAyIDQwIDJlIDIwIDAwIDAwCitGREVbNTRdOiBsb3dfcGMgPSAweDgwNGQwMTAsIGxlbmd0aCA9IDExNworRkRFWzU0XTogYnl0ZXMgPSAyNCAwMCAwMCAwMCA2MCAwMCAwMCAwMCAxMCBkMCAwNCAwOCA3NSAwMCAwMCAwMCA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0MSA4NiAwNCA0MSA4MyAwNSA1YyAyZSAxMCAwMiA0OCAyZSAyMAorRkRFWzU0XTogY2llX29mZnNldCA9IDIwMDgsIGNpZV9pbmRleCA9IDQsIGZkZV9vZmZzZXQgPSA5NgorRkRFWzU0XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNWMgMmUgMTAgMDIgNDggMmUgMjAKK0ZERVs1NV06IGxvd19wYyA9IDB4ODA0ZDA5MCwgbGVuZ3RoID0gMTkwCitGREVbNTVdOiBieXRlcyA9IDI0IDAwIDAwIDAwIDg4IDAwIDAwIDAwIDkwIGQwIDA0IDA4IGJlIDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDY0IDJlIDEwIDAyIDg5IDJlIDIwCitGREVbNTVdOiBjaWVfb2Zmc2V0ID0gMjAwOCwgY2llX2luZGV4ID0gNCwgZmRlX29mZnNldCA9IDEzNgorRkRFWzU1XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjQgMmUgMTAgMDIgODkgMmUgMjAKK0ZERVs1Nl06IGxvd19wYyA9IDB4ODA0ZDE1MCwgbGVuZ3RoID0gMTAxCitGREVbNTZdOiBieXRlcyA9IDI0IDAwIDAwIDAwIGIwIDAwIDAwIDAwIDUwIGQxIDA0IDA4IDY1IDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDYxIDJlIDEwIDczIDJlIDIwIDAwCitGREVbNTZdOiBjaWVfb2Zmc2V0ID0gMjAwOCwgY2llX2luZGV4ID0gNCwgZmRlX29mZnNldCA9IDE3NgorRkRFWzU2XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjEgMmUgMTAgNzMgMmUgMjAgMDAKK0ZERVs1N106IGxvd19wYyA9IDB4ODA0ZDFjMCwgbGVuZ3RoID0gNDgwCitGREVbNTddOiBieXRlcyA9IDI4IDAwIDAwIDAwIGQ4IDAwIDAwIDAwIGMwIGQxIDA0IDA4IGUwIDAxIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDU2IDJlIDEwIDAyIGY1IDJlIDIwIDAyIDkxIDJlIDEwCitGREVbNTddOiBjaWVfb2Zmc2V0ID0gMjAwOCwgY2llX2luZGV4ID0gNCwgZmRlX29mZnNldCA9IDIxNgorRkRFWzU3XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNTYgMmUgMTAgMDIgZjUgMmUgMjAgMDIgOTEgMmUgMTAKK0ZERVs1OF06IGxvd19wYyA9IDB4ODA0ZDNhMCwgbGVuZ3RoID0gODk3CitGREVbNThdOiBieXRlcyA9IDI4IDAwIDAwIDAwIDA0IDAxIDAwIDAwIGEwIGQzIDA0IDA4IDgxIDAzIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDYxIDJlIDEwIDAzIDYxIDAxIDJlIDIwIDAwIDAwIDAwCitGREVbNThdOiBjaWVfb2Zmc2V0ID0gMjAwOCwgY2llX2luZGV4ID0gNCwgZmRlX29mZnNldCA9IDI2MAorRkRFWzU4XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjEgMmUgMTAgMDMgNjEgMDEgMmUgMjAgMDAgMDAgMDAKK0ZERVs1OV06IGxvd19wYyA9IDB4ODA0ZDczMCwgbGVuZ3RoID0gMjM4CitGREVbNTldOiBieXRlcyA9IDI0IDAwIDAwIDAwIDMwIDAxIDAwIDAwIDMwIGQ3IDA0IDA4IGVlIDAwIDAwIDAwIDQxIDBlIDA4IDg1IDAyIDQyIDBkIDA1IDQxIDg3IDAzIDQxIDg2IDA0IDQxIDgzIDA1IDYxIDJlIDEwIDAyIDhmIDJlIDIwCitGREVbNTldOiBjaWVfb2Zmc2V0ID0gMjAwOCwgY2llX2luZGV4ID0gNCwgZmRlX29mZnNldCA9IDMwNAorRkRFWzU5XTogaW5zdHJ1Y3Rpb25zID0gNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDEgODYgMDQgNDEgODMgMDUgNjEgMmUgMTAgMDIgOGYgMmUgMjAKK0ZERVs2MF06IGxvd19wYyA9IDB4ODA0ZTIyMCwgbGVuZ3RoID0gNzMKK0ZERVs2MF06IGJ5dGVzID0gMjAgMDAgMDAgMDAgNTggMDEgMDAgMDAgMjAgZTIgMDQgMDggNDkgMDAgMDAgMDAgNDEgMGUgMDggODUgMDIgNDIgMGQgMDUgNDEgODcgMDMgNDQgODYgMDQgNzQgMmUgMjAgMDAgMDAgMDAKK0ZERVs2MF06IGNpZV9vZmZzZXQgPSAyMDA4LCBjaWVfaW5kZXggPSA0LCBmZGVfb2Zmc2V0ID0gMzQ0CitGREVbNjBdOiBpbnN0cnVjdGlvbnMgPSA0MSAwZSAwOCA4NSAwMiA0MiAwZCAwNSA0MSA4NyAwMyA0NCA4NiAwNCA3NCAyZSAyMCAwMCAwMCAwMAorbm8gRkRFIGF0IDgwNDg0MDAKK25vIEZERSBhdCA4MDQ4NDJjCitubyBGREUgYXQgODA0ODQ1NAorbm8gRkRFIGF0IDgwNDg0NTUKK0ZERVtAODA0OTNmY106IGNpZV9vZmZzZXQgPSAwLCBjaWVfaW5kZXggPSAwLCBmZGVfb2Zmc2V0ID0gMjgKK0VPRgorCitybSAtZiB0ZXN0ZmlsZTMgdGVzdGZpbGU0IHNob3ctY2llZmRlLm91dAorCitleGl0IDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3J1bi1zaG93LWRpZS1pbmZvLnNoIGIvdGVzdHMvcnVuLXNob3ctZGllLWluZm8uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyNjMyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3J1bi1zaG93LWRpZS1pbmZvLnNoCkBAIC0wLDAgKzEsOTg4IEBACisjISAvYmluL3NoCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNCBSZWQgSGF0LCBJbmMuCisjIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyMgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorIyBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyMgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4KK3NldCAtZQorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvdGVzdGZpbGU1LmJ6MiA+IHRlc3RmaWxlNSAyPi9kZXYvbnVsbCB8fCBleGl0IDAKKworIyBEb24ndCBmYWlsIGlmIHdlIGNhbm5vdCBkZWNvbXByZXNzIHRoZSBmaWxlLgorYnVuemlwMiAtYyAkc3JjZGlyL3Rlc3RmaWxlMi5iejIgPiB0ZXN0ZmlsZTIgMj4vZGV2L251bGwgfHwgZXhpdCAwCisKKy4vc2hvdy1kaWUtaW5mbyB0ZXN0ZmlsZTUgdGVzdGZpbGUyID4gc2hvdy1kaWUtaW5mby5vdXQKKworZGlmZiAtdSBzaG93LWRpZS1pbmZvLm91dCAtIDw8IkVPRiIKK2ZpbGU6IHRlc3RmaWxlNQorTmV3IENVOiBvZmYgPSAwLCBoc2l6ZSA9IDExLCBhYiA9IDAsIGFzID0gNCwgb3MgPSA0CisgICAgIERXX1RBR19jb21waWxlX3VuaXQKKyAgICAgIE5hbWUgICAgICA6IGIuYworICAgICAgT2Zmc2V0ICAgIDogMTEKKyAgICAgIENVIG9mZnNldCA6IDExCisgICAgICBBdHRycyAgICAgOiBuYW1lIHN0bXRfbGlzdCBsb3dfcGMgaGlnaF9wYyBsYW5ndWFnZSBjb21wX2RpciBwcm9kdWNlcgorICAgICAgbG93IFBDICAgIDogMHg4MDQ4NDJjCisgICAgICBoaWdoIFBDICAgOiAweDgwNDg0MzYKKyAgICAgIGxhbmd1YWdlICA6IDEKKyAgICAgIGRpcmVjdG9yeSA6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQKKyAgICAgIHByb2R1Y2VyICA6IEdOVSBDIDIuOTYgMjAwMDA3MzEgKFJlZCBIYXQgTGludXggNy4wKQorICAgICAgICAgIERXX1RBR19zdWJwcm9ncmFtCisgICAgICAgICAgIE5hbWUgICAgICA6IGJhcgorICAgICAgICAgICBPZmZzZXQgICAgOiAxMDQKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTA0CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgbG93X3BjIGhpZ2hfcGMgcHJvdG90eXBlZCBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIGZyYW1lX2Jhc2UgdHlwZQorICAgICAgICAgICBsb3cgUEMgICAgOiAweDgwNDg0MmMKKyAgICAgICAgICAgaGlnaCBQQyAgIDogMHg4MDQ4NDM2CisgICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiBpbnQKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMTI3CisgICAgICAgICAgIENVIG9mZnNldCA6IDEyNworICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZworICAgICAgICAgICBieXRlIHNpemUgOiA0CitOZXcgQ1U6IG9mZiA9IDEzNSwgaHNpemUgPSAxMSwgYWIgPSA1NCwgYXMgPSA0LCBvcyA9IDQKKyAgICAgRFdfVEFHX2NvbXBpbGVfdW5pdAorICAgICAgTmFtZSAgICAgIDogZi5jCisgICAgICBPZmZzZXQgICAgOiAxNDYKKyAgICAgIENVIG9mZnNldCA6IDExCisgICAgICBBdHRycyAgICAgOiBuYW1lIHN0bXRfbGlzdCBsb3dfcGMgaGlnaF9wYyBsYW5ndWFnZSBjb21wX2RpciBwcm9kdWNlcgorICAgICAgbG93IFBDICAgIDogMHg4MDQ4NDM4CisgICAgICBoaWdoIFBDICAgOiAweDgwNDg0NDIKKyAgICAgIGxhbmd1YWdlICA6IDEKKyAgICAgIGRpcmVjdG9yeSA6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQKKyAgICAgIHByb2R1Y2VyICA6IEdOVSBDIDIuOTYgMjAwMDA3MzEgKFJlZCBIYXQgTGludXggNy4wKQorICAgICAgICAgIERXX1RBR19zdWJwcm9ncmFtCisgICAgICAgICAgIE5hbWUgICAgICA6IGZvbworICAgICAgICAgICBPZmZzZXQgICAgOiAyMzkKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTA0CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgbG93X3BjIGhpZ2hfcGMgcHJvdG90eXBlZCBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIGZyYW1lX2Jhc2UgdHlwZQorICAgICAgICAgICBsb3cgUEMgICAgOiAweDgwNDg0MzgKKyAgICAgICAgICAgaGlnaCBQQyAgIDogMHg4MDQ4NDQyCisgICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiBpbnQKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjYyCisgICAgICAgICAgIENVIG9mZnNldCA6IDEyNworICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZworICAgICAgICAgICBieXRlIHNpemUgOiA0CitOZXcgQ1U6IG9mZiA9IDI3MCwgaHNpemUgPSAxMSwgYWIgPSAxMDgsIGFzID0gNCwgb3MgPSA0CisgICAgIERXX1RBR19jb21waWxlX3VuaXQKKyAgICAgIE5hbWUgICAgICA6IG0uYworICAgICAgT2Zmc2V0ICAgIDogMjgxCisgICAgICBDVSBvZmZzZXQgOiAxMQorICAgICAgQXR0cnMgICAgIDogbmFtZSBzdG10X2xpc3QgbG93X3BjIGhpZ2hfcGMgbGFuZ3VhZ2UgY29tcF9kaXIgcHJvZHVjZXIKKyAgICAgIGxvdyBQQyAgICA6IDB4ODA0ODQ0NAorICAgICAgaGlnaCBQQyAgIDogMHg4MDQ4NDcyCisgICAgICBsYW5ndWFnZSAgOiAxCisgICAgICBkaXJlY3RvcnkgOiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0CisgICAgICBwcm9kdWNlciAgOiBHTlUgQyAyLjk2IDIwMDAwNzMxIChSZWQgSGF0IExpbnV4IDcuMCkKKyAgICAgICAgICBEV19UQUdfc3VicHJvZ3JhbQorICAgICAgICAgICBOYW1lICAgICAgOiBtYWluCisgICAgICAgICAgIE9mZnNldCAgICA6IDM3NAorICAgICAgICAgICBDVSBvZmZzZXQgOiAxMDQKKyAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBuYW1lIGxvd19wYyBoaWdoX3BjIHByb3RvdHlwZWQgZGVjbF9maWxlIGRlY2xfbGluZSBleHRlcm5hbCBmcmFtZV9iYXNlIHR5cGUKKyAgICAgICAgICAgbG93IFBDICAgIDogMHg4MDQ4NDQ0CisgICAgICAgICAgIGhpZ2ggUEMgICA6IDB4ODA0ODQ3MgorICAgICAgICAgICAgICAgRFdfVEFHX3N1YnByb2dyYW0KKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBiYXIKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiA0MDIKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxMzIKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSBkZWNsYXJhdGlvbiBleHRlcm5hbCB0eXBlCisgICAgICAgICAgICAgICAgICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogNDE5CisgICAgICAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNDkKKyAgICAgICAgICAgICAgICAgICAgIEF0dHJzICAgICA6CisgICAgICAgICAgICAgICBEV19UQUdfc3VicHJvZ3JhbQorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IGZvbworICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDQyMQorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE1MQorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSBkZWNsYXJhdGlvbiBleHRlcm5hbCB0eXBlCisgICAgICAgICAgICAgICAgICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogNDM0CisgICAgICAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNjQKKyAgICAgICAgICAgICAgICAgICAgIEF0dHJzICAgICA6CisgICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiBpbnQKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNDM3CisgICAgICAgICAgIENVIG9mZnNldCA6IDE2NworICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZworICAgICAgICAgICBieXRlIHNpemUgOiA0CisgICAgICAgICAgRFdfVEFHX3ZhcmlhYmxlCisgICAgICAgICAgIE5hbWUgICAgICA6IGEKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNDQ0CisgICAgICAgICAgIENVIG9mZnNldCA6IDE3NAorICAgICAgICAgICBBdHRycyAgICAgOiBsb2NhdGlvbiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgZXh0ZXJuYWwgdHlwZQorZmlsZTogdGVzdGZpbGUyCitOZXcgQ1U6IG9mZiA9IDAsIGhzaXplID0gMTEsIGFiID0gMCwgYXMgPSA0LCBvcyA9IDQKKyAgICAgRFdfVEFHX2NvbXBpbGVfdW5pdAorICAgICAgTmFtZSAgICAgIDogYi5jCisgICAgICBPZmZzZXQgICAgOiAxMQorICAgICAgQ1Ugb2Zmc2V0IDogMTEKKyAgICAgIEF0dHJzICAgICA6IG5hbWUgc3RtdF9saXN0IGxvd19wYyBoaWdoX3BjIGxhbmd1YWdlIGNvbXBfZGlyIHByb2R1Y2VyCisgICAgICBsb3cgUEMgICAgOiAweDEwMDAwNDcwCisgICAgICBoaWdoIFBDICAgOiAweDEwMDAwNDkwCisgICAgICBsYW5ndWFnZSAgOiAxCisgICAgICBkaXJlY3RvcnkgOiAvc2hvZ2dvdGgvZHJlcHBlcgorICAgICAgcHJvZHVjZXIgIDogR05VIEMgMi45Ni1sYXVyZWwtMDAwOTEyCisgICAgICAgICAgRFdfVEFHX3N1YnByb2dyYW0KKyAgICAgICAgICAgTmFtZSAgICAgIDogYmFyCisgICAgICAgICAgIE9mZnNldCAgICA6IDcyCisgICAgICAgICAgIENVIG9mZnNldCA6IDcyCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgbG93X3BjIGhpZ2hfcGMgcHJvdG90eXBlZCBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIGZyYW1lX2Jhc2UgdHlwZQorICAgICAgICAgICBsb3cgUEMgICAgOiAweDEwMDAwNDcwCisgICAgICAgICAgIGhpZ2ggUEMgICA6IDB4MTAwMDA0OTAKKyAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6IGludAorICAgICAgICAgICBPZmZzZXQgICAgOiA5NQorICAgICAgICAgICBDVSBvZmZzZXQgOiA5NQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZworICAgICAgICAgICBieXRlIHNpemUgOiA0CisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogc2l6ZV90CisgICAgICAgICAgIE9mZnNldCAgICA6IDEwMgorICAgICAgICAgICBDVSBvZmZzZXQgOiAxMDIKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6IHVuc2lnbmVkIGludAorICAgICAgICAgICBPZmZzZXQgICAgOiAxMTYKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTE2CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgYnl0ZV9zaXplIGVuY29kaW5nCisgICAgICAgICAgIGJ5dGUgc2l6ZSA6IDQKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2dudWNfdmFfbGlzdAorICAgICAgICAgICBPZmZzZXQgICAgOiAxMzIKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTMyCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX2FycmF5X3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogX19idWlsdGluX3ZhX2xpc3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMTU0CisgICAgICAgICAgIENVIG9mZnNldCA6IDE1NAorICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIG5hbWUgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX3N1YnJhbmdlX3R5cGUKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE4MQorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE4MQorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHVwcGVyX2JvdW5kIHR5cGUKKyAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6IHVuc2lnbmVkIGludAorICAgICAgICAgICBPZmZzZXQgICAgOiAxODgKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTg4CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgYnl0ZV9zaXplIGVuY29kaW5nCisgICAgICAgICAgIGJ5dGUgc2l6ZSA6IDQKKyAgICAgICAgICBEV19UQUdfc3RydWN0dXJlX3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogX192YV9saXN0X3RhZworICAgICAgICAgICBPZmZzZXQgICAgOiAyMDQKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjA0CisgICAgICAgICAgIEF0dHJzICAgICA6IHNpYmxpbmcgbmFtZSBieXRlX3NpemUgZGVjbF9maWxlIGRlY2xfbGluZQorICAgICAgICAgICBieXRlIHNpemUgOiAxMgorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IGdwcgorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDIyNgorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDIyNgorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogZnByCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMjQwCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjQwCisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBvdmVyZmxvd19hcmdfYXJlYQorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDI1NAorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDI1NAorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogcmVnX3NhdmVfYXJlYQorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDI4MgorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDI4MgorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiB1bnNpZ25lZCBjaGFyCisgICAgICAgICAgIE9mZnNldCAgICA6IDMwNworICAgICAgICAgICBDVSBvZmZzZXQgOiAzMDcKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKKyAgICAgICAgICAgYnl0ZSBzaXplIDogMQorICAgICAgICAgIERXX1RBR19wb2ludGVyX3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMzI0CisgICAgICAgICAgIENVIG9mZnNldCA6IDMyNAorICAgICAgICAgICBBdHRycyAgICAgOiBieXRlX3NpemUKKyAgICAgICAgICAgYnl0ZSBzaXplIDogNAorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fdV9jaGFyCisgICAgICAgICAgIE9mZnNldCAgICA6IDMyNgorICAgICAgICAgICBDVSBvZmZzZXQgOiAzMjYKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX3Vfc2hvcnQKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMzQyCisgICAgICAgICAgIENVIG9mZnNldCA6IDM0MgorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR19iYXNlX3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogc2hvcnQgdW5zaWduZWQgaW50CisgICAgICAgICAgIE9mZnNldCAgICA6IDM1OQorICAgICAgICAgICBDVSBvZmZzZXQgOiAzNTkKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKKyAgICAgICAgICAgYnl0ZSBzaXplIDogMgorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fdV9pbnQKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMzgxCisgICAgICAgICAgIENVIG9mZnNldCA6IDM4MQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fdV9sb25nCisgICAgICAgICAgIE9mZnNldCAgICA6IDM5NgorICAgICAgICAgICBDVSBvZmZzZXQgOiAzOTYKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6IGxvbmcgdW5zaWduZWQgaW50CisgICAgICAgICAgIE9mZnNldCAgICA6IDQxMgorICAgICAgICAgICBDVSBvZmZzZXQgOiA0MTIKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKKyAgICAgICAgICAgYnl0ZSBzaXplIDogNAorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fdV9xdWFkX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNDMzCisgICAgICAgICAgIENVIG9mZnNldCA6IDQzMworICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR19iYXNlX3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogbG9uZyBsb25nIHVuc2lnbmVkIGludAorICAgICAgICAgICBPZmZzZXQgICAgOiA0NTEKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNDUxCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgYnl0ZV9zaXplIGVuY29kaW5nCisgICAgICAgICAgIGJ5dGUgc2l6ZSA6IDgKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX3F1YWRfdAorICAgICAgICAgICBPZmZzZXQgICAgOiA0NzcKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNDc3CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiBsb25nIGxvbmcgaW50CisgICAgICAgICAgIE9mZnNldCAgICA6IDQ5MworICAgICAgICAgICBDVSBvZmZzZXQgOiA0OTMKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKKyAgICAgICAgICAgYnl0ZSBzaXplIDogOAorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9faW50OF90CisgICAgICAgICAgIE9mZnNldCAgICA6IDUxMAorICAgICAgICAgICBDVSBvZmZzZXQgOiA1MTAKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6IHNpZ25lZCBjaGFyCisgICAgICAgICAgIE9mZnNldCAgICA6IDUyNgorICAgICAgICAgICBDVSBvZmZzZXQgOiA1MjYKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKKyAgICAgICAgICAgYnl0ZSBzaXplIDogMQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fdWludDhfdAorICAgICAgICAgICBPZmZzZXQgICAgOiA1NDEKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNTQxCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX19pbnQxNl90CisgICAgICAgICAgIE9mZnNldCAgICA6IDU1OAorICAgICAgICAgICBDVSBvZmZzZXQgOiA1NTgKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6IHNob3J0IGludAorICAgICAgICAgICBPZmZzZXQgICAgOiA1NzUKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNTc1CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgYnl0ZV9zaXplIGVuY29kaW5nCisgICAgICAgICAgIGJ5dGUgc2l6ZSA6IDIKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX3VpbnQxNl90CisgICAgICAgICAgIE9mZnNldCAgICA6IDU4OAorICAgICAgICAgICBDVSBvZmZzZXQgOiA1ODgKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2ludDMyX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNjA2CisgICAgICAgICAgIENVIG9mZnNldCA6IDYwNgorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fdWludDMyX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNjIzCisgICAgICAgICAgIENVIG9mZnNldCA6IDYyMworICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9faW50NjRfdAorICAgICAgICAgICBPZmZzZXQgICAgOiA2NDEKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNjQxCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX191aW50NjRfdAorICAgICAgICAgICBPZmZzZXQgICAgOiA2NTgKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNjU4CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX19xYWRkcl90CisgICAgICAgICAgIE9mZnNldCAgICA6IDY3NgorICAgICAgICAgICBDVSBvZmZzZXQgOiA2NzYKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfcG9pbnRlcl90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgIE9mZnNldCAgICA6IDY5MworICAgICAgICAgICBDVSBvZmZzZXQgOiA2OTMKKyAgICAgICAgICAgQXR0cnMgICAgIDogYnl0ZV9zaXplIHR5cGUKKyAgICAgICAgICAgYnl0ZSBzaXplIDogNAorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fZGV2X3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNjk5CisgICAgICAgICAgIENVIG9mZnNldCA6IDY5OQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fdWlkX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNzE0CisgICAgICAgICAgIENVIG9mZnNldCA6IDcxNAorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fZ2lkX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNzI5CisgICAgICAgICAgIENVIG9mZnNldCA6IDcyOQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9faW5vX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNzQ0CisgICAgICAgICAgIENVIG9mZnNldCA6IDc0NAorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fbW9kZV90CisgICAgICAgICAgIE9mZnNldCAgICA6IDc1OQorICAgICAgICAgICBDVSBvZmZzZXQgOiA3NTkKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX25saW5rX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNzc1CisgICAgICAgICAgIENVIG9mZnNldCA6IDc3NQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fb2ZmX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogNzkyCisgICAgICAgICAgIENVIG9mZnNldCA6IDc5MgorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR19iYXNlX3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogbG9uZyBpbnQKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogODA3CisgICAgICAgICAgIENVIG9mZnNldCA6IDgwNworICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZworICAgICAgICAgICBieXRlIHNpemUgOiA0CisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX19sb2ZmX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogODE5CisgICAgICAgICAgIENVIG9mZnNldCA6IDgxOQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fcGlkX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogODM1CisgICAgICAgICAgIENVIG9mZnNldCA6IDgzNQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fc3NpemVfdAorICAgICAgICAgICBPZmZzZXQgICAgOiA4NTAKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogODUwCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX19ybGltX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogODY3CisgICAgICAgICAgIENVIG9mZnNldCA6IDg2NworICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fcmxpbTY0X3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogODgzCisgICAgICAgICAgIENVIG9mZnNldCA6IDg4MworICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9faWRfdAorICAgICAgICAgICBPZmZzZXQgICAgOiA5MDEKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogOTAxCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgIE9mZnNldCAgICA6IDkxNQorICAgICAgICAgICBDVSBvZmZzZXQgOiA5MTUKKyAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBieXRlX3NpemUgZGVjbF9maWxlIGRlY2xfbGluZQorICAgICAgICAgICBieXRlIHNpemUgOiA4CisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX192YWwKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiA5MjMKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiA5MjMKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR19hcnJheV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgIE9mZnNldCAgICA6IDk0MAorICAgICAgICAgICBDVSBvZmZzZXQgOiA5NDAKKyAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfc3VicmFuZ2VfdHlwZQorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogOTQ5CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogOTQ5CisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogdXBwZXJfYm91bmQgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fZnNpZF90CisgICAgICAgICAgIE9mZnNldCAgICA6IDk1NgorICAgICAgICAgICBDVSBvZmZzZXQgOiA5NTYKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2RhZGRyX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogOTcyCisgICAgICAgICAgIENVIG9mZnNldCA6IDk3MgorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fY2FkZHJfdAorICAgICAgICAgICBPZmZzZXQgICAgOiA5ODkKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogOTg5CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3BvaW50ZXJfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICBPZmZzZXQgICAgOiAxMDA2CisgICAgICAgICAgIENVIG9mZnNldCA6IDEwMDYKKyAgICAgICAgICAgQXR0cnMgICAgIDogYnl0ZV9zaXplIHR5cGUKKyAgICAgICAgICAgYnl0ZSBzaXplIDogNAorICAgICAgICAgIERXX1RBR19iYXNlX3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogY2hhcgorICAgICAgICAgICBPZmZzZXQgICAgOiAxMDEyCisgICAgICAgICAgIENVIG9mZnNldCA6IDEwMTIKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKKyAgICAgICAgICAgYnl0ZSBzaXplIDogMQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fdGltZV90CisgICAgICAgICAgIE9mZnNldCAgICA6IDEwMjAKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTAyMAorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fc3dibGtfdAorICAgICAgICAgICBPZmZzZXQgICAgOiAxMDM2CisgICAgICAgICAgIENVIG9mZnNldCA6IDEwMzYKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2Nsb2NrX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMTA1MworICAgICAgICAgICBDVSBvZmZzZXQgOiAxMDUzCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX19mZF9tYXNrCisgICAgICAgICAgIE9mZnNldCAgICA6IDEwNzAKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTA3MAorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR19zdHJ1Y3R1cmVfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICBPZmZzZXQgICAgOiAxMDg3CisgICAgICAgICAgIENVIG9mZnNldCA6IDEwODcKKyAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBieXRlX3NpemUgZGVjbF9maWxlIGRlY2xfbGluZQorICAgICAgICAgICBieXRlIHNpemUgOiAxMjgKKyAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfX2Zkc19iaXRzCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTA5NQorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDEwOTUKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR19hcnJheV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgIE9mZnNldCAgICA6IDExMTcKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTExNworICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19zdWJyYW5nZV90eXBlCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxMTI2CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTEyNgorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHVwcGVyX2JvdW5kIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2ZkX3NldAorICAgICAgICAgICBPZmZzZXQgICAgOiAxMTMzCisgICAgICAgICAgIENVIG9mZnNldCA6IDExMzMKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2tleV90CisgICAgICAgICAgIE9mZnNldCAgICA6IDExNDkKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTE0OQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9faXBjX3BpZF90CisgICAgICAgICAgIE9mZnNldCAgICA6IDExNjQKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTE2NAorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fYmxrY250X3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMTE4MworICAgICAgICAgICBDVSBvZmZzZXQgOiAxMTgzCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX19ibGtjbnQ2NF90CisgICAgICAgICAgIE9mZnNldCAgICA6IDEyMDEKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTIwMQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fZnNibGtjbnRfdAorICAgICAgICAgICBPZmZzZXQgICAgOiAxMjIxCisgICAgICAgICAgIENVIG9mZnNldCA6IDEyMjEKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2ZzYmxrY250NjRfdAorICAgICAgICAgICBPZmZzZXQgICAgOiAxMjQxCisgICAgICAgICAgIENVIG9mZnNldCA6IDEyNDEKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2ZzZmlsY250X3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMTI2MworICAgICAgICAgICBDVSBvZmZzZXQgOiAxMjYzCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX19mc2ZpbGNudDY0X3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMTI4MworICAgICAgICAgICBDVSBvZmZzZXQgOiAxMjgzCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX19pbm82NF90CisgICAgICAgICAgIE9mZnNldCAgICA6IDEzMDUKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTMwNQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9fb2ZmNjRfdAorICAgICAgICAgICBPZmZzZXQgICAgOiAxMzIyCisgICAgICAgICAgIENVIG9mZnNldCA6IDEzMjIKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX3Rfc2NhbGFyX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMTMzOQorICAgICAgICAgICBDVSBvZmZzZXQgOiAxMzM5CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX190X3VzY2FsYXJfdAorICAgICAgICAgICBPZmZzZXQgICAgOiAxMzU5CisgICAgICAgICAgIENVIG9mZnNldCA6IDEzNTkKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2ludHB0cl90CisgICAgICAgICAgIE9mZnNldCAgICA6IDEzODAKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTM4MAorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR19zdHJ1Y3R1cmVfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fRklMRQorICAgICAgICAgICBPZmZzZXQgICAgOiAxMzk4CisgICAgICAgICAgIENVIG9mZnNldCA6IDEzOTgKKyAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBuYW1lIGJ5dGVfc2l6ZSBkZWNsX2ZpbGUgZGVjbF9saW5lCisgICAgICAgICAgIGJ5dGUgc2l6ZSA6IDE1MgorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9mbGFncworICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE0MTUKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNDE1CisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fcmVhZF9wdHIKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNDMyCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTQzMgorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX0lPX3JlYWRfZW5kCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTQ1NQorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE0NTUKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9JT19yZWFkX2Jhc2UKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNDc4CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTQ3OAorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX0lPX3dyaXRlX2Jhc2UKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNTAyCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTUwMgorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX0lPX3dyaXRlX3B0cgorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE1MjcKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNTI3CisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fd3JpdGVfZW5kCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTU1MQorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE1NTEKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9JT19idWZfYmFzZQorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE1NzUKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNTc1CisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fYnVmX2VuZAorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE1OTgKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNTk4CisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fc2F2ZV9iYXNlCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTYyMAorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE2MjAKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9JT19iYWNrdXBfYmFzZQorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE2NDQKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNjQ0CisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fc2F2ZV9lbmQKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNjcwCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTY3MAorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX21hcmtlcnMKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNjkzCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTY5MworICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX2NoYWluCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTcxMgorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE3MTIKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9maWxlbm8KKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNzI5CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTcyOQorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX2Jsa3NpemUKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNzQ3CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTc0NworICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX29sZF9vZmZzZXQKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNzY2CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTc2NgorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX2N1cl9jb2x1bW4KKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNzg4CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTc4OAorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX3Z0YWJsZV9vZmZzZXQKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxODEwCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTgxMAorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX3Nob3J0YnVmCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTgzNQorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE4MzUKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9sb2NrCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTg1NQorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE4NTUKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9vZmZzZXQKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxODcxCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTg3MQorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX3VudXNlZDIKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxODg5CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTg4OQorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6IF9JT19tYXJrZXIKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMTkwOQorICAgICAgICAgICBDVSBvZmZzZXQgOiAxOTA5CisgICAgICAgICAgIEF0dHJzICAgICA6IHNpYmxpbmcgbmFtZSBieXRlX3NpemUgZGVjbF9maWxlIGRlY2xfbGluZQorICAgICAgICAgICBieXRlIHNpemUgOiAxMgorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9uZXh0CisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTkyOAorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE5MjgKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9zYnVmCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTk0NAorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE5NDQKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9wb3MKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxOTYwCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTk2MAorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3BvaW50ZXJfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICBPZmZzZXQgICAgOiAxOTc2CisgICAgICAgICAgIENVIG9mZnNldCA6IDE5NzYKKyAgICAgICAgICAgQXR0cnMgICAgIDogYnl0ZV9zaXplIHR5cGUKKyAgICAgICAgICAgYnl0ZSBzaXplIDogNAorICAgICAgICAgIERXX1RBR19wb2ludGVyX3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMTk4MgorICAgICAgICAgICBDVSBvZmZzZXQgOiAxOTgyCisgICAgICAgICAgIEF0dHJzICAgICA6IGJ5dGVfc2l6ZSB0eXBlCisgICAgICAgICAgIGJ5dGUgc2l6ZSA6IDQKKyAgICAgICAgICBEV19UQUdfYXJyYXlfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICBPZmZzZXQgICAgOiAxOTg4CisgICAgICAgICAgIENVIG9mZnNldCA6IDE5ODgKKyAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfc3VicmFuZ2VfdHlwZQorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTk5NworICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE5OTcKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiB1cHBlcl9ib3VuZCB0eXBlCisgICAgICAgICAgRFdfVEFHX3BvaW50ZXJfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICBPZmZzZXQgICAgOiAyMDA0CisgICAgICAgICAgIENVIG9mZnNldCA6IDIwMDQKKyAgICAgICAgICAgQXR0cnMgICAgIDogYnl0ZV9zaXplCisgICAgICAgICAgIGJ5dGUgc2l6ZSA6IDQKKyAgICAgICAgICBEV19UQUdfYXJyYXlfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICBPZmZzZXQgICAgOiAyMDA2CisgICAgICAgICAgIENVIG9mZnNldCA6IDIwMDYKKyAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfc3VicmFuZ2VfdHlwZQorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMjAxNQorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDIwMTUKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiB1cHBlcl9ib3VuZCB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogRklMRQorICAgICAgICAgICBPZmZzZXQgICAgOiAyMDIyCisgICAgICAgICAgIENVIG9mZnNldCA6IDIwMjIKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiB3Y2hhcl90CisgICAgICAgICAgIE9mZnNldCAgICA6IDIwMzQKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjAzNAorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IHdpbnRfdAorICAgICAgICAgICBPZmZzZXQgICAgOiAyMDUwCisgICAgICAgICAgIENVIG9mZnNldCA6IDIwNTAKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfR19pbnQxNl90CisgICAgICAgICAgIE9mZnNldCAgICA6IDIwNjUKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjA2NQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9HX2ludDMyX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjA4MworICAgICAgICAgICBDVSBvZmZzZXQgOiAyMDgzCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX0dfdWludDE2X3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjEwMQorICAgICAgICAgICBDVSBvZmZzZXQgOiAyMTAxCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogX0dfdWludDMyX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjEyMAorICAgICAgICAgICBDVSBvZmZzZXQgOiAyMTIwCisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6IF9JT19qdW1wX3QKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjEzOQorICAgICAgICAgICBDVSBvZmZzZXQgOiAyMTM5CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbGFyYXRpb24KKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fbG9ja190CisgICAgICAgICAgIE9mZnNldCAgICA6IDIxNTIKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjE1MgorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fRklMRQorICAgICAgICAgICBPZmZzZXQgICAgOiAyMTY2CisgICAgICAgICAgIENVIG9mZnNldCA6IDIxNjYKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfc3RydWN0dXJlX3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogX0lPX0ZJTEVfcGx1cworICAgICAgICAgICBPZmZzZXQgICAgOiAyMTgyCisgICAgICAgICAgIENVIG9mZnNldCA6IDIxODIKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsYXJhdGlvbgorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9faW9fcmVhZF9mbgorICAgICAgICAgICBPZmZzZXQgICAgOiAyMTk4CisgICAgICAgICAgIENVIG9mZnNldCA6IDIxOTgKKyAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKKyAgICAgICAgICBEV19UQUdfc3Vicm91dGluZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgIE9mZnNldCAgICA6IDIyMTkKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjIxOQorICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIHByb3RvdHlwZWQgdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDIyMjkKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjI5CisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDIyMzQKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjM0CisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogdHlwZQorICAgICAgICAgICAgICAgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDIyMzkKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjM5CisgICAgICAgICAgICAgICAgQXR0cnMgICAgIDogdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IF9faW9fd3JpdGVfZm4KKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjI0NQorICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjQ1CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICBPZmZzZXQgICAgOiAyMjY3CisgICAgICAgICAgIENVIG9mZnNldCA6IDIyNjcKKyAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBwcm90b3R5cGVkIHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMjc3CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjI3NworICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMjgyCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjI4MgorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMjg3CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjI4NworICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKKyAgICAgICAgICBEV19UQUdfcG9pbnRlcl90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgIE9mZnNldCAgICA6IDIyOTMKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjI5MworICAgICAgICAgICBBdHRycyAgICAgOiBieXRlX3NpemUgdHlwZQorICAgICAgICAgICBieXRlIHNpemUgOiA0CisgICAgICAgICAgRFdfVEFHX2NvbnN0X3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjI5OQorICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjk5CisgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2lvX3NlZWtfZm4KKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjMwNAorICAgICAgICAgICBDVSBvZmZzZXQgOiAyMzA0CisgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCisgICAgICAgICAgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgorICAgICAgICAgICBPZmZzZXQgICAgOiAyMzI1CisgICAgICAgICAgIENVIG9mZnNldCA6IDIzMjUKKyAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBwcm90b3R5cGVkIHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMzM1CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjMzNQorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMzQwCisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjM0MAorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKKyAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMzQ1CisgICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjM0NQorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKKyAgICAgICAgICBEV19UQUdfdHlwZWRlZgorICAgICAgICAgICBOYW1lICAgICAgOiBfX2lvX2Nsb3NlX2ZuCisgICAgICAgICAgIE9mZnNldCAgICA6IDIzNTEKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjM1MQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR19zdWJyb3V0aW5lX3R5cGUKKyAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjM3MworICAgICAgICAgICBDVSBvZmZzZXQgOiAyMzczCisgICAgICAgICAgIEF0dHJzICAgICA6IHNpYmxpbmcgcHJvdG90eXBlZCB0eXBlCisgICAgICAgICAgICAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlcgorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMjM4MworICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDIzODMKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiB0eXBlCisgICAgICAgICAgRFdfVEFHX3R5cGVkZWYKKyAgICAgICAgICAgTmFtZSAgICAgIDogZnBvc190CisgICAgICAgICAgIE9mZnNldCAgICA6IDIzODkKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjM4OQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorICAgICAgICAgIERXX1RBR190eXBlZGVmCisgICAgICAgICAgIE5hbWUgICAgICA6IG9mZl90CisgICAgICAgICAgIE9mZnNldCAgICA6IDI0MDMKKyAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjQwMworICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQorTmV3IENVOiBvZmYgPSAyNDE4LCBoc2l6ZSA9IDExLCBhYiA9IDIxMywgYXMgPSA0LCBvcyA9IDQKKyAgICAgRFdfVEFHX2NvbXBpbGVfdW5pdAorICAgICAgTmFtZSAgICAgIDogZi5jCisgICAgICBPZmZzZXQgICAgOiAyNDI5CisgICAgICBDVSBvZmZzZXQgOiAxMQorICAgICAgQXR0cnMgICAgIDogbmFtZSBzdG10X2xpc3QgbG93X3BjIGhpZ2hfcGMgbGFuZ3VhZ2UgY29tcF9kaXIgcHJvZHVjZXIKKyAgICAgIGxvdyBQQyAgICA6IDB4MTAwMDA0OTAKKyAgICAgIGhpZ2ggUEMgICA6IDB4MTAwMDA0YjAKKyAgICAgIGxhbmd1YWdlICA6IDEKKyAgICAgIGRpcmVjdG9yeSA6IC9zaG9nZ290aC9kcmVwcGVyCisgICAgICBwcm9kdWNlciAgOiBHTlUgQyAyLjk2LWxhdXJlbC0wMDA5MTIKKyAgICAgICAgICBEV19UQUdfc3VicHJvZ3JhbQorICAgICAgICAgICBOYW1lICAgICAgOiBmb28KKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjQ5MAorICAgICAgICAgICBDVSBvZmZzZXQgOiA3MgorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGxvd19wYyBoaWdoX3BjIHByb3RvdHlwZWQgZGVjbF9maWxlIGRlY2xfbGluZSBleHRlcm5hbCBmcmFtZV9iYXNlIHR5cGUKKyAgICAgICAgICAgbG93IFBDICAgIDogMHgxMDAwMDQ5MAorICAgICAgICAgICBoaWdoIFBDICAgOiAweDEwMDAwNGIwCisgICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQorICAgICAgICAgICBOYW1lICAgICAgOiBpbnQKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjUxMworICAgICAgICAgICBDVSBvZmZzZXQgOiA5NQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZworICAgICAgICAgICBieXRlIHNpemUgOiA0CitOZXcgQ1U6IG9mZiA9IDI1MjEsIGhzaXplID0gMTEsIGFiID0gMjY3LCBhcyA9IDQsIG9zID0gNAorICAgICBEV19UQUdfY29tcGlsZV91bml0CisgICAgICBOYW1lICAgICAgOiBtLmMKKyAgICAgIE9mZnNldCAgICA6IDI1MzIKKyAgICAgIENVIG9mZnNldCA6IDExCisgICAgICBBdHRycyAgICAgOiBuYW1lIHN0bXRfbGlzdCBsb3dfcGMgaGlnaF9wYyBsYW5ndWFnZSBjb21wX2RpciBwcm9kdWNlcgorICAgICAgbG93IFBDICAgIDogMHgxMDAwMDRiMAorICAgICAgaGlnaCBQQyAgIDogMHgxMDAwMDUxNAorICAgICAgbGFuZ3VhZ2UgIDogMQorICAgICAgZGlyZWN0b3J5IDogL3Nob2dnb3RoL2RyZXBwZXIKKyAgICAgIHByb2R1Y2VyICA6IEdOVSBDIDIuOTYtbGF1cmVsLTAwMDkxMgorICAgICAgICAgIERXX1RBR19zdWJwcm9ncmFtCisgICAgICAgICAgIE5hbWUgICAgICA6IG1haW4KKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjU5MworICAgICAgICAgICBDVSBvZmZzZXQgOiA3MgorICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIG5hbWUgbG93X3BjIGhpZ2hfcGMgcHJvdG90eXBlZCBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIGZyYW1lX2Jhc2UgdHlwZQorICAgICAgICAgICBsb3cgUEMgICAgOiAweDEwMDAwNGIwCisgICAgICAgICAgIGhpZ2ggUEMgICA6IDB4MTAwMDA1MTQKKyAgICAgICAgICAgICAgIERXX1RBR19zdWJwcm9ncmFtCisgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogYmFyCisgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMjYyMQorICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDEwMAorICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHNpYmxpbmcgbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIGRlY2xhcmF0aW9uIGV4dGVybmFsIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCisgICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyNjM4CisgICAgICAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxMTcKKyAgICAgICAgICAgICAgICAgICAgIEF0dHJzICAgICA6CisgICAgICAgICAgICAgICBEV19UQUdfc3VicHJvZ3JhbQorICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IGZvbworICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDI2NDAKKyAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxMTkKKyAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgZGVjbGFyYXRpb24gZXh0ZXJuYWwgdHlwZQorICAgICAgICAgICAgICAgICAgICBEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKKyAgICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDI2NTMKKyAgICAgICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDEzMgorICAgICAgICAgICAgICAgICAgICAgQXR0cnMgICAgIDoKKyAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCisgICAgICAgICAgIE5hbWUgICAgICA6IGludAorICAgICAgICAgICBPZmZzZXQgICAgOiAyNjU2CisgICAgICAgICAgIENVIG9mZnNldCA6IDEzNQorICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZworICAgICAgICAgICBieXRlIHNpemUgOiA0CisgICAgICAgICAgRFdfVEFHX3ZhcmlhYmxlCisgICAgICAgICAgIE5hbWUgICAgICA6IGEKKyAgICAgICAgICAgT2Zmc2V0ICAgIDogMjY2MworICAgICAgICAgICBDVSBvZmZzZXQgOiAxNDIKKyAgICAgICAgICAgQXR0cnMgICAgIDogbG9jYXRpb24gbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIHR5cGUKK0VPRgorCitybSAtZiB0ZXN0ZmlsZTIgdGVzdGZpbGU1IHNob3ctZGllLWluZm8ub3V0CisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuLXN0cmlwLXRlc3Quc2ggYi90ZXN0cy9ydW4tc3RyaXAtdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjZlYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnVuLXN0cmlwLXRlc3Quc2gKQEAgLTAsMCArMSw1MSBAQAorIyEgL2Jpbi9zaAorIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDUgUmVkIEhhdCwgSW5jLgorIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgorIworIyBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisjIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyMgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisjIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuCitzZXQgLWUKKworb3JpZ2luYWw9JHtvcmlnaW5hbDotdGVzdGZpbGUxMX0KK3N0cmlwcGVkPSR7c3RyaXBwZWQ6LXRlc3RmaWxlN30KK2RlYnVnb3V0PSR7ZGVidWdmaWxlOistZiB0ZXN0ZmlsZS5kZWJ1Zy50ZW1wIC1GICRkZWJ1Z2ZpbGV9CisKKyMgRG9uJ3QgZmFpbCBpZiB3ZSBjYW5ub3QgZGVjb21wcmVzcyB0aGUgZmlsZS4KK2J1bnppcDIgLWMgJHNyY2Rpci8kb3JpZ2luYWwuYnoyID4gJG9yaWdpbmFsIDI+L2Rldi9udWxsIHx8IGV4aXQgMAorCisjIERvbid0IGZhaWwgaWYgd2UgY2Fubm90IGRlY29tcHJlc3MgdGhlIGZpbGUuCitidW56aXAyIC1jICRzcmNkaXIvJHN0cmlwcGVkLmJ6MiA+ICRzdHJpcHBlZCAyPi9kZXYvbnVsbCB8fCBleGl0IDAKKworIyBEb24ndCBmYWlsIGlmIHdlIGNhbm5vdCBkZWNvbXByZXNzIHRoZSBmaWxlLgordGVzdCAteiAiJGRlYnVnZmlsZSIgfHwKK2J1bnppcDIgLWMgJHNyY2Rpci8kZGVidWdmaWxlLmJ6MiA+ICRkZWJ1Z2ZpbGUgMj4vZGV2L251bGwgfHwgZXhpdCAwCisKK0xEX0xJQlJBUllfUEFUSD0uLi9saWJlYmw6Li4vbGliZWxmJHtMRF9MSUJSQVJZX1BBVEg6Kzp9JExEX0xJQlJBUllfUEFUSCBcCisgIC4uL3NyYy9zdHJpcCAtbyB0ZXN0ZmlsZS50ZW1wICRkZWJ1Z291dCAkb3JpZ2luYWwKKworY21wICRzdHJpcHBlZCB0ZXN0ZmlsZS50ZW1wCisKKyMgQ2hlY2sgZWxmbGludCBhbmQgdGhlIGV4cGVjdGVkIHJlc3VsdC4KK0xEX0xJQlJBUllfUEFUSD0uLi9saWJlYmw6Li4vbGliZWxmJHtMRF9MSUJSQVJZX1BBVEg6Kzp9JExEX0xJQlJBUllfUEFUSCBcCisgIC4uL3NyYy9lbGZsaW50IC1xIHRlc3RmaWxlLnRlbXAKKwordGVzdCAteiAiJGRlYnVnZmlsZSIgfHwgeworY21wICRkZWJ1Z2ZpbGUgdGVzdGZpbGUuZGVidWcudGVtcAorCisjIENoZWNrIGVsZmxpbnQgYW5kIHRoZSBleHBlY3RlZCByZXN1bHQuCitMRF9MSUJSQVJZX1BBVEg9Li4vbGliZWJsOi4uL2xpYmVsZiR7TERfTElCUkFSWV9QQVRIOis6fSRMRF9MSUJSQVJZX1BBVEggXAorICAuLi9zcmMvZWxmbGludCAtcSAtZCB0ZXN0ZmlsZS5kZWJ1Zy50ZW1wCisKK3JtIC1mICIkZGVidWdmaWxlIgorfQorCitybSAtZiAkb3JpZ2luYWwgJHN0cmlwcGVkIHRlc3RmaWxlLnRlbXAgdGVzdGZpbGUuZGVidWcudGVtcAorCitleGl0IDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3J1bi1zdHJpcC10ZXN0Mi5zaCBiL3Rlc3RzL3J1bi1zdHJpcC10ZXN0Mi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQzNjFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnVuLXN0cmlwLXRlc3QyLnNoCkBAIC0wLDAgKzEsMTcgQEAKKyMhIC9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorIyBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisjIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorIyAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLgorCitvcmlnaW5hbD10ZXN0ZmlsZTgKK3N0cmlwcGVkPXRlc3RmaWxlOQorLiAkc3JjZGlyL3J1bi1zdHJpcC10ZXN0LnNoCmRpZmYgLS1naXQgYS90ZXN0cy9ydW4tc3RyaXAtdGVzdDMuc2ggYi90ZXN0cy9ydW4tc3RyaXAtdGVzdDMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4YWM4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3J1bi1zdHJpcC10ZXN0My5zaApAQCAtMCwwICsxLDE3IEBACisjISAvYmluL3NoCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNSBSZWQgSGF0LCBJbmMuCisjIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyMgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorIyBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyMgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4KKworb3JpZ2luYWw9dGVzdGZpbGUxMgorc3RyaXBwZWQ9dGVzdGZpbGUxMworLiAkc3JjZGlyL3J1bi1zdHJpcC10ZXN0LnNoCmRpZmYgLS1naXQgYS90ZXN0cy9ydW4tc3RyaXAtdGVzdDQuc2ggYi90ZXN0cy9ydW4tc3RyaXAtdGVzdDQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5YmUyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3J1bi1zdHJpcC10ZXN0NC5zaApAQCAtMCwwICsxLDUgQEAKK29yaWdpbmFsPXRlc3RmaWxlMTEKK3N0cmlwcGVkPXRlc3RmaWxlMTUKK2RlYnVnZmlsZT10ZXN0ZmlsZTE1LmRlYnVnCisKKy4gJHNyY2Rpci9ydW4tc3RyaXAtdGVzdC5zaApkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuLXN0cmlwLXRlc3Q1LnNoIGIvdGVzdHMvcnVuLXN0cmlwLXRlc3Q1LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYTllYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ydW4tc3RyaXAtdGVzdDUuc2gKQEAgLTAsMCArMSw1IEBACitvcmlnaW5hbD10ZXN0ZmlsZTgKK3N0cmlwcGVkPXRlc3RmaWxlMTYKK2RlYnVnZmlsZT10ZXN0ZmlsZTE2LmRlYnVnCisKKy4gJHNyY2Rpci9ydW4tc3RyaXAtdGVzdC5zaApkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuLXN0cmlwLXRlc3Q2LnNoIGIvdGVzdHMvcnVuLXN0cmlwLXRlc3Q2LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZTVmMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ydW4tc3RyaXAtdGVzdDYuc2gKQEAgLTAsMCArMSw1IEBACitvcmlnaW5hbD10ZXN0ZmlsZTEyCitzdHJpcHBlZD10ZXN0ZmlsZTE3CitkZWJ1Z2ZpbGU9dGVzdGZpbGUxNy5kZWJ1ZworCisuICRzcmNkaXIvcnVuLXN0cmlwLXRlc3Quc2gKZGlmZiAtLWdpdCBhL3Rlc3RzL3NhcmlkeC5jIGIvdGVzdHMvc2FyaWR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiYzg5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NhcmlkeC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworc3RhdGljIGNvbnN0IGNoYXIgKm1hY2hpbmVzW10gPQoreworI2RlZmluZSBNQUNISU5FKG5hbWUpIFtuYW1lXSA9ICNuYW1lCisgIE1BQ0hJTkUgKEVNX05PTkUpLAorICBNQUNISU5FIChFTV9NMzIpLAorICBNQUNISU5FIChFTV9TUEFSQyksCisgIE1BQ0hJTkUgKEVNXzM4NiksCisgIE1BQ0hJTkUgKEVNXzY4SyksCisgIE1BQ0hJTkUgKEVNXzg4SyksCisgIE1BQ0hJTkUgKEVNXzg2MCksCisgIE1BQ0hJTkUgKEVNX01JUFMpLAorICBNQUNISU5FIChFTV9NSVBTX1JTM19MRSksCisgIE1BQ0hJTkUgKEVNX1BBUklTQyksCisgIE1BQ0hJTkUgKEVNX1ZQUDUwMCksCisgIE1BQ0hJTkUgKEVNX1NQQVJDMzJQTFVTKSwKKyAgTUFDSElORSAoRU1fOTYwKSwKKyAgTUFDSElORSAoRU1fUFBDKSwKKyAgTUFDSElORSAoRU1fUFBDNjQpLAorICBNQUNISU5FIChFTV9WODAwKSwKKyAgTUFDSElORSAoRU1fRlIyMCksCisgIE1BQ0hJTkUgKEVNX1JIMzIpLAorICBNQUNISU5FIChFTV9SQ0UpLAorICBNQUNISU5FIChFTV9BUk0pLAorICBNQUNISU5FIChFTV9GQUtFX0FMUEhBKSwKKyAgTUFDSElORSAoRU1fU0gpLAorICBNQUNISU5FIChFTV9TUEFSQ1Y5KSwKKyAgTUFDSElORSAoRU1fVFJJQ09SRSksCisgIE1BQ0hJTkUgKEVNX0FSQyksCisgIE1BQ0hJTkUgKEVNX0g4XzMwMCksCisgIE1BQ0hJTkUgKEVNX0g4XzMwMEgpLAorICBNQUNISU5FIChFTV9IOFMpLAorICBNQUNISU5FIChFTV9IOF81MDApLAorICBNQUNISU5FIChFTV9JQV82NCksCisgIE1BQ0hJTkUgKEVNX01JUFNfWCksCisgIE1BQ0hJTkUgKEVNX0NPTERGSVJFKSwKKyAgTUFDSElORSAoRU1fNjhIQzEyKSwKKyAgTUFDSElORSAoRU1fTU1BKSwKKyAgTUFDSElORSAoRU1fUENQKSwKKyAgTUFDSElORSAoRU1fTkNQVSksCisgIE1BQ0hJTkUgKEVNX05EUjEpLAorICBNQUNISU5FIChFTV9TVEFSQ09SRSksCisgIE1BQ0hJTkUgKEVNX01FMTYpLAorICBNQUNISU5FIChFTV9TVDEwMCksCisgIE1BQ0hJTkUgKEVNX1RJTllKKSwKKyAgTUFDSElORSAoRU1fRlg2NiksCisgIE1BQ0hJTkUgKEVNX1NUOVBMVVMpLAorICBNQUNISU5FIChFTV9TVDcpLAorICBNQUNISU5FIChFTV82OEhDMTYpLAorICBNQUNISU5FIChFTV82OEhDMTEpLAorICBNQUNISU5FIChFTV82OEhDMDgpLAorICBNQUNISU5FIChFTV82OEhDMDUpLAorICBNQUNISU5FIChFTV9TVlgpLAorICBNQUNISU5FIChFTV9TVDE5KSwKKyAgTUFDSElORSAoRU1fVkFYKQorfTsKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCBmZDsKKyAgRWxmICplbGY7CisgIEVsZl9DbWQgY21kOworICBzaXplX3QgbjsKKyAgaW50IGFyZyA9IDE7CisgIGludCB2ZXJib3NlID0gMDsKKworICAvKiBSZWNvZ25pemUgb3B0aW9uYWwgdmVyYm9zaXR5IGZsYWcuICAqLworICBpZiAoYXJnIDwgYXJnYyAmJiBzdHJjbXAgKGFyZ3ZbYXJnXSwgIi12IikgPT0gMCkKKyAgICB7CisgICAgICB2ZXJib3NlID0gMTsKKyAgICAgICsrYXJnOworICAgIH0KKworICAvKiBBbnkgbW9yZSBhcmd1bWVudHMgYXZhaWxhYmxlLiAgKi8KKyAgaWYgKGFyZyA+PSBhcmdjKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJObyBpbnB1dCBmaWxlIGdpdmVuIik7CisKKyAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZS4gICovCisgIGZkID0gb3BlbiAoYXJndlthcmddLCBPX1JET05MWSk7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3IgKCJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogU2V0IHRoZSBFTEYgdmVyc2lvbiB3ZSBhcmUgdXNpbmcgaGVyZS4gICovCisgIGlmIChlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCkgPT0gRVZfTk9ORSkKKyAgICB7CisgICAgICBwdXRzICgiRUxGIGxpYnJhcnkgdG9vIG9sZCIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFN0YXJ0IHJlYWRpbmcgdGhlIGZpbGUuICAqLworICBjbWQgPSBFTEZfQ19SRUFEOworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIE5VTEwpOworICBpZiAoZWxmID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiZWxmX2JlZ2luOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBJZiBpdCBpcyBubyBhcmNoaXZlIHB1bnQuICAqLworICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfQVIpCisgICAgeworICAgICAgcHJpbnRmICgiJXMgaXMgbm90IGFuIGFyY2hpdmVcbiIsIGFyZ3ZbMV0pOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmICh2ZXJib3NlKQorICAgIHsKKyAgICAgIC8qIFRoZSB2ZXJib3NlIHZhcmlhbnQuICBXZSBwcmludCBhIGxvdCBvZiBpbmZvcm1hdGlvbi4gICovCisgICAgICBFbGYgKnN1YmVsZjsKKyAgICAgIGNoYXIgYnVmWzEwMF07CisgICAgICB0aW1lX3QgdDsKKworICAgICAgLyogR2V0IHRoZSBlbGVtZW50cyBvZiB0aGUgYXJjaGl2ZSBvbmUgYWZ0ZXIgdGhlIG90aGVyLiAgKi8KKyAgICAgIHdoaWxlICgoc3ViZWxmID0gZWxmX2JlZ2luIChmZCwgY21kLCBlbGYpKSAhPSBOVUxMKQorCXsKKwkgIC8qIFRoZSB0aGUgaGVhZGVyIGZvciB0aGlzIGVsZW1lbnQuICAqLworCSAgRWxmX0FyaGRyICphcmhkciA9IGVsZl9nZXRhcmhkciAoc3ViZWxmKTsKKworCSAgaWYgKGFyaGRyID09IE5VTEwpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IGFyaGRyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBzd2l0Y2ggKGVsZl9raW5kIChzdWJlbGYpKQorCSAgICB7CisJICAgIGNhc2UgRUxGX0tfRUxGOgorCSAgICAgIGZwdXRzICgiRUxGIGZpbGU6XG4iLCBzdGRvdXQpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRUxGX0tfQVI6CisJICAgICAgZnB1dHMgKCJhcmNoaXZlOlxuIiwgc3Rkb3V0KTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGZwdXRzICgidW5rbm93biBmaWxlOlxuIiwgc3Rkb3V0KTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBQcmludCBnZW5lcmFsIGluZm9ybWF0aW9uLiAgKi8KKwkgIHQgPSBhcmhkci0+YXJfZGF0ZTsKKwkgIHN0cmZ0aW1lIChidWYsIHNpemVvZiBidWYsICIlWS0lbS0lZFQlSDolTTolUyV6IiwgZ210aW1lICgmdCkpOworCSAgcHJpbnRmICgiICBuYW1lICAgICAgICAgOiBcIiVzXCJcbiIKKwkJICAiICB0aW1lICAgICAgICAgOiAlc1xuIgorCQkgICIgIHVpZCAgICAgICAgICA6ICVsZFxuIgorCQkgICIgIGdpZCAgICAgICAgICA6ICVsZFxuIgorCQkgICIgIG1vZGUgICAgICAgICA6ICVvXG4iCisJCSAgIiAgc2l6ZSAgICAgICAgIDogJWxkXG4iCisJCSAgIiAgcmF3bmFtZSAgICAgIDogXCIlc1wiXG4iLAorCQkgIGFyaGRyLT5hcl9uYW1lLAorCQkgIGJ1ZiwKKwkJICAobG9uZyBpbnQpIGFyaGRyLT5hcl91aWQsCisJCSAgKGxvbmcgaW50KSBhcmhkci0+YXJfZ2lkLAorCQkgIGFyaGRyLT5hcl9tb2RlLAorCQkgIChsb25nIGludCkgYXJoZHItPmFyX3NpemUsCisJCSAgYXJoZHItPmFyX3Jhd25hbWUpOworCisJICAvKiBGb3IgRUxGIGZpbGVzIHdlIGNhbiBwcm92aWRlIHNvbWUgbW9yZSBpbmZvcm1hdGlvbi4gICovCisJICBpZiAoZWxmX2tpbmQgKHN1YmVsZikgPT0gRUxGX0tfRUxGKQorCSAgICB7CisJICAgICAgR0VsZl9FaGRyIGVoZHI7CisKKwkgICAgICAvKiBHZXQgdGhlIEVMRiBoZWFkZXIuICAqLworCSAgICAgIGlmIChnZWxmX2dldGVoZHIgKHN1YmVsZiwgJmVoZHIpID09IE5VTEwpCisJCXByaW50ZiAoIiAgKioqIGNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgcHJpbnRmICgiICBiaW5hcnkgY2xhc3MgOiAlc1xuIiwKKwkJCSAgZWhkci5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyCisJCQkgID8gIkVMRkNMQVNTMzIiIDogIkVMRkNMQVNTNjQiKTsKKwkJICBwcmludGYgKCIgIGRhdGEgZW5jb2Rpbmc6ICVzXG4iLAorCQkJICBlaGRyLmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJMU0IKKwkJCSAgPyAiRUxGREFUQTJMU0IiIDogIkVMRkRBVEEyTVNCIik7CisJCSAgcHJpbnRmICgiICBiaW5hcnkgdHlwZSAgOiAlc1xuIiwKKwkJCSAgZWhkci5lX3R5cGUgPT0gRVRfUkVMCisJCQkgID8gInJlbG9jYXRhYmxlIgorCQkJICA6IChlaGRyLmVfdHlwZSA9PSBFVF9FWEVDCisJCQkgICAgID8gImV4ZWN1dGFibGUiCisJCQkgICAgIDogKGVoZHIuZV90eXBlID09IEVUX0RZTgorCQkJCT8gImR5bmFtaWMiCisJCQkJOiAiY29yZSBmaWxlIikpKTsKKwkJICBwcmludGYgKCIgIG1hY2hpbmUgICAgICA6ICVzXG4iLAorCQkJICAoZWhkci5lX21hY2hpbmUgPj0gKHNpemVvZiAobWFjaGluZXMpCisJCQkJCSAgICAgIC8gc2l6ZW9mIChtYWNoaW5lc1swXSkpCisJCQkgICB8fCBtYWNoaW5lc1tlaGRyLmVfbWFjaGluZV0gPT0gTlVMTCkKKwkJCSAgPyAiPz8/IgorCQkJICA6IG1hY2hpbmVzW2VoZHIuZV9tYWNoaW5lXSk7CisJCX0KKwkgICAgfQorCisJICAvKiBHZXQgbmV4dCBhcmNoaXZlIGVsZW1lbnQuICAqLworCSAgY21kID0gZWxmX25leHQgKHN1YmVsZik7CisJICBpZiAoZWxmX2VuZCAoc3ViZWxmKSAhPSAwKQorCSAgICBwcmludGYgKCJlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXNcbiIsCisJCSAgICBlbGZfZXJybXNnICgtMSkpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgc2ltcGxlIHZlcnNpb24uICBPbmx5IHByaW50IGEgYml0IG9mIGluZm9ybWF0aW9uLiAgKi8KKyAgICAgIEVsZl9BcnN5bSAqYXJzeW0gPSBlbGZfZ2V0YXJzeW0gKGVsZiwgJm4pOworCisgICAgICBpZiAobiA9PSAwKQorCXByaW50ZiAoIm5vIHN5bWJvbCB0YWJsZSBpbiBhcmNoaXZlOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGVsc2UKKwl7CisJICAtLW47CisKKwkgIHdoaWxlIChuLS0gPiAwKQorCSAgICBwcmludGYgKCJuYW1lID0gXCIlc1wiLCBvZmZzZXQgPSAlbGQsIGhhc2ggPSAlbHhcbiIsCisJCSAgICBhcnN5bVtuXS5hc19uYW1lLCAobG9uZyBpbnQpIGFyc3ltW25dLmFzX29mZiwKKwkJICAgIGFyc3ltW25dLmFzX2hhc2gpOworCX0KKyAgICB9CisKKyAgLyogRnJlZSB0aGUgRUxGIGhhbmRsZS4gICovCisgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCisgICAgcHJpbnRmICgiZXJyb3Igd2hpbGUgZnJlZWluZyBFTEYgZGVzY3JpcHRvcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisKKyAgLyogQ2xvc2UgdGhlIHVuZGVybHlpbmcgZmlsZS4gICovCisgIGNsb3NlIChmZCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zY25uYW1lcy5jIGIvdGVzdHMvc2NubmFtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGY0MjhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2NubmFtZXMuYwpAQCAtMCwwICsxLDg3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBFbGYgKmVsZjsKKyAgaW50IGZkOworICBHRWxmX0VoZHIgZWhkcjsKKyAgc2l6ZV90IHN0cm5keDsKKyAgRWxmX1NjbiAqc2NuOworCisgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICBwdXRzICgibWlzc2luZyBwYXJhbWV0ZXIiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBmZCA9IG9wZW4gKGFyZ3ZbMV0sIE9fUkRPTkxZKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIFwiJXNcIjogJXNcbiIsIGFyZ3ZbMV0sIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKKworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIEVMRiBmaWxlOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfRUxGKQorICAgIHsKKyAgICAgIHByaW50ZiAoIlwiJXNcIiBpcyBub3QgYW4gRUxGIGZpbGVcbiIsIGFyZ3ZbMV0pOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHIpID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGdldCB0aGUgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgc3RybmR4ID0gZWhkci5lX3Noc3RybmR4OworCisgIHNjbiA9IE5VTEw7CisgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICAgIEdFbGZfU2hkciBzaGRyOworCisgICAgICBpZiAoZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyKSAhPSBOVUxMKQorCW5hbWUgPSBlbGZfc3RycHRyIChlbGYsIHN0cm5keCwgKHNpemVfdCkgc2hkci5zaF9uYW1lKTsKKworICAgICAgcHJpbnRmICgic2VjdGlvbjogYCVzJ1xuIiwgbmFtZSk7CisgICAgfQorCisgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiZXJyb3Igd2hpbGUgZnJlZWluZyBFTEYgZGVzY3JpcHRvcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zZWN0aW9uZHVtcC5jIGIvdGVzdHMvc2VjdGlvbmR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTlhMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2VjdGlvbmR1bXAuYwpAQCAtMCwwICsxLDE3OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgaW50IGhhbmRsZV9zZWN0aW9uIChFbGYgKmVsZiwgRWxmX1NjbiAqc2NuKTsKK3N0YXRpYyB2b2lkIHByaW50X2J5dGVzIChFbGZfRGF0YSAqZGF0YSk7CitzdGF0aWMgdm9pZCBwcmludF9zeW10YWIgKEVsZiAqZWxmLCBFbGZfRGF0YSAqZGF0YSk7CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBFbGYgKmVsZjsKKyAgaW50IGZkOworICBpbnQgY250OworCisgIGlmIChhcmdjIDw9IDEpCisgICAgZXhpdCAoMSk7CisKKyAgLyogT3BlbiB0aGUgdGVzdCBmaWxlLiAgVGhpcyBpcyBnaXZlbiBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIHRoZQorICAgICBwcm9ncmFtLiAgKi8KKyAgZmQgPSBvcGVuIChhcmd2WzFdLCBPX1JET05MWSk7CisgIGlmIChmZCA9PSAtMSkKKyAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgImNhbm5vdCBvcGVuIGlucHV0IGZpbGUgYCVzJyIsIGFyZ3ZbMV0pOworCisgIC8qIFNldCB0aGUgbGlicmFyeSB2ZXJzaW8gd2UgZXhwZWN0LiAgKi8KKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIC8qIENyZWF0ZSB0aGUgRUxGIGRlc2NyaXB0b3IuICAqLworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlcyIsCisJICAgZWxmX2Vycm1zZyAoMCkpOworCisgIC8qIE5vdyBwcm9jZXMgYWxsIHRoZSBzZWN0aW9ucyBtZW50aW9uZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZS4gICovCisgIGZvciAoY250ID0gMjsgY250IDwgYXJnYzsgKytjbnQpCisgICAgaWYgKGhhbmRsZV9zZWN0aW9uIChlbGYsIGVsZl9nZXRzY24gKGVsZiwgYXRvaSAoYXJndltjbnRdKSkpICE9IDApCisgICAgICAvKiBXaGVuIHdlIGVuY291bnRlciBhbiBlcnJvciBzdG9wIGltbWVkaWF0ZWx5LiAgKi8KKyAgICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJ3aGlsZSBwcm9jZXNzaW5nIHNlY3Rpb24gJWQ6ICVzIiwgY250LAorCSAgIGVsZl9lcnJtc2cgKDApKTsKKworICAvKiBDbG9zZSB0aGUgZGVzY3JpcHRvci4gICovCisgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCisgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImZhaWx1cmUgd2hpbGUgY2xvc2luZyBFTEYgZGVzY3JpcHRvcjogJXMiLAorCSAgIGVsZl9lcnJtc2cgKDApKTsKKworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitoYW5kbGVfc2VjdGlvbiAoRWxmICplbGYsIEVsZl9TY24gKnNjbikKK3sKKyAgR0VsZl9FaGRyICplaGRyOworICBHRWxmX0VoZHIgZWhkcl9tZW07CisgIEdFbGZfU2hkciAqc2hkcjsKKyAgR0VsZl9TaGRyIHNoZHJfbWVtOworICBFbGZfRGF0YSAqZGF0YTsKKworICAvKiBGaXJzdCBnZXQgdGhlIEVMRiBhbmQgc2VjdGlvbiBoZWFkZXIuICAqLworICBlaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7CisgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCB8fCBzaGRyID09IE5VTEwpCisgICAgcmV0dXJuIDE7CisKKyAgLyogUHJpbnQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIEVMRiBzZWN0aW9uIGhlYWRlci4gICAqLworICBwcmludGYgKCJuYW1lICAgICAgPSAlc1xuIgorCSAgInR5cGUgICAgICA9ICUiIFBSSWQzMiAiXG4iCisJICAiZmxhZ3MgICAgID0gJSIgUFJJeDY0ICJcbiIKKwkgICJhZGRyICAgICAgPSAlIiBQUkl4NjQgIlxuIgorCSAgIm9mZnNldCAgICA9ICUiIFBSSXg2NCAiXG4iCisJICAic2l6ZSAgICAgID0gJSIgUFJJZDY0ICJcbiIKKwkgICJsaW5rICAgICAgPSAlIiBQUklkMzIgIlxuIgorCSAgImluZm8gICAgICA9ICUiIFBSSXgzMiAiXG4iCisJICAiYWRkcmFsaWduID0gJSIgUFJJeDY0ICJcbiIKKwkgICJlbnRzaXplICAgPSAlIiBQUklkNjQgIlxuIiwKKwkgIGVsZl9zdHJwdHIgKGVsZiwgZWhkci0+ZV9zaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCisJICBzaGRyLT5zaF90eXBlLAorCSAgc2hkci0+c2hfZmxhZ3MsCisJICBzaGRyLT5zaF9hZGRyLAorCSAgc2hkci0+c2hfb2Zmc2V0LAorCSAgc2hkci0+c2hfc2l6ZSwKKwkgIHNoZHItPnNoX2xpbmssCisJICBzaGRyLT5zaF9pbmZvLAorCSAgc2hkci0+c2hfYWRkcmFsaWduLAorCSAgc2hkci0+c2hfZW50c2l6ZSk7CisKKyAgLyogR2V0IHRoZSBzZWN0aW9uIGRhdGEgbm93LiAgKi8KKyAgZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiAxOworCisgIC8qIE5vdyBwcm9jZXMgdGhlIGRpZmZlcmVudCBzZWN0aW9uIHR5cGVzIGFjY29yZGluZ2x5LiAgKi8KKyAgc3dpdGNoIChzaGRyLT5zaF90eXBlKQorICAgIHsKKyAgICBjYXNlIFNIVF9TWU1UQUI6CisgICAgICBwcmludF9zeW10YWIgKGVsZiwgZGF0YSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0hUX1BST0dCSVRTOgorICAgIGRlZmF1bHQ6CisgICAgICBwcmludF9ieXRlcyAoZGF0YSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogU2VwYXJhdGUgZm9ybSB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KKyAgcHV0cyAoIiIpOworCisgIC8qIEFsbCBkb25lIGNvcnJlY3RseS4gICovCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9ieXRlcyAoRWxmX0RhdGEgKmRhdGEpCit7CisgIHNpemVfdCBzaXplID0gZGF0YS0+ZF9zaXplOworICBvZmZfdCBvZmZzZXQgPSBkYXRhLT5kX29mZjsKKyAgdW5zaWduZWQgY2hhciAqYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWY7CisgIHNpemVfdCBjbnQ7CisKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplOyBjbnQgKz0gMTYpCisgICAgeworICAgICAgc2l6ZV90IGlubmVyOworCisgICAgICBwcmludGYgKCIlKlp4OiAiLCBzaXplb2YgKHNpemVfdCkgPT0gNCA/IDggOiAxNiwgKHNpemVfdCkgb2Zmc2V0ICsgY250KTsKKworICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgMTYgJiYgY250ICsgaW5uZXIgPCBzaXplOyArK2lubmVyKQorCXByaW50ZiAoIiAlMDJoaHgiLCBidWZbY250ICsgaW5uZXJdKTsKKworICAgICAgcHV0cyAoIiIpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfc3ltdGFiIChFbGYgKmVsZiwgRWxmX0RhdGEgKmRhdGEpCit7CisgIGludCBjbGFzcyA9IGdlbGZfZ2V0Y2xhc3MgKGVsZik7CisgIHNpemVfdCBuc3ltID0gZGF0YS0+ZF9zaXplIC8gKGNsYXNzID09IEVMRkNMQVNTMzIKKwkJCQk/IHNpemVvZiAoRWxmMzJfU3ltKSA6IHNpemVvZiAoRWxmNjRfU3ltKSk7CisgIHNpemVfdCBjbnQ7CisKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBuc3ltOyArK2NudCkKKyAgICB7CisgICAgICBHRWxmX1N5bSBzeW1fbWVtOworICAgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltIChkYXRhLCBjbnQsICZzeW1fbWVtKTsKKworICAgICAgcHJpbnRmICgiJTVadTogJSoiIFBSSXg2NCAiICU2IiBQUkl4NjQgIiAlNGRcbiIsCisJICAgICAgY250LAorCSAgICAgIGNsYXNzID09IEVMRkNMQVNTMzIgPyA4IDogMTYsCisJICAgICAgc3ltLT5zdF92YWx1ZSwKKwkgICAgICBzeW0tPnN0X3NpemUsCisJICAgICAgR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zaG93LWFiYnJldi5jIGIvdGVzdHMvc2hvdy1hYmJyZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmE3Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2hvdy1hYmJyZXYuYwpAQCAtMCwwICsxLDEyNyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGliZHcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IGNudDsKKworICBmb3IgKGNudCA9IDE7IGNudCA8IGFyZ2M7ICsrY250KQorICAgIHsKKyAgICAgIGludCBmZCA9IG9wZW4gKGFyZ3ZbY250XSwgT19SRE9OTFkpOworICAgICAgRHdhcmYgKmRiZyA9IGR3YXJmX2JlZ2luIChmZCwgRFdBUkZfQ19SRUFEKTsKKyAgICAgIGlmICAoZGJnID09IE5VTEwpCisJeworCSAgcHJpbnRmICgiJXMgbm90IHVzYWJsZTogJXNcbiIsIGFyZ3ZbY250XSwgZHdhcmZfZXJybXNnICgtMSkpOworCSAgY2xvc2UgIChmZCk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIER3YXJmX09mZiBjdW9mZiA9IDA7CisgICAgICBEd2FyZl9PZmYgb2xkX2N1b2ZmID0gMDsKKyAgICAgIHNpemVfdCBoc2l6ZTsKKyAgICAgIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgY3VvZmYsICZjdW9mZiwgJmhzaXplLCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKQorCXsKKwkgIC8qIEdldCB0aGUgRElFIGZvciB0aGUgQ1UuICAqLworCSAgRHdhcmZfRGllIGRpZTsKKyAJICBpZiAoZHdhcmZfb2ZmZGllIChkYmcsIG9sZF9jdW9mZiArIGhzaXplLCAmZGllKSA9PSBOVUxMKQorCSAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCisJICAgIGJyZWFrOworCisJICBEd2FyZl9PZmYgb2Zmc2V0ID0gMDsKKworCSAgd2hpbGUgKDEpCisJICAgIHsKKwkgICAgICBzaXplX3QgbGVuZ3RoOworCSAgICAgIER3YXJmX0FiYnJldiAqYWJicmV2ID0gZHdhcmZfZ2V0YWJicmV2ICgmZGllLCBvZmZzZXQsICZsZW5ndGgpOworCSAgICAgIGlmIChhYmJyZXYgPT0gTlVMTCB8fCBhYmJyZXYgPT0gRFdBUkZfRU5EX0FCQlJFVikKKwkJLyogRW5kIG9mIHRoZSBsaXN0LiAgKi8KKwkJYnJlYWs7CisKKwkgICAgICB1bnNpZ25lZCB0YWcgPSBkd2FyZl9nZXRhYmJyZXZ0YWcgKGFiYnJldik7CisJICAgICAgaWYgKHRhZyA9PSAwKQorCQl7CisJCSAgcHJpbnRmICgiZHdhcmZfZ2V0YWJicmV2dGFnIGF0IG9mZnNldCAlbGx1IHJldHVybmVkIGVycm9yOiAlc1xuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9mZnNldCwKKwkJCSAgZHdhcmZfZXJybXNnICgtMSkpOworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICB1bnNpZ25lZCBjb2RlID0gZHdhcmZfZ2V0YWJicmV2Y29kZSAoYWJicmV2KTsKKwkgICAgICBpZiAoY29kZSA9PSAwKQorCQl7CisJCSAgcHJpbnRmICgiZHdhcmZfZ2V0YWJicmV2Y29kZSBhdCBvZmZzZXQgJWxsdSByZXR1cm5lZCBlcnJvcjogJXNcbiIsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBvZmZzZXQsCisJCQkgIGR3YXJmX2Vycm1zZyAoLTEpKTsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgaW50IGNoaWxkcmVuID0gZHdhcmZfYWJicmV2aGFzY2hpbGRyZW4gKGFiYnJldik7CisJICAgICAgaWYgKGNoaWxkcmVuIDwgMCkKKwkJeworCQkgIHByaW50ZiAoImR3YXJmX2FiYnJldmhhc2NoaWxkcmVuIGF0IG9mZnNldCAlbGx1IHJldHVybmVkIGVycm9yOiAlc1xuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9mZnNldCwKKwkJCSAgZHdhcmZfZXJybXNnICgtMSkpOworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICBwcmludGYgKCJhYmJyZXZbJWxsdV06IGNvZGUgPSAldSwgdGFnID0gJXUsIGNoaWxkcmVuID0gJWRcbiIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBvZmZzZXQsIGNvZGUsIHRhZywgY2hpbGRyZW4pOworCisJICAgICAgc2l6ZV90IGF0dHJjbnQ7CisJICAgICAgaWYgKGR3YXJmX2dldGF0dHJjbnQgKGFiYnJldiwgJmF0dHJjbnQpICE9IDApCisJCXsKKwkJICBwcmludGYgKCJkd2FyZl9nZXRhdHRyY250IGF0IG9mZnNldCAlbGx1IHJldHVybmVkIGVycm9yOiAlc1xuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9mZnNldCwKKwkJCSAgZHdhcmZfZXJybXNnICgtMSkpOworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICB1bnNpZ25lZCBpbnQgYXR0cl9udW07CisJICAgICAgdW5zaWduZWQgaW50IGF0dHJfZm9ybTsKKwkgICAgICBEd2FyZl9PZmYgYWJvZmZzZXQ7CisJICAgICAgc2l6ZV90IGo7CisJICAgICAgZm9yIChqID0gMDsgaiA8IGF0dHJjbnQ7ICsraikKKwkJaWYgKGR3YXJmX2dldGFiYnJldmF0dHIgKGFiYnJldiwgaiwgJmF0dHJfbnVtLCAmYXR0cl9mb3JtLAorCQkJCQkgJmFib2Zmc2V0KSkKKwkJICBwcmludGYgKCJkd2FyZl9nZXRhYmJyZXZhdHRyIGZvciBhYmJyZXZbJWxsdV0gYW5kIGluZGV4ICV6dSBmYWlsZWRcbiIsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBvZmZzZXQsIGopOworCQllbHNlCisJCSAgcHJpbnRmICgiYWJicmV2WyVsbHVdOiBhdHRyWyV6dV06IGNvZGUgPSAldSwgZm9ybSA9ICV1LCBvZmZzZXQgPSAlIiBQUkl1NjQgIlxuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9mZnNldCwgaiwgYXR0cl9udW0sCisJCQkgIGF0dHJfZm9ybSwgKHVpbnQ2NF90KSBhYm9mZnNldCk7CisKKwkgICAgICBvZmZzZXQgKz0gbGVuZ3RoOworCSAgICB9CisKKwkgIG9sZF9jdW9mZiA9IGN1b2ZmOworCX0KKworICAgICAgaWYgKGR3YXJmX2VuZCAoZGJnKSAhPSAwKQorCXByaW50ZiAoImR3YXJmX2VuZCBmYWlsZWQgZm9yICVzOiAlc1xuIiwgYXJndltjbnRdLAorCQlkd2FyZl9lcnJtc2cgKC0xKSk7CisKKyAgICAgIGNsb3NlIChmZCk7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2hvdy1jaWVmZGUuYyBiL3Rlc3RzL3Nob3ctY2llZmRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlYWUzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Nob3ctY2llZmRlLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxsaWJkd2FyZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IGNudDsKKworICBmb3IgKGNudCA9IDE7IGNudCA8IGFyZ2M7ICsrY250KQorICAgIHsKKyAgICAgIGludCBmZCA9IG9wZW4gKGFyZ3ZbY250XSwgT19SRE9OTFkpOworICAgICAgRHdhcmZfRGVidWcgZGJnOworICAgICAgRHdhcmZfU2lnbmVkIGNpZV9jbnQ7CisgICAgICBEd2FyZl9DaWUgKmNpZV9kYXRhOworICAgICAgRHdhcmZfU2lnbmVkIGZkZV9jbnQ7CisgICAgICBEd2FyZl9GZGUgKmZkZV9kYXRhOworICAgICAgRHdhcmZfRXJyb3IgZXJyOworCisgICAgICAgaWYgKGR3YXJmX2luaXQgKGZkLCBEV19ETENfUkVBRCwgTlVMTCwgTlVMTCwgJmRiZywgJmVycikgIT0gRFdfRExWX09LKQorCSB7CisJICAgcHJpbnRmICgiJXMgbm90IHVzYWJsZTogJXNcbiIsIGFyZ3ZbY250XSwgZHdhcmZfZXJybXNnIChlcnIpKTsKKwkgICBjb250aW51ZTsKKwkgfQorICAgICAgZWxzZSBpZiAoZHdhcmZfZ2V0X2ZkZV9saXN0X2VoIChkYmcsICZjaWVfZGF0YSwgJmNpZV9jbnQsICZmZGVfZGF0YSwKKwkJCQkgICAgICAmZmRlX2NudCwgJmVycikgIT0gRFdfRExWX09LKQorCXByaW50ZiAoImNhbm5vdCBnZXQgQ0lFcyBhbmQgRkRFcyBmcm9tICVzOiAlc1xuIiwgYXJndltjbnRdLAorCQlkd2FyZl9lcnJtc2cgKGVycikpOworICAgICAgZWxzZQorCXsKKwkgIER3YXJmX0FkZHIgbG93X3BjOworCSAgRHdhcmZfQWRkciBoaWdoX3BjOworCSAgRHdhcmZfVW5zaWduZWQgZnVuY19sZW5ndGg7CisJICBEd2FyZl9QdHIgZmRlX2J5dGVzOworCSAgRHdhcmZfVW5zaWduZWQgZmRlX2J5dGVfbGVuZ3RoOworCSAgRHdhcmZfT2ZmIGNpZV9vZmZzZXQ7CisJICBEd2FyZl9TaWduZWQgY2llX2luZGV4OworCSAgRHdhcmZfT2ZmIGZkZV9vZmZzZXQ7CisJICBEd2FyZl9GZGUgZmRlOworCSAgaW50IGk7CisKKwkgIHByaW50ZiAoIiVzIGhhcyAlbGxkIENJRXMgYW5kICVsbGQgRkRFc1xuIiwKKwkJICBiYXNlbmFtZSAoYXJndltjbnRdKSwKKwkJICAobG9uZyBsb25nIGludCkgY2llX2NudCwgKGxvbmcgbG9uZyBpbnQpIGZkZV9jbnQpOworCisJICBmb3IgKGkgPSAwOyBpIDwgY2llX2NudDsgKytpKQorCSAgICB7CisJICAgICAgRHdhcmZfVW5zaWduZWQgYnl0ZXNfaW5fY2llOworCSAgICAgIER3YXJmX1NtYWxsIHZlcnNpb247CisJICAgICAgY2hhciAqYXVnbWVudGVyOworCSAgICAgIER3YXJmX1Vuc2lnbmVkIGNvZGVfYWxpZ25tZW50X2ZhY3RvcjsKKwkgICAgICBEd2FyZl9TaWduZWQgZGF0YV9hbGlnbm1lbnRfZmFjdG9yOworCSAgICAgIER3YXJmX0hhbGYgcmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXI7CisJICAgICAgRHdhcmZfUHRyIGluaXRpYWxfaW5zdHJ1Y3Rpb25zOworCSAgICAgIER3YXJmX1Vuc2lnbmVkIGluaXRpYWxfaW5zdHJ1Y3Rpb25zX2xlbmd0aDsKKworCSAgICAgIGlmIChkd2FyZl9nZXRfY2llX2luZm8gKGNpZV9kYXRhW2ldLCAmYnl0ZXNfaW5fY2llLCAmdmVyc2lvbiwKKwkJCQkgICAgICAmYXVnbWVudGVyLCAmY29kZV9hbGlnbm1lbnRfZmFjdG9yLAorCQkJCSAgICAgICZkYXRhX2FsaWdubWVudF9mYWN0b3IsCisJCQkJICAgICAgJnJldHVybl9hZGRyZXNzX3JlZ2lzdGVyLAorCQkJCSAgICAgICZpbml0aWFsX2luc3RydWN0aW9ucywKKwkJCQkgICAgICAmaW5pdGlhbF9pbnN0cnVjdGlvbnNfbGVuZ3RoLCAmZXJyKQorCQkgICE9IERXX0RMVl9PSykKKwkJcHJpbnRmICgiY2Fubm90IGdldCBpbmZvIGZvciBDSUUgJWQ6ICVzXG4iLCBpLAorCQkJZHdhcmZfZXJybXNnIChlcnIpKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBzaXplX3QgajsKKworCQkgIHByaW50ZiAoIkNJRVslZF06IGJ5dGVzX2luX2NpZSA9ICVsbHUsIHZlcnNpb24gPSAlaGhkLCBhdWdtZW50ZXIgPSBcIiVzXCJcbiIsCisJCQkgIGksICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBieXRlc19pbl9jaWUsIHZlcnNpb24sCisJCQkgIGF1Z21lbnRlcik7CisJCSAgcHJpbnRmICgiQ0lFWyVkXTogY29kZV9hbGlnbm1lbnRfZmFjdG9yID0gJWxseFxuIgorCQkJICAiQ0lFWyVkXTogZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gJWxseFxuIgorCQkJICAiQ0lFWyVkXTogcmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgPSAlaHVcbiIKKwkJCSAgIkNJRVslZF06IGJ5dGVzID0iLAorCQkJICBpLCAodW5zaWduZWQgbG9uZyBsb25nIGludCkgY29kZV9hbGlnbm1lbnRfZmFjdG9yLAorCQkJICBpLCAodW5zaWduZWQgbG9uZyBsb25nIGludCkgZGF0YV9hbGlnbm1lbnRfZmFjdG9yLAorCQkJICBpLCByZXR1cm5fYWRkcmVzc19yZWdpc3RlciwgaSk7CisKKwkJICBmb3IgKGogPSAwOyBqIDwgaW5pdGlhbF9pbnN0cnVjdGlvbnNfbGVuZ3RoOyArK2opCisJCSAgICBwcmludGYgKCIgJTAyaGh4IiwKKwkJCSAgICAoKHVuc2lnbmVkIGNoYXIgKikgaW5pdGlhbF9pbnN0cnVjdGlvbnMpW2pdKTsKKworCQkgIHB1dGNoYXIgKCdcbicpOworCQl9CisJICAgIH0KKworCSAgZm9yIChpID0gMDsgaSA8IGZkZV9jbnQ7ICsraSkKKwkgICAgeworCSAgICAgIER3YXJmX0NpZSBjaWU7CisKKwkgICAgICBpZiAoZHdhcmZfZ2V0X2ZkZV9yYW5nZSAoZmRlX2RhdGFbaV0sICZsb3dfcGMsICZmdW5jX2xlbmd0aCwKKwkJCQkgICAgICAgJmZkZV9ieXRlcywgJmZkZV9ieXRlX2xlbmd0aCwKKwkJCQkgICAgICAgJmNpZV9vZmZzZXQsICZjaWVfaW5kZXgsICZmZGVfb2Zmc2V0LAorCQkJCSAgICAgICAmZXJyKSAhPSBEV19ETFZfT0spCisJCXByaW50ZiAoImNhbm5vdCBnZXQgcmFuZ2Ugb2YgRkRFICVkOiAlc1xuIiwgaSwKKwkJCWR3YXJmX2Vycm1zZyAoZXJyKSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgc2l6ZV90IGo7CisJCSAgRHdhcmZfUHRyIGluc3RyczsKKwkJICBEd2FyZl9VbnNpZ25lZCBsZW47CisKKwkJICBwcmludGYgKCJGREVbJWRdOiBsb3dfcGMgPSAlI2xseCwgbGVuZ3RoID0gJWxsdVxuIiwgaSwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGxvd19wYywKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGZ1bmNfbGVuZ3RoKTsKKwkJICBwcmludGYgKCJGREVbJWRdOiBieXRlcyA9IiwgaSk7CisKKwkJICBmb3IgKGogPSAwOyBqIDwgZmRlX2J5dGVfbGVuZ3RoOyArK2opCisJCSAgICBwcmludGYgKCIgJTAyaGh4IiwgKCh1bnNpZ25lZCBjaGFyICopIGZkZV9ieXRlcylbal0pOworCisJCSAgcHJpbnRmICgiXG5GREVbJWRdOiBjaWVfb2Zmc2V0ID0gJWxsZCwgY2llX2luZGV4ID0gJWxsZCwgZmRlX29mZnNldCA9ICVsbGRcbiIsCisJCQkgIGksIChsb25nIGxvbmcgaW50KSBjaWVfb2Zmc2V0LAorCQkJICAobG9uZyBsb25nIGludCkgY2llX2luZGV4LAorCQkJICAobG9uZyBsb25nIGludCkgZmRlX29mZnNldCk7CisKKwkJICBpZiAoZHdhcmZfZ2V0X2ZkZV9pbnN0cl9ieXRlcyAoZmRlX2RhdGFbaV0sICZpbnN0cnMsICZsZW4sCisJCQkJCQkgJmVycikgIT0gRFdfRExWX09LKQorCQkgICAgcHJpbnRmICgiY2Fubm90IGdldCBpbnN0cnVjdGlvbnMgb2YgRkRFICVkOiAlc1xuIiwgaSwKKwkJCSAgICBkd2FyZl9lcnJtc2cgKGVycikpOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgcHJpbnRmICgiRkRFWyVkXTogaW5zdHJ1Y3Rpb25zID0iLCBpKTsKKworCQkgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyArK2opCisJCQlwcmludGYgKCIgJTAyaGh4IiwgKCh1bnNpZ25lZCBjaGFyICopIGluc3Rycylbal0pOworCisJCSAgICAgIHB1dGNoYXIgKCdcbicpOworCQkgICAgfQorCisJCSAgLyogQ29uc2lzdGVuY3kgY2hlY2suICAqLworCQkgIGlmIChkd2FyZl9nZXRfY2llX29mX2ZkZSAoZmRlX2RhdGFbaV0sICZjaWUsICZlcnIpCisJCSAgICAgICE9IERXX0RMVl9PSykKKwkJICAgIHByaW50ZiAoImNhbm5vdCBnZXQgQ0lFIG9mIEZERSAlZDogJXNcbiIsIGksCisJCQkgICAgZHdhcmZfZXJybXNnIChlcnIpKTsKKwkJICBlbHNlIGlmIChjaWVfZGF0YVtjaWVfaW5kZXhdICE9IGNpZSkKKwkJICAgIHB1dHMgKCJjaWVfaW5kZXggZm9yIEZERVslZF0gZG9lcyBub3QgbWF0Y2ggZHdhcmZfZ2V0X2NpZV9vZl9mZGUgcmVzdWx0Iik7CisJCX0KKworCSAgICAgIGlmIChkd2FyZl9nZXRfZmRlX24gKGZkZV9kYXRhLCBpLCAmZmRlLCAmZXJyKSAhPSBEV19ETFZfT0spCisJCXByaW50ZiAoImR3YXJmX2dldF9mZGVfbiBmb3IgRkRFWyVkXSBmYWlsZWRcbiIsIGkpOworCSAgICAgIGVsc2UgaWYgKGZkZSAhPSBmZGVfZGF0YVtpXSkKKwkJcHJpbnRmICgiZHdhcmZfZ2V0X2ZkZV9uIGZvciBGREVbJWRdIGRpZG4ndCByZXR1cm4gdGhlIHJpZ2h0IHZhbHVlXG4iLCBpKTsKKwkgICAgfQorCisJICBpZiAoZHdhcmZfZ2V0X2ZkZV9uIChmZGVfZGF0YSwgZmRlX2NudCwgJmZkZSwgJmVycikKKwkgICAgICAhPSBEV19ETFZfTk9fRU5UUlkpCisJICAgIHB1dHMgKCJkd2FyZl9nZXRfZmRlX24gZm9yIGludmFsaWQgaW5kZXggZG9lc24ndCByZXR1cm4gRFdfRExWX05PX0VOVFJZIik7CisKKwkgIHsKKwkgICAgY29uc3QgdW5zaWduZWQgaW50IGFkZHJzW10gPQorCSAgICAgIHsKKwkJMHg4MDQ4NDAwLCAweDgwNDg0MmMsIDB4ODA0ODQ1NCwgMHg4MDQ4NDU1LCAweDgwNDkzZmMKKwkgICAgICB9OworCSAgICBjb25zdCBpbnQgbmFkZHJzID0gc2l6ZW9mIChhZGRycykgLyBzaXplb2YgKGFkZHJzWzBdKTsKKworCSAgICBmb3IgKGkgPSAwOyBpIDwgbmFkZHJzOyArK2kpCisJICAgICAgaWYgKGR3YXJmX2dldF9mZGVfYXRfcGMgKGZkZV9kYXRhLCBhZGRyc1tpXSwgJmZkZSwgJmxvd19wYywKKwkJCQkgICAgICAgJmhpZ2hfcGMsICZlcnIpICE9IERXX0RMVl9PSykKKwkJcHJpbnRmICgibm8gRkRFIGF0ICV4XG4iLCBhZGRyc1tpXSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgRHdhcmZfQWRkciBvdGhlcl9sb3dfcGM7CisKKwkJICBpZiAoZHdhcmZfZ2V0X2ZkZV9yYW5nZSAoZmRlLCAmb3RoZXJfbG93X3BjLCAmZnVuY19sZW5ndGgsCisJCQkJCSAgICZmZGVfYnl0ZXMsICZmZGVfYnl0ZV9sZW5ndGgsCisJCQkJCSAgICZjaWVfb2Zmc2V0LCAmY2llX2luZGV4LAorCQkJCQkgICAmZmRlX29mZnNldCwgJmVycikgIT0gRFdfRExWX09LKQorCQkgICAgcHJpbnRmICgiY2Fubm90IGdldCByYW5nZSBvZiBGREUgcmV0dXJuZWQgYnkgZHdhcmZfZ2V0X2ZkZV9hdF9wYyBmb3IgJXU6ICVzXG4iLAorCQkJICAgIGFkZHJzW2ldLCBkd2FyZl9lcnJtc2cgKGVycikpOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgcHJpbnRmICgiRkRFW0AleF06IGNpZV9vZmZzZXQgPSAlbGxkLCBjaWVfaW5kZXggPSAlbGxkLCBmZGVfb2Zmc2V0ID0gJWxsZFxuIiwKKwkJCSAgICAgIGFkZHJzW2ldLAorCQkJICAgICAgKGxvbmcgbG9uZyBpbnQpIGNpZV9vZmZzZXQsCisJCQkgICAgICAobG9uZyBsb25nIGludCkgY2llX2luZGV4LAorCQkJICAgICAgKGxvbmcgbG9uZyBpbnQpIGZkZV9vZmZzZXQpOworCisJCSAgICAgIGlmIChsb3dfcGMgIT0gb3RoZXJfbG93X3BjKQorCQkJcHJpbnRmICgibG93X3BjIHJldHVybmVkIGJ5IGR3YXJmX2dldF9mZGVfYXRfcGMgZm9yICV4IGFuZCBkd2FyZl9nZXRfZmRlX3JhbmdlIGRpZmZlcnMiLAorCQkJCWFkZHJzW2ldKTsKKworCQkgICAgICBpZiAoaGlnaF9wYyAhPSBsb3dfcGMgKyBmdW5jX2xlbmd0aCAtIDEpCisJCQlwcmludGYgKCJoaWdoX3BjIHJldHVybmVkIGJ5IGR3YXJmX2dldF9mZGVfYXRfcGMgZm9yICV4IGFuZCBkd2FyZl9nZXRfZmRlX3JhbmdlIGRpZmZlcnMiLAorCQkJCWFkZHJzW2ldKTsKKwkJICAgIH0KKwkJfQorCSAgfQorCX0KKworICAgICAgaWYgKGR3YXJmX2ZpbmlzaCAoZGJnLCAmZXJyKSAhPSBEV19ETFZfT0spCisJcHJpbnRmICgiZHdhcmZfZmluaXNoIGZhaWxlZCBmb3IgJXM6ICVzXG4iLCBhcmd2W2NudF0sCisJCWR3YXJmX2Vycm1zZyAoZXJyKSk7CisKKyAgICAgIGNsb3NlIChmZCk7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2hvdy1kaWUtaW5mby5jIGIvdGVzdHMvc2hvdy1kaWUtaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Zjk5MmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaG93LWRpZS1pbmZvLmMKQEAgLTAsMCArMSw0NzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8ZHdhcmYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPGxpYmR3Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKK3N0YXRpYyBjb25zdCBjaGFyICp0YWduYW1lc1tdID0KK3sKKyAgW0RXX1RBR19hcnJheV90eXBlXSA9ICJEV19UQUdfYXJyYXlfdHlwZSIsCisgIFtEV19UQUdfY2xhc3NfdHlwZV0gPSAiRFdfVEFHX2NsYXNzX3R5cGUiLAorICBbRFdfVEFHX2VudHJ5X3BvaW50XSA9ICJEV19UQUdfZW50cnlfcG9pbnQiLAorICBbRFdfVEFHX2VudW1lcmF0aW9uX3R5cGVdID0gIkRXX1RBR19lbnVtZXJhdGlvbl90eXBlIiwKKyAgW0RXX1RBR19mb3JtYWxfcGFyYW1ldGVyXSA9ICJEV19UQUdfZm9ybWFsX3BhcmFtZXRlciIsCisgIFtEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb25dID0gIkRXX1RBR19pbXBvcnRlZF9kZWNsYXJhdGlvbiIsCisgIFtEV19UQUdfbGFiZWxdID0gIkRXX1RBR19sYWJlbCIsCisgIFtEV19UQUdfbGV4aWNhbF9ibG9ja10gPSAiRFdfVEFHX2xleGljYWxfYmxvY2siLAorICBbRFdfVEFHX21lbWJlcl0gPSAiRFdfVEFHX21lbWJlciIsCisgIFtEV19UQUdfcG9pbnRlcl90eXBlXSA9ICJEV19UQUdfcG9pbnRlcl90eXBlIiwKKyAgW0RXX1RBR19yZWZlcmVuY2VfdHlwZV0gPSAiRFdfVEFHX3JlZmVyZW5jZV90eXBlIiwKKyAgW0RXX1RBR19jb21waWxlX3VuaXRdID0gIkRXX1RBR19jb21waWxlX3VuaXQiLAorICBbRFdfVEFHX3N0cmluZ190eXBlXSA9ICJEV19UQUdfc3RyaW5nX3R5cGUiLAorICBbRFdfVEFHX3N0cnVjdHVyZV90eXBlXSA9ICJEV19UQUdfc3RydWN0dXJlX3R5cGUiLAorICBbRFdfVEFHX3N1YnJvdXRpbmVfdHlwZV0gPSAiRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSIsCisgIFtEV19UQUdfdHlwZWRlZl0gPSAiRFdfVEFHX3R5cGVkZWYiLAorICBbRFdfVEFHX3VuaW9uX3R5cGVdID0gIkRXX1RBR191bmlvbl90eXBlIiwKKyAgW0RXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzXSA9ICJEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycyIsCisgIFtEV19UQUdfdmFyaWFudF0gPSAiRFdfVEFHX3ZhcmlhbnQiLAorICBbRFdfVEFHX2NvbW1vbl9ibG9ja10gPSAiRFdfVEFHX2NvbW1vbl9ibG9jayIsCisgIFtEV19UQUdfY29tbW9uX2luY2x1c2lvbl0gPSAiRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24iLAorICBbRFdfVEFHX2luaGVyaXRhbmNlXSA9ICJEV19UQUdfaW5oZXJpdGFuY2UiLAorICBbRFdfVEFHX2lubGluZWRfc3Vicm91dGluZV0gPSAiRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSIsCisgIFtEV19UQUdfbW9kdWxlXSA9ICJEV19UQUdfbW9kdWxlIiwKKyAgW0RXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGVdID0gIkRXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUiLAorICBbRFdfVEFHX3NldF90eXBlXSA9ICJEV19UQUdfc2V0X3R5cGUiLAorICBbRFdfVEFHX3N1YnJhbmdlX3R5cGVdID0gIkRXX1RBR19zdWJyYW5nZV90eXBlIiwKKyAgW0RXX1RBR193aXRoX3N0bXRdID0gIkRXX1RBR193aXRoX3N0bXQiLAorICBbRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbl0gPSAiRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiIsCisgIFtEV19UQUdfYmFzZV90eXBlXSA9ICJEV19UQUdfYmFzZV90eXBlIiwKKyAgW0RXX1RBR19jYXRjaF9ibG9ja10gPSAiRFdfVEFHX2NhdGNoX2Jsb2NrIiwKKyAgW0RXX1RBR19jb25zdF90eXBlXSA9ICJEV19UQUdfY29uc3RfdHlwZSIsCisgIFtEV19UQUdfY29uc3RhbnRdID0gIkRXX1RBR19jb25zdGFudCIsCisgIFtEV19UQUdfZW51bWVyYXRvcl0gPSAiRFdfVEFHX2VudW1lcmF0b3IiLAorICBbRFdfVEFHX2ZpbGVfdHlwZV0gPSAiRFdfVEFHX2ZpbGVfdHlwZSIsCisgIFtEV19UQUdfZnJpZW5kXSA9ICJEV19UQUdfZnJpZW5kIiwKKyAgW0RXX1RBR19uYW1lbGlzdF0gPSAiRFdfVEFHX25hbWVsaXN0IiwKKyAgW0RXX1RBR19uYW1lbGlzdF9pdGVtXSA9ICJEV19UQUdfbmFtZWxpc3RfaXRlbSIsCisgIFtEV19UQUdfcGFja2VkX3R5cGVdID0gIkRXX1RBR19wYWNrZWRfdHlwZSIsCisgIFtEV19UQUdfc3VicHJvZ3JhbV0gPSAiRFdfVEFHX3N1YnByb2dyYW0iLAorICBbRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW1dID0gIkRXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtIiwKKyAgW0RXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbV0gPSAiRFdfVEFHX3RlbXBsYXRlX3ZhbHVlX3BhcmFtIiwKKyAgW0RXX1RBR190aHJvd25fdHlwZV0gPSAiRFdfVEFHX3Rocm93bl90eXBlIiwKKyAgW0RXX1RBR190cnlfYmxvY2tdID0gIkRXX1RBR190cnlfYmxvY2siLAorICBbRFdfVEFHX3ZhcmlhbnRfcGFydF0gPSAiRFdfVEFHX3ZhcmlhbnRfcGFydCIsCisgIFtEV19UQUdfdmFyaWFibGVdID0gIkRXX1RBR192YXJpYWJsZSIsCisgIFtEV19UQUdfdm9sYXRpbGVfdHlwZV0gPSAiRFdfVEFHX3ZvbGF0aWxlX3R5cGUiCit9OworI2RlZmluZSBudGFnbmFtZXMgKHNpemVvZiAodGFnbmFtZXMpIC8gc2l6ZW9mICh0YWduYW1lc1swXSkpCisKKworY29uc3Qgc3RydWN0Cit7CisgIGludCBjb2RlOworICBjb25zdCBjaGFyICpuYW1lOworfSBhdHRyc1tdID0KK3sKKyAgeyBEV19BVF9zaWJsaW5nLCAic2libGluZyIgfSwKKyAgeyBEV19BVF9sb2NhdGlvbiwgImxvY2F0aW9uIiB9LAorICB7IERXX0FUX25hbWUsICJuYW1lIiB9LAorICB7IERXX0FUX29yZGVyaW5nLCAib3JkZXJpbmciIH0sCisgIHsgRFdfQVRfc3Vic2NyX2RhdGEsICJzdWJzY3JfZGF0YSIgfSwKKyAgeyBEV19BVF9ieXRlX3NpemUsICJieXRlX3NpemUiIH0sCisgIHsgRFdfQVRfYml0X29mZnNldCwgImJpdF9vZmZzZXQiIH0sCisgIHsgRFdfQVRfYml0X3NpemUsICJiaXRfc2l6ZSIgfSwKKyAgeyBEV19BVF9lbGVtZW50X2xpc3QsICJlbGVtZW50X2xpc3QiIH0sCisgIHsgRFdfQVRfc3RtdF9saXN0LCAic3RtdF9saXN0IiB9LAorICB7IERXX0FUX2xvd19wYywgImxvd19wYyIgfSwKKyAgeyBEV19BVF9oaWdoX3BjLCAiaGlnaF9wYyIgfSwKKyAgeyBEV19BVF9sYW5ndWFnZSwgImxhbmd1YWdlIiB9LAorICB7IERXX0FUX21lbWJlciwgIm1lbWJlciIgfSwKKyAgeyBEV19BVF9kaXNjciwgImRpc2NyIiB9LAorICB7IERXX0FUX2Rpc2NyX3ZhbHVlLCAiZGlzY3JfdmFsdWUiIH0sCisgIHsgRFdfQVRfdmlzaWJpbGl0eSwgInZpc2liaWxpdHkiIH0sCisgIHsgRFdfQVRfaW1wb3J0LCAiaW1wb3J0IiB9LAorICB7IERXX0FUX3N0cmluZ19sZW5ndGgsICJzdHJpbmdfbGVuZ3RoIiB9LAorICB7IERXX0FUX2NvbW1vbl9yZWZlcmVuY2UsICJjb21tb25fcmVmZXJlbmNlIiB9LAorICB7IERXX0FUX2NvbXBfZGlyLCAiY29tcF9kaXIiIH0sCisgIHsgRFdfQVRfY29uc3RfdmFsdWUsICJjb25zdF92YWx1ZSIgfSwKKyAgeyBEV19BVF9jb250YWluaW5nX3R5cGUsICJjb250YWluaW5nX3R5cGUiIH0sCisgIHsgRFdfQVRfZGVmYXVsdF92YWx1ZSwgImRlZmF1bHRfdmFsdWUiIH0sCisgIHsgRFdfQVRfaW5saW5lLCAiaW5saW5lIiB9LAorICB7IERXX0FUX2lzX29wdGlvbmFsLCAiaXNfb3B0aW9uYWwiIH0sCisgIHsgRFdfQVRfbG93ZXJfYm91bmQsICJsb3dlcl9ib3VuZCIgfSwKKyAgeyBEV19BVF9wcm9kdWNlciwgInByb2R1Y2VyIiB9LAorICB7IERXX0FUX3Byb3RvdHlwZWQsICJwcm90b3R5cGVkIiB9LAorICB7IERXX0FUX3JldHVybl9hZGRyLCAicmV0dXJuX2FkZHIiIH0sCisgIHsgRFdfQVRfc3RhcnRfc2NvcGUsICJzdGFydF9zY29wZSIgfSwKKyAgeyBEV19BVF9zdHJpZGVfc2l6ZSwgInN0cmlkZV9zaXplIiB9LAorICB7IERXX0FUX3VwcGVyX2JvdW5kLCAidXBwZXJfYm91bmQiIH0sCisgIHsgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luLCAiYWJzdHJhY3Rfb3JpZ2luIiB9LAorICB7IERXX0FUX2FjY2Vzc2liaWxpdHksICJhY2Nlc3NpYmlsaXR5IiB9LAorICB7IERXX0FUX2FkZHJlc3NfY2xhc3MsICJhZGRyZXNzX2NsYXNzIiB9LAorICB7IERXX0FUX2FydGlmaWNpYWwsICJhcnRpZmljaWFsIiB9LAorICB7IERXX0FUX2Jhc2VfdHlwZXMsICJiYXNlX3R5cGVzIiB9LAorICB7IERXX0FUX2NhbGxpbmdfY29udmVudGlvbiwgImNhbGxpbmdfY29udmVudGlvbiIgfSwKKyAgeyBEV19BVF9jb3VudCwgImNvdW50IiB9LAorICB7IERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uLCAiZGF0YV9tZW1iZXJfbG9jYXRpb24iIH0sCisgIHsgRFdfQVRfZGVjbF9jb2x1bW4sICJkZWNsX2NvbHVtbiIgfSwKKyAgeyBEV19BVF9kZWNsX2ZpbGUsICJkZWNsX2ZpbGUiIH0sCisgIHsgRFdfQVRfZGVjbF9saW5lLCAiZGVjbF9saW5lIiB9LAorICB7IERXX0FUX2RlY2xhcmF0aW9uLCAiZGVjbGFyYXRpb24iIH0sCisgIHsgRFdfQVRfZGlzY3JfbGlzdCwgImRpc2NyX2xpc3QiIH0sCisgIHsgRFdfQVRfZW5jb2RpbmcsICJlbmNvZGluZyIgfSwKKyAgeyBEV19BVF9leHRlcm5hbCwgImV4dGVybmFsIiB9LAorICB7IERXX0FUX2ZyYW1lX2Jhc2UsICJmcmFtZV9iYXNlIiB9LAorICB7IERXX0FUX2ZyaWVuZCwgImZyaWVuZCIgfSwKKyAgeyBEV19BVF9pZGVudGlmaWVyX2Nhc2UsICJpZGVudGlmaWVyX2Nhc2UiIH0sCisgIHsgRFdfQVRfbWFjcm9faW5mbywgIm1hY3JvX2luZm8iIH0sCisgIHsgRFdfQVRfbmFtZWxpc3RfaXRlbXMsICJuYW1lbGlzdF9pdGVtcyIgfSwKKyAgeyBEV19BVF9wcmlvcml0eSwgInByaW9yaXR5IiB9LAorICB7IERXX0FUX3NlZ21lbnQsICJzZWdtZW50IiB9LAorICB7IERXX0FUX3NwZWNpZmljYXRpb24sICJzcGVjaWZpY2F0aW9uIiB9LAorICB7IERXX0FUX3N0YXRpY19saW5rLCAic3RhdGljX2xpbmsiIH0sCisgIHsgRFdfQVRfdHlwZSwgInR5cGUiIH0sCisgIHsgRFdfQVRfdXNlX2xvY2F0aW9uLCAidXNlX2xvY2F0aW9uIiB9LAorICB7IERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciwgInZhcmlhYmxlX3BhcmFtZXRlciIgfSwKKyAgeyBEV19BVF92aXJ0dWFsaXR5LCAidmlydHVhbGl0eSIgfSwKKyAgeyBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbiwgInZ0YWJsZV9lbGVtX2xvY2F0aW9uIiB9LAorICB7IERXX0FUX01JUFNfZmRlLCAiTUlQU19mZGUiIH0sCisgIHsgRFdfQVRfTUlQU19sb29wX2JlZ2luLCAiTUlQU19sb29wX2JlZ2luIiB9LAorICB7IERXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luLCAiTUlQU190YWlsX2xvb3BfYmVnaW4iIH0sCisgIHsgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4sICJNSVBTX2VwaWxvZ19iZWdpbiIgfSwKKyAgeyBEV19BVF9NSVBTX2xvb3BfdW5yb2xsX2ZhY3RvciwgIk1JUFNfbG9vcF91bnJvbGxfZmFjdG9yIiB9LAorICB7IERXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGgsICJNSVBTX3NvZnR3YXJlX3BpcGVsaW5lX2RlcHRoIiB9LAorICB7IERXX0FUX01JUFNfbGlua2FnZV9uYW1lLCAiTUlQU19saW5rYWdlX25hbWUiIH0sCisgIHsgRFdfQVRfTUlQU19zdHJpZGUsICJNSVBTX3N0cmlkZSIgfSwKKyAgeyBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUsICJNSVBTX2Fic3RyYWN0X25hbWUiIH0sCisgIHsgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4sICJNSVBTX2Nsb25lX29yaWdpbiIgfSwKKyAgeyBEV19BVF9NSVBTX2hhc19pbmxpbmVzLCAiTUlQU19oYXNfaW5saW5lcyIgfSwKKyAgeyBEV19BVF9NSVBTX3N0cmlkZV9ieXRlLCAiTUlQU19zdHJpZGVfYnl0ZSIgfSwKKyAgeyBEV19BVF9NSVBTX3N0cmlkZV9lbGVtLCAiTUlQU19zdHJpZGVfZWxlbSIgfSwKKyAgeyBEV19BVF9NSVBTX3B0cl9kb3BldHlwZSwgIk1JUFNfcHRyX2RvcGV0eXBlIiB9LAorICB7IERXX0FUX01JUFNfYWxsb2NhdGFibGVfZG9wZXR5cGUsICJNSVBTX2FsbG9jYXRhYmxlX2RvcGV0eXBlIiB9LAorICB7IERXX0FUX01JUFNfYXNzdW1lZF9zaGFwZV9kb3BldHlwZSwgIk1JUFNfYXNzdW1lZF9zaGFwZV9kb3BldHlwZSIgfSwKKyAgeyBEV19BVF9NSVBTX2Fzc3VtZWRfc2l6ZSwgIk1JUFNfYXNzdW1lZF9zaXplIiB9LAorICB7IERXX0FUX3NmX25hbWVzLCAic2ZfbmFtZXMiIH0sCisgIHsgRFdfQVRfc3JjX2luZm8sICJzcmNfaW5mbyIgfSwKKyAgeyBEV19BVF9tYWNfaW5mbywgIm1hY19pbmZvIiB9LAorICB7IERXX0FUX3NyY19jb29yZHMsICJzcmNfY29vcmRzIiB9LAorICB7IERXX0FUX2JvZHlfYmVnaW4sICJib2R5X2JlZ2luIiB9LAorICB7IERXX0FUX2JvZHlfZW5kLCAiYm9keV9lbmQiIH0KK307CisjZGVmaW5lIG5hdHRycyAoc2l6ZW9mIChhdHRycykgLyBzaXplb2YgKGF0dHJzWzBdKSkKKworCit2b2lkCitoYW5kbGUgKER3YXJmICpkYmcsIER3YXJmX0RpZSAqZGllLCBpbnQgbikKK3sKKyAgRHdhcmZfRGllIGNoaWxkOworICB1bnNpZ25lZCBpbnQgdGFnOworICBjb25zdCBjaGFyICpzdHI7CisgIGNoYXIgYnVmWzMwXTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgRHdhcmZfT2ZmIG9mZjsKKyAgRHdhcmZfT2ZmIGN1b2ZmOworICBzaXplX3QgY250OworICBEd2FyZl9BZGRyIGFkZHI7CisgIGludCBpOworCisgIHRhZyA9IGR3YXJmX3RhZyAoZGllKTsKKyAgaWYgKHRhZyAhPSBEV19UQUdfaW52YWxpZCkKKyAgICB7CisgICAgICBpZiAodGFnIDwgbnRhZ25hbWVzKQorCXN0ciA9IHRhZ25hbWVzW3RhZ107CisgICAgICBlbHNlCisJeworCSAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiUjeCIsIHRhZyk7CisJICBzdHIgPSBidWY7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHN0ciA9ICIqIE5PIFRBRyAqIjsKKworICBuYW1lID0gZHdhcmZfZGllbmFtZSAoZGllKTsKKyAgaWYgKG5hbWUgPT0gMCkKKyAgICBuYW1lID0gIiogTk8gTkFNRSAqIjsKKworICBvZmYgPSBkd2FyZl9kaWVvZmZzZXQgKGRpZSk7CisgIGN1b2ZmID0gZHdhcmZfY3VvZmZzZXQgKGRpZSk7CisKKyAgcHJpbnRmICgiJSpzJXNcbiIsIG4gKiA1LCAiIiwgc3RyKTsKKyAgcHJpbnRmICgiJSpzIE5hbWUgICAgICA6ICVzXG4iLCBuICogNSwgIiIsIG5hbWUpOworICBwcmludGYgKCIlKnMgT2Zmc2V0ICAgIDogJWxsZFxuIiwgbiAqIDUsICIiLCAobG9uZyBsb25nIGludCkgb2ZmKTsKKyAgcHJpbnRmICgiJSpzIENVIG9mZnNldCA6ICVsbGRcbiIsIG4gKiA1LCAiIiwgKGxvbmcgbG9uZyBpbnQpIGN1b2ZmKTsKKworICBwcmludGYgKCIlKnMgQXR0cnMgICAgIDoiLCBuICogNSwgIiIpOworICBmb3IgKGNudCA9IDA7IGNudCA8IG5hdHRyczsgKytjbnQpCisgICAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgYXR0cnNbY250XS5jb2RlKSkKKyAgICAgIHByaW50ZiAoIiAlcyIsIGF0dHJzW2NudF0ubmFtZSk7CisgIHB1dHMgKCIiKTsKKworICBpZiAoZHdhcmZfaGFzYXR0ciAoZGllLCBEV19BVF9sb3dfcGMpICYmIGR3YXJmX2xvd3BjIChkaWUsICZhZGRyKSA9PSAwKQorICAgIHsKKyAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOworICAgICAgRHdhcmZfQWRkciBhZGRyMjsKKyAgICAgIHByaW50ZiAoIiUqcyBsb3cgUEMgICAgOiAlI2xseFxuIiwKKwkgICAgICBuICogNSwgIiIsICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBhZGRyKTsKKworICAgICAgaWYgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfbG93X3BjLCAmYXR0cikgPT0gTlVMTAorCSAgfHwgZHdhcmZfZm9ybWFkZHIgKCZhdHRyLCAmYWRkcjIpICE9IDAKKwkgIHx8IGFkZHIgIT0gYWRkcjIpCisJcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfbG93X3BjIHZlcmlmeSBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgICBlbHNlIGlmICghIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2FkZHIpKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2xvd19wYyBmb3JtIGZhaWxlZCAqKioqKioqKioqKioiKTsKKyAgICAgIGVsc2UgaWYgKGR3YXJmX3doYXRmb3JtICgmYXR0cikgIT0gRFdfRk9STV9hZGRyKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2xvd19wYyBmb3JtICgyKSBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgICBlbHNlIGlmIChkd2FyZl93aGF0YXR0ciAoJmF0dHIpICE9IERXX0FUX2xvd19wYykKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9sb3dfcGMgYXR0ciBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgfQorICBpZiAoZHdhcmZfaGFzYXR0ciAoZGllLCBEV19BVF9oaWdoX3BjKSAmJiBkd2FyZl9oaWdocGMgKGRpZSwgJmFkZHIpID09IDApCisgICAgeworICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgICBEd2FyZl9BZGRyIGFkZHIyOworICAgICAgcHJpbnRmICgiJSpzIGhpZ2ggUEMgICA6ICUjbGx4XG4iLAorCSAgICAgIG4gKiA1LCAiIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGFkZHIpOworICAgICAgaWYgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfaGlnaF9wYywgJmF0dHIpID09IE5VTEwKKwkgIHx8IGR3YXJmX2Zvcm1hZGRyICgmYXR0ciwgJmFkZHIyKSAhPSAwCisJICB8fCBhZGRyICE9IGFkZHIyKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2hpZ2hfcGMgdmVyaWZ5IGZhaWxlZCAqKioqKioqKioqKioiKTsKKyAgICAgIGVsc2UgaWYgKCEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fYWRkcikpCisJcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfaGlnaF9wYyBmb3JtIGZhaWxlZCAqKioqKioqKioqKioiKTsKKyAgICAgIGVsc2UgaWYgKGR3YXJmX3doYXRmb3JtICgmYXR0cikgIT0gRFdfRk9STV9hZGRyKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2hpZ2hfcGMgZm9ybSAoMikgZmFpbGVkICoqKioqKioqKioqKiIpOworICAgICAgZWxzZSBpZiAoZHdhcmZfd2hhdGF0dHIgKCZhdHRyKSAhPSBEV19BVF9oaWdoX3BjKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2hpZ2hfcGMgYXR0ciBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgfQorCisgIGlmIChkd2FyZl9oYXNhdHRyIChkaWUsIERXX0FUX2J5dGVfc2l6ZSkgJiYgKGkgPSBkd2FyZl9ieXRlc2l6ZSAoZGllKSkgIT0gLTEpCisgICAgeworICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgICBEd2FyZl9Xb3JkIHUyOworICAgICAgdW5zaWduZWQgaW50IHU7CisgICAgICBwcmludGYgKCIlKnMgYnl0ZSBzaXplIDogJWRcbiIsIG4gKiA1LCAiIiwgaSk7CisgICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9ieXRlX3NpemUsICZhdHRyKSA9PSBOVUxMCisJICB8fCBkd2FyZl9mb3JtdWRhdGEgKCZhdHRyLCAmdTIpICE9IDAKKwkgIHx8IGkgIT0gKGludCkgdTIpCisJcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYnl0ZV9zaXplIHZlcmlmeSBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgICBlbHNlIGlmICghIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGExKQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGEyKQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE0KQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE4KQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3NkYXRhKQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3VkYXRhKSkKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9ieXRlX3NpemUgZm9ybSBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgICBlbHNlIGlmICgodSA9IGR3YXJmX3doYXRmb3JtICgmYXR0cikpID09IDAKKwkgICAgICAgfHwgKHUgIT0gRFdfRk9STV9kYXRhMQorCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTIKKwkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGE0CisJCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhOAorCQkgICAmJiB1ICE9IERXX0ZPUk1fc2RhdGEKKwkJICAgJiYgdSAhPSBEV19GT1JNX3VkYXRhKSkKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9ieXRlX3NpemUgZm9ybSAoMikgZmFpbGVkICoqKioqKioqKioqKiIpOworICAgICAgZWxzZSBpZiAoZHdhcmZfd2hhdGF0dHIgKCZhdHRyKSAhPSBEV19BVF9ieXRlX3NpemUpCisJcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYnl0ZV9zaXplIGF0dHIgZmFpbGVkICoqKioqKioqKioqKiIpOworICAgIH0KKyAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfYml0X3NpemUpICYmIChpID0gZHdhcmZfYml0c2l6ZSAoZGllKSkgIT0gLTEpCisgICAgeworICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgICBEd2FyZl9Xb3JkIHUyOworICAgICAgdW5zaWduZWQgaW50IHU7CisgICAgICBwcmludGYgKCIlKnMgYml0IHNpemUgIDogJWRcbiIsIG4gKiA1LCAiIiwgaSk7CisgICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9iaXRfc2l6ZSwgJmF0dHIpID09IE5VTEwKKwkgIHx8IGR3YXJmX2Zvcm11ZGF0YSAoJmF0dHIsICZ1MikgIT0gMAorCSAgfHwgaSAhPSAoaW50KSB1MikKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9iaXRfc2l6ZSB0ZXN0IGZhaWxlZCAqKioqKioqKioqKioiKTsKKyAgICAgIGVsc2UgaWYgKCEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTEpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTIpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTQpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTgpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fc2RhdGEpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fdWRhdGEpKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2JpdF9zaXplIGZvcm0gZmFpbGVkICoqKioqKioqKioqKiIpOworICAgICAgZWxzZSBpZiAoKHUgPSBkd2FyZl93aGF0Zm9ybSAoJmF0dHIpKSA9PSAwCisJICAgICAgIHx8ICh1ICE9IERXX0ZPUk1fZGF0YTEKKwkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGEyCisJCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhNAorCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTgKKwkJICAgJiYgdSAhPSBEV19GT1JNX3NkYXRhCisJCSAgICYmIHUgIT0gRFdfRk9STV91ZGF0YSkpCisJcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYml0X3NpemUgZm9ybSAoMikgZmFpbGVkICoqKioqKioqKioqKiIpOworICAgICAgZWxzZSBpZiAoZHdhcmZfd2hhdGF0dHIgKCZhdHRyKSAhPSBEV19BVF9iaXRfc2l6ZSkKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9iaXRfc2l6ZSBhdHRyIGZhaWxlZCAqKioqKioqKioqKioiKTsKKyAgICB9CisgIGlmIChkd2FyZl9oYXNhdHRyIChkaWUsIERXX0FUX2JpdF9vZmZzZXQpCisgICAgICAmJiAoaSA9IGR3YXJmX2JpdG9mZnNldCAoZGllKSkgIT0gLTEpCisgICAgeworICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgICBEd2FyZl9Xb3JkIHUyOworICAgICAgdW5zaWduZWQgaW50IHU7CisgICAgICBwcmludGYgKCIlKnMgYml0IG9mZnNldDogJWRcbiIsIG4gKiA1LCAiIiwgaSk7CisgICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9iaXRfb2Zmc2V0LCAmYXR0cikgPT0gTlVMTAorCSAgfHwgZHdhcmZfZm9ybXVkYXRhICgmYXR0ciwgJnUyKSAhPSAwCisJICB8fCBpICE9IChpbnQpIHUyKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2JpdF9vZmZzZXQgdGVzdCBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgICBlbHNlIGlmICghIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGExKQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGEyKQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE0KQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE4KQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3NkYXRhKQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3VkYXRhKSkKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9iaXRfb2Zmc2V0IGZvcm0gZmFpbGVkICoqKioqKioqKioqKiIpOworICAgICAgZWxzZSBpZiAoKHUgPSBkd2FyZl93aGF0Zm9ybSAoJmF0dHIpKSA9PSAwCisJICAgICAgIHx8ICh1ICE9IERXX0ZPUk1fZGF0YTEKKwkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGEyCisJCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhNAorCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTgKKwkJICAgJiYgdSAhPSBEV19GT1JNX3NkYXRhCisJCSAgICYmIHUgIT0gRFdfRk9STV91ZGF0YSkpCisJcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYml0X29mZnNldCBmb3JtICgyKSBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgICBlbHNlIGlmIChkd2FyZl93aGF0YXR0ciAoJmF0dHIpICE9IERXX0FUX2JpdF9vZmZzZXQpCisJcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYml0X29mZnNldCBhdHRyIGZhaWxlZCAqKioqKioqKioqKioiKTsKKyAgICB9CisKKyAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfbGFuZ3VhZ2UpICYmIChpID0gZHdhcmZfc3JjbGFuZyAoZGllKSkgIT0gLTEpCisgICAgeworICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgICBEd2FyZl9Xb3JkIHUyOworICAgICAgdW5zaWduZWQgaW50IHU7CisgICAgICBwcmludGYgKCIlKnMgbGFuZ3VhZ2UgIDogJWRcbiIsIG4gKiA1LCAiIiwgaSk7CisgICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9sYW5ndWFnZSwgJmF0dHIpID09IE5VTEwKKwkgIHx8IGR3YXJmX2Zvcm11ZGF0YSAoJmF0dHIsICZ1MikgIT0gMAorCSAgfHwgaSAhPSAoaW50KSB1MikKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9sYW5ndWFnZSB0ZXN0IGZhaWxlZCAqKioqKioqKioqKioiKTsKKyAgICAgIGVsc2UgaWYgKCEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTEpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTIpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTQpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTgpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fc2RhdGEpCisJICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fdWRhdGEpKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2xhbmd1YWdlIGZvcm0gZmFpbGVkICoqKioqKioqKioqKiIpOworICAgICAgZWxzZSBpZiAoKHUgPSBkd2FyZl93aGF0Zm9ybSAoJmF0dHIpKSA9PSAwCisJICAgICAgIHx8ICh1ICE9IERXX0ZPUk1fZGF0YTEKKwkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGEyCisJCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhNAorCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTgKKwkJICAgJiYgdSAhPSBEV19GT1JNX3NkYXRhCisJCSAgICYmIHUgIT0gRFdfRk9STV91ZGF0YSkpCisJcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfbGFuZ3VhZ2UgZm9ybSAoMikgZmFpbGVkICoqKioqKioqKioqKiIpOworICAgICAgZWxzZSBpZiAoZHdhcmZfd2hhdGF0dHIgKCZhdHRyKSAhPSBEV19BVF9sYW5ndWFnZSkKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9sYW5ndWFnZSBhdHRyIGZhaWxlZCAqKioqKioqKioqKioiKTsKKyAgICB9CisKKyAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfb3JkZXJpbmcpCisgICAgICAmJiAoaSA9IGR3YXJmX2FycmF5b3JkZXIgKGRpZSkpICE9IC0xKQorICAgIHsKKyAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOworICAgICAgRHdhcmZfV29yZCB1MjsKKyAgICAgIHVuc2lnbmVkIGludCB1OworICAgICAgcHJpbnRmICgiJSpzIG9yZGVyaW5nICA6ICVkXG4iLCBuICogNSwgIiIsIGkpOworICAgICAgaWYgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfb3JkZXJpbmcsICZhdHRyKSA9PSBOVUxMCisJICB8fCBkd2FyZl9mb3JtdWRhdGEgKCZhdHRyLCAmdTIpICE9IDAKKwkgIHx8IGkgIT0gKGludCkgdTIpCisJcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfb3JkZXJpbmcgdGVzdCBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgICBlbHNlIGlmICghIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGExKQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGEyKQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE0KQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE4KQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3NkYXRhKQorCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3VkYXRhKSkKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9vcmRlcmluZyBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgICBlbHNlIGlmICgodSA9IGR3YXJmX3doYXRmb3JtICgmYXR0cikpID09IDAKKwkgICAgICAgfHwgKHUgIT0gRFdfRk9STV9kYXRhMQorCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTIKKwkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGE0CisJCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhOAorCQkgICAmJiB1ICE9IERXX0ZPUk1fc2RhdGEKKwkJICAgJiYgdSAhPSBEV19GT1JNX3VkYXRhKSkKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9vcmRlcmluZyBmb3JtICgyKSBmYWlsZWQgKioqKioqKioqKioqIik7CisgICAgICBlbHNlIGlmIChkd2FyZl93aGF0YXR0ciAoJmF0dHIpICE9IERXX0FUX29yZGVyaW5nKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX29yZGVyaW5nIGF0dHIgZmFpbGVkICoqKioqKioqKioqKiIpOworICAgIH0KKworICBpZiAoZHdhcmZfaGFzYXR0ciAoZGllLCBEV19BVF9jb21wX2RpcikpCisgICAgeworICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7CisgICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9jb21wX2RpciwgJmF0dHIpID09IE5VTEwKKwkgIHx8IChuYW1lID0gZHdhcmZfZm9ybXN0cmluZyAoJmF0dHIpKSA9PSBOVUxMKQorCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2NvbXBfZGlyIGF0dHIgZmFpbGVkICoqKioqKioqKioqKiIpOworICAgICAgZWxzZQorCXByaW50ZiAoIiUqcyBkaXJlY3RvcnkgOiAlc1xuIiwgbiAqIDUsICIiLCBuYW1lKTsKKyAgICB9CisKKyAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfcHJvZHVjZXIpKQorICAgIHsKKyAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOworICAgICAgaWYgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfcHJvZHVjZXIsICZhdHRyKSA9PSBOVUxMCisJICB8fCAobmFtZSA9IGR3YXJmX2Zvcm1zdHJpbmcgKCZhdHRyKSkgPT0gTlVMTCkKKwlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9jb21wX2RpciBhdHRyIGZhaWxlZCAqKioqKioqKioqKioiKTsKKyAgICAgIGVsc2UKKwlwcmludGYgKCIlKnMgcHJvZHVjZXIgIDogJXNcbiIsIG4gKiA1LCAiIiwgbmFtZSk7CisgICAgfQorCisgIGlmIChkd2FyZl9oYXNjaGlsZHJlbiAoZGllKSAhPSAwICYmIGR3YXJmX2NoaWxkIChkaWUsICZjaGlsZCkgPT0gMCkKKyAgICBoYW5kbGUgKGRiZywgJmNoaWxkLCBuICsgMSk7CisgIGlmIChkd2FyZl9zaWJsaW5nb2YgKGRpZSwgZGllKSA9PSAwKQorICAgIGhhbmRsZSAoZGJnLCBkaWUsIG4pOworfQorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyBpbnQgY250OworCisgIGZvciAoY250ID0gMTsgY250IDwgYXJnYzsgKytjbnQpCisgICAgeworICAgICAgaW50IGZkID0gb3BlbiAoYXJndltjbnRdLCBPX1JET05MWSk7CisgICAgICBEd2FyZiAqZGJnOworCisgICAgICBwcmludGYgKCJmaWxlOiAlc1xuIiwgYmFzZW5hbWUgKGFyZ3ZbY250XSkpOworCisgICAgICBkYmcgPSBkd2FyZl9iZWdpbiAoZmQsIERXQVJGX0NfUkVBRCk7CisgICAgICBpZiAoZGJnID09IE5VTEwpCisJeworCSAgcHJpbnRmICgiJXMgbm90IHVzYWJsZVxuIiwgYXJndltjbnRdKTsKKwkgIGNsb3NlIChmZCk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIER3YXJmX09mZiBvZmYgPSAwOworICAgICAgRHdhcmZfT2ZmIG9sZF9vZmYgPSAwOworICAgICAgc2l6ZV90IGhzaXplOworICAgICAgRHdhcmZfT2ZmIGFiYnJldjsKKyAgICAgIHVpbnQ4X3QgYWRkcmVzc3NpemU7CisgICAgICB1aW50OF90IG9mZnNldHNpemU7CisgICAgICB3aGlsZSAoZHdhcmZfbmV4dGN1IChkYmcsIG9mZiwgJm9mZiwgJmhzaXplLCAmYWJicmV2LCAmYWRkcmVzc3NpemUsCisJCQkgICAmb2Zmc2V0c2l6ZSkgPT0gMCkKKwl7CisJICBwcmludGYgKCJOZXcgQ1U6IG9mZiA9ICVsbHUsIGhzaXplID0gJXp1LCBhYiA9ICVsbHUsIGFzID0gJSIgUFJJdTgKKwkJICAiLCBvcyA9ICUiIFBSSXU4ICJcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9sZF9vZmYsIGhzaXplLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBhYmJyZXYsIGFkZHJlc3NzaXplLAorCQkgIG9mZnNldHNpemUpOworCisJICBEd2FyZl9EaWUgZGllOworCSAgaWYgKGR3YXJmX29mZmRpZSAoZGJnLCBvbGRfb2ZmICsgaHNpemUsICZkaWUpICE9IE5VTEwpCisJICAgIGhhbmRsZSAoZGJnLCAmZGllLCAxKTsKKworCSAgb2xkX29mZiA9IG9mZjsKKwl9CisKKyAgICAgIGR3YXJmX2VuZCAoZGJnKTsKKyAgICAgIGNsb3NlIChmZCk7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2hvd3B0YWJsZS5jIGIvdGVzdHMvc2hvd3B0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjQ3YzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaG93cHRhYmxlLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIEVsZiAqZWxmOworICBpbnQgZmQ7CisgIEdFbGZfRWhkciBlaGRyOworICBpbnQgY250OworCisgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICBwdXRzICgibWlzc2luZyBwYXJhbWV0ZXIiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBmZCA9IG9wZW4gKGFyZ3ZbMV0sIE9fUkRPTkxZKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIFwiJXNcIjogJXNcbiIsIGFyZ3ZbMV0sIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKKworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIEVMRiBmaWxlOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfRUxGKQorICAgIHsKKyAgICAgIHByaW50ZiAoIlwiJXNcIiBpcyBub3QgYW4gRUxGIGZpbGVcbiIsIGFyZ3ZbMV0pOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHIpID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGdldCB0aGUgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcHJpbnRmICgiaWR4IHR5cGUgICAgJSpzICUqcyAlKnMgJSpzICUqcyAgYWxpZ24gZmxhZ3NcbiIsCisJICBnZWxmX2dldGNsYXNzIChlbGYpID09IEVMRkNMQVNTMzIgPyA5IDogMTcsICJvZmZzZXQiLAorCSAgZ2VsZl9nZXRjbGFzcyAoZWxmKSA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgInZhZGRyIiwKKwkgIGdlbGZfZ2V0Y2xhc3MgKGVsZikgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsICJwYWRkciIsCisJICBnZWxmX2dldGNsYXNzIChlbGYpID09IEVMRkNMQVNTMzIgPyA5IDogMTIsICJmaWxlc3oiLAorCSAgZ2VsZl9nZXRjbGFzcyAoZWxmKSA9PSBFTEZDTEFTUzMyID8gOSA6IDEyLCAibWVtc3oiKTsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IGVoZHIuZV9waG51bTsgKytjbnQpCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVuYW1lc1tdID0KKyAgICAgIHsKKwlbUFRfTlVMTF0gPSAiTlVMTCIsCisJW1BUX0xPQURdID0gIkxPQUQiLAorCVtQVF9EWU5BTUlDXSA9ICJEWU5BTUlDIiwKKwlbUFRfSU5URVJQXSA9ICJJTlRFUlAiLAorCVtQVF9OT1RFXSA9ICJOT1RFIiwKKwlbUFRfU0hMSUJdID0gIlNITElCIiwKKwlbUFRfUEhEUl0gPSAiUEhEUiIKKyAgICAgIH07CisgICAgICBHRWxmX1BoZHIgbWVtOworICAgICAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlbGYsIGNudCwgJm1lbSk7CisgICAgICBjaGFyIGJ1ZlsxOV07CisgICAgICBjb25zdCBjaGFyICpwX3R5cGUgPSB0eXBlbmFtZXNbcGhkci0+cF90eXBlXTsKKworICAgICAgLyogSWYgd2UgZG9uJ3Qga25vdyB0aGUgbmFtZSBvZiB0aGUgdHlwZSB3ZSB1c2UgdGhlIG51bWJlciB2YWx1ZS4gICovCisgICAgICBpZiAocGhkci0+cF90eXBlID49IFBUX05VTSkKKwl7CisJICBzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1ZiksICIleCIsIHBoZHItPnBfdHlwZSk7CisJICBwX3R5cGUgPSBidWY7CisJfQorCisgICAgICBwcmludGYgKCIlM2QgJS03cyAlIzAqbGx4ICUjMCpsbHggJSMwKmxseCAlIzAqbGx4ICUjMCpsbHggJSM2bGx4ICIsCisJICAgICAgY250LCBwX3R5cGUsCisJICAgICAgZ2VsZl9nZXRjbGFzcyAoZWxmKSA9PSBFTEZDTEFTUzMyID8gOSA6IDE3LAorCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBwaGRyLT5wX29mZnNldCwKKwkgICAgICBnZWxmX2dldGNsYXNzIChlbGYpID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LAorCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBwaGRyLT5wX3ZhZGRyLAorCSAgICAgIGdlbGZfZ2V0Y2xhc3MgKGVsZikgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsCisJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIHBoZHItPnBfcGFkZHIsCisJICAgICAgZ2VsZl9nZXRjbGFzcyAoZWxmKSA9PSBFTEZDTEFTUzMyID8gOSA6IDEyLAorCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBwaGRyLT5wX2ZpbGVzeiwKKwkgICAgICBnZWxmX2dldGNsYXNzIChlbGYpID09IEVMRkNMQVNTMzIgPyA5IDogMTIsCisJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIHBoZHItPnBfbWVtc3osCisJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIHBoZHItPnBfYWxpZ24pOworCisgICAgICBwdXRjX3VubG9ja2VkICgocGhkci0+cF9mbGFncyAmIFBGX1gpID8gJ1gnIDogJyAnLCBzdGRvdXQpOworICAgICAgcHV0Y191bmxvY2tlZCAoKHBoZHItPnBfZmxhZ3MgJiBQRl9XKSA/ICdXJyA6ICcgJywgc3Rkb3V0KTsKKyAgICAgIHB1dGNfdW5sb2NrZWQgKChwaGRyLT5wX2ZsYWdzICYgUEZfUikgPyAnUicgOiAnICcsIHN0ZG91dCk7CisKKyAgICAgIHB1dGNfdW5sb2NrZWQgKCdcbicsIHN0ZG91dCk7CisKKyAgICAgIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfSU5URVJQKQorCXsKKwkgIC8qIFdlIGNhbiBzaG93IHRoZSB1c2VyIHRoZSBuYW1lIG9mIHRoZSBpbnRlcnByZXRlci4gICovCisJICBzaXplX3QgbWF4c2l6ZTsKKwkgIGNoYXIgKmZpbGVkYXRhID0gZWxmX3Jhd2ZpbGUgKGVsZiwgJm1heHNpemUpOworCisJICBpZiAoZmlsZWRhdGEgIT0gTlVMTCAmJiBwaGRyLT5wX29mZnNldCA8IG1heHNpemUpCisJICAgIHByaW50ZiAoIlx0W1JlcXVlc3RpbmcgcHJvZ3JhbSBpbnRlcnByZXRlcjogJXNdXG4iLAorCQkgICAgZmlsZWRhdGEgKyBwaGRyLT5wX29mZnNldCk7CisJfQorICAgIH0KKworICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImVycm9yIHdoaWxlIGZyZWVpbmcgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdC1ubGlzdC5jIGIvdGVzdHMvdGVzdC1ubGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhM2YzZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0LW5saXN0LmMKQEAgLTAsMCArMSw3OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBPcGVuIFNvdXJjZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjAgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUKKyAgIExpY2Vuc2UgdmVyc2lvbiAxLjAgZnJvbSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC5waHAgb3IKKyAgIGJ5IHdyaXRpbmcgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYy9vIExhd3JlbmNlIFJvc2VuLCBFc3EuLAorICAgMzAwMSBLaW5nIFJhbmNoIFJvYWQsIFVraWFoLCBDQSA5NTQ4Mi4gICAqLworCisjaW5jbHVkZSA8bmxpc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKK2ludCB2YXIgPSAxOworCitpbnQgYnNzOworCisKK2ludAorZm9vIChpbnQgYSkKK3sKKyAgcmV0dXJuIGE7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIHN0cnVjdCBubGlzdCBubFs2XSA9CisgIHsKKyAgICBbMF0gPSB7IC5uX25hbWUgPSAidmFyIiB9LAorICAgIFsxXSA9IHsgLm5fbmFtZSA9ICJic3MiIH0sCisgICAgWzJdID0geyAubl9uYW1lID0gIm1haW4iIH0sCisgICAgWzNdID0geyAubl9uYW1lID0gImZvbyIgfSwKKyAgICBbNF0gPSB7IC5uX25hbWUgPSAibm90LXRoZXJlIiB9LAorICAgIFs1XSA9IHsgLm5fbmFtZSA9IE5VTEwgfSwKKyAgfTsKKyAgaW50IGNudDsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgaWYgKG5saXN0ICgiLmxpYnMvdGVzdC1ubGlzdCIsIG5sKSAhPSAwCisgICAgICAmJiBubGlzdCAoIi4vdGVzdC1ubGlzdCIsIG5sKSAhPSAwKQorICAgIHsKKyAgICAgIHB1dHMgKCJubGlzdCBmYWlsZWQiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBmb3IgKGNudCA9IDA7IG5sW2NudF0ubl9uYW1lICE9IE5VTEw7ICsrY250KQorICAgIHsKKyAgICAgIGlmIChhcmdjID4gMSkKKwkvKiBGb3IgZGVidWdnaW5nLiAgKi8KKwlwcmludGYgKCJubFslZF0ubl9uYW1lID0gXCIlc1wiXG4iCisJCSJubFslZF0ubl92YWx1ZSA9ICVsZFxuIgorCQkibmxbJWRdLm5fc2NudW0gPSAlZFxuIgorCQkibmxbJWRdLm5fdHlwZSA9ICV1XG4iCisJCSJubFslZF0ubl9zY2xhc3MgPSAlZFxuIgorCQkibmxbJWRdLm5fbnVtYXV4ID0gJWRcblxuIiwKKwkJY250LCBubFtjbnRdLm5fbmFtZSwKKwkJY250LCBubFtjbnRdLm5fdmFsdWUsCisJCWNudCwgbmxbY250XS5uX3NjbnVtLAorCQljbnQsIG5sW2NudF0ubl90eXBlLAorCQljbnQsIG5sW2NudF0ubl9zY2xhc3MsCisJCWNudCwgbmxbY250XS5uX251bWF1eCk7CisKKyAgICAgIGlmICgoY250ICE9IDQgJiYgbmxbY250XS5uX3ZhbHVlID09IDAgJiYgbmxbY250XS5uX3NjbnVtID09IDAKKwkgICAmJiBubFtjbnRdLm5fdHlwZSA9PSAwICYmIG5sW2NudF0ubl9zY2xhc3MgPT0gMAorCSAgICYmIG5sW2NudF0ubl9udW1hdXggPT0gMCkKKwkgIHx8IChjbnQgPT0gNCAmJiAobmxbY250XS5uX3ZhbHVlICE9IDAgfHwgbmxbY250XS5uX3NjbnVtICE9IDAKKwkJCSAgIHx8IG5sW2NudF0ubl90eXBlICE9IDAgfHwgbmxbY250XS5uX3NjbGFzcyAhPSAwCisJCQkgICB8fCBubFtjbnRdLm5fbnVtYXV4ICE9IDApKSkKKwlyZXN1bHQgPSAxOworICAgIH0KKworICByZXR1cm4gZm9vIChyZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUuYnoyIGIvdGVzdHMvdGVzdGZpbGUuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTliMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0ZmlsZS5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxMC5iejIgYi90ZXN0cy90ZXN0ZmlsZTEwLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWRkNTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxMC5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxMS5iejIgYi90ZXN0cy90ZXN0ZmlsZTExLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDk0Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxMS5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxMi5iejIgYi90ZXN0cy90ZXN0ZmlsZTEyLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI1YWQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxMi5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxMy5iejIgYi90ZXN0cy90ZXN0ZmlsZTEzLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjBiY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxMy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxNC5iejIgYi90ZXN0cy90ZXN0ZmlsZTE0LmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzdjNjllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxNC5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxNS5iejIgYi90ZXN0cy90ZXN0ZmlsZTE1LmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzVmNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxNS5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxNS5kZWJ1Zy5iejIgYi90ZXN0cy90ZXN0ZmlsZTE1LmRlYnVnLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzg2OTAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxNS5kZWJ1Zy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxNi5iejIgYi90ZXN0cy90ZXN0ZmlsZTE2LmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDllMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxNi5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxNi5kZWJ1Zy5iejIgYi90ZXN0cy90ZXN0ZmlsZTE2LmRlYnVnLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQ2NTFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxNi5kZWJ1Zy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxNy5iejIgYi90ZXN0cy90ZXN0ZmlsZTE3LmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTEyMzIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxNy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxNy5kZWJ1Zy5iejIgYi90ZXN0cy90ZXN0ZmlsZTE3LmRlYnVnLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE3NmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxNy5kZWJ1Zy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUxOC5iejIgYi90ZXN0cy90ZXN0ZmlsZTE4LmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjUzMjZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGZpbGUxOC5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUyLmJ6MiBiL3Rlc3RzL3Rlc3RmaWxlMi5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MTMxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RmaWxlMi5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGUzLmJ6MiBiL3Rlc3RzL3Rlc3RmaWxlMy5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhNDU2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RmaWxlMy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGU0LmJ6MiBiL3Rlc3RzL3Rlc3RmaWxlNC5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViMjVkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RmaWxlNC5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGU1LmJ6MiBiL3Rlc3RzL3Rlc3RmaWxlNS5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MzEzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RmaWxlNS5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGU2LmJ6MiBiL3Rlc3RzL3Rlc3RmaWxlNi5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzNzZiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RmaWxlNi5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGU3LmJ6MiBiL3Rlc3RzL3Rlc3RmaWxlNy5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0NTJiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RmaWxlNy5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGU4LmJ6MiBiL3Rlc3RzL3Rlc3RmaWxlOC5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmNDk5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RmaWxlOC5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGZpbGU5LmJ6MiBiL3Rlc3RzL3Rlc3RmaWxlOS5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NTRiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RmaWxlOS5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvdXBkYXRlMS5jIGIvdGVzdHMvdXBkYXRlMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmQ2MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91cGRhdGUxLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qIFRlc3QgcHJvZ3JhbSBmb3IgZWxmX3VwZGF0ZSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGNvbnN0IGNoYXIgKmZuYW1lID0gInh4eCI7CisgIGludCBmZDsKKyAgRWxmICplbGY7CisgIEVsZjMyX0VoZHIgKmVoZHI7CisgIGludCBpOworCisgIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1dSSVRFLCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIENyZWF0ZSBhbiBFTEYgaGVhZGVyLiAgKi8KKyAgZWhkciA9IGVsZjMyX25ld2VoZHIgKGVsZik7CisgIGlmIChlaGRyID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBQcmludCB0aGUgRUxGIGhlYWRlciB2YWx1ZXMuICAqLworICBpZiAoYXJnYyA+IDEpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IEVJX05JREVOVDsgKytpKQorCXByaW50ZiAoIiAlMDJ4IiwgZWhkci0+ZV9pZGVudFtpXSk7CisgICAgICBwcmludGYgKCJcCitcbnR5cGUgPSAlaHVcbm1hY2hpbmUgPSAlaHVcbnZlcnNpb24gPSAldVxuZW50cnkgPSAldVxucGhvZmYgPSAldVxuIgorCSAgICAgICJzaG9mZiA9ICV1XG5mbGFncyA9ICV1XG5laHNpemUgPSAlaHVcbnBoZW50c2l6ZSA9ICVodVxuIgorCSAgICAgICJwaG51bSA9ICVodVxuc2hlbnRzaXplID0gJWh1XG5zaG51bSA9ICVodVxuc2hzdHJuZHggPSAlaHVcbiIsCisJICAgICAgZWhkci0+ZV90eXBlLCBlaGRyLT5lX21hY2hpbmUsIGVoZHItPmVfdmVyc2lvbiwgZWhkci0+ZV9lbnRyeSwKKwkgICAgICBlaGRyLT5lX3Bob2ZmLCBlaGRyLT5lX3Nob2ZmLCBlaGRyLT5lX2ZsYWdzLCBlaGRyLT5lX2Voc2l6ZSwKKwkgICAgICBlaGRyLT5lX3BoZW50c2l6ZSwgZWhkci0+ZV9waG51bSwgZWhkci0+ZV9zaGVudHNpemUsCisJICAgICAgZWhkci0+ZV9zaG51bSwgZWhkci0+ZV9zaHN0cm5keCk7CisgICAgfQorCisgIGVoZHItPmVfaWRlbnRbMF0gPSA0MjsKKyAgZWhkci0+ZV9pZGVudFs0XSA9IDE7CisgIGVoZHItPmVfaWRlbnRbNV0gPSAxOworICBlaGRyLT5lX2lkZW50WzZdID0gMjsKKyAgZWhkci0+ZV9pZGVudFs5XSA9IDI7CisgIGVoZHItPmVfdmVyc2lvbiA9IDE7CisgIGVoZHItPmVfZWhzaXplID0gMTsKKworICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUuICAqLworICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19XUklURSkgPCAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGFuIEVMRiBoZWFkZXIuICAqLworICBlaGRyID0gZWxmMzJfbmV3ZWhkciAoZWxmKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFByaW50IHRoZSBFTEYgaGVhZGVyIHZhbHVlcy4gICovCisgIGlmIChhcmdjID4gMSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyArK2kpCisJcHJpbnRmICgiICUwMngiLCBlaGRyLT5lX2lkZW50W2ldKTsKKyAgICAgIHByaW50ZiAoIlwKK1xudHlwZSA9ICVodVxubWFjaGluZSA9ICVodVxudmVyc2lvbiA9ICV1XG5lbnRyeSA9ICV1XG5waG9mZiA9ICV1XG4iCisJICAgICAgInNob2ZmID0gJXVcbmZsYWdzID0gJXVcbmVoc2l6ZSA9ICVodVxucGhlbnRzaXplID0gJWh1XG4iCisJICAgICAgInBobnVtID0gJWh1XG5zaGVudHNpemUgPSAlaHVcbnNobnVtID0gJWh1XG5zaHN0cm5keCA9ICVodVxuIiwKKwkgICAgICBlaGRyLT5lX3R5cGUsIGVoZHItPmVfbWFjaGluZSwgZWhkci0+ZV92ZXJzaW9uLCBlaGRyLT5lX2VudHJ5LAorCSAgICAgIGVoZHItPmVfcGhvZmYsIGVoZHItPmVfc2hvZmYsIGVoZHItPmVfZmxhZ3MsIGVoZHItPmVfZWhzaXplLAorCSAgICAgIGVoZHItPmVfcGhlbnRzaXplLCBlaGRyLT5lX3BobnVtLCBlaGRyLT5lX3NoZW50c2l6ZSwKKwkgICAgICBlaGRyLT5lX3NobnVtLCBlaGRyLT5lX3Noc3RybmR4KTsKKyAgICB9CisKKyAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdXBkYXRlMi5jIGIvdGVzdHMvdXBkYXRlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0M2JmZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91cGRhdGUyLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qIFRlc3QgcHJvZ3JhbSBmb3IgZWxmX3VwZGF0ZSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGNvbnN0IGNoYXIgKmZuYW1lID0gInh4eCI7CisgIGludCBmZDsKKyAgRWxmICplbGY7CisgIEVsZjMyX0VoZHIgKmVoZHI7CisgIEVsZjMyX1BoZHIgKnBoZHI7CisgIGludCBpOworCisgIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1dSSVRFLCBOVUxMKTsKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIENyZWF0ZSBhbiBFTEYgaGVhZGVyLiAgKi8KKyAgZWhkciA9IGVsZjMyX25ld2VoZHIgKGVsZik7CisgIGlmIChlaGRyID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBQcmludCB0aGUgRUxGIGhlYWRlciB2YWx1ZXMuICAqLworICBpZiAoYXJnYyA+IDEpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IEVJX05JREVOVDsgKytpKQorCXByaW50ZiAoIiAlMDJ4IiwgZWhkci0+ZV9pZGVudFtpXSk7CisgICAgICBwcmludGYgKCJcCitcbnR5cGUgPSAlaHVcbm1hY2hpbmUgPSAlaHVcbnZlcnNpb24gPSAldVxuZW50cnkgPSAldVxucGhvZmYgPSAldVxuIgorCSAgICAgICJzaG9mZiA9ICV1XG5mbGFncyA9ICV1XG5laHNpemUgPSAlaHVcbnBoZW50c2l6ZSA9ICVodVxuIgorCSAgICAgICJwaG51bSA9ICVodVxuc2hlbnRzaXplID0gJWh1XG5zaG51bSA9ICVodVxuc2hzdHJuZHggPSAlaHVcbiIsCisJICAgICAgZWhkci0+ZV90eXBlLCBlaGRyLT5lX21hY2hpbmUsIGVoZHItPmVfdmVyc2lvbiwgZWhkci0+ZV9lbnRyeSwKKwkgICAgICBlaGRyLT5lX3Bob2ZmLCBlaGRyLT5lX3Nob2ZmLCBlaGRyLT5lX2ZsYWdzLCBlaGRyLT5lX2Voc2l6ZSwKKwkgICAgICBlaGRyLT5lX3BoZW50c2l6ZSwgZWhkci0+ZV9waG51bSwgZWhkci0+ZV9zaGVudHNpemUsCisJICAgICAgZWhkci0+ZV9zaG51bSwgZWhkci0+ZV9zaHN0cm5keCk7CisgICAgfQorCisgIGVoZHItPmVfaWRlbnRbMF0gPSA0MjsKKyAgZWhkci0+ZV9pZGVudFs0XSA9IDE7CisgIGVoZHItPmVfaWRlbnRbNV0gPSAxOworICBlaGRyLT5lX2lkZW50WzZdID0gMjsKKyAgZWhkci0+ZV90eXBlID0gRVRfRVhFQzsKKyAgZWhkci0+ZV92ZXJzaW9uID0gMTsKKyAgZWhkci0+ZV9laHNpemUgPSAxOworICBlbGZfZmxhZ2VoZHIgKGVsZiwgRUxGX0NfU0VULCBFTEZfRl9ESVJUWSk7CisKKyAgLyogQ3JlYXRlIHRoZSBwcm9ncmFtIGhlYWRlci4gICovCisgIHBoZHIgPSBlbGYzMl9uZXdwaGRyIChlbGYsIDEpOworICBpZiAocGhkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHBoZHJbMF0ucF90eXBlID0gUFRfUEhEUjsKKyAgZWxmX2ZsYWdwaGRyIChlbGYsIEVMRl9DX1NFVCwgRUxGX0ZfRElSVFkpOworCisgIC8qIExldCB0aGUgbGlicmFyeSBjb21wdXRlIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uICAqLworICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19OVUxMKSA8IDApCisgICAgeworICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKE5VTEwpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBlaGRyID0gZWxmMzJfZ2V0ZWhkciAoZWxmKTsKKworICBwaGRyWzBdLnBfb2Zmc2V0ID0gZWhkci0+ZV9waG9mZjsKKyAgcGhkclswXS5wX29mZnNldCA9IGVoZHItPmVfcGhvZmY7CisgIHBoZHJbMF0ucF92YWRkciA9IGVoZHItPmVfcGhvZmY7CisgIHBoZHJbMF0ucF9wYWRkciA9IGVoZHItPmVfcGhvZmY7CisgIHBoZHJbMF0ucF9mbGFncyA9IFBGX1IgfCBQRl9YOworICBwaGRyWzBdLnBfZmlsZXN6ID0gZWhkci0+ZV9waG51bSAqIGVsZjMyX2ZzaXplIChFTEZfVF9QSERSLCAxLCBFVl9DVVJSRU5UKTsKKyAgcGhkclswXS5wX21lbXN6ID0gZWhkci0+ZV9waG51bSAqIGVsZjMyX2ZzaXplIChFTEZfVF9QSERSLCAxLCBFVl9DVVJSRU5UKTsKKyAgcGhkclswXS5wX2FsaWduID0gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKKworICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUuICAqLworICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19XUklURSkgPCAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZShXUklURSk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFByaW50IHRoZSBFTEYgaGVhZGVyIHZhbHVlcy4gICovCisgIGlmIChhcmdjID4gMSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyArK2kpCisJcHJpbnRmICgiICUwMngiLCBlaGRyLT5lX2lkZW50W2ldKTsKKyAgICAgIHByaW50ZiAoIlwKK1xudHlwZSA9ICVodVxubWFjaGluZSA9ICVodVxudmVyc2lvbiA9ICV1XG5lbnRyeSA9ICV1XG5waG9mZiA9ICV1XG4iCisJICAgICAgInNob2ZmID0gJXVcbmZsYWdzID0gJXVcbmVoc2l6ZSA9ICVodVxucGhlbnRzaXplID0gJWh1XG4iCisJICAgICAgInBobnVtID0gJWh1XG5zaGVudHNpemUgPSAlaHVcbnNobnVtID0gJWh1XG5zaHN0cm5keCA9ICVodVxuIiwKKwkgICAgICBlaGRyLT5lX3R5cGUsIGVoZHItPmVfbWFjaGluZSwgZWhkci0+ZV92ZXJzaW9uLCBlaGRyLT5lX2VudHJ5LAorCSAgICAgIGVoZHItPmVfcGhvZmYsIGVoZHItPmVfc2hvZmYsIGVoZHItPmVfZmxhZ3MsIGVoZHItPmVfZWhzaXplLAorCSAgICAgIGVoZHItPmVfcGhlbnRzaXplLCBlaGRyLT5lX3BobnVtLCBlaGRyLT5lX3NoZW50c2l6ZSwKKwkgICAgICBlaGRyLT5lX3NobnVtLCBlaGRyLT5lX3Noc3RybmR4KTsKKyAgICB9CisKKyAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdXBkYXRlMy5jIGIvdGVzdHMvdXBkYXRlMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGFkZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91cGRhdGUzLmMKQEAgLTAsMCArMSwxOTggQEAKKy8qIFRlc3QgcHJvZ3JhbSBmb3IgZWxmX3VwZGF0ZSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgT3BlbiBTb3VyY2Ugc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4wIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlCisgICBMaWNlbnNlIHZlcnNpb24gMS4wIGZyb20gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wucGhwIG9yCisgICBieSB3cml0aW5nIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGMvbyBMYXdyZW5jZSBSb3NlbiwgRXNxLiwKKyAgIDMwMDEgS2luZyBSYW5jaCBSb2FkLCBVa2lhaCwgQ0EgOTU0ODIuICAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGliZWJsLmg+CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKK3sKKyAgY29uc3QgY2hhciAqZm5hbWUgPSAieHh4IjsKKyAgaW50IGZkOworICBFbGYgKmVsZjsKKyAgRWxmMzJfRWhkciAqZWhkcjsKKyAgRWxmMzJfUGhkciAqcGhkcjsKKyAgRWxmX1NjbiAqc2NuOworICBFbGYzMl9TaGRyICpzaGRyOworICBFbGZfRGF0YSAqZGF0YTsKKyAgc3RydWN0IEVibF9TdHJ0YWIgKnNoc3Q7CisgIHN0cnVjdCBFYmxfU3RyZW50ICpzaHN0cnRhYnNlOworICBpbnQgaTsKKworICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY2Nik7CisgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBgJXMnOiAlc1xuIiwgZm5hbWUsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKKworICBlbGZfZmlsbCAoMHg0Mik7CisKKyAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfV1JJVEUsIE5VTEwpOworICBpZiAoZWxmID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGFuIEVMRiBoZWFkZXIuICAqLworICBlaGRyID0gZWxmMzJfbmV3ZWhkciAoZWxmKTsKKyAgaWYgKGVoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFByaW50IHRoZSBFTEYgaGVhZGVyIHZhbHVlcy4gICovCisgIGlmIChhcmdjID4gMSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyArK2kpCisJcHJpbnRmICgiICUwMngiLCBlaGRyLT5lX2lkZW50W2ldKTsKKyAgICAgIHByaW50ZiAoIlwKK1xudHlwZSA9ICVodVxubWFjaGluZSA9ICVodVxudmVyc2lvbiA9ICV1XG5lbnRyeSA9ICV1XG5waG9mZiA9ICV1XG4iCisJICAgICAgInNob2ZmID0gJXVcbmZsYWdzID0gJXVcbmVoc2l6ZSA9ICVodVxucGhlbnRzaXplID0gJWh1XG4iCisJICAgICAgInBobnVtID0gJWh1XG5zaGVudHNpemUgPSAlaHVcbnNobnVtID0gJWh1XG5zaHN0cm5keCA9ICVodVxuIiwKKwkgICAgICBlaGRyLT5lX3R5cGUsIGVoZHItPmVfbWFjaGluZSwgZWhkci0+ZV92ZXJzaW9uLCBlaGRyLT5lX2VudHJ5LAorCSAgICAgIGVoZHItPmVfcGhvZmYsIGVoZHItPmVfc2hvZmYsIGVoZHItPmVfZmxhZ3MsIGVoZHItPmVfZWhzaXplLAorCSAgICAgIGVoZHItPmVfcGhlbnRzaXplLCBlaGRyLT5lX3BobnVtLCBlaGRyLT5lX3NoZW50c2l6ZSwKKwkgICAgICBlaGRyLT5lX3NobnVtLCBlaGRyLT5lX3Noc3RybmR4KTsKKyAgICB9CisKKyAgZWhkci0+ZV9pZGVudFswXSA9IDQyOworICBlaGRyLT5lX2lkZW50WzRdID0gMTsKKyAgZWhkci0+ZV9pZGVudFs1XSA9IDE7CisgIGVoZHItPmVfaWRlbnRbNl0gPSAyOworICBlaGRyLT5lX3R5cGUgPSBFVF9FWEVDOworICBlaGRyLT5lX3ZlcnNpb24gPSAxOworICBlaGRyLT5lX2Voc2l6ZSA9IDE7CisgIGVsZl9mbGFnZWhkciAoZWxmLCBFTEZfQ19TRVQsIEVMRl9GX0RJUlRZKTsKKworICAvKiBDcmVhdGUgdGhlIHByb2dyYW0gaGVhZGVyLiAgKi8KKyAgcGhkciA9IGVsZjMyX25ld3BoZHIgKGVsZiwgMSk7CisgIGlmIChwaGRyID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBwcm9ncmFtIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcGhkclswXS5wX3R5cGUgPSBQVF9QSERSOworICBlbGZfZmxhZ3BoZHIgKGVsZiwgRUxGX0NfU0VULCBFTEZfRl9ESVJUWSk7CisKKyAgc2hzdCA9IGVibF9zdHJ0YWJpbml0ICh0cnVlKTsKKworICBzY24gPSBlbGZfbmV3c2NuIChlbGYpOworICBpZiAoc2NuID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBTSFNUUlRBQiBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgc2hkciA9IGVsZjMyX2dldHNoZHIgKHNjbik7CisgIGlmIChzaGRyID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIFNIU1RSVEFCIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHNoc3RydGFic2UgPSBlYmxfc3RydGFiYWRkIChzaHN0LCAiLnNoc3RydGFiIiwgMCk7CisKKyAgc2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7CisgIHNoZHItPnNoX2ZsYWdzID0gMDsKKyAgc2hkci0+c2hfYWRkciA9IDA7CisgIHNoZHItPnNoX2xpbmsgPSBTSE5fVU5ERUY7CisgIHNoZHItPnNoX2luZm8gPSBTSE5fVU5ERUY7CisgIHNoZHItPnNoX2FkZHJhbGlnbiA9IDE7CisgIHNoZHItPnNoX2VudHNpemUgPSAwOworCisgIC8qIFdlIGhhdmUgdG8gc3RvcmUgdGhlIHNlY3Rpb24gaW5kZXggaW4gdGhlIEVMRiBoZWFkZXIuICAqLworICBlaGRyLT5lX3Noc3RybmR4ID0gZWxmX25keHNjbiAoc2NuKTsKKworICBkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBkYXRhIFNIU1RSVEFCIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIE5vIG1vcmUgc2VjdGlvbnMsIGZpbmFsaXplIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLworICBlYmxfc3RydGFiZmluYWxpemUgKHNoc3QsIGRhdGEpOworCisgIHNoZHItPnNoX25hbWUgPSBlYmxfc3RydGFib2Zmc2V0IChzaHN0cnRhYnNlKTsKKworICAvKiBMZXQgdGhlIGxpYnJhcnkgY29tcHV0ZSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKGVsZl91cGRhdGUgKGVsZiwgRUxGX0NfTlVMTCkgPCAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZShOVUxMKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZWhkciA9IGVsZjMyX2dldGVoZHIgKGVsZik7CisKKyAgcGhkclswXS5wX29mZnNldCA9IGVoZHItPmVfcGhvZmY7CisgIHBoZHJbMF0ucF9vZmZzZXQgPSBlaGRyLT5lX3Bob2ZmOworICBwaGRyWzBdLnBfdmFkZHIgPSBlaGRyLT5lX3Bob2ZmOworICBwaGRyWzBdLnBfcGFkZHIgPSBlaGRyLT5lX3Bob2ZmOworICBwaGRyWzBdLnBfZmxhZ3MgPSBQRl9SIHwgUEZfWDsKKyAgcGhkclswXS5wX2ZpbGVzeiA9IGVoZHItPmVfcGhudW0gKiBlbGYzMl9mc2l6ZSAoRUxGX1RfUEhEUiwgMSwgRVZfQ1VSUkVOVCk7CisgIHBoZHJbMF0ucF9tZW1zeiA9IGVoZHItPmVfcGhudW0gKiBlbGYzMl9mc2l6ZSAoRUxGX1RfUEhEUiwgMSwgRVZfQ1VSUkVOVCk7CisgIHBoZHJbMF0ucF9hbGlnbiA9IHNpemVvZiAoRWxmMzJfV29yZCk7CisKKyAgLyogV3JpdGUgb3V0IHRoZSBmaWxlLiAgKi8KKyAgaWYgKGVsZl91cGRhdGUgKGVsZiwgRUxGX0NfV1JJVEUpIDwgMCkKKyAgICB7CisgICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl91cGRhdGUoV1JJVEUpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBXZSBkb24ndCBuZWVkIHRoZSBzdHJpbmcgdGFibGUgYW55bW9yZS4gICovCisgIGVibF9zdHJ0YWJmcmVlIChzaHN0KTsKKworICAvKiBBbmQgdGhlIGRhdGEgYWxsb2NhdGVkIGluIHRoZSAuc2hzdHJ0YWIgc2VjdGlvbi4gICovCisgIGZyZWUgKGRhdGEtPmRfYnVmKTsKKworICAvKiBQcmludCB0aGUgRUxGIGhlYWRlciB2YWx1ZXMuICAqLworICBpZiAoYXJnYyA+IDEpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IEVJX05JREVOVDsgKytpKQorCXByaW50ZiAoIiAlMDJ4IiwgZWhkci0+ZV9pZGVudFtpXSk7CisgICAgICBwcmludGYgKCJcCitcbnR5cGUgPSAlaHVcbm1hY2hpbmUgPSAlaHVcbnZlcnNpb24gPSAldVxuZW50cnkgPSAldVxucGhvZmYgPSAldVxuIgorCSAgICAgICJzaG9mZiA9ICV1XG5mbGFncyA9ICV1XG5laHNpemUgPSAlaHVcbnBoZW50c2l6ZSA9ICVodVxuIgorCSAgICAgICJwaG51bSA9ICVodVxuc2hlbnRzaXplID0gJWh1XG5zaG51bSA9ICVodVxuc2hzdHJuZHggPSAlaHVcbiIsCisJICAgICAgZWhkci0+ZV90eXBlLCBlaGRyLT5lX21hY2hpbmUsIGVoZHItPmVfdmVyc2lvbiwgZWhkci0+ZV9lbnRyeSwKKwkgICAgICBlaGRyLT5lX3Bob2ZmLCBlaGRyLT5lX3Nob2ZmLCBlaGRyLT5lX2ZsYWdzLCBlaGRyLT5lX2Voc2l6ZSwKKwkgICAgICBlaGRyLT5lX3BoZW50c2l6ZSwgZWhkci0+ZV9waG51bSwgZWhkci0+ZV9zaGVudHNpemUsCisJICAgICAgZWhkci0+ZV9zaG51bSwgZWhkci0+ZV9zaHN0cm5keCk7CisgICAgfQorCisgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfZW5kOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3VwZGF0ZTQuYyBiL3Rlc3RzL3VwZGF0ZTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGYzYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdXBkYXRlNC5jCkBAIC0wLDAgKzEsMzUzIEBACisvKiBUZXN0IHByb2dyYW0gZm9yIGVsZl91cGRhdGUgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIE9wZW4gU291cmNlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMCBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgT3BlbiBTb2Z0d2FyZQorICAgTGljZW5zZSB2ZXJzaW9uIDEuMCBmcm9tIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLnBocCBvcgorICAgYnkgd3JpdGluZyB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBjL28gTGF3cmVuY2UgUm9zZW4sIEVzcS4sCisgICAzMDAxIEtpbmcgUmFuY2ggUm9hZCwgVWtpYWgsIENBIDk1NDgyLiAgICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGliZWxmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGxpYmVibC5oPgorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCit7CisgIGNvbnN0IGNoYXIgZm5hbWVbXSA9ICJ4eHgiOworICBpbnQgZmQ7CisgIEVsZiAqZWxmOworICBFbGYzMl9FaGRyICplaGRyOworICBFbGYzMl9QaGRyICpwaGRyOworICBFbGZfU2NuICpzY247CisgIEVsZjMyX1NoZHIgKnNoZHI7CisgIEVsZl9EYXRhICpkYXRhOworICBzdHJ1Y3QgRWJsX1N0cnRhYiAqc2hzdDsKKyAgc3RydWN0IEVibF9TdHJlbnQgKmZpcnN0c2U7CisgIHN0cnVjdCBFYmxfU3RyZW50ICpzZWNvbmRzZTsKKyAgc3RydWN0IEVibF9TdHJlbnQgKnRoaXJkc2U7CisgIHN0cnVjdCBFYmxfU3RyZW50ICpmb3VydGhzZTsKKyAgc3RydWN0IEVibF9TdHJlbnQgKnNoc3RydGFic2U7CisgIGludCBpOworCisgIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOworCisgIGVsZl9maWxsICgweDQyKTsKKworICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19XUklURSwgTlVMTCk7CisgIGlmIChlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBDcmVhdGUgYW4gRUxGIGhlYWRlci4gICovCisgIGVoZHIgPSBlbGYzMl9uZXdlaGRyIChlbGYpOworICBpZiAoZWhkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogUHJpbnQgdGhlIEVMRiBoZWFkZXIgdmFsdWVzLiAgKi8KKyAgaWYgKGFyZ2MgPiAxKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBFSV9OSURFTlQ7ICsraSkKKwlwcmludGYgKCIgJTAyeCIsIGVoZHItPmVfaWRlbnRbaV0pOworICAgICAgcHJpbnRmICgiXAorXG50eXBlID0gJWh1XG5tYWNoaW5lID0gJWh1XG52ZXJzaW9uID0gJXVcbmVudHJ5ID0gJXVcbnBob2ZmID0gJXVcbiIKKwkgICAgICAic2hvZmYgPSAldVxuZmxhZ3MgPSAldVxuZWhzaXplID0gJWh1XG5waGVudHNpemUgPSAlaHVcbiIKKwkgICAgICAicGhudW0gPSAlaHVcbnNoZW50c2l6ZSA9ICVodVxuc2hudW0gPSAlaHVcbnNoc3RybmR4ID0gJWh1XG4iLAorCSAgICAgIGVoZHItPmVfdHlwZSwgZWhkci0+ZV9tYWNoaW5lLCBlaGRyLT5lX3ZlcnNpb24sIGVoZHItPmVfZW50cnksCisJICAgICAgZWhkci0+ZV9waG9mZiwgZWhkci0+ZV9zaG9mZiwgZWhkci0+ZV9mbGFncywgZWhkci0+ZV9laHNpemUsCisJICAgICAgZWhkci0+ZV9waGVudHNpemUsIGVoZHItPmVfcGhudW0sIGVoZHItPmVfc2hlbnRzaXplLAorCSAgICAgIGVoZHItPmVfc2hudW0sIGVoZHItPmVfc2hzdHJuZHgpOworICAgIH0KKworICBlaGRyLT5lX2lkZW50WzBdID0gNDI7CisgIGVoZHItPmVfaWRlbnRbNF0gPSAxOworICBlaGRyLT5lX2lkZW50WzVdID0gMTsKKyAgZWhkci0+ZV9pZGVudFs2XSA9IDI7CisgIGVoZHItPmVfdHlwZSA9IEVUX0VYRUM7CisgIGVoZHItPmVfdmVyc2lvbiA9IDE7CisgIGVoZHItPmVfZWhzaXplID0gMTsKKyAgZWxmX2ZsYWdlaGRyIChlbGYsIEVMRl9DX1NFVCwgRUxGX0ZfRElSVFkpOworCisgIC8qIENyZWF0ZSB0aGUgcHJvZ3JhbSBoZWFkZXIuICAqLworICBwaGRyID0gZWxmMzJfbmV3cGhkciAoZWxmLCAxKTsKKyAgaWYgKHBoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBwaGRyWzBdLnBfdHlwZSA9IFBUX1BIRFI7CisgIGVsZl9mbGFncGhkciAoZWxmLCBFTEZfQ19TRVQsIEVMRl9GX0RJUlRZKTsKKworICBzaHN0ID0gZWJsX3N0cnRhYmluaXQgKHRydWUpOworCisgIHNjbiA9IGVsZl9uZXdzY24gKGVsZik7CisgIGlmIChzY24gPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGZpcnN0IHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBzaGRyID0gZWxmMzJfZ2V0c2hkciAoc2NuKTsKKyAgaWYgKHNoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IGhlYWRlciBmb3IgZmlyc3Qgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZmlyc3RzZSA9IGVibF9zdHJ0YWJhZGQgKHNoc3QsICIuZmlyc3QiLCAwKTsKKworICBzaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOworICBzaGRyLT5zaF9mbGFncyA9IFNIRl9BTExPQyB8IFNIRl9FWEVDSU5TVFI7CisgIHNoZHItPnNoX2FkZHIgPSAwOworICBzaGRyLT5zaF9saW5rID0gMDsKKyAgc2hkci0+c2hfaW5mbyA9IDA7CisgIHNoZHItPnNoX2VudHNpemUgPSAxOworCisgIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGRhdGEgZmlyc3Qgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZGF0YS0+ZF9idWYgPSAiaGVsbG8iOworICBkYXRhLT5kX3R5cGUgPSBFTEZfVF9CWVRFOworICBkYXRhLT5kX3ZlcnNpb24gPSBFVl9DVVJSRU5UOworICBkYXRhLT5kX3NpemUgPSA1OworICBkYXRhLT5kX2FsaWduID0gMTY7CisKKworICBzY24gPSBlbGZfbmV3c2NuIChlbGYpOworICBpZiAoc2NuID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzZWNvbmQgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIHNoZHIgPSBlbGYzMl9nZXRzaGRyIChzY24pOworICBpZiAoc2hkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgaGVhZGVyIGZvciBzZWNvbmQgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgc2Vjb25kc2UgPSBlYmxfc3RydGFiYWRkIChzaHN0LCAiLnNlY29uZCIsIDApOworCisgIHNoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CisgIHNoZHItPnNoX2ZsYWdzID0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFOworICBzaGRyLT5zaF9hZGRyID0gMDsKKyAgc2hkci0+c2hfbGluayA9IDA7CisgIHNoZHItPnNoX2luZm8gPSAwOworICBzaGRyLT5zaF9lbnRzaXplID0gMTsKKworICBkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBkYXRhIHNlY29uZCBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBkYXRhLT5kX2J1ZiA9ICJ3b3JsZCI7CisgIGRhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7CisgIGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7CisgIGRhdGEtPmRfc2l6ZSA9IDU7CisgIGRhdGEtPmRfYWxpZ24gPSAxNjsKKworCisgIHNjbiA9IGVsZl9uZXdzY24gKGVsZik7CisgIGlmIChzY24gPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHRoaXJkIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBzaGRyID0gZWxmMzJfZ2V0c2hkciAoc2NuKTsKKyAgaWYgKHNoZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IGhlYWRlciBmb3IgdGhpcmQgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgdGhpcmRzZSA9IGVibF9zdHJ0YWJhZGQgKHNoc3QsICIudGhpcmQiLCAwKTsKKworICBzaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOworICBzaGRyLT5zaF9mbGFncyA9IFNIRl9BTExPQyB8IFNIRl9FWEVDSU5TVFI7CisgIHNoZHItPnNoX2FkZHIgPSAwOworICBzaGRyLT5zaF9saW5rID0gMDsKKyAgc2hkci0+c2hfaW5mbyA9IDA7CisgIHNoZHItPnNoX2VudHNpemUgPSAxOworCisgIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGRhdGEgdGhpcmQgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZGF0YS0+ZF9idWYgPSAiISEhISEiOworICBkYXRhLT5kX3R5cGUgPSBFTEZfVF9CWVRFOworICBkYXRhLT5kX3ZlcnNpb24gPSBFVl9DVVJSRU5UOworICBkYXRhLT5kX3NpemUgPSA1OworICBkYXRhLT5kX2FsaWduID0gMTY7CisKKworICBzY24gPSBlbGZfbmV3c2NuIChlbGYpOworICBpZiAoc2NuID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBmb3VydGggc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIHNoZHIgPSBlbGYzMl9nZXRzaGRyIChzY24pOworICBpZiAoc2hkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgaGVhZGVyIGZvciBmb3VydGggc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZm91cnRoc2UgPSBlYmxfc3RydGFiYWRkIChzaHN0LCAiLmZvdXJ0aCIsIDApOworCisgIHNoZHItPnNoX3R5cGUgPSBTSFRfTk9CSVRTOworICBzaGRyLT5zaF9mbGFncyA9IFNIRl9BTExPQyB8IFNIRl9FWEVDSU5TVFI7CisgIHNoZHItPnNoX2FkZHIgPSAwOworICBzaGRyLT5zaF9saW5rID0gMDsKKyAgc2hkci0+c2hfaW5mbyA9IDA7CisgIHNoZHItPnNoX2VudHNpemUgPSAxOworICBzaGRyLT5zaF9zaXplID0gMTAwOworCisgIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGRhdGEgZm91cnRoIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGRhdGEtPmRfYnVmID0gTlVMTDsKKyAgZGF0YS0+ZF90eXBlID0gRUxGX1RfQllURTsKKyAgZGF0YS0+ZF92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKKyAgZGF0YS0+ZF9zaXplID0gMTAwOworICBkYXRhLT5kX2FsaWduID0gMTY7CisKKworICBzY24gPSBlbGZfbmV3c2NuIChlbGYpOworICBpZiAoc2NuID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBTSFNUUlRBQiBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgc2hkciA9IGVsZjMyX2dldHNoZHIgKHNjbik7CisgIGlmIChzaGRyID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIFNIU1RSVEFCIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHNoc3RydGFic2UgPSBlYmxfc3RydGFiYWRkIChzaHN0LCAiLnNoc3RydGFiIiwgMCk7CisKKyAgc2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7CisgIHNoZHItPnNoX2ZsYWdzID0gMDsKKyAgc2hkci0+c2hfYWRkciA9IDA7CisgIHNoZHItPnNoX2xpbmsgPSBTSE5fVU5ERUY7CisgIHNoZHItPnNoX2luZm8gPSBTSE5fVU5ERUY7CisgIHNoZHItPnNoX2VudHNpemUgPSAxOworCisgIC8qIFdlIGhhdmUgdG8gc3RvcmUgdGhlIHNlY3Rpb24gaW5kZXggaW4gdGhlIEVMRiBoZWFkZXIuICAqLworICBlaGRyLT5lX3Noc3RybmR4ID0gZWxmX25keHNjbiAoc2NuKTsKKworICBkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7CisgIGlmIChkYXRhID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBkYXRhIFNIU1RSVEFCIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIE5vIG1vcmUgc2VjdGlvbnMsIGZpbmFsaXplIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLworICBlYmxfc3RydGFiZmluYWxpemUgKHNoc3QsIGRhdGEpOworCisgIGVsZjMyX2dldHNoZHIgKGVsZl9nZXRzY24gKGVsZiwgMSkpLT5zaF9uYW1lID0gZWJsX3N0cnRhYm9mZnNldCAoZmlyc3RzZSk7CisgIGVsZjMyX2dldHNoZHIgKGVsZl9nZXRzY24gKGVsZiwgMikpLT5zaF9uYW1lID0gZWJsX3N0cnRhYm9mZnNldCAoc2Vjb25kc2UpOworICBlbGYzMl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlbGYsIDMpKS0+c2hfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKHRoaXJkc2UpOworICBlbGYzMl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlbGYsIDQpKS0+c2hfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKGZvdXJ0aHNlKTsKKyAgc2hkci0+c2hfbmFtZSA9IGVibF9zdHJ0YWJvZmZzZXQgKHNoc3RydGFic2UpOworCisgIC8qIExldCB0aGUgbGlicmFyeSBjb21wdXRlIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uICAqLworICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19OVUxMKSA8IDApCisgICAgeworICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKE5VTEwpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBlaGRyID0gZWxmMzJfZ2V0ZWhkciAoZWxmKTsKKworICBwaGRyWzBdLnBfb2Zmc2V0ID0gZWhkci0+ZV9waG9mZjsKKyAgcGhkclswXS5wX29mZnNldCA9IGVoZHItPmVfcGhvZmY7CisgIHBoZHJbMF0ucF92YWRkciA9IGVoZHItPmVfcGhvZmY7CisgIHBoZHJbMF0ucF9wYWRkciA9IGVoZHItPmVfcGhvZmY7CisgIHBoZHJbMF0ucF9mbGFncyA9IFBGX1IgfCBQRl9YOworICBwaGRyWzBdLnBfZmlsZXN6ID0gZWhkci0+ZV9waG51bSAqIGVsZjMyX2ZzaXplIChFTEZfVF9QSERSLCAxLCBFVl9DVVJSRU5UKTsKKyAgcGhkclswXS5wX21lbXN6ID0gZWhkci0+ZV9waG51bSAqIGVsZjMyX2ZzaXplIChFTEZfVF9QSERSLCAxLCBFVl9DVVJSRU5UKTsKKyAgcGhkclswXS5wX2FsaWduID0gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKKworICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUuICAqLworICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19XUklURSkgPCAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZShXUklURSk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFdlIGRvbid0IG5lZWQgdGhlIHN0cmluZyB0YWJsZSBhbnltb3JlLiAgKi8KKyAgZWJsX3N0cnRhYmZyZWUgKHNoc3QpOworCisgIC8qIEFuZCB0aGUgZGF0YSBhbGxvY2F0ZWQgaW4gdGhlIC5zaHN0cnRhYiBzZWN0aW9uLiAgKi8KKyAgZnJlZSAoZGF0YS0+ZF9idWYpOworCisgIC8qIFByaW50IHRoZSBFTEYgaGVhZGVyIHZhbHVlcy4gICovCisgIGlmIChhcmdjID4gMSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyArK2kpCisJcHJpbnRmICgiICUwMngiLCBlaGRyLT5lX2lkZW50W2ldKTsKKyAgICAgIHByaW50ZiAoIlwKK1xudHlwZSA9ICVodVxubWFjaGluZSA9ICVodVxudmVyc2lvbiA9ICV1XG5lbnRyeSA9ICV1XG5waG9mZiA9ICV1XG4iCisJICAgICAgInNob2ZmID0gJXVcbmZsYWdzID0gJXVcbmVoc2l6ZSA9ICVodVxucGhlbnRzaXplID0gJWh1XG4iCisJICAgICAgInBobnVtID0gJWh1XG5zaGVudHNpemUgPSAlaHVcbnNobnVtID0gJWh1XG5zaHN0cm5keCA9ICVodVxuIiwKKwkgICAgICBlaGRyLT5lX3R5cGUsIGVoZHItPmVfbWFjaGluZSwgZWhkci0+ZV92ZXJzaW9uLCBlaGRyLT5lX2VudHJ5LAorCSAgICAgIGVoZHItPmVfcGhvZmYsIGVoZHItPmVfc2hvZmYsIGVoZHItPmVfZmxhZ3MsIGVoZHItPmVfZWhzaXplLAorCSAgICAgIGVoZHItPmVfcGhlbnRzaXplLCBlaGRyLT5lX3BobnVtLCBlaGRyLT5lX3NoZW50c2l6ZSwKKwkgICAgICBlaGRyLT5lX3NobnVtLCBlaGRyLT5lX3Noc3RybmR4KTsKKyAgICB9CisKKyAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHVubGluayAoZm5hbWUpOworCisgIHJldHVybiAwOworfQo=